From e0a374c0424af2a55e82c79c5cec6cbbae6b9161 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 9 Jan 2025 11:55:09 +0800 Subject: [PATCH 1/3] [add] bsp gd32f527i-eval --- bsp/gd32/arm/gd32527I-eval/.config | 1306 ++++++ bsp/gd32/arm/gd32527I-eval/Kconfig | 12 + bsp/gd32/arm/gd32527I-eval/README.md | 74 + .../RTE/_rt-thread/RTE_Components.h | 15 + bsp/gd32/arm/gd32527I-eval/SConscript | 15 + bsp/gd32/arm/gd32527I-eval/SConstruct | 60 + .../arm/gd32527I-eval/applications/SConscript | 15 + .../arm/gd32527I-eval/applications/main.c | 36 + bsp/gd32/arm/gd32527I-eval/board/Kconfig | 390 ++ bsp/gd32/arm/gd32527I-eval/board/SConscript | 28 + bsp/gd32/arm/gd32527I-eval/board/board.c | 95 + bsp/gd32/arm/gd32527I-eval/board/board.h | 47 + .../arm/gd32527I-eval/board/gd32f5xx_libopt.h | 45 + .../board/linker_scripts/link.icf | 40 + .../board/linker_scripts/link.ld | 142 + .../board/linker_scripts/link.sct | 15 + bsp/gd32/arm/gd32527I-eval/figures/board.png | Bin 0 -> 405988 bytes bsp/gd32/arm/gd32527I-eval/project.ewd | 3056 ++++++++++++++ bsp/gd32/arm/gd32527I-eval/project.ewp | 2177 ++++++++++ bsp/gd32/arm/gd32527I-eval/project.eww | 10 + bsp/gd32/arm/gd32527I-eval/project.uvoptx | 1086 +++++ bsp/gd32/arm/gd32527I-eval/project.uvproj | 1159 ++++++ bsp/gd32/arm/gd32527I-eval/project.uvprojx | 2423 +++++++++++ bsp/gd32/arm/gd32527I-eval/rtconfig.h | 396 ++ bsp/gd32/arm/gd32527I-eval/rtconfig.py | 184 + bsp/gd32/arm/gd32527I-eval/template.ewp | 1892 +++++++++ bsp/gd32/arm/gd32527I-eval/template.uvoptx | 185 + bsp/gd32/arm/gd32527I-eval/template.uvproj | 628 +++ bsp/gd32/arm/gd32527I-eval/template.uvprojx | 413 ++ .../CMSIS/GD/GD32F5xx/Include/gd32f5xx.h | 302 ++ .../GD/GD32F5xx/Include/system_gd32f5xx.h | 57 + .../GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s | 495 +++ .../GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s | 317 ++ .../GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s | 750 ++++ .../GD/GD32F5xx/Source/system_gd32f5xx.c | 944 +++++ .../CMSIS/LICENSE.TXT | 201 + .../CMSIS/cmsis_armcc.h | 817 ++++ .../CMSIS/cmsis_armclang.h | 1803 ++++++++ .../CMSIS/cmsis_compiler.h | 355 ++ .../CMSIS/cmsis_gcc.h | 1980 +++++++++ .../CMSIS/cmsis_version.h | 39 + .../CMSIS/core_armv8mbl.h | 1878 +++++++++ .../CMSIS/core_armv8mml.h | 2902 +++++++++++++ .../CMSIS/core_cm0.h | 888 ++++ .../CMSIS/core_cm0plus.h | 1021 +++++ .../CMSIS/core_cm23.h | 1878 +++++++++ .../CMSIS/core_cm3.h | 1928 +++++++++ .../CMSIS/core_cm33.h | 2898 +++++++++++++ .../CMSIS/core_cm4.h | 2113 ++++++++++ .../CMSIS/core_cm7.h | 2658 ++++++++++++ .../CMSIS/core_sc000.h | 1016 +++++ .../CMSIS/core_sc300.h | 1903 +++++++++ .../CMSIS/mpu_armv7.h | 182 + .../CMSIS/tz_context.h | 69 + .../Include/gd32f5xx_adc.h | 513 +++ .../Include/gd32f5xx_can.h | 916 ++++ .../Include/gd32f5xx_cau.h | 317 ++ .../Include/gd32f5xx_crc.h | 78 + .../Include/gd32f5xx_ctc.h | 182 + .../Include/gd32f5xx_dac.h | 277 ++ .../Include/gd32f5xx_dbg.h | 165 + .../Include/gd32f5xx_dci.h | 236 ++ .../Include/gd32f5xx_dma.h | 433 ++ .../Include/gd32f5xx_enet.h | 1697 ++++++++ .../Include/gd32f5xx_exmc.h | 812 ++++ .../Include/gd32f5xx_exti.h | 293 ++ .../Include/gd32f5xx_fmc.h | 644 +++ .../Include/gd32f5xx_fwdgt.h | 118 + .../Include/gd32f5xx_gpio.h | 406 ++ .../Include/gd32f5xx_hau.h | 223 + .../Include/gd32f5xx_i2c.h | 416 ++ .../Include/gd32f5xx_i2c_add.h | 410 ++ .../Include/gd32f5xx_ipa.h | 378 ++ .../Include/gd32f5xx_iref.h | 184 + .../Include/gd32f5xx_misc.h | 93 + .../Include/gd32f5xx_pkcau.h | 290 ++ .../Include/gd32f5xx_pmu.h | 203 + .../Include/gd32f5xx_rcu.h | 1261 ++++++ .../Include/gd32f5xx_rtc.h | 638 +++ .../Include/gd32f5xx_sai.h | 473 +++ .../Include/gd32f5xx_sdio.h | 431 ++ .../Include/gd32f5xx_spi.h | 376 ++ .../Include/gd32f5xx_syscfg.h | 358 ++ .../Include/gd32f5xx_timer.h | 869 ++++ .../Include/gd32f5xx_tli.h | 370 ++ .../Include/gd32f5xx_trng.h | 100 + .../Include/gd32f5xx_usart.h | 489 +++ .../Include/gd32f5xx_wwdgt.h | 107 + .../Source/gd32f5xx_adc.c | 1200 ++++++ .../Source/gd32f5xx_can.c | 1431 +++++++ .../Source/gd32f5xx_cau.c | 718 ++++ .../Source/gd32f5xx_cau_aes.c | 915 ++++ .../Source/gd32f5xx_cau_des.c | 183 + .../Source/gd32f5xx_cau_tdes.c | 198 + .../Source/gd32f5xx_crc.c | 127 + .../Source/gd32f5xx_ctc.c | 388 ++ .../Source/gd32f5xx_dac.c | 679 +++ .../Source/gd32f5xx_dbg.c | 209 + .../Source/gd32f5xx_dci.c | 343 ++ .../Source/gd32f5xx_dma.c | 902 ++++ .../Source/gd32f5xx_enet.c | 3701 +++++++++++++++++ .../Source/gd32f5xx_exmc.c | 1264 ++++++ .../Source/gd32f5xx_exti.c | 251 ++ .../Source/gd32f5xx_fmc.c | 1592 +++++++ .../Source/gd32f5xx_fwdgt.c | 229 + .../Source/gd32f5xx_gpio.c | 431 ++ .../Source/gd32f5xx_hau.c | 402 ++ .../Source/gd32f5xx_hau_sha_md5.c | 419 ++ .../Source/gd32f5xx_i2c.c | 857 ++++ .../Source/gd32f5xx_i2c_add.c | 978 +++++ .../Source/gd32f5xx_ipa.c | 636 +++ .../Source/gd32f5xx_iref.c | 124 + .../Source/gd32f5xx_misc.c | 184 + .../Source/gd32f5xx_pkcau.c | 1270 ++++++ .../Source/gd32f5xx_pmu.c | 394 ++ .../Source/gd32f5xx_rcu.c | 1473 +++++++ .../Source/gd32f5xx_rtc.c | 1289 ++++++ .../Source/gd32f5xx_sai.c | 609 +++ .../Source/gd32f5xx_sdio.c | 801 ++++ .../Source/gd32f5xx_spi.c | 877 ++++ .../Source/gd32f5xx_syscfg.c | 471 +++ .../Source/gd32f5xx_timer.c | 2282 ++++++++++ .../Source/gd32f5xx_tli.c | 595 +++ .../Source/gd32f5xx_trng.c | 153 + .../Source/gd32f5xx_usart.c | 1010 +++++ .../Source/gd32f5xx_wwdgt.c | 141 + .../device/class/audio/Include/audio_core.h | 316 ++ .../class/audio/Include/audio_out_itf.h | 48 + .../device/class/audio/Source/audio_core.c | 951 +++++ .../device/class/audio/Source/audio_out_itf.c | 167 + .../device/class/cdc/Include/cdc_acm_core.h | 65 + .../device/class/cdc/Source/cdc_acm_core.c | 520 +++ .../device/class/dfu/Include/dfu_core.h | 173 + .../device/class/dfu/Include/dfu_mem.h | 82 + .../device/class/dfu/Source/dfu_core.c | 721 ++++ .../device/class/dfu/Source/dfu_mem.c | 241 ++ .../class/hid/Include/custom_hid_core.h | 66 + .../class/hid/Include/standard_hid_core.h | 67 + .../device/class/hid/Source/custom_hid_core.c | 473 +++ .../class/hid/Source/standard_hid_core.c | 460 ++ .../device/class/iap/Include/usb_iap_core.h | 103 + .../device/class/iap/Source/usb_iap_core.c | 667 +++ .../device/class/msc/Include/usbd_msc_bbb.h | 100 + .../device/class/msc/Include/usbd_msc_core.h | 57 + .../device/class/msc/Include/usbd_msc_mem.h | 58 + .../device/class/msc/Include/usbd_msc_scsi.h | 53 + .../device/class/msc/Source/usbd_msc_bbb.c | 287 ++ .../device/class/msc/Source/usbd_msc_core.c | 395 ++ .../device/class/msc/Source/usbd_msc_scsi.c | 758 ++++ .../class/printer/Include/printer_core.h | 78 + .../class/printer/Source/printer_core.c | 302 ++ .../device/core/Include/usbd_core.h | 102 + .../device/core/Include/usbd_enum.h | 98 + .../device/core/Include/usbd_transc.h | 56 + .../device/core/Source/usbd_core.c | 320 ++ .../device/core/Source/usbd_enum.c | 816 ++++ .../device/core/Source/usbd_transc.c | 264 ++ .../driver/Include/drv_usb_core.h | 347 ++ .../driver/Include/drv_usb_dev.h | 197 + .../driver/Include/drv_usb_host.h | 115 + .../driver/Include/drv_usb_hw.h | 62 + .../driver/Include/drv_usb_regs.h | 656 +++ .../driver/Include/drv_usbd_int.h | 50 + .../driver/Include/drv_usbh_int.h | 53 + .../driver/Source/drv_usb_core.c | 371 ++ .../driver/Source/drv_usb_dev.c | 660 +++ .../driver/Source/drv_usb_host.c | 472 +++ .../driver/Source/drv_usbd_int.c | 576 +++ .../driver/Source/drv_usbh_int.c | 639 +++ .../host/class/hid/Include/usbh_hid_core.h | 116 + .../class/hid/Include/usbh_standard_hid.h | 96 + .../host/class/hid/Source/usbh_hid_core.c | 582 +++ .../host/class/hid/Source/usbh_standard_hid.c | 271 ++ .../host/class/msc/Include/usbh_msc_bbb.h | 148 + .../host/class/msc/Include/usbh_msc_core.h | 122 + .../host/class/msc/Include/usbh_msc_scsi.h | 97 + .../host/class/msc/Source/usbh_msc_bbb.c | 360 ++ .../host/class/msc/Source/usbh_msc_core.c | 551 +++ .../host/class/msc/Source/usbh_msc_fatfs.c | 232 ++ .../host/class/msc/Source/usbh_msc_scsi.c | 396 ++ .../host/core/Include/usbh_core.h | 262 ++ .../host/core/Include/usbh_enum.h | 70 + .../host/core/Include/usbh_pipe.h | 102 + .../host/core/Include/usbh_transc.h | 50 + .../host/core/Source/usbh_core.c | 655 +++ .../host/core/Source/usbh_enum.c | 693 +++ .../host/core/Source/usbh_pipe.c | 181 + .../host/core/Source/usbh_transc.c | 369 ++ .../ustd/class/cdc/usb_cdc.h | 180 + .../ustd/class/hid/usb_hid.h | 81 + .../ustd/class/msc/msc_bbb.h | 69 + .../ustd/class/msc/msc_scsi.h | 117 + .../ustd/class/msc/usb_msc.h | 68 + .../ustd/common/usb_ch9_std.h | 248 ++ .../GD32F5xx_Firmware_Library/SConscript | 65 + .../GD32F5xx_Firmware_Library/change log.txt | 1390 +++++++ bsp/gd32/arm/libraries/Kconfig | 5 + .../arm/libraries/gd32_drivers/drv_gpio.c | 20 +- .../arm/libraries/gd32_drivers/drv_gpio.h | 4 +- .../arm/libraries/gd32_drivers/drv_usart.c | 18 +- .../arm/libraries/gd32_drivers/drv_usart.h | 4 +- .../arm/libraries/gd32_drivers/drv_usart_v2.c | 18 +- 202 files changed, 110491 insertions(+), 31 deletions(-) create mode 100644 bsp/gd32/arm/gd32527I-eval/.config create mode 100644 bsp/gd32/arm/gd32527I-eval/Kconfig create mode 100644 bsp/gd32/arm/gd32527I-eval/README.md create mode 100644 bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h create mode 100644 bsp/gd32/arm/gd32527I-eval/SConscript create mode 100644 bsp/gd32/arm/gd32527I-eval/SConstruct create mode 100644 bsp/gd32/arm/gd32527I-eval/applications/SConscript create mode 100644 bsp/gd32/arm/gd32527I-eval/applications/main.c create mode 100644 bsp/gd32/arm/gd32527I-eval/board/Kconfig create mode 100644 bsp/gd32/arm/gd32527I-eval/board/SConscript create mode 100644 bsp/gd32/arm/gd32527I-eval/board/board.c create mode 100644 bsp/gd32/arm/gd32527I-eval/board/board.h create mode 100644 bsp/gd32/arm/gd32527I-eval/board/gd32f5xx_libopt.h create mode 100644 bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.icf create mode 100644 bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld create mode 100644 bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct create mode 100644 bsp/gd32/arm/gd32527I-eval/figures/board.png create mode 100644 bsp/gd32/arm/gd32527I-eval/project.ewd create mode 100644 bsp/gd32/arm/gd32527I-eval/project.ewp create mode 100644 bsp/gd32/arm/gd32527I-eval/project.eww create mode 100644 bsp/gd32/arm/gd32527I-eval/project.uvoptx create mode 100644 bsp/gd32/arm/gd32527I-eval/project.uvproj create mode 100644 bsp/gd32/arm/gd32527I-eval/project.uvprojx create mode 100644 bsp/gd32/arm/gd32527I-eval/rtconfig.h create mode 100644 bsp/gd32/arm/gd32527I-eval/rtconfig.py create mode 100644 bsp/gd32/arm/gd32527I-eval/template.ewp create mode 100644 bsp/gd32/arm/gd32527I-eval/template.uvoptx create mode 100644 bsp/gd32/arm/gd32527I-eval/template.uvproj create mode 100644 bsp/gd32/arm/gd32527I-eval/template.uvprojx create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript create mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt diff --git a/bsp/gd32/arm/gd32527I-eval/.config b/bsp/gd32/arm/gd32527I-eval/.config new file mode 100644 index 00000000000..5e366ae773b --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/.config @@ -0,0 +1,1306 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +# CONFIG_RT_USING_TIMER_ALL_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y +CONFIG_DFS_USING_WORKDIR=y +# CONFIG_RT_USING_DFS_MNTTABLE is not set +CONFIG_DFS_FD_MAX=16 +CONFIG_RT_USING_DFS_V1=y +# CONFIG_RT_USING_DFS_V2 is not set +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 +# CONFIG_RT_USING_DFS_ELMFAT is not set +# CONFIG_RT_USING_DFS_DEVFS is not set +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_DFS_MQUEUE is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +# +# Hardware Drivers Config +# +CONFIG_SOC_SERIES_GD32F5xx=y +CONFIG_SOC_GD32527I=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_UART0_RX_USING_DMA is not set +# CONFIG_BSP_UART0_TX_USING_DMA is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_UART6 is not set +# CONFIG_BSP_USING_UART7 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_USBD is not set +# CONFIG_BSP_USING_USBH is not set +# CONFIG_BSP_USING_SDRAM is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/gd32/arm/gd32527I-eval/Kconfig b/bsp/gd32/arm/gd32527I-eval/Kconfig new file mode 100644 index 00000000000..07edfefc341 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/gd32/arm/gd32527I-eval/README.md b/bsp/gd32/arm/gd32527I-eval/README.md new file mode 100644 index 00000000000..eda047696ab --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/README.md @@ -0,0 +1,74 @@ +# GDF527I-Eval开发板BSP说明 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +|:-------- |:--------:|:-------------------------------- | +| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...113 | +| UART | 支持 | UART0 - UART7 | +| **扩展模块** | **支持情况** | **备注** | +| 暂无 | 暂不支持 | 暂不支持 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5工程,支持 GCC 开发环境,也可使用RT-Thread Studio开发。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用调试器连接开发板到 PC,使用USB2TTL连接USART0,并给开发板供电。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 CMSIS-DAP 仿真器下载程序,在通过 CMSIS-DAP 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.0.0 build Mar 3 2023 00:43:44 + 2006 - 2022 Copyright by RT-Thread team +msh /> +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口1的功能,如果需使用高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +## 注意事项 + +暂无 + +## 联系人信息 + +维护人: + +- [yuanzihao](https://github.com/zihao-yuan/), 邮箱: diff --git a/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h b/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h new file mode 100644 index 00000000000..5361d8c17c9 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h @@ -0,0 +1,15 @@ + +/* + * Auto generated Run-Time-Environment Configuration File + * *** Do not modify ! *** + * + * Project: 'project' + * Target: 'rt-thread' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + + +#endif /* RTE_COMPONENTS_H */ diff --git a/bsp/gd32/arm/gd32527I-eval/SConscript b/bsp/gd32/arm/gd32527I-eval/SConscript new file mode 100644 index 00000000000..20f7689c53c --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/gd32/arm/gd32527I-eval/SConstruct b/bsp/gd32/arm/gd32527I-eval/SConstruct new file mode 100644 index 00000000000..3917db9a61e --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +gd32_library = 'GD32F5xx_Firmware_Library' +rtconfig.BSP_LIBRARY_TYPE = gd32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, gd32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/gd32/arm/gd32527I-eval/applications/SConscript b/bsp/gd32/arm/gd32527I-eval/applications/SConscript new file mode 100644 index 00000000000..9bb9abae897 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/gd32/arm/gd32527I-eval/applications/main.c b/bsp/gd32/arm/gd32527I-eval/applications/main.c new file mode 100644 index 00000000000..dc801496bf1 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/applications/main.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2023-03-05 yuanzihao change the LED pins + */ + +#include +#include +#include +#include + +/* defined the LED1 pin: PE3 */ +#define LED1_PIN GET_PIN(E, 3) + +int main(void) +{ + int count = 1; + + /* set LED1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/gd32/arm/gd32527I-eval/board/Kconfig b/bsp/gd32/arm/gd32527I-eval/board/Kconfig new file mode 100644 index 00000000000..9fb623a9cc0 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/Kconfig @@ -0,0 +1,390 @@ +menu "Hardware Drivers Config" + +config SOC_SERIES_GD32F5xx + bool + default y + +config SOC_GD32527I + bool + select SOC_SERIES_GD32F5xx + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable UART0" + default y + + config BSP_UART0_RX_USING_DMA + bool "Enable UART0 RX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_TX_USING_DMA + bool "Enable UART0 TX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_RX_BUFSIZE + int "Set UART0 RX buffer size" + range 64 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART0_TX_BUFSIZE + int "Set UART0 TX buffer size" + range 0 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_TX_USING_DMA + bool "Enable UART1 TX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_RX_BUFSIZE + int "Set UART1 RX buffer size" + range 64 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART1_TX_BUFSIZE + int "Set UART1 TX buffer size" + range 0 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_RX_BUFSIZE + int "Set UART2 RX buffer size" + range 64 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART2_TX_BUFSIZE + int "Set UART2 TX buffer size" + range 0 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_RX_BUFSIZE + int "Set UART3 RX buffer size" + range 64 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART3_TX_BUFSIZE + int "Set UART3 TX buffer size" + range 0 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART4 + bool "Enable UART4" + default n + + config BSP_UART4_RX_USING_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_TX_USING_DMA + bool "Enable UART4 TX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_RX_BUFSIZE + int "Set UART4 RX buffer size" + range 64 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART4_TX_BUFSIZE + int "Set UART4 TX buffer size" + range 0 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART5 + bool "Enable UART5" + default n + + config BSP_UART5_RX_USING_DMA + bool "Enable UART5 RX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_TX_USING_DMA + bool "Enable UART5 TX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_RX_BUFSIZE + int "Set UART5 RX buffer size" + range 64 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART5_TX_BUFSIZE + int "Set UART5 TX buffer size" + range 0 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART6 + bool "Enable UART6" + default n + + config BSP_UART6_RX_USING_DMA + bool "Enable UART6 RX DMA" + depends on BSP_USING_UART6 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART6_TX_USING_DMA + bool "Enable UART6 TX DMA" + depends on BSP_USING_UART6 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART6_RX_BUFSIZE + int "Set UART6 RX buffer size" + range 64 65535 + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART6_TX_BUFSIZE + int "Set UART6 TX buffer size" + range 0 65535 + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 + default 0 + + config BSP_USING_UART7 + bool "Enable UART7" + default n + + config BSP_UART7_RX_USING_DMA + bool "Enable UART7 RX DMA" + depends on BSP_USING_UART7 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART7_TX_USING_DMA + bool "Enable UART7 TX DMA" + depends on BSP_USING_UART7 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART7_RX_BUFSIZE + int "Set UART7 RX buffer size" + range 64 65535 + depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART7_TX_BUFSIZE + int "Set UART7 TX buffer size" + range 0 65535 + depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 + default 0 + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 216 + default 24 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 216 + default 25 + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC0" + default n + + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM10 + bool "Enable TIM10" + default n + + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM12 + bool "Enable TIM13" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_USBD + bool "Enable USB Device" + select RT_USING_USB_DEVICE + default n + + menuconfig BSP_USING_USBH + bool "Enable USB Host" + select RT_USING_USB_HOST + default n + if BSP_USING_USBH + menuconfig RT_USBH_MSTORAGE + bool "Enable Udisk Drivers" + default n + if RT_USBH_MSTORAGE + config UDISK_MOUNTPOINT + string "Udisk mount dir" + default "/" + endif + endif + + config BSP_USING_SDRAM + bool "Enable SDRAM" + select RT_USING_SDRAM + default n + + rsource "../../libraries/gd32_drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/gd32/arm/gd32527I-eval/board/SConscript b/bsp/gd32/arm/gd32527I-eval/board/SConscript new file mode 100644 index 00000000000..34d88c084a6 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/SConscript @@ -0,0 +1,28 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +path = [cwd] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/GCC/startup_gd32f4xx.s'] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/ARM/startup_gd32f4xx.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/IAR/startup_gd32f4xx.s'] + +CPPDEFINES = ['GD32F527'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/gd32/arm/gd32527I-eval/board/board.c b/bsp/gd32/arm/gd32527I-eval/board/board.c new file mode 100644 index 00000000000..c4177401e3e --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/board.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers add serial supports + */ +#include +#include +#include +#include + +#ifdef RT_USING_SERIAL_V2 +#include "drv_usart_v2.h" +#else +#include "drv_usart.h" +#endif + + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler */ + /* User can add his own implementation to report the HAL error return state */ + while (1) + { + } + /* USER CODE END Error_Handler */ +} + +/** System Clock Configuration +*/ +void SystemClock_Config(void) +{ + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + NVIC_SetPriority(SysTick_IRQn, 0); +} + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * This function will initial GD32 board. + */ +void rt_hw_board_init() +{ + /* NVIC Configuration */ +#define NVIC_VTOR_MASK 0x3FFFFF80 +#ifdef VECT_TAB_RAM + /* Set the Vector Table base location at 0x10000000 */ + SCB->VTOR = (0x10000000 & NVIC_VTOR_MASK); +#else /* VECT_TAB_FLASH */ + /* Set the Vector Table base location at 0x08000000 */ + SCB->VTOR = (0x08000000 & NVIC_VTOR_MASK); +#endif + + SystemClock_Config(); + +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + +#ifdef RT_USING_HEAP + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} + +/*@}*/ diff --git a/bsp/gd32/arm/gd32527I-eval/board/board.h b/bsp/gd32/arm/gd32527I-eval/board/board.h new file mode 100644 index 00000000000..89d7bf77c28 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/board.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers remove the include of drv_usart.h + */ +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "gd32f5xx.h" +#include "drv_gpio.h" + +#include "gd32f5xx_exti.h" + +#define EXT_SDRAM_BEGIN (0xC0000000U) /* the begining address of external SDRAM */ +#define EXT_SDRAM_END (EXT_SDRAM_BEGIN + (32U * 1024 * 1024)) /* the end address of external SDRAM */ + +// Internal SRAM memory size[Kbytes] <8-512> +// Default: 448 +#ifdef __ICCARM__ +// Use *.icf ram symbal, to avoid hardcode. +extern char __ICFEDIT_region_RAM_end__; +#define GD32_SRAM_END &__ICFEDIT_region_RAM_end__ +#else +#define GD32_SRAM_SIZE 448 +#define GD32_SRAM_END (0x20000000 + GD32_SRAM_SIZE * 1024) +#endif + +#ifdef __ARMCC_VERSION +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END GD32_SRAM_END + +#endif + diff --git a/bsp/gd32/arm/gd32527I-eval/board/gd32f5xx_libopt.h b/bsp/gd32/arm/gd32527I-eval/board/gd32f5xx_libopt.h new file mode 100644 index 00000000000..38e087d4338 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/gd32f5xx_libopt.h @@ -0,0 +1,45 @@ +/*! + \file gd32f5xx_libopt.h + \brief library optional for gd32f5xx +*/ + +/* + Copyright (C) 2016 GigaDevice + + 2016-10-19, V1.0.0, firmware for GD32F5xx +*/ + +#ifndef GD32F5XX_LIBOPT_H +#define GD32F5XX_LIBOPT_H +#include "gd32f5xx_rcu.h" +#include "gd32f5xx_adc.h" +#include "gd32f5xx_can.h" +#include "gd32f5xx_crc.h" +#include "gd32f5xx_ctc.h" +#include "gd32f5xx_dac.h" +#include "gd32f5xx_dbg.h" +#include "gd32f5xx_dci.h" +#include "gd32f5xx_dma.h" +//#include "gd32f5xx_enet.h" +#include "gd32f5xx_exmc.h" +#include "gd32f5xx_exti.h" +#include "gd32f5xx_fmc.h" +#include "gd32f5xx_fwdgt.h" +#include "gd32f5xx_gpio.h" +#include "gd32f5xx_syscfg.h" +#include "gd32f5xx_i2c.h" +#include "gd32f5xx_ipa.h" +#include "gd32f5xx_iref.h" +#include "gd32f5xx_pmu.h" +#include "gd32f5xx_rcu.h" +#include "gd32f5xx_rtc.h" +#include "gd32f5xx_sdio.h" +#include "gd32f5xx_spi.h" +#include "gd32f5xx_timer.h" +#include "gd32f5xx_tli.h" +#include "gd32f5xx_trng.h" +#include "gd32f5xx_usart.h" +#include "gd32f5xx_wwdgt.h" +#include "gd32f5xx_misc.h" + +#endif /* GD32F5XX_LIBOPT_H */ diff --git a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.icf b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.icf new file mode 100644 index 00000000000..0c38c558970 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.icf @@ -0,0 +1,40 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2006FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x2000; +/**** End of ICF editor section. ###ICF###*/ + +export symbol __ICFEDIT_region_RAM_end__; + +define symbol __region_RAM1_start__ = 0x10000000; +define symbol __region_RAM1_end__ = 0x1000FFFF; + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +keep { section FSymTab }; +keep { section VSymTab }; +keep { section .rti_fn* }; +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; +place in RAM1_region { section .sram }; diff --git a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld new file mode 100644 index 00000000000..5bec095bfb6 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld @@ -0,0 +1,142 @@ +/* + * linker script for GD32F4xx with GNU ld + * BruceOu 2021-12-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 448k /* 448KB sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + . = ALIGN(4); + _etext = .; + } > CODE = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >DATA + + .stack : + { + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >DATA + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > DATA + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct new file mode 100644 index 00000000000..56a5b1213b3 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00100000 { ; load region size_region + ER_IROM1 0x08000000 0x00100000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00070000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/gd32/arm/gd32527I-eval/figures/board.png b/bsp/gd32/arm/gd32527I-eval/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..45f85c7db68498d87e51b6dd31b1dc04921f6172 GIT binary patch literal 405988 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�_b7Vf^2jZO>6qRO?DSngO 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≫W@uP09MuH5y;$VyjhS&Su4F>iFz4NBm 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%0AAT2WiSPM_aY3mibXIV}+%b zIY-m`Uem)t&O>~jL;NC1P@vXi2w4e)=hTE@iYt$d{NMfpQ{9CMa78sidCST{#J|BS zxCZp;4B$_m(xyl9IOtlLk05RuK4aK!r?!6c>8Wpp!>)~I)VInLZ3G3IIvZ~YpV)(o zz+&*0HRL@`lAab=@`|wh44;|9eK(PkSsPldMJFRN$-vMw$WC`77Nb3;Z*{ZH&Zf>p zxZ~{+gi6b)=-(4oO%(!@Z27U>3c(E>>BCei{MN|oAkl9%%!K6G2`>=!C6pks-JPzs zQZF&dsMF(p*>;S$$PzgPLP8rfs2GY4aA)M-x%WI& zyPwH+q4vnEYABl4Qeh5Y$Pa{M_;*4v(!ps8Y{|2`HpKg;aB0v7U~oxmVSBdEinbod z<+`vS?*~;t$xDem7d~~NPqx?bI{X$g_ z$SxDSf!E?bG~~YdV@`i6IjM<{_u1pSrbJCfLQ_LI-Hp}Ew;RRc%@?On#RQ*FFG52g z9R43Ql5WB`r`D$Zkn23`5uPyk=}kve-XF7qK7>X8@9qk5jqJTgQ8@um51h^C?Bd`w z2v|3hWM@8HRX(|JNyJpggHy;~eF#(FSBZk*U(1Sr&%%oRbB*o6@ms~MqlY1_+gANY zUT$b~f&v$a@`_K|_J?3LJ1^O424eAk2ZH>(e#FlYojeoo;hr=c(*lY+K>`SLJ2*mw zkilT#`nAh3DA+wYS%su5jE7No7Zb5+JwKQjeuwjiTkZ>{x9A9dZM8=?R%20# zR#Ki~Du`R}9f&(n?8^~Pjv}xL5z`C(tT=pAr6Qpw1n|5yw6gW!Te|Kg17(CebNPOv zM7xkQ-pJMnPB#jOJbiOaxGg~D7e21xWC_pWD#q89-jkTcOo5MS$oAgZR5r8f4S(i~Lu~X>+VjdzW9D zcgml(Ow$S9hsv|USp)n!`&1AH7VpX$(w>D1)zCPRGmLEWdrwD5;66|iy$6$hOD`=b zbJo2MQzhaTI^+&2dOulS>OwtS-QeyQI|V;CS+7BeavXs!!Y>%L$5&d$Bm{*((}p#p z0Ut2xfIb)l`2VF%Ljc&Bwal-O-4<*}85o7oGEy@ks%8vGZwaIH{Na9sH11e-n|SU- zzaic**9UFUog@(cfHMXgTg*yi*LCNEEq*=p)_mOyJqBl=(x;AtUBkwkf@GyTFSX2E$wnamptxnIR7Q zup<0dgfYs~|G0i|8t4^^L+-|tpmb!-P-+Mb00Xg|k|($k)Z-tvh;pMH@wI@_ylONl z6|`6{VE$c!4)mK8^D%nEgCGWUcl^7Dg~}`LE9X!R0l8i{sVa5>=*?R$S7nHq7k!#1 zBu3BJ8j)Zam}uO)|BAC)F7CQR{0zTQ7F2~_D@Bu>d7^*;bVRa3g(YMF=~KGg2|l^z z75*&WE-x02;$uMuo0fHnsZ*mu?)Z|V!*TOLP4oWF%z;yc^hsuH2kTsU=@Ohyj`|*wm}f6wNk;32Ed6VkkNkGhbkBTqQBi zJ8WS^*ElvmWyIs0-BjF9^uU_c-K^u7z3|6riHp$8pI!Nnx;nSlgLlo@77X}B=2NB9 z=VX?#&&C_+Do^b8M+d(*mPubCp5x&%h2$C%iXvM`>{$MTX|$N&{|8D^)JsS_x%FV9pwH`35c zla1^GRACPy?X$`VI~2}o+%l;gjwqt|QxL7OV9zLY=LH$%P`oP9u?q6rG$SzH#dqsp z$sA9+{SXn{KJEFh)irfRa9(?JQRMNIELl%S8mY_k^maMjck6O`AD~dI`2rMfQpR6) zcgvyCI*A}p4^f<4GEV!@j60SdM+pzUH3m$O*)E!(X#sWS0l{HOPDHL|-h1~?$?qDX zfC>z%Ju9^qGC7_+tjw+1+*jXq`=;=mmUv}$z^7^)GT_aX9~?M>Gd%Lb$!Vp8MysNa zyhO>YA2oM!-YkD>Rl*qK$!SkhQ}z$DWS(`y9epOP&Q^i4g)-9$96s55-&N`@4qzp3 zb^9l86w=pwjlM9S^j10^RW7cCX-zdSN zo4>Q5wT$7G!3ZDSE?*;~d)1ABL0${sbT*!clAg~Tq+eqVUq`p3`p|Q8+dnH2pC}k~ zJ*Cn2#HAnpR1Pnz@CEYg&n~O4JPSn7!TCHJSa;f7uXDJMT`FJk_SD?VEBx6zTmQMt zQ2G`?Pdo7E5(Z+V41Wg)S9N}9UmiV)KC(nkGy#nAK4z{62bPR_9c zIT6;jHXj+?LoK?6C2iCyMNVOUfX2egf^8?)_<8)O$pDBi=jrUtOQX*eoQ?8KB9`eq zemT^)u?uQuW%mah3{g}FY<-T0F482HSs%W?9?81Xo!lGNmm;}jF*F<(BCC_!yLTZN z%%Wy^_FyY06;WEXiMY!~!0zHF50aezG`|tFFHzx8sYTy6Y;RUyq}(n!wD zKFQnkn!7xHv+@y>6?RDA+%|P|@5;D}i6FnV(0vOos35iN%?huoE5=>E!y*SM;d;`e z{^TN1Fi>Plh?s469U#@vE_RUh#$b3x({;qxf_WGI_W5x`q`Nu}VL^EPXCXI{VJ(PW z_Yu#*1J{Qw+r@IXFUV#oa~01$9nMjF)2;p^C2(R;4_L>h{&JKPX8q4}=X8E(wGH>Z*iZ8B&m3&$>prP(h`>?IMDH^6xDJ4iHd{`VlSx=8q zZ0hT31?_4PlZwm`N6&PJ!V0IhKGp#q1nmYh)r`lLfvNmTYR@^)iQA#g#p~jzLIBO* zTLPZ@GMn>b%rhxH`lqco`&VfxrqPIv_4(QDAgqF zqD6M+mfw!HM{`qnv4^CPwE&fka|Ha{S6`9jW^rnQq1^;wJ!?MQXumIe#}}LNgkB!+ z(@06(BR*MSCNLZ&{k0A~Ps}WQ8P zf6r+r|2^E&rgVjyXua5IRGdr0oNRVjFJ)f~Or9d$HQ=c1%rAF4-?ZCfFJ;oGO@p(l zD*Hhq4>dA&cp#g)d%g8cWq;_KD8tbFPq6`Ij4eB5u9|jwy3~pEx3xaEC>+El+udxO zB>Gv&gVy7`84{6l@0NFB+eWDiQOG9>g$lqtYdyhdQ3p;ZMk@qSrsjZoIYN@dY2WjOg z3}nO23tYSa-#E0X3usm^bWo4=qc%7!>2mmq;&Xxa<>20(p`@TdK{&40{5-(|{eX7U zGt~o;Xpf%s{l*-&oT48Qquq}aZfTa&E53}*9L1t8aq^0n)vXzxAI!e2*S!TGT8W1W zFQnqxZkDqxpAsT~6IMWY_GjzD=QvdKO@Ca@IKq0rmFRP3!k=Fbhnl5^7_gYQ?k*C`ey5J54a!(D{BdB8y+%^e-18gnn6L>BHt{9a3^Y}ey?Xw zZMp^kadgCTrsoIimiFT*8F>M<{iXJ*89#6@CVm%Yuil;S@hx~W#nnD#wc*o&Pw39S zEm?D=2?~=BC1B;qF6E-C!i@!3+SIYvOk!GD&#F}@%zURW*eC#^n~98odMd}>N-G?o z0@6W2ZKVA{5DmZgYpvg>AFaFVUy=q>80=mO`{&jEJ&DG9UH!U1YMVgQvqs&pUzPb&azfHHy@pcx%XJW`7_fD4M>74w)<(>JCy6$8W_s zZyk}LOEe7;ltWLmnH^-0i!YQEJM5V0vKq&Baa}KZ=1Zw3W8E9aVnL1$C8cQ-3#GDUHY>Q9z#GbeSj-X~zV-UL^b4 zowVj|8DPA7h+Yf(hWPuJD(+geyFJ~ej}FY15X3A0x%yeR23P>MW{qV|03*I*fI0nR4p?3SbaOUwT4!& z#$q-+$)*mVfC|OLdWR(otVv_tCf1$A0pc7f8=ZTJ!CbGcYTn!V>TbduHTXtLf@`lP z%Zq&Tn4m@VXde1JR7^($i`&uZuX>})A-0t2AxBFIlO!vOq&v24+g68PY}>Z& zWHR@jGi%L1*n91&+HXDl-?frPUkK6J?pavtP*_`AbB+7_@9M?W{?VN?V09AHw2Jro zyaw@)qajw^3MEM19cgK6jIL(3y~*NcFo-ZpfC!Yvhab{?-y#wiN8~<7mpx;9OT(T# z{!(--hi2fWft%2sw0C!`+B(vY>0cE?$hw=K7FChhO4w~b6rzTY76J?L*p&C3VSbl@ zsA9@tE}n>JCLR^PG+k;JKa{SnV}WMz%0w`~D^*!Q!MUHW+4V`O2V-a=NpAVC{JIvxt!zC6 zE>x(^&2DPEwaNAWpwsNYD7EODeV$rk(Chkhm#?XaOuPLSYSH{H&-tQ;IXpS#$~BlxpOjjpVmZmCfB zV7ZzJm!_cs?jgt>l{mHua0UZn+x*P|vZHqePVoL;5NSDz2`Q6){18AN9HM8_zVZXM ztG1@3gy{((nJ2%D)xVSt&q{$y2px#E^hE;8g?v)?`yy8fFB+5Bsl8H>+yxA99|UY2X0HK8wMzFeK0JW+Bj$SS z@dQjg9^m>_S8=enJDt6OW0J>H#&CPn&>|ui^Gtyq<8o5Bk|88W^C^E9udO@@%J3SZK=LMrG+s=nQ{XgdeA(;L+SQi%yT%c8!A+%;$5h z;Z%&w@pNZxN<{Ds$SZxuv;U^D=ywHuZnl_Hzu*4(l`Mru&OkIub32=oA*I@5w(WmS zK~-4VztFe}imYyGUa6xtY$T`flL~ zr=(mSC=Sw^`_K%DwCqXCSbZ4NBKO`QDmc7{ej9+#jn6G-qb-Z4?TDxCuC1+&Ah+t| zxcc>j6VmkI!Grt4!ChydiO&dU^{c>L0=^n z>aU(^vHnj`6Y+lm6TwMeJsNWcD&+`d64b@-K4T#OhRF&dxLR*{)36=+RMehM{MJ>< zI}1i$3O-koW-=Un`~_HOcQpA1K-?3c@2sES*qDRd_6pMuC3hVO)~bt0|EzHQ`f|>( zqb5H750QzXz+_{bt?<{cY?>;h!?CtuvcfW_6Ox<1JZjW`#{W?dXFC#w zxHEn(SA?X=;!I2}kCanCi$Bsz1A6l**FDplf=$69CJm6W>*)l3F1m%E@+Xi9uD9my z$DXX-;6fVF3NZky^}vn6!IMoUpG8`+MDsMGL1d>JvHHfTj%)5Y{?Z`|K0xBeaG0km z_CwUeqPF9djRo^KTXV_(f*$!9j;A@C$INo|fPDdK=KRt@5VB--kG*qpw;nV=1jZW* zQh;pE+lQrS2)-EOC1(65joZ3~+2s|HMjHI{qS~&8oz)Kne+b;!l>OeL9Ih5;u5w1U z2tTd&AV%a@CCj1xAXCzHXlw~wkY3O`&^F;kkqFQbe4Ac8uEl;~j-rNbPut;Y#)FL7 z-h|NcYv$~(|Mic+lFrl*?ewGSDI%7tw5lqWy%f-Kg-Y-xPBhxS-;Gum_D!M^5`klf zpsup&)?zcIjPPF7E^dAchH4@vvFK6}=m7nIO(E7eCQRrGWL34FcfJMmFu<8dXV@c< zlq7>4e4LwvHTA{krcqz=ZAFrx?OdrKeootU^F%&+>yoaVAl%Bief&f_ZzUsjnbl15dA zVL{Z+VoH?fN=f;q}hv!K|~iUoA_KN zSJ^l4F?lN8eV##K&qsOb?^$4xjH~2m&j=bV=if|2pajq}S1&Ne-U4V|Efc8)d1nn( z&>F>Iwl?3xjBe#C>5r!ueDcS^NSniwV~2g&79u#gYlv z;$9%M8~va}@T%D0HRjaB2ff1!i|hAw8}SOAi?)dyJS&NGjM%v+R^cljRp9&8GkFM%iYQg%2(bx1A2r{cs!GR6s-P~w>MN~%(l z!{jOd7ra5EkALzobp$K2%Rk~lS_kX*VTmaSoRw+{hzB|Mk6}D;A&daSqtUCjkZW7` zp0SPdG-#n^_UJluWjvD zjRl%d9%NHCj3Xj(N3NA^TitiuGBaMDsx(6|(AwTGyuO8W^*JcGK0c0+u{WiJdWpN` zD(C@z`6022&`MJ{L5YarM9XAN97*~zW0;?|WoZLA=$UnRJ5ZMOSYwWlbn*vJmp0@>ywea@d8(6-(Y5A{YJi3#ya0XM^|DLb?!x2x)Q^mG*RB=-OacRYAJmci0q1n}OdPv4I+C^@@e1-7p(1DT4d$`v_|oSh zi1bAzo{2hCXym`T3^W~<=b&oZL%Pq7Pu=Sp<2xqJ$LHj9vJOuiyW~%_EJzw_MH-yi zhPO}BR3J&uzAT;RD8(}F{>3&Hjz+wZR?f$DjnsOz5_(^=YY)1Kex^Ej59{A!r;lC2 ziME4@Mi^lA%5d7O*vIrB@AesPSImT9NaVUvmZF%jyKDZ&ANI!EC3-7D!vb+9eEEBc z238FCgMod0enNF@r>E&swN}OnP?&waqWVM>eCf!SVx^T5%OXjFwnAGV#`Co7ZQmYj zX-C%45B@aP3jOG1A*q9K1>F`$*x(L*S7_$Sq8SKY)R}rpp4sm&E-#C@!ko_rIVK7BZO!w|BLldDI&?;kI zj4)=NMnG6m_0d-aIZ@XfES|`%Yc{wWp!u=%D_|!N0rD=1TG%C+-$iR~@MxHcVvP zhMoY^1+=~q?ADPDL%13Qew$4b#gva7TQA}IM&6iiX7|p{Kq1c^;lun_K8`b~@qA=# zW>}AFElgwY;V>`uPKM2$F8+n~Z^cS_tu9p%s9MdMo02i6ap52a298?K${1WZ6Fop7 z*N2))wX%WvSe>zP;SKCTsu{>50`{0}YLP%k*LPUjgi_#G2J~(^a}p#uJG1I}{PUgP(9r}qI2L~(nnPyHgiMSv*U$XOVIjhf zx_4|1TNZrj-xn)O4ml0KMAi`EGX3o$a0GVR972hPMB9~;(o zg#OgW8j&m*(~wK%cKOxU3mRoF>RM^vqd&Zv3jnlSYi3};f++U|YDP2tcg&~MT83Kx z)&}#>gGRL>>eUcgF-c1xts!P{I~_K$hYQ)v_;$CT!wlRd_Y6Q@v2Pd8Fn{u;}<@!SqW{~RVTfKO1E~Hkm!&bcd6GYY~ z;1JpD6YObtK6eJVKSL@j+gAW0TZPazUW=J~Kq`9y0sj-fo@ef#?@6*`UzXLh15TC( zDiEJbHsA#LC^(@PfyqJe&~gIa-MLDlk3ZPSLMFY~r_z@5jKD$xbuLh+skR&8iDe;O zfa@rDs>s3|h>rt6u$)=Oe(wDtI1%mh7sRLv;8zxbVP@H-aCyBntTi@ze0we42`6}^ z^e_uxTIf#v0;>%j}_3kSy)3Rq9Yh4Cvsjvl}Y zH~VQRJV#|tFfmExyU?qQ+b9bG(+JwWfyt$a@IoaT1`MYQw{3aLEQOJrUz%TP*=yiu zsOdX7zpQG(iQ*`jIc7K9T^#;Fov>1AF7(^VIqi>=0tNisuY{t;UbfwUa)qjDN$z~RC@$%7joALyC& zokK|vyo7SdBfW}Y|Gp47usb|>P~PsY?(N!3sI6LAex|yCHqSc`?rsDiM@1ii3NH-G zf7dSZL>tIba1iwZq40-1v3~TV82BP9R?0?rd)R18{+Aya!oG$vyR(!yEqk|!tUaQHBe3Q3y_qrcpp_X zqDy1Z4uNcW#U)p^eg_dXZLiv-@5r~i)n6TFK`DAs)ZdC@fng@>r7>(-&!jYqRGFjH zw%LqG3ZsYi$m)G*&by(JNTJ;P)=Yy*HFl=r_#i^2haz;4!}n91V4YN3!*LBK_VKC( z7dU0+maLh~so5S~aggG&#%O5cl2mM+84=by?VA+L)Z1B(VA}Gwfm9~7;`f44#8kn) z4F1v5as!#73ahkqG_Joo4&uIVjpdolMI~Q;Vba{sp=A~2bMq>H+AP<~RYH8)tOAC> z0+O;tfV%xV1TLw}eCx}1vU)pA>9@#SV=zdH6)A8Jn{NmJb&Rxeaf=ZPwFI|ZU#!)v znb$}P@TWokySexTM7%bl;psE?>~{gqeK6IkX`pWvZT2;Y79=lRM>dKcm|cNFq*7vO zkcsEtlWcrm6y2pT;zQ|;-tghezcw4QE;XH-Km+Er66}@zedFD}D~bgU=GX0>S4Bs= zKhBvXL#^o?yaFoz0?@$f1|Usw!fS>RH8pcn69Bj#^hHDs^ralErycwSqcS<2YDFk- z_1$vu(_kAOw@5ax@LFNqsXN^$P$ZEeVa?j}oeS?#CJK#0lM>4T=gwC;Mm0B)LgR0R zDGNhxv{0odt(n`ZJ$Ntm04qb>B!$S`S3z@Ein9NDT|ol}h4r6K4y516>i7%xenz-Y zl^YEld6}X!%uz{F!h3AL^0ZfGF!|H9+i8tO zXRdUztt?-s63$PCyOGJiX>Q5L=JoMpo)s587(jTq zekJ%dwgQ*dI{QGo4V~!&$0n>QT;1h|8piJ0ouHfD@sE8 z@1NcnAEHiM(i6r`TAkIo+4xniG_ig9yrPnyovYsqxpSJu62JRbP~bc9b~kE= zNFQSA?99SBLx)kjYn8jj5>3BeD+^FBaAYt$TLRnw%kG}-F$%5i_e;3}Kb!_!w}r{) zYu^(_;v-)=htKDCxYF0z$@?=TO&t1t!G{J{8!WrYZ zD5${UAVk;aqd1s!0B z%|)3<-QC@1`IxUy8cyND8*XijzQ(Fly|t8zzq7O>U(%RcqtDW~IVst&b`+0xF@7fT zzLHUTdsRx8jEuRgzVM!So5PtehoyzgiooMX1f%Ir)bOa3{8k%!F**4Ouff;-D5hQ} znS=jwt%F1Ffks3MW#z_jc)13*<^LoC7XaO|O z>Hq2n)&z}!jND_R03Rw@uKzND z{kU`IgG_!2UH>9dfQ$WZgos-Setsn^Or5C&{{sQ|gYOFXBMTyPPHs$nXC^WVqIvX( zNGAR)v>AOoj&N9a*#MzWHhPftfi~~#UFw!q=u%7~yOSmRUlWQw8q*6F9@n6`1W0j) zD!?&^au0r*y{Gl(2n7W?VkOzr7Z9x`Ga$7i?Bx#Z7DpL8bsWv-ZQR$GRg)QVQUAL1 zW!yb1wCkT`FGFKob{F!;O|Ko5qb?iFH=|q;DuS0LqVVVAG)dY@O;0{EqxRX-yPfEz z>`u*e^iEK#gUx&Mk@bv2Z$b|&EBf!g*q%KX1T=Fi&|>5rnVb%X7F`;wRv{ckg;;$8 zI9M@;f`XDfNT~kwvdRv^E`?bu!k64(dvnX`$kTNsF6Ei*^LXd?LL{LPIEro{>eE|C`Xf4Dq$};M!qBtIX4t?ZN znMY|DRWn1hLMAKHsjjLo>e}pSGP{p%N>bn>@KP+mKRk3QuJ5@0)9%V@=hG1&jP#C- z{=I!Gk)vZQHiJc*kGXs(^ab12g*~%PL+mhK=W@nCFTYu5bh1i&bv|uRj8F;deVx*X z_*AWBuW!*CGPWBNMrU=fP*VU=HQkYn!6ycZ7v=vya+bAmjsq|TD?Drjas&_T&oFQyDrha*rsad#D-a4mKZ;RzZicq$yr)w=c27f8uCaLV#v4K+L`zb}q;w z?o3A%v-;oa_IW5cto0DA!yCA;7Cka2NKo2ed~; z7_^rDV;dg!oWnlFKyk=^}w z*v9H0GT5ejav_Fr#xEH*^E_T)z5M$i}BJ{?;$!Hmpa{j5X?haQ*WsufB$8}#SDD~~hI)s@G z3n$ZC3DSwyo0|b*fNHmO6C6rapO8I^gcP4AY{~V4?x9bItJ78G(wQYza4~)a+>v+X z3>-LUCNEu~uxL$bLQ76C^W5)zZyG3B(fVq zPX6fNUxG0DE2gM@p&)5ZToz%%olysL3yZl$=|@!?#wd&<1V~zc{|dCj2K#iW6T-1- zt48lVh~P`cyHf*4))kt-3!vJ2Mwvluf7JjTn^aPzv)gNrW{cP~_Z-fFw-shw8WVT% z{|4@s=yL)-oOU_88y5TPRN2I)L%9gJYH=VoJ{14I`7cd%0@OBh)?c^J`S8niW1exa z|FBVBOgP>b&~jwA$?W2P5z&Gt0;wIO9X-kdlWnOgE2`wu1VgQ^_%4oc?idC5++`7I z7}|4ZpgwE@D5Et5@6c4>q^_pke@|(x{(jX)krXDE5XH^zal`Wi>&Bqi)J>5H?Uvz~ z%;U|ej=^i1E|Fy)F?y|O#pO}<=?e$r|0)w9i;FE2g3HwHLk(zJMAe|3KmNJT0hHs^ zd%&A}{fbi;mYWid!YS+wmvD-^Exo{;PI=B%*#3oLKU393F{>5f8Of1Pe)yJ!j#y&y zAt0(w-?+bCdrn(K_rY4Sng8xQ3i^A!=B*t8&^85sY%El{j(}s*kC=Z?X*BuzvGr7x zBKR37oY6@a&RfmUO>h~bm+b?IbOUkwreLo2!w(knVnhBreCF{o8bjs555{0dpDv^K z-yA}wHqxgzhn}ab%Avl=<#@gH$j;}!i50sqZ+@>MHZv?mjolpTfx!Msk;T1F1(`)7OB>gx5Zdnq65B+`tCGwmV^6KBHec@kQ&V+^5R!&s(m4x` zcy3=i7N9+$d34Vui&cRkt}l?qjIlP4Uz06CG7a@EJOY)nKC?PYg;yE@43M+@E>**zI0F8AyEwybhOzTwh4OQWcybO#zD}j`1?<6;zITa#^Xv^ioD&Sf%d(; zz1|N!@c%`Nq7LQuJZrFps5U9#G~X2He(*p1x3GfqIDcxC>Byurl-ANUSm#i5koi`1 zuc?~Q7-q6H$z`l0S5#?`bdJ(;crhA8A$zrG9d)_5?y8!SRjs(W=@V;`BR#dZtaSo^ zzP6HqHqjKs$?bNv$QQ*>)8C(#z`}Of!b+pA(}9 z4S_^#K{;JN3e%#btb%Yvv$9Br?N|S1s8ijmU{$!p6nP!-j*0C+yyzT=?-z6uDZtzlo)>H3RSL{tgv?0Giui-`i6@ zp3(ih_SIgiszFGqfhP;Q_DgDGQI`DxmJ_`UN1fQo$@~#($;H4UsuotAeqjh3$iIr8Zy#WAwIau|fMRH>!zNiIKXw z!JIPfDfW*U6-5GLeAZ`Qp}RF*!$MiD2yU6NrT!V8$ZmDQ73IkD+RFZ0NMV?wfe6Torgy zw4T{%3~c_mZj7Gr3kq=iFjnPIe(c^yhq79KT^q}7X%&W}`yYd2;QMy_`>x2)6hNwj zsxylH`PpZ)#km1S*~oz2Nd=&-iN8nWagBo^_xe!JcFZnJ<#~#em0IhlYaS=1MP2iH zO894OM$Nsv_Nf0}8t+_lntIE!Qf{#&zM9xaJG4k8NM5mVNf)2T+vJ}}`*TsRrX`b7 zqw|5h@E14xoA*Xj%b@fcFJ|!OqPy5h-m zuK{=|loxTYHvy%gL0JLy0&CK5nDI%kv?GhX>npVH$iXACsv|E(SHpnHy2HUTx-WWA zpbh<64g4MbfCx_NR863gK|7H{aM#<`hdgIfzFQ%#+0|2swF}UB@qb0iAyW|#z7-lr z=iiKHMXyRZUa}@)>HXjm+DFeDND5op-0}dq?TFXF5Sh1H||{ z6!S5MNb(bf#eDyv<6IT{nu_|w7mQ_fWOBY(78pQ?a0r473D{f;N!M^a{33S<`8AGZ zaYc4#XcQxl#D4lborfi2$&EU&RZFg+(%7peSmm*QiTKa8WHw&GCBU}W)^INI)@k@F zVili?h``@4(qC8SiIasnq_A=6*fJ9`aI0oV#aGqbd1c5oVMKj1PO2W_OZZk|*L&w0 z%#e;4Fk;uby~wn(&j+}M>{j?mV|2)!YGbT5E?Qu6?lx-+)JxX**qxcsx|H{ELyg$7 z2vMA{Az!xlyt&^Fi}dL_FU=(a&sgzV~(o0fAhQs{&ftYaNO}3jXwR z|Jo(u;?i1DqWF5oAAb;yOD+wz61Y#z7+Y@S^ATN1z$G(G@`el=+7{7o?nybK{mo+W zyvREGM7`658OZY!h1m8XtSsqQ?PyY$o$|laa}QJWSnSiG%)Mwcr)9ig5Q}$8ey29K zB+@B(s>PCE$R$*rlMQ%`3LJ+A%u$sg4hOg18Oxd46H1;(WdzO@dcQrLuXU54HZkF) zT9rY8*DrhhVc4=A)HqBx1oCs$=R%8?+e(xkBzs`rbVj&V+JU#2*xwtt>=h5cd3^0P zz2HL7G`5_eaH|IhgF${`}vSjyibc9&5X!(FwJ=E zWn00l_ML5W@SB{{gV(G@yP=`eID6w#T|Ax+zlh8$zt!>MxU2fNlH-SPNMYPco(&lo z;Q8h9vdUQNXam(rC`)a4Z)-dBYPDkj^;~$^bj&vTfRg6X|l{wzaHG2CcbONj>7E*`tcGchqR|) zFDVDC*Y5^S98WvytX)MN4Bsx|M@AL}t5f-g3B0{4<>;_0M*m#8A?hV=d2%@@$fS2< z52?ygXzsd_7dOZb7@-@^K8*0ayzf6_+NH?QCGL51s*({VmV8zKYP?$$oRhQV=Mn&=2UfZ*$Vcfvb4VUQ^!I zwjFhUaX1RG)^Yg637zS5xV{Q~FFt;I7i5-gPO9$WCs;XdZKmVn&&v_M?Mnm|0Bl2S zEe){(qgAcJ)CdH!(A&+(()v8~IQ_@_IP2Vp@s#16k2L_$tkA|&CQt04QOJr8;L0d` zynz{VQHF&3rByz*mOO{e%4lo-_sJ5loy86Q1#Duf4N1EoZ553} z`^?-05><^rH2jR^vV_jRLS20mTof6oX9N3v(^v!1j@>KzE#=gfwTkK-ggs1)=b+jNP(30Rf^s0Kyt>vuR&RBh|WXST@PfkW%Bm@6V zM;64fH}E2joT{krSg7Z|fuTTQHepy{x{$)f=iVU zzclgnP)pal7iQl~EtG(9XSDbC9*L5X>v(;0_#PDr9)R&RIAkBae+N-f;7`66o?l)tc)cbb!4{C`ih^qTrDNh6M|!Ns0IBret^k9&Ovip{CHV zUmFi<33Je$8+ClT!6O#!OPgp?Z12u=F|{IHf(OlHTChc$`GttvFYj42k{(<5dJ{Bc zcJ`)!cS^k7R54@Kr3c0Z$r8eM^ycBgxQ0#GtRRZ$#Zid_BhgOI00%c4QVl`lfx~ra zLR<^zqFx-eZG+z}MkL4tS>mXc-maD}9o+OYhp3VbG zr31?wS~9yB-QmEhC7B_@5}BQ-tF(Mh4IJaUtVExFSU=|4rkB~_5kC!l4Uci z-A0C!A2oRe_5pc)DE9+k^Odhmsb9yKTKP-AGRnh>pL?)_M{}T#_7|jbH-R{N^*1q5 z^yJEtMJvgXAcYdcOc;gP9#Dj;We{?cAv4<|SY{w4aTM;*z^vHn{-Jy5aZ5sbf=}8!AYq%>hRG%iLtjP7fCh@Y&KhhumW|GDTsQ zPtmwPmDWw?@CvJOE%m881 zSxXgg3FB?2q5K<-tyz@tf!QdA@_%KEysn_A2KFNJL736 zYb)X7fn_c+ef}+iiT}XD%Jk=81PmQ#vt}%vdK(vS#SYIEIivvT2sy@0g3kf(!+W!@ zLt*sjTs=8=lNU75p`1@^StKm`abK!t1`qi{a4ajfekE{(Ai)qA{=kB~5U0LIX3mzR zmxT@p+e0@p2z@^0q?fzn54SX$cousvh!+UwI7d@ljlX`9#LVM*S8)NUQ11*4h?@$} z_}ea&QYuA;JXgr^RGZ#mbU>qM7D?lCSfK~m$Ck@Dj%AJ#kZX2GS1iGRTTPeoxFjb9 znls{ZuXSU&s7*#Qso_4zmjz7e+KN!gEEzhp=1p4c9|AFH{YI$hkyfoGbxgaC0Ag79 zzii-b%)hy7<92JPu*xqQCy}qW$QOx>L3dT2$13JbTB03pf8jwM0_^D|~ zM3njlu!7v7Qbct-R<2n|31v%H9W7;K>c<-)o~kO>cEge+zy<}of0_h~@}M*^x zs)sR45KB}kO2`Vngx+%2Am5%`jHs_nU(2zGi%29>eunu{RPxYK17>D`YL zGz(Q$xc$+u+p{0I_h~*`)ujg0>(Op8e(v={;y0?>pD|ABhH zg1>K}t(w;LceKu+G3MPOsEyO!+xLg=>0xZmANRCgo9(!Xc-n^{PL~f_L zJoPKw7vud~N8wpdmtV3F+hp}8V0l<>L<142#a`1Y;edBO-$!atpnIUTnIAhP%TiY- zqII$ik-1=H5WYgHBTEK%x1${V9WpgRYqR4mQLfDm@uAw53j4ZunI-77D_sCL3r`I` z^Jnh`X7*6^i1>I$Aq=|kW4qndXMMOw#P3BA0B8QC(-a!$Q>S-x?-7FLb5oZ?(ds z**LQZIfCN3&dW3%55_?^3JY~*N7sS#Cr%F{7<$jmM0b%*G~&R|n5vEVFFTS$knWj) zd;+(u`c|((2Y2_dx$GA-Fi60m4F~0zGmp^=2HE#DDw7u*iR&Gr=C4WIf;4vRc$UY} z?CkXqqR;(5&C$l-e%tI#b@lNniF90c0mSp`lAdiT%~cshHn zPMNE<)#&2{1|iX2_dhi53w}B$70^0AIo)sjLdx0JHEU`{No2?p_Uc;Gv;BazU#?L1 z0N3B{y;56jxn((%S$$O;;fRR)a;`s3T%K?;&zwX`%GMFhE)i z_>X0FEdd}?kc$iZSBGJ1qdmJzq!KDpN?q7M_BMIU%B_FsO5OVvnc82Q!o`7LEN@iU+!lt5?oxd)5 z#67n6K3Q&_xvWAG-s$sdEv;L1Vx@n63YXDLiLieeyD+bl8gVsM@RHN3vn+yFqrwlK~tXlT{0|}K=6OOksb13X>sm64Z!CPSx@6+~!*_1YobTd11Tz_{` zp1?4gFVk6CvRfOdO{)WK754k~R)DsHTN2BJgS(%M9&q~Sn#Uk1ER}n_Y&QuCd&-`Q zlPZzu_wlSNA{rV-a492($S6KT1GN86KE8`2xT5Hxn|-EmUdL9{Ws+L(t;t|>6=7wx9;r5XgAv& zRA!WbK2g_#YReqP*qoSt2E35L;!uvBQk?f>bYLJ~4g5tZjyPYkppQeZtFgh;9wy}% z;_qG&MI(vnx=XnjwW$UeK-$nTE6r$b5^P%^#j(;Mks;$jpO_9w!IO_dLGFWR-*&mm z8iH9(@8LZN`QqBMB_13Wav-{Xt9qDJiDE2RUwLpbI4xDD-?{3HqKSFKza`^x_J-1I z6)o7e0*vGpZ9P4&akz=!Tl&>iRUz;~UK_Tfv0m&T8*8csGv)*4B^cIe1$eR^zip3r%>CoZ(LX0NQlO#HPaSdxeGgqbPxCMoJ$1eZE!u;M=8uQ%?@ z9Q^+l>bJ7B2?Nab%GG6~2y%ho6wEZBx6b8GzWa9cM9tglHDTj#P|zk((kfCv`<=Yr zx04S2SnrQ8Kojq$Vf0oh2K7VIe10H6K=_Kue!VOmbVn>p;bvVzQ>JBnSQ4_rJZ54f zA?UKtR`F7x2WB=b(|4HA*39?_n%w^Fi@PU$5!HdDpdSLFPJn?3^3D<>uVsS%$Ad>b zmh~8_*uS!bn@ev}x&6)W9*f$NU9p~7@YApafK z=3SY#clej4c)y--YycC%&I~FYOx6>Drtf(hVxi7vz3s+GLQ2Yk4+_$IJX)fOywT1| zky?&U*QI0c0sUQ0nvZazIPa@3u2c7kQxB)(5>(4MZAs@{iahf+Li(!}ZvV3xfjwn% z3pEc16Rn`n;x4Q75ra-DjHmoZoQo;~HB?)hNe`?b3 zDp3+roT?hMZ1A+q{0Q$wLs10nKb|q>-K5(u{KrV4y|-eiUSRPJr|0&N z-ue0S^_LLBgn!2D59L3Qgdc=pUd!5p3KpTfXM0|me?d%p4TEhDF*OeI%ZXw8SbZqP zsA1p*q40w(>V-%ivkB)-lZHnVlYme26G^vehZQp~Yt8%Fq3t-CCW7&$8 zu>pgYXvLq|)!^9ospfXM-i@j$DG8l*vHo%^z|(h`V$j9jX?(O8&)6WqlbYCAOIERO zvffZ%e_K#RPOibIW*ZcprDbsSk@U9X>>gd2;=!oPpVXnySKY{=`RQv)OkL?>AKSw1 zIpS_I8yp#QM9Z03Gd`@I8mIWr$>7_|79{R7R;t~~RF*hSD^2xy!}u zpjh^LvbGD|6tyr6+LD9fduy)LyCst|8meqD(Kn65-Z*rsvLx;M~K4!R!5*`OvkE!SLnAFb4xddNPO~ zEY}%fd`GRLY^(F9xw!&Vc%~m^b~y8ypN&l`Bm7tWGW;2l;tlqux)`CmOeJIQC4`x< z^z*Qn(&6)oR0yH?DqTy3WxXxeimt@Vn)TQ{jL<_5cWQJ^gL36zb6`WDy~le8HcT?$ zNJBsis2Wwl8jWP3xmZHUJ(=Zy!EG+!K+I^l{>0!nsY~pQc&s;-DZ0;kcx>W$#4*O8!BHZKK!^HX!fG) zVGs0>aDV+nWFt;SAi?a8xKwvu0DZp@MrMNcY8ZIH6WZRr1ux>;YJc|1`C&UUHHL|z z*gKsYh=qWqm4oBQ(=mfa?-nwIY|W7GtW=io;17a?b~S(d4h4fN|1A97`KWn#@Az8# zO7K)13WKj<)NC`Fk!>KV5Sex_*`d}}zgwLxI^$RjEqy6tUWNP770d*QO9iM9R-Ylv z{2wZH0$e{Gs`8bC`t$JdPk;y>9FrDMAExA!p=QdhWSq!IGip_YECogu05<68~Fxce+TE$AzDqG0!1Lo5CY|Grt@qs+}*e10O!GdO*6e;RcKD;-@Q;l{J&&kqaJ@uLDINDl;-prgAT zS8fq*`m!n+ynRz2(XfyslIhqzZ%m=;p|`o7m+J@9bOKCt1keNGYJfO*8=}si$$6#} zfvk84rSUP4ClyH?G6gihvU3>+2gy8ztCS{;?)_o2P(1fgrf~*w8j-LtM?R7smtpP^ zO9$Z%VtgNFbh)E_7}u>>^m`i1{I~m!b=1_}wiEyUnhah6a`2+C;?p|f5e06TH|1#- z_7eZr@2DM~@${?rm(j4Wl(Mn3tOyHu+3B;(;z~;K+^xz)E&H0CcW#A$tY zacBn{)ic`+#HrYEGecO_yuhze%1~0?+3P!~ma3Aru?ny%3xFVcm$fOYP*Ofq-N{mS zX$`CHZTiA~thTbU^3OV}-`oB?ITyC@UDWJf9i?Lz-jf*`HPi>ZibuyAR>;Ept6DJ0 zW80hkR|Jy7^!-;$7rjv`zqkK>_Fw6(5QeQ9(m!T4_d|TRzc;^X1kyNjwgCHmBPRGORIBY!0cIgE zk^Y1?OVj6oxPqsq~$i;4Iz+Ow6XxL3#kv^+l?-jxkiz?wl7nR~{~#C4Q{U1~ymy7X)de36W(k{~y# z1(OBPU!}rj%T>({X~eAxEoB}(%drN%Kw@C1YRu3c5?8?(>%PlB@H%w&l8qnuOuqio zP9BjYM(6$vF+(M;Kq09IK*1?QjIJ74k2;_wh*Ke@G5g?oL(bQrGA@F^fRsdulVRw# zJY{}yW*QrkHv535DtvI#ZB0WC+gkiQNMO->anx`z27fM!s;sb3Ey~G~dAd?-dmS>d z8x(I4Ku2JzS+(gN-J~8DH1?}%$M8Zl66@?|_+M>9bNMr*+PghaQk=ZLV^oK^SRu}` zD27m+{q|>&vN?n`lDvZ0pwy0`b5jCf9l#+rYk$YfARN#z-FLhgRals?i4gA9Q_c{FFK&=3Ov*x zR?v7q@aMubU3abk67xqnga%5`rmnUd+B(SkqBL8eq$R^$xiuCyBgD38yC&Zc^p<{x zBaKZ2Sl@=w-q2x8m3Q?2L(?^|RT{S2y|Zn*CfhbAyQ!UPvZp57wlUeZ&B^9u+d7@| zedl`r!t>r(Yu#)4U&@(pVFxKmV!Zr<47u&x!0J_0G>-M3+BN7P{-YUugqU)`&v!=+ z0b=KUjlyQa`_`S3&eZoCZa4+N(?kx2yyFX$M0W#OI1DQ(3}f1}T~TdYfK$0`n-06( zjqBYGk~TmpZR+}5=3z>3QFK%E%lV5Sm;sF{Q z)v2(!=ZyR|I`z$?VF>I^#~6{YVhvW#Lq92OjKH4EAaK#hSbMXtHS2rxEhlu&3LHiD zp=s`!?~ZJdK63H)4zo*#AIB%aduIV`80<9&5?rSnHQb>L@+%-JK!aWjj~iX2F5xio zCwwP)czA|=R7;f6gagY6})PJY0L}Zv_qzxXb|uango;W4Fh*A}44U~jT%#day>8z~xfW9wrqjEQc>rQ-*q&)eD2afV9$9DB5>4>SR zn7;*pU9#J<2CtOPd2W{`dd)TB(oI#jS-4l_N?-hyW$^b}j`ybQkM@?Z3zWO0#$4p( z2yvZ)H6me)ESeh#g z02fjS%+=MPh}7d8!gA@bkr0f;RUa5X&M)z#Z}TLi;nlnv#>aclB1BXgbo|QS`qM3g zT;LX3x~tGTM}3?5|JSZ_gHvN}WmG3u%&q_-MV+@&j|s|41UUvT6{goC(z!`l<_L>j z5FY?m3rFl9`@#A6S^M~*tem;BS^~L%)Qu<<1QnMf5mzKB(J&pYRALc!Y@1{Y`{(O& z2#n%tS4iX3A{p0_^UAu=3Q7 z{`h_5pTO6+RE9Q5bW_wiY>K@V= z_2RBsd)Nd#xDKEUKGZ$=@+%M;OJt=F{Ii%^{y>~}x)cb2&Z_Yzhw16PCI&wJWy@h* zQfx#HB)CepVr$$d8!*q)_SN)vrsN0mhVd8*DS)dc?owPUGsr+n_dR%kyse96EtG9( zI!%wD9iNK2vZo~l;)gsOsUtk=KNR{I1l+&-hE1#5fe++Nx+-_6pO~3+W}l&W7h&Hk znz^IRz}C8Cthu#(^M3(?+2Hs*%o(4#&}zP=niV?IR{t=N-L79aLlUoZS-Bt5h=l~2 zH1)-eHQw|3|GTfrTGCpr1h-Yta^u<=$Y;#4*Zv(W@|G-;u;T{}_hb+G=LI1{{5OlQ zi0kEa%iN-rEwj19+KWBeZqp-2s|Yld0~o01E9`m?C^k)~3kF53rJp%tl;F%2q=f;hSzACf_+7U&=s%Vcjr_G zF}3}IvDGDwnRw7?QOoYK5Y9ZPg$d6kiZ|@zj(hRPY3mKwlIO0F*pcTq>~Hg>k)Z|| z&C6b6*J67dg5guCY5UrtPIPic?^`30_lgOF98FNXn{ait<~XvZa{Hy(@@B4lG3rGW zVVL|GNq2;UV6knV2wqu)jYZK9(Gp=Epm@j^D*QhpuRuxJT=<5Tnkx|y7wRcNBn)|d z-0mVzl#ejs^9ck?!FCc5%uj;gW~FS9B7KGtY#u447pEUb-yc>g9}oh%#*7b_`@p1sY4 z$UR+sLXq6El4DWyk^=5eFHLa^yqGJ2=y4Fe$!)1lHxtze=#aRHS0FLDkj z;c~yek+fQrbCqNkHp~mV9v?HFC(uA&Tr{!d*W&ZoX9PxSW_R?1SuzbIy~AA@tQ7U6 zsN{$sDGsf-z89Mv%;Y(s2aItDN&LhBky_K0{2<>#Ou?hj@(xPUX*MQg?%Wx1LjioG z!+99G^uR_ui1cMkqxeVX=BaAzV3ZA~=Ud_^nU2Qfg5rm0B_qfj1Z8e&ONnB785}fF zxZL?!sh25oMrrCbkORY`hzg|QDs6`#F5|I@2wUANa^0XdF!ypqyo2y6gz3QihxkPd zqSfPSp|-I{s`G$6WGxcfsA2bkU7}iPzP9a2%qr+N`u;spaK#7c%h*~p=Ks{lpOr`4 zVf)ZVI7p5gMenPD(@Q<%ANclAxx>kUFMoRxSBJC^_HJGyB_&yWQA7IZ_D;ku){YXa zHCBd?ts@br8DOIjl5kl;%RBv(9v0#TraS4gmI?zVc&T*;j=8jzh)u$}2m(-}EHH?s zI)*@0jVo|!Zhrs)!J`xj^jR*g#j1&&98g`PK=^ofnk_>yiOE!A07^*$oq(#M<~He0 z)je+*qXg?gjF9>C(D!{b-{c~gy<|^a+|H|$werbgwVxf1=RWWf>a8(C*6W*LsojnK zOjkjzfE?QXDNSFzh{3{xs)RTxmUfelI}KF)zTm{?Y(Dw*P!b*2h(-J6kDR!;>$w~= zlf>j3s{5fRIvoE4n?RG*`{t9^$&KfY!WSyAK3D%gMh0DCs2MO|3H28JH0%v-w4FK7 zO&Qf0TNPX#G8Vtz?+mNDvyn45^%RSMd;2a73Gew-=*yAs_QlFAKLg6;ciEKAba>kh1`2lP((#! z7cJ_h*&CxB^#OVU@AGrex!iN-ec zDpB)@dM7VGC&1QWV#?Z*M*6Z zt?fVCzF(#~w_<=40i1;2JQpVG`{)_D*-#z1+ORyCGz$hP5^7wicVMXM0E23+Du}%? z_Go$I`A4f@Q>W%V4rj4<)F2xG1?A3r-O-NvkT?4njp3uotB!Ks|r)a zzP_Npg6;Oz8=LP>^=mm_xg8IO1bb4hZl@G`J(37CVi_qzp3Ha z$%Ea7Qwke^4=k2St<(!#87b6Bf;r^~Nm9-G8Yon{v=3EozkwA%ttKR`&WVmxZ-(!f z1Dr#p@lg`+19?7Ix_f!-zi$UKNB_%=x$Xoe#-cJW-&vx4~7YCXT=?0%_+no?9`HK%#2J1p? zF!VEsfrLfktGY6VayITaY==&dV{vBS4V6hI?Y`1noBPK@T?q?_8?m z?5;eR)MM91<^i3#1@id@M#&+=0ynExl+}ZiBYe;)3G!xdbrsB$uZ+}FYr<8I7Y7RY zeJX${qz3FE(QVtE)9+e7Lj=rt4me1~!vC(@0_))*6i!`1BUE=TppI zyLUcOM}(YbL>=99K9%{)YaPl6V9HlNVP$Q+Fy70ysrpejN%ms@XN_P(J`bDPQ%6;J@G)0p@P3` zOJiwgoERydNyff}PMx*Q-m+^%UzrK8P%%|NQFSiyz^2^X@-Oq@L3I`%7c0}vd{~U* zEjOhST!o_mrGpi*4FCPB`>l_I`xXmqBsW5j?>*EiDvoS_;6Z0Ef&G8#7*CPAi1}Q! zA5Pd*H$2ZaTdUJ9xYI-JbIcwQIwtPF5~EGKt>>7$pD@_mB**%X0D~?$Y#kjCbW|h zcD>&9&!oT0nH~DyCGJ65(LNp$WcLezBd(1KMiv(4&Y#enL%AeZwi7W30Q@>Roxcc% zcB7Qe$~|p59Ws9oGIvGEcB`O@#+6PJeGr?O9`uiN`V9gyz{K8O7xyFj8M_iXFP9s! z-0pMuavHv-ze0FJN&Iswiwm0h8WD}ys;KdF;rnyn(koC5X?gFb-;mh0pM(X){B3N8 zOp@#2RCfbipyw(w^?AB(9js%S67%jBMl(ITmLM;OVT! zqRoEERN6qY%EZHy5ws+oMJW0;$Vt|r3ip>WVSBY0g5@ztW(=+)=Cd zBjparGL}lvks=oKO{_2`f+!O}XekumfL)({-`-GgO09Q`&>*sk`P2kT)q_`M%COtt zHA9-~7*3A2IaEv3oh>^IUN*kK2s7rK9=+Pm4CFtah!8%7uPge;b|p0(_ZzN7ja_T~ zp-bUrQp*HLy&!Dd(b@L?I1dx)we;KLXtjhsX$2@LxrkDy;zfk`f5No5Vw*Vr-U2(* z(5D&-MEd*x9z9?IF@N2e4VC1~Jp~Umb+lK;s10Uaspxfhs7)Q)!zZq5%p01;6W!2} zDz<^Rqsr(2s9jo^KW+xqf4j4N-aX!3Ze4V=7LdtKJUUzTecMCYmE?zE9 zkLrMyS7mu&ym1?uPq%+Y$9a6tA4Pi&5#Ty+91oYiEbFYZg?7FA=3oJjs_0|FNG|ACy0|!|ns+MS}rf!tM7jS#_pAA;Fn|u(ylu7%n zhxFMTr?CQ7*Z&4{=v|lVRq}tE_6ca)CTkS7I5W)9VdqS;>g@NEq9;uf8823JA|W#! zMNZ97HiGFGz%KeCVhv@w&ufUhBeNGs-R;j5z*#U3l;+uo@@kL@_pL%r)9=WJ_eer) z!u0v8*N34)K&nqiX{_@#{SYpvtANDHg#`D4ph9>yP!s8g@4R;s4S@wefGj;p(3Yds zaA{JX@`&VzH7@&fS!5GTLFpY!TLl}c{iSi;u3J6;S)WY*ttvFBC0o51))Fe$G`{g* z+Vt@^eaI(;S!tkb1&pQTL~yCq4<|ClA1VsIoed3XI$uBvLRoIW|3O2Q0C}e#-5wzP z@9_jau&bGYR?SO0+*_S>s)|ZeR;NQn-EQlP*Mqfga)A7@G1pEv4lGt@q1pDB(rf@C zEHl*)cuZ-H<_(*MN64~-mopHwja&PmPM(BV8=Q?_L%Obf-1j{Pax#sSpyzB)%{;Rr;{%m}0eI#x$_S#7Du6E|bGf;tQtv z1~!Dl+bklY#q8JKT~odskIQ{7$SVchSss1E(bf_xdoEs!}F2Bkb=?oiM5Pk#qud6a94)6VD#kCl|J&zAee^SueRQM@SE=9kmJ!uh&q`e zWwr-nyqo=6W$zuzhq66;1PD0TL$PU)pQ~f#sFbHWoy1L@hFb~M2kRMJ^;leJlcmF- zX%MTlYN!*nnMf~;ivE7*0g)y3<-IB$c?v7q4xqs`=dC0#8Q#0iuDs9U5%47NeZ zV-={u-H)l&%C}R4=nVS&D`QV63D(DI83~~mhQIs88YGO;m5gjrTOjdQ>42m#cPp!6Xd%U}sc2A_w7Fq6Yn0DWT;TnbiG6Fw}5WhdZl#Ls)< zL1unU9dCzLmj-k0)dvm@RS}b~_M7kbVL~$N18F3v(*XL^D}w+em7eKn<`LijKBNC# z`QDR}=!I!%NOGPDA#?uDr>9{OPvtDey0q-|Z-lzdzNVlTd&TN`y*5@ zwnQ*}v5kzQ_)X6{!Bb7cs(u(&yeBk<(Fv^!&MeLM0Zqb?sZFyxyN2N*?c2g>#i03f zG18miUg!IxBn>##Ud!3p=lkr@R1gy%8X6U@x5`}^Em#kNj{9<(JE+IQeizNA5DNFb z+18WKFNBy+A&xTdy%4A7Tdxd|r%x&(pT5yyrq<%5HrKgO;(N1JCfGXc(Get1+V2xjW;uLf zr>NC=qJ!BhjtDF)l}?V%_u+iEKy0Np`?)p%05{8OtRHiBJUwWND-d*PXxaBq3p8t_FRb)36+3K%K)f8UwBmCa+?bb zn|*LO@tj%nS*jLho7$N^NfPkQqO9ce*Ty5aaqGx|TKS}+pg+$wHKE#X7Z>r(SU4>t@8-ySL zQ*nZPt#-VC9BysKx@kQc0Y=YNq7U}R;bA+W(x}Ulzei@J+J7`>x^bl;@n=wQPu+bL zJ;0Nr(D+5*;WdyD!fFrQ0zM_1oePgTQ<|w1w=XWmEj1tcbb}?0AF0I^{;5s&4kN#R zFE<160_ImQ3u}!n7Oq|d_N8TSuCA7~=C88&(iS4D;gK_!qKAtnX2xK_ljC8Rhd8sB zTsH;0cUmF)3kpoecdqXyexE>|8wfW>{Ye=_aV7`Yy9o?5Z$!Jw^;nEYgrCaL+ujJP z%+Kvuwn0V|={%lO#T57cG{S7?rC4T&P+x7Cj`McJVUzG91hLJ)OiuQQkRo7yz~$IO(kF__o+^@$ovdE-q;i-Qng-Q_EbfhEfoE^_ zQD=ENEK7D;RTW5E7>k-S8m}V2>`I9@H%iaG1fi~1AP*ll!36}`t;y#AXCrNt~%WwMwy_QSsWM*@x%O#*-( z-U9WQd2#kIL4rgB-C;zCKO{z-0ok91C81u_NuYYXNDMtvnN8(r5N`er1A}+#~9EG z@d)HIXX2p4@@!MXzgTMM$6#=84K{i9!=A$2flI<$)O-$0m4o&;Cx7!u*NgLEcJPQqKbm|x;wXd%E3iCh#xV9Zy_>gW%C@mSW*UGC_ zda2>tU86u*;+V={?dqT9YI?i#vSnZYTP183T8P(@RJSZ9PlMK_jq4;O`;?$@4M-Yr; zp~mh=VDWk|Ic1w@@hNh;-JObVrof?W;0stMXexH3_0-|9g#skMCom*a9Ql)ojGnvN zm>#ScFzSd4f;Q43yzP(rru@KvH>zVBH8<*&+^}4jJ2LV+?TGI5#Pxz>*Lgp;SA35{ z)zueFTtI8m{0+}{#~KT6CcdKdGvK@I_5r0#=lMC`8v;9H9}Jt8j<#FF{@TDQqf>kC zWuN3&V6E#H5rKXO3Hc6&eH1ENW^VbCg8it_e$zkhDCXBLw>f=`poO39md3g* zRP z@hVdl|NHV;CtCR(hE;idLH${+j`Q+P@=yt7vQ{N8ia!-Xi%nRQqn&ILyH)O>*{uXq z-HBdEFr6(vL;-Wrx$`dwaolhY#Q9}7gMgbcz%SW2=C4u*B?ljdK=T{vkFCh(gcy(| zuPUcJGl6>BYTp-93`uLdHNxzP5!B^TlefomZq*aow2)ieKIqF9*of#s+h25qgwPTj zg5un_S&6?N(->aE>R93SvKB{M;C6_#H7vS!u z@cdQ{ypl>mX0xQnC%uSXKB(zUFDywzH5Wks^|@U}M-rJ0z)L)i z6zk8}9|X0NlS>4!K_kN$jc@$!5evo=lsF!luIH5W`q^Op$68p9n{g+x=f^7Y=owOt zAJ(~tK$|rzR7O5cok3ULlLX|Rfm!dpTzhxZqT$a^OB-P2@`lQ^>BWk&PEFzbm<&4? z;$~KK9!w&Qa1*v`?sZ;#v)qU^*ZUUwn2u)4%7hgB`e!>W(tR2Q#vutzJ_n;|p*nH46{%8x5KLme_W< z-DVu81}w?C)`r7Ww+3|;UtoE%h0TB-T|^T`<@8j=TvHJ}YG=POQP#EtutK>7av;cp z&JVv#VNrp{TG$j-VTH2baEgnVoxDvD+nf(TzEJ4BS0oTZ&G zP@vR9a*j^m#wz^mXvz-)->HWX!}n8R{Em}#*1-n0U)nZq+kv{D6d(qZJ|QIDJM||j zNd(sY7Q#e0`6(6{amgt7GE!(M@AgaVf)^F1<}zv^NB)yufW;1IEDBE_3&QQy)*Vi8 zm#jhJ{y+Nd(?Na_xOGBP(rMGsD$tyVQF^K~lSQB`=ycO~HQI0*xy0GA@As3qo8oY= zGHc9iapHYN*TB8M!AP}uqzbB(xh$BJs-k^U3RQ*O$jal!MECpQ4zqQUuvH?A@OdV0 z@=Rut$5B|u`*BaEYjYSg@{Ne4Jx2z{ep;SiQbm5zdFW}V*jxrVjNA2S~H#rTCKv)$zyN_4l&jVx_$C!>ECfSsB6J&yeQVI&QN-F-}O-%|VLHNHu1meEfE0$2o9z zirNb|ZWSGt(U#fYPmOM@BC)o+n&%(Q;M1{Dw!6{XeL@1DXAkaVR)9pD#IgP!q7NwF z(Lbt&XHgVE(JFo0``d3W@3km(;UV$mWJSdg)!IP+GrT(JFT-K}gFg)2&z_+|o($GT zF{7+)?fiFIS@_%53i?SP-w^wzv7tg0_-cDZBdS;hr+HXYiCm2b!D_sYe}{*KB!Z

1u?L1|G#y1`m{?SPhr*0&?qM{iS1p3>dLr8tUCSQy|KOmipv~L{s zDbQ@@@dnQu-QIdy?^emAqS)i7e_u&R@MIhiUn!81Pn%P2Zm23+qLK`G(0B&RFM#!r z1(h71f*GOSKn*7r2Y-`-il)^g##N>o`JWYVIiYku2Km}caqjzGqZQR^?_WM%^TDYu z@nKEw{!k;fC1U>3aZ?76|6kCcz&TGpm*-DvnNNxvn_)eapy+MVQ(9b|Fgz2Hso$T@ zRS&4}=W(6~6~Y|CI7SMCjrHGF-dyebWXn{QP$`!TpxG&OaocVD*sEVX@C&=MzQMvm zT!SGZ_DYGN{k7tW-*TLs`6a@qOA-K9_PH9Wp~lI|>exepPqYMeA?V_Eu&p#RvJv+i zo_L+~nb?5aX{WC}{lU?P?@7hjCXs(79~+^x(>7oR>26Lx2NNIv_s;ZGWf~oulOy9B z>wc%i-#vb(qe5&+$%C^rw!`bnn1udoIa{#;Khpuh`V*fYbo}<9*S_-@hIy>Ui}?#e zl7g!qh?O&cSCG2w{^Cl~?}keG1*MhDN~X@c^?#iKyKSpgRsOtg zC8?)h+#Z#(?5Dl00?BVdSEGJA(LB!;rY2Xy$S*-k4|spZ(m}GEz{7Au3hW1GIq9!*-w8$83Oa_Oe z+{uZ>vN3}VW)8VF53)xRv9&Li2a^xCIyArMzXf|Ct2(H3V*JWZtcaPP`-mdc760LE z5CI>z6G3}(XLNnOt(#VrjSv!TH?V++x(0Se+y1x7upN#tJ3Hz18FkQ|@n}o~AD5Yp z(d5C^l_|dWLxP$Nkm-mBc6*4=GKdnd8s6{4z|9Rk;A2w$yP3!JnGNTiW6=r-usw7z zfn^wX9PYaKow>f@RiTyk0Y<#gILd3!@*r;FHbQZjs5E#@`FGB{sLTDwQ6l8pDr?); zT|@&VX<1&a95^nQ>m3XdsQ>;A{*Iobvc$qd4SyDD3`$Ze;vy92Q{L(2N^(ewLJvae!+h)E{RFzT2%k8W^P^*GAPo zJbBi+B#eIOi~|dKd{{jw*{Q3oO^e;>#9N$u zi?hHka@7K9oFfa0+5gvQ)|A5K0Z>w3q+TrKbce`LD_(W)a~FW{%|K8yHyM14?c?7?J5_ly*Yxp{0W?F#5dagVonW+i z3$Ahyrac~!=J+KI@N}^#263loSoHFohSMBMs*JKx_$8Q>b~38mC~j$Am-nU${(X6I zNfCO?0MLx-ZCnD?Eo$$-TZiznGC+5aqxu(6?WAb5zIM%Bj*H~O$EcT=kj}n{jeDCQ z?x9fK8!Kq0XgL9kgD)sr07lL5P(xS+r_hXL3GeA+Bh~geY2o5kbF!lu@AR z&)B<|25UG)Yd&7gplIeI=u{HkVS!|Y1aCD3YgGkz%CF*#jZ^bW%wh}pkBN=0OYmg< zSzlvu*M$of@Cl-!Zd@_3qA+ zu{vnVj8-AudZTMn*N6Y+1K7K2o}TMB&&a|sht_0nO#lrXczwNYz%qV9(IL@+YNAYk zPwi#5V7SxrdpeD-Q5u9=F0;o(Nhc&9=yzeXwYG5c+g;QJ2yRiGvy;n4PSUVs7B1>r znRAnCH?3}v8P`Tk7*!^)EG{mtW~_T{x1QVBltGf)e9e^m2wPHwi3xPiMO!oLT zWLEa;NZ2ID;B}mk4+mF>G7p~rB5WWK-nuxq0Ko4=_W!u-J&QJU#U%|*iB0E*?1-Ka z5dF?S8M9kU)BC6XzdHBgO^^EA+=2ozzr8BWz$kQ7U(6Zg_ZX%7 z^+c9JpCKwJDJW>{WXsniG6g<2)wzr4i8n(@DK8%{%LigA?`_`9uI@BMI&i3p%cfW2 zx!_2I-kTqL|rz?aHFh@4`j@2eyd_4=OaLQeEHxb1b^1OZf5z_0+as&YX2){g9tt*@d z`$+Ou?&=D_?1gXpPA271<%yftlF6TjqqzxwW8rxGMhN-C$GPzEU?__pHw7Qv5)E^4 zsqF{fZ+KVN4EboFrWCK29buXBJFMG%l<4)v{V?>Ur7H zJ3?o%OfLRTOz^9C1y<-L%3Rd$CAWU22eoEz3-S3 zzSm8J>9++Fz%79pp9Z}X1gwE1c+yqgdp|H2UJI~ef8RsTnEc74ig=%~f6#4o(-fCt z(ux(;KQqAf;x$!w9P@{S2gPN^cWmEr%S-+3%)x(j-3!j?NY9v%h3V$zHgKQVcNgNh zejrcj&%ix`j@&5CM)4AT#_$Y3Duu)u zj=iE_NAJ>zjdADZY=Uo{tNS4Op;57RH&DcjMEiqM`>is0e)s;{#s+KUwZvishg8$) z^3Y{r8Zo_4$8}W02_*EEatiTtGjh|Gz~+*&flv7^vMJqGcz9bn#=}Hky=yQt=vh|T z(ClpJARtING%Mu*46+15fSK*Pfi zZ^!+%CcV>IXKd?l3(vxsR0f~KQG5P@h?waVkdB+f`mJiLLaff{i!{%p7{yI@<^EM* z@7EnyUgNGw#0iu^>J*RltN9;i)g;+oubgllH$jqzT%EZJQ&?Aebw*2s{+?RbU)Y#- z5n}^?Cx4wM;i+bAJk&Iqf@xuPAvF2lKPlZ{7}4#iS3XZm^)2w8HFyxBzAlKo;GDht zq&BA~HfmK@euD5GCkcLgiNmv`<=%DPFnfP71S}8rk1R*lV1CijE&_D(khC0b!bc-L z=yXI7)Kaj}3Qll2G=qbEQIm=Ap%mLpd-W0Do<5I1Ws(LQ1?0vbDKEzPoDjwW;y#Q_ zauQCWB`;PzY3+EZdv)YMDx%(Wl6!sptlR&uX6}OYt;JV?9#VwGus;5z#cwAKtJ8ci zrUOoMuANK%@M#u7c%m02z{`2=MT$QT;@w_+vrVHiE?yw^YlU+6^xCP0-Mtg|`-F2* zEi8d;6|&#egd{dh+>kPp)cjoZ5L0)w;IdYYQ5nZ;Q}^S6_0uqvOe|N!45r%a_{Rg5 zhkBTrT9j>~KC=PV#yf=Xd;Z!PfxIDY!%Ruy^709>sk-W#K&mSMVG$Y7LD?RlwC(RNWJG8mjE-|PQC*s=kcA}O3kHh>lLwIv z-I`QJi-xaUOh#4$gJtnkzKeqK{7cwcb~W@8wGfeDTu{KqWyUBPo{{E$q;xirMQpt$ zt#4gHHNnNEGlxY;W|#0dN{)-UN>EopWrfAVzkDK{+oWg_RA^P>Ac~c7a)mm=?yCW} z$_hX$&}PSiI%e^eUnAB2X5_DfmqFoI@aNcFB()6uI~#s)=x(_CjV@~4Jx~*w(8T|K zSsq8Bu?7OxDg$KBp9DI+=OLyKhl=)b6?!Jq!%1Fv9o_wqFgedZI)R*dGEu&VPD6nu zDgM5xCsF`rGH#Q~oa~9};i-xV7a*#knDG5Mo0AKV|;558f|Br^} zsh#lg<2r}vqiRU#efMb#*;g4dD+`gAY#vQSXj{bQ+Y=djX3!=aYg5bpD&kU<1^zL$ zLHJ}5jqBj}s!2w(gk0U|^OEUL$fzfHN6Xr85xgezBW)X( z;un6U;8fG;Y|*ksRyH+h3>VBLV4_v=ih&R5BVrBCXPng8Q&|TF63oj3v1Ehp)x-vk zXH&sgTnYy8^o11!kV7NRVe&}9UHVky8$@B(5Kh2@iA;__IV7Eu*bEkd%fk3fdFYga zke$gB?6U+lS#gp2)>6{=l5936LzMWGdLo+NyV%lddML9xYxb7JU9^|sWDw`cBzinN z#RgH>-^gmjF!hjPUH*H4vvvLJYUk3G|H+LfqLjeiRf@C3n44Xvx zuavT*`TXfAY&Y{Sd*6NiknGDUA4i%U9}^RZJI(C3F2J|*jGG)!FQaz@FTKFa>aK1{ zaeKijXfWcvDug-DyD%q3{@U)eW2-xKMp}b!V|tb9jGFV@LjhWW+i2RiGY_l?sW0oG%o7tcPxd#o0R z>Tu0-aXrph-WyRS(ObdcHrk#17bU> z;ATF+Gq7h90UIbo4$#mOT*it2+;>Vo$6k)oHN*U+eoAri)Ct;WWvZz~D>CdM%9@g= zfK#Yj%#yrpiVi<3>=D4645EZ_$8yOynI^oM7|1WkE1v|K0P8FmgFpoE5qZ8-12&H7`_OhNLe~ABWW=BaOPg*UWe!;7 zqqU@QLFYab?0FP@6GUK1J-fEgJm>Mp+e=@F=ehyxqbba*SN3c9C5w$ffaEmUt`OeK zz{Q4?cF|uN*=&{9q+a>P5^hh)UmhM$XDdlov`c@8<*CV;p6Ao=ZZtLiP!I28Qn4Kp z8^hCpXHUEv!IM?fJi9!1WK0mR-*Z80rak=R*ym6j#-^qWqKH#g*3&~JcI5Dq$G3yW z$AJJOuRq%`CLD3#`AQgg8a<*1e*Nj43Pwb58-!oR&uK1+FqH-`1L*By41sJi6HzvY zp6h%u`ge<>NGUx`dcvzJaOpTns{kJx?r)&Msk}f!1<8Wi(!a~%M58~Jimcc=o{RDj zvpU{-qF^7u-o^kuYmE|fJJ^mrx&9yN*v^fx5?b@mInY<=xl}mMjKb#_N}v}_NP@hv zAM5^ghCMjNV*8A3J<1UZr$HA25QB3Bi=m8?=Ga&!s8=dS?=pJ)? zN(Jl&?LDv@sS_ycLs}>gzFg9^XdD5hgCLJjZCJM4b2=%>*hol2n>Xu%q#HPvMnLuR zkH~g%V?#pu4zq&`7$hiKMf)pz*y#w+IP&Y;zrLV?*86XI*>JqmDC~M@gi#V=Vvo?cZ&(LyqzmmOKWU&@#-* zQ;dx(C_9%_esHegx~w{)hZE9PeO}27e|q}2a$TR0kn^!{rk-?NuR%%8q-B4nDMMMW zl6w2wBxaNMo42GBvh@f_IA@50eJr^Z1%O~u+)CLh9>pUeoGzaBXL!O-Gs;P6rgfSUjhsfDz-k1uc+M71}vG>#9yS>L1cy&YdywthK|Z3xTQ#rP??s)m>#4Mpq{=c zm?W-RmyUgR4I69}$I*2Nv_s3is-jxe#K(^cs;ELg$VjT11PAD3n}*rbJa9OqxqOh& z|I+GLZu}oRJ3b%Lk57NMSn@x+$AEk%q&v$ZBWs7g-H>XKmD1i|ouVEo$MT;-(oS(jy-BkUZsV#$i7kCS^K(|T zfBmxbe0#OaYS(hrzy%Q|iok?6GC_>z!QoU-wPf?UeQhk@ds zU>o!Wa%`g=6W($iS5f#AMm6W&8I=tOTYkhEG-c{ntd?J244Uy6l!8;sb2?$>0m06 z25C&G3e?0-4L1hyDa1?_8YzwdQNj1(8vnszZHR7KB_7n0@E+5C&@Q)QNoElLtrHbd z&r&#|eJ>;)4wI+fgDe1rHT8!}v@bd(R5**gH4KiyaW5yl@SLz}JA}W>Gec;LMsjd& zDOx&;5&F;aUpjD+c@_dmBD$sY@CluXVDJr;Xn-2bSNPLO+nhmRGfu$>38S@9Kc@=q zq^mvH`BxjTRzSyOF$`x;4mzG!W_Jkxj%TL0Z6?_>n7+}YvMZb$`B7r9sutcxOs*tB zu&^CX%XJ42{ZSz1|28wE{{hcHFu%t?J^aJ(Jf{6me~0s!>IdAPUC{qIqDMjYmOlaj z6SN>~chibfr*@Sedk5=}2$Z0xNER9OX!@zV&|?Ik{a#KC(~?*bAjEwgv%Un)`nsE@ zlCz@t_{jRz+rHp@oxiP0OIyEuHFI9u2qG-Mcz$?g3OSHJHHT@x^oqK6Q+w~TmD`HG zS5v%T!R+{?q?)MkHI?DTN%6CiYT|2>;*%F7hiIWol9`>`t$d@yc0UIU0dp4e(2Bl3 z-%g;-X0Q?fuC7ctRh*RczynDThOQ{CAuPD2IDGIAfGSqbZ@3R;17gfCO^ z)#T_F8k?UYH0pj1cxJREwS`Cd74}2YL6+7asFdMK9Kiyg#Hy1S;Rp;ltCH9Q>!}J_ zy=b~vm)7Z0)jFpj2p09CQ%EIT*P^N}r<&$WCF`y3CZWYz+vIMlb?XERn`W|@2q{eM z6;xHSP!$$xvC$F|WmZ^v1Q}b%>*hDm!dyMH0mhELJa$hIXw(_IDxU2y4JdbOQx$3}6Q=p{G>P4ZJxJn#RsaGV63+sjI6?b=Gyd zOlcR@R0lb8Q(ameImfhAr-@tyOPa~qS$DC{;e6!HYmH9qyc;Q`0ypkST7&vakjnEk-hsIf2}9h;fEjo zyD{LW%)o&A3$Wk?sNCo1gr$gT`i$I@kDQFl4c{#hR0YZgav_mD7!wzFGBGhR@0du| zF=1MW4I-+>?xsMCB0J3li=y3QY%@>ufy{T!smfF7M^C}i8IjKB2qvs(gq$a# zsrr6s{cGeU@%5(~XTgOz>=;UBVh2~vs)>q9s#&Q$Xa98Oq8xZY$rc#6m^O%IRxecqXm;Xq|{&Lm4R z(fRny@5944m!~2G`w0Lq>HyrGqQDS>ern;L2S zzVTV)naI!H;QSaWokR=2wCS_Ry!mI2MnE0#`ogiYqLHz&334BwAY*KNd}3sLB8t2i z9~m3DS~xK_F)?S(k~xK27tdKdXX}B9iIItfdt^g0#>XZ$N>_LkUqc#NM_>`8&;m^b z)8>Pirsc6DcM6A*E9TzG zT6Qnu`b4$y~SQ;U6Sl7jZzX{XBUm*dF)^N!E<^2t#qW-g8{&xW|GGP3y-xA1W z7F>fmU{*@4$&H&|aw@N6LtIQb*4YwJCaiVS=G>DTB6mg3CF?^a^ny-;dRJpcU!W`q z^;b}ftJIg)_ji2y%dF#>`nYS^PyIs3o-BGy!gkm+a6-wO*{u_|-pLpT3))-JgX z=C&(?nUDS@DQ4EedTyu$$m_d~tf^!4+#BAkS+qF?EEv4;@$u9h|(kO5Nn!41@u{ zbT{>IaZN~kOUuGc=E&Ux^fD!kR`fkNayE6v({mPVbM5`1>Cw^5hf->^;Y`oY17{I{ zJ0{Jb`%7&;Z+lT|HS;0 ziD%YJ7=y;#r7G2x#Oy1XUve^T-*O)-ZPc`@QBf076BC6KS0`_US0^T}l9h!~69ZaV zA$fOTarJOv#n?pQfsl!)sIk%6A!QTrO=DV!$eMU7)fzQeq0rX~+GorKQ^O3X0n%Fo z@!?7FvwqSu8Uxk{zj|tig?KEO*wjETU}(kw3|Qby*FI)jP+5hEUZA-KYBY&JOQ0TE za6r+echp(T$bGGl2R3UOnKO)(k?91PYK(ntjE_Z4kbhK|evq%IF>+?~nnaQL$e+if zV5O#g!AL#j^G=?ef8s>qvfYwj4QQVU{&GhnPt05Uiw_eM%Q=Z$WLqEx9ViFJ;_P4@ zaBu_x_`ec>hgUy6{pBo%{L?bC>5F$6Sk7iB9&h|oi+VRCN=yFo|1SVMh#}|>5bx4h zYC*v@V8F6kllykw7&+|W;uC8xmqW-@gvLW@;V~OdT_x1v>gE%VT;5G!HcU%kC0`q@ zIwD)y^V?`iu&uQJR%yqlcZc3Pe*A-@&xA1ybFq43@`_jvC0KrmIX})uM<2>sl5<5n z+b8)w9j)q2!hn;)!_$+KpH3Q&53hK7b}~WF83cX_8I4a)POga?NhS=~UR&T6r!v5z zB4Iw5Oc44?Z^26Yo7TZq;QV_ms-h<0f#Uaz$!;p*qksZmVmOg`MvG=pIc+Ef=Po19 ziLWO(S8dEWoMUMjtY(f3Wu_z%IQk^^g#*xxA!}P$&NIh*pFO}<4INIMv*tkA+1A&e z{i=($V(7r|L4SUuXzMo1lGlqRz)Hq-R&);CBMewv9=G=G$j#ximR(x=yrsrkK}ZXCqpb zYX$#iE2eBAIL#ZZ)IQQm4K*Mb4e@9z%B6rQ+ad%js|EyEPzMZUNWF%3J|Nq|&1h#~ zh%p2BHc(GXL}O&wv{(sXUC?_RT4B4OnoJi{$f}LYit@q@_sh zrZkgaN~^0QYa$}*aG1!gPF1;CS{PGT68GZ`C3){(nhXC59F0Cls2qD{-fJJt3y;|q z`IF11&Pfq$pdBG<;~*{oEt{HyUeLi21mOQd0N%)~TTTa}?(*fZZXIk7QqQiY|F3&R9AhdzamfU{RDpvwNGl=0oT^i znoJdhSKH*U&;+Ui_ne!92rv5(gf(~FX&JQpa-Bj8E@ozUW;HsRe6*DRbb54q% zb1J^(RB>f`Qbp34hr-q|VHzRGz?*NCLc`)VUK00=nKEO;T#MW-qtRltR#&%vbyahZ z|JlU=!0c+3?Nr5Q3#BS8T3xR`6uV7)eRM|`q|PZ>h592&uCJF-6Go;4_KXbKFJTB; zbj56#`^nf4OlU5>_M5yOl$m=Kscv7~+Hf+_86KWhax(Y#J+coNFo>V;=YTVy3<+t} z(ASJO(DFeipcxe;gBuznq+_}BfBxF$F>N?%U*z0n>!m=|k;3kq7g}C3JUluaQZjem zQRc9=O5|9Mg(l0529LcJY_qMkUb~UyoJLN1T61!OwaMG+ZEX^CI!|kBtC3|GNp7`E z9LJ<;OPVYkYXK8XYzpBKcpVSjiU4{IIvrN`@>6~odRl2j(H1L@tW$C6fFl;|;cMbj zg+TrndIB3klVu`IA2nWqu1Bbb)+5U{U{0ATo`4z)urr-bFX#i3Fa+Q>7F@yY4BL(^ zrJEE~1ahesu1Ct$K41iqTm+F}nLaS$kRtG1I>=0Vy>C~^&)3c%{|y5nCw?6FnHXpX ztoY6(&Q1It{4b2}I}x``;@B%jE7ky816g364Ckt#7j$q00rw@LW*S|yXSc^(t!F;(q0>OFxaxM9dFO!R}GXGk6)P*YWs!*yu>e*PU()vOT)A@V&gebbFYS`lQ7T`# zo8lV!Ud-mo6$|3SyiqpY}qp8$(UuX>#x86zI zHvkrc6IKedU7JX%DNc%yuS`m>h>uSRkB@(#CMkZ&P#FQ>Oa`o}yoP=_Vx3urZb*!5 zZ0f50f%cqzCt*H-(9D&Y)yxG#mt|Rzq$@Kg2mtSu!1z-1zCQ5NrY$sD+~2XKAL@Vk z>k7of{W5vT*dddXd~_(GPU<_ASdui^54dFQjNNF4MSwc;@`lMi!BO*1{-#_)2Ha8F z|J5`A?u9a>3CICYHDfTL3L3l5QoaRcxi*DOjJve&Pl2B^|D!yb{#9A2{Qi1v*`@Gb zf1&M_)d(fCvhr7zv9&EJm8(`Qj&03a9NjCYIW4R&UaMkVo)fuCB`Lgd z!M`s^S+#YMjg>ZOOFViDORy2NMmn9&?6UAWptw3PrldEh9RiV-o+2(}d7(f@4<=St zJ=F?N=5hs$KMr@w@KI{&`uz!zYWV@q3sTh)zWa#7z z`PvJGcLxbExV!LP#qmB7x*^$S?yu6WZjN8Dam|_q`=2Jrxh6TeIC(*3Wjc92J3f8( zpUM|kGCL2jhVH(v_hAU2u_ybM0tZsxO8|I}HX0wF^gw+4sWtJZ;vdK(J9!|fc=Lpo zq=ad)3{>UHUv*d&XdKZdKCUf%Vf*%HAAfdG`=$7Sc5lz)bN1}n^8!KY3z}9oGE!DH zSfp)ds>qAM5$M*W-MbE_N!Y5sKfCmnjgjlS6*y;zh07TPizQaN`Im81YgXKgQ$5|a zt0gfptO!0Q;-;7l;Zy5F*5<~X6R`}b|7#4`)fYB%S`PTngaJ2#6BhOT2LRR~2ewH| zFVEdKwZA)aOTO@73fRAC-`rjIe{UrxLe~KRvp)J)n3IVQnNDp$8}H-@0CNO)IA`q~ zZQ$OhwzAe$HhNDBaZu0H$Bj0rQ(NK|c(R>IK*_Ub$2pS&`y$ZbGo*X1w0)7@I@v-{ zk6GY=2{a~v(f`T-u2obv-N36;R+Q~%MahB{rP+YSli>brZJ0!2{gj;A%0s(g_(=vd z%4$H@4hU1Xm~(@16z@*-^k6N_sL>*$~M;W~_KLHIs`lRg>! z;?mrC_pjZF56?&{dn1D7xc5)YzrTLj+ldd!Cd~UbV1o*%spbV<*St8G0}hTL0RLA3 z@bE+h^W~QWZ@=6GncWr4a!p(QF8MTF7svq@&mM-1aL8_MD0G4fUNC=+Jc^q*|d?sKj1 zx#hHZkF=e z>!|LTr)gW-LwFK~0bdPnF4d~2D8dp@1x=l>47A1WM5}=n*5gSCT z7lJ$OKJV}MoFLepnceFeXWDnKJW0+uIVU9H1ad$3@8iA^fMeadD)Q>R4{PBaOJ9=M zigSJ40x($w;JxH9YmX({-n^*`^l?%ViQG9>$WSdxDWZ6B^qjXRO-A=MRtGVw9$Znn zZ_;<^$ja9%BpuBO&>XO!<}L7>S&nu8IGh6xk1zoL)k4r@EkpV4tm;`q3{zdPqM>5uAA8FC@23q;<@bljUognAAT|ac8(n4JOqO1XJ9w~h z`t+irnrYK!6xF01oR8Dj znk4z*w5(gJqWNDx%4eJAq82o|LpVwKJlAiYZ=CdTpI;MK$7nH9J$rxYq`6#7Qg$T* zaDnS1Z>FpVjn}!|vJw`2i%-e{TX=y=VNgp1B*6-U?MUPEQDh>y5fl9~i#iglt#ba> zN&Bx=M(>$c7z7p90V=vnUbfWkW-?N-pi9y-L&$i5Hw2CmHK8 z0syCrT{B6+&HSv7>-O4;$c>nIDFs8&m;=rtd7?R%yjxt}Tv3JMdD$h$mnqXeK-dk9$^6f>jCha zj9h|s24Hvi%UJ-xd2m}=As_o}`7EXa%dlpWh%cG7F=Xk|SrrwZz4^xhcrXmWe>ni3 zM$13u)6w7LZXZd0U{h^rX=7t)LPAnPX>IBA3+C^yyiW4jNYYNT){35!sD$O$iv4rd zsMU;oR)gBj9!I~XAFdir7cOvwR=8#N*n#?LG**upE*fBpCY4GncVhWv{1rJsVCK`I za=j~OHhRsZ$nZ#cRCctaK`rPq3c$3u%UgEZqUoMGb?SfIVMplf zz?x!(+zH%9`;d%WN$I|*$zZYIn9?1{e|8fHln2ashjP z02C=rZBx(dKC|JYP$e`qC{ok3EG?b_o=S_CX;ri!ho}`63uiI0z<|fi7_b@|m9X@3 zCzDF<9#-R1sMNI38Ed#`CAFF=fP_qzs1FmoCAW#y9wLdnfI(*X_0vK@bltS;$#0T) zP0ur|4H<9-_WP2tL$nK=G#8Ql2vX0`hF`I`YRY>_lfiRSLWP7~NYd|DzBl=QxN*sB zEdnt8Ffa(vCIIW#^E<;@(BTmV;J+dO4}Zyg7Eu)O<}{i@LI8eXh0KCumNqaezMRR# z$h}ElJ zRL-WxO^@djGDCclv@=+(rFCU$f_|DtHlOSP&Z0)6Cu&zDs88}IVXZ!i>(Z0<>qkvY?c90TXN8u@+AZYPJn!u1w@!MGBm3f}U@Nes zeSH5Uz`QmL3|KNh0t^`I(dAa)va+K9z&jV-kpre?3<4H7waIS0uoR3MuI1pV(mzZ9 z?c33nZX3YtCw=d{wCU}Mm;uW~D*^ z;A8!T!#lQ-8mlqgU??ai8?Dx4azW$f-1bOP>{n6*HUhw(GZ=IRgIlAspEJ;EW!l`U zQd@XA{;Z;%NVtW8X=)EFI}lR9G*Sn_Hig2{&32eL!DwTT387wKss;TTPuqsoD!Bx@ zEkhrQSyQnMT0TuhqGdN=UUmzH4IRg_QVU6>A?W4{MVKA^t zV8F3VJGohy7OU$Ux!#=hd}lK5y+?PLc0 z-s`g@)_}?1P)=Ts#E0FG!Xpg8e^mf3QikG@w*eTte;Jrg$5bqZt>tHC%DqV>f+5qC z%x9lfRLuIL08ERp2LF~tSkw==Dc5K1?6h8STyDyB^(V>X3 zBreXLR5V1ko_I&!*+C+x@x13^SEvpd=$p4cq>3d{MPwSH#fl^`$clb-*?_loplrb9 z^7(vvyG96#e!feTRAuJZNV4pGAX^a8@a{zLSE8|AjuC%6#t!@gyd|5H6{-BjxbuUE z0Boi*Am;{?waKfduPsh1t|=Z$#wR#@t!9W!-He|Z^CXF9{E}Amw`F>y;CLAqtr`ni zJmC8dU1Tjz3@%GrEo|AGHrN0Fm9&1p9~Y9}kH%5xEGS9Zqep2aG(6m--$HH*uAl5L zosh+aEm0+?UgniBIEFkr4`kYyx;1BfjX@brA~ zu$V#)OWj6V1A_I9Rw1 zJheSCQmIL*QH5DvHI>0?lPw!){#QZUgRx{wEpy>EtQt0P2#Wx|%3~Vp6L<{$fDvhh zwvfr8Eb{?$8UdU}ud&%!mi3^qZY;s(`Hu`rRa$+N(jKHIw?gIPI+(Nq|a!0W!z$k7D2y}bZW+= zf2VzCA7^xQI;5bPU^I|Y391W`;XdH-2m|n64}kNSx-(yr;XLL`G7i8o%$sXv?Tz08 z0K=g(a?$f|nUV7iD`w96Qvm$8Z$rW==*t7XE7mK%E1kWn%b&ZN_|a=SC2scF+NkmG zjPs{{T8Ujqz!TZVg!wTOIFj@eGZRT>C`Fstf7B&om=^5~2SP>3egs8|j0lvUP%i?} zukgAuz23}BSCiFeVKfBGPlJz=o$f-MwF#S54lNTAVIr7dN@a|Y( zz?fD=vjiZ*g6s=u3RGqvkD5S>gSER*r5J#A&)HKs_uM`ZwdUm&|BrtoA&&7rU{!9f)n_mnu5{+QfC0~&I+P`e zd*Wu4%A{>L?!>80J)z_#vp8;l`7WWWPD{U_#P(8T3%pn(TKZ z3_-u@@?OsEy<+6sF1KZVRCXG*pzlz^n)+SCp$;AuFfa*hlGK{ve8%TjQ;MyoKEU`y z?kGfdVNmPjnMv>m1hr1N&{`jMg-Q- z0`)dt&pSgQ=0$>kEc#7YyJR+-I?WoBU(%|2(8|c9QuTCLx&Zp@8oS*N0O;}b8(-aPfepB4=rX`i zbQ$>#LaWLYa@G~;RSLZt0j_bG|3$q^(WP){FazA>!-X0VxJx~tc6F&?sg`%*;BhfcLU3OIy9z}#GP?JU6K?tI6QKG?Shrrzw3kJT9~#pZHU@mx^|ch4iCp{eLg$x zh!g|{{Aycfrtga9L#Ib^`Eq92=^hhxLs~Q`1Z~GQB*ADrW&rxDRtwk$EVx-|O7^}v zAr3tKc+$sGDs}#KOM9|cPRXHAKRo@>_hvH{WF3-Y9q(pSyLp8};dVO(g+tI--R^Dy z8SqZY?NmDif!Amh3bRJ=IgCc$=MYeNxqk(z@$kHzs$3e428Ds@fxsL<#p{$N0}3&Z z7e73iTo2E&$3j}rv<->V=~XI)8edmMt%tD$ zn$}%ody-s*)y9u|70SC1=k1)XySv9pA_P1!Y`2ruS!_WY$MU8==@2Wq5r9qgzUN;{Np ztX=u@w^vB4L4oocm;qKeb%4g|kPt_h0f$Ezfd4uG{3W1i5q_^to3*qK{!3@(#r!tn zw?%l3A$b*Fl9_cFZXV8q<;?RVONYtu%)AOYC;ZIfo;+aHzn?PK;R3?!ZS@Xh zB6GGLHT1pckXftj!4N{>Pzc&$(P;gC&+a>B8}xd|Xcx79K#|LWRt}SE^}G~%d$&W; zzmAscV#N?EElyZ6WzNCr(;K57 zo%6DrX(x{{5+j*3urPScRAeyKdaQ16dI`JvDcX8bOzw+5srSWB(Qs! zU>8bFY6aR>CQ4l%*d0&m88``CmkG`Xs%<)?XdXbY)U6LjU-%nYCD-1dqg(A67D4X=(Wq(qg|>%~Snk zzZmT4*}ywAKs*(cdMY#;hq|k0o)1WI7xGb{m|ZRf-*fS_WOLsRaR;dp62cw@;0|d6 zuV`)E^7JoX{UwZ7VHCUy+pj+T%Vkx0zkGEg?EL3n7R+sJb<7pm({}2lBx*07ymR6Z z{I9czKeL1Gq}5yqz_x%GG|km>u)|4i>M--YXUUS`NpAD@-6BfTEBwtaVLdJI{XUZ0*GTaaF`qxs2<_`O*faM_W*_eWW< z?x-gku z50lC&4OA2q7_d)p_UVo()Pi2<4)+0vM;L(b;`qgbcRNY@odh-M`^%rsTqW+}*q*{%;RBG(pQMby0+b-CU&2!-;KGAq+LU+8h8DCXn*J|Zg zm;E3lo7p3nk$h8w2ufEGgOQo~5rFmf47Eei<>>EsIJ){B{SFsw;OOs!m(!cA^4*gz zpF?lxIW3nxYcJ|?squOGJr245w_l_2z^&iY-|sQQllAw*67KY4^gOiJ(~p}dh-K>c zm^^k9HV2#S8oOD8wn)IWB1xhfAz9=WS8j?*T2i@K0_siU@t(3KS5vS4C)2az5~6Z; zosojtaXUiq=e?aih0p49HF@V+WIMu1eZcRY6D(*3s1TfjB2)#f=4Gzivg@6k=-Dq< zpzp5?zSKlsVi#BDLI);vV`>uwJyvRkUcqj#r`-HYf73$&x5PdAa${1|rkD3f9G%fn z%CBT?(p$Tt8@Db&lVuD5q@W&(fYEr3(I{XkG|xvChWmiSBMiWIZ+!2;f4a-h_)iah z6OF&)IbfB`mr=&YBU3jjPyc8NBWGuC2^)tcLs2>?tvUr_GT31K6!H2`47Ie2XY zg9dz}xi!<}bUpPzgqsa|<7- z&?w2Mf;oY+TVXUJ0XE90^nN$((LsDN;z9!#g~0^a<>^Urs(6#T#lXudSb`Bl(9Z~H ziUbT<0fbp4i*C?PUz%4&6qYG4ZBwEaNs16DM##t7u&nx6p!wVIy6shTyRwIvm2YkY1NwzZBMW=}YVL@?vMTvvgV$XlZD`Gf3~bLxxD0B<5OL zTKXg#H7GN!@WJohWki2)~TW}7)^Ho-z`ve~pYlmFNd2I*j!$}(M<4jO+} zV@{WuxU!sxw@LDijNHCM*Gx#vk@_~s4NKym8UN)VbGr{n&H>|HZ4d=95P~&6FVMV;7mv0g?^F9=C^WcKsaw5UhHkbXVA)WAgL?7$^{B%rnqg?Q9=oK%4~uXs*ChfQ6SbswmhCa_cc5Fnvl>=*pT*I@IOh5P=OQ*|y%z-Z>`Sw@vIc z8QmeDJahA%?Lr4NiTMfD_|m zsbLb;qtvn87BdL8NR6%=0_LN?73$2H?Amz;|_gBlvqe2V4f<@=Y}Q+=RZs z^A=(b7}cyz@0Q&Q6R&Q6(e=xPiHV5_z`I8mZtT&m zUwGia!usz{9oxSB)~#aU|T{Oz3k!d{Vk%M6g;KJb|Y8EvJI|*j%Ah)mp%2!x(r7vHX(&#)B~X#2Bu*{MMW%o20Dhy zH>lOE3WwUK!D2FO7w&Sn)F5;yRkR^EWHub~ zVUkS_X+JO;Gw@W9(rLlB<`mf10DxH~!Z1ZlY(p~O39#7VhC90jv|ykN7uLvpQ}KT4 zB&1c!vzgG$LCH?W=Trl{4YgX9=T^|lI6kZe9Ufr-zT0Eud%w7A==+QBm47q8#Lzec zb|KwrLIlQq?}deAm&5`!(*~)mBEo`S3`!GXjVQV3N9u+=kU2(Xm_*TD21p^tpIcio zPOB;N4h-l|pL7iXD8UUbsss5M8SBgW4;Q6nSgLMht&@B&%3qW}STS=KUAkTsMR zADm@6m2k$JEJvz*l$EK44i3nnEIC zBZi=rGCHKXO`*gulD5=P#FQO}U^#w@w-k#BkyjxIu%fO?7~bWLZY+Y5vznOd1>{r< z6y{NP8qt)BS0RQP401vjmxho!v=SvMVSL2j9<*nd7X&p-8`MUs9mxYcg-WL~`he>y zIo8mD`0Mmwlp1@Sju{YuUkf3xjIcaS2!|A>QSr)1JAp&)4n`V_Zkwb2AmYo|v(nM8$^GW;qh@q7a< z6T`-AHO^4l+7w|193Ei+4v#;R1J7Kf#_NiT1CK z=V7VZq6iF_Wq|)SWzzVwtyP8S=JR^{O*Wbq)ndz$4Q~gwv)YFfwJ#7m!)SLWcaV05 zVPc7n@$ar;n2oUUa19b{+O{MwC9OYn7oWhSwfRFw%(SiwW5qwZ@jm{r6Q77d0B&ZO z`t**g>9TpCZBZ<&g8op{SfXwTqFg>rYr3`bF5Zqm`x%ek>>R9rl5At7sl_49taNc< z5l0i%%#TPUgNyGDnV8_B2&zua+@VJ)uR;ezj`@__!VrBx8_FkBy~?1Us&Zn+8Rt24 zx`QlOvSAMR#oWx>{Fml{&E5HT^Z`$O*NtvSfR+L>U>fj520VeVNP(3hD8ZXsE`?^< zPh{{_VhWZG8Z0cQOhJAN08I501=NyIDOk=VXjmJ^83a_9l%*AEi7#b%a4{N@bMnCR zcnYeRamChK9+Sgvok3^P>FgeZ$*sdOX%h?#QkzU{=;p@ku!#aRDvk3-FNZU}ZaL7v z8gOEQBGuFq3Ev6Nj|*{xzi`4M48Y;>^&If-4JxlIQ&r}oQRt?o-V3w}8cUp0UU|9k zoytd9fC|i>+Jabr6cicvuF55|D|c!|TIlo;nc>zR^=5jzXa*ELaYeDK%&YmYl~fOt z(Wzvcw7UonF+a?YC3^rMBX2Bcf(vIe;$zoXW@C-?KagR*vjpo$LxtN8U#($chtht$ z83CBAk99N7tIy3kT$Lp<=gOBd+K^Tjt?u%N%B+L((`n~n|F2n&KQq>&8s^->^(0Me z_8hoXpZ?uulYir_%`t+%-(&XJ{X2#;%*cSB9?o$7XsD(idyw#AGMmkvubrm0KiS&OxX)b2HPS# zz>EH4>cUuEN(XOL3vyIgX0C#YCM{W33ZRHFHsxaCHF!u9+-mBVc@w6jl<*d_&g4J@%fMw8$(fP%+IP3 z_l&H~z<-39V>!e7jNBqDb4J8fR%xT_XW%X31}B3Zz#3wGiaVe~6C=Q19uBzYx!Dwf zdrdEQ`BFQ=HrezS&6cQ)R-4?>gvXE$Q_CgUELfJI=1oe$>267FaXM3V-8!W^HKqGd zsyo%Bbi>QF91`40+}$FaYk3VH)8c-u<+YO6Qr#^rCGfCRcrSRq0#c9*ND}8}$1}g7 z3akJJCsmRKNss}fu@h2YDlTGF^R25N3p3#G2m^3<{0RnZDa*`smCd8*i-G71SOv|( zcS>bkc0y7@LiW~2B>-fgzqTOIHIcm(mwh%NA>r&MfKMAT;E1kPuQybGg+0BZs4k;+ zNR!BH5CEw2;j8sK*4K3Gt^r~z{xESP*(qWlaTa4cP$-Enl(&c*x3dy;7os8^p~B+O zHg+EQ<&}J+ddq(1$)TGyL**&V#-ZXu3c&H}hi~otbW!3{>!&p{;p7|snPa=luO@DBwLLO4y71OhuHN1slfCAF%P#dmYwo`;deN1;V`xjk zRYGoT-_V52--{R5Wfu-F4H}0=*->3Ud}!!q3u=flw#9il2OHmcv?Zh+67(Ylh6znW zU3AXD*;861$p+};IY9R2dNBzc3PB?S{#qaK)Yx+vg2p_mqD^5GFbJ&{css^KgWR4= z(K)j#-(V#<_bb<4xjCt!0$!(bd8!0hc&KP(BxdaVSmODZv9Wv{F=J_I`89=U`D6KG zV=?(PaPa0>3_NHIwqTi9oK{$vR=5rqg`3wE_yBJO3jbK0j3|s^8w!j<>wyE?lr|1? zseqw7hjq(rSj2K3c*SP zzDE_zOl1127GMJ447(wPM;L&^cr1ZBqU4`X_fExi)CKqzkrP@tbg{aW&Z1HJvxBNT1?|& zpKRMB-!c2QkY$ft+tA=qM)Mexy35zqrFN*h1~hs#re-x=@C=#(je0Kf-%h=P(&GM$8b&f-7+rR3^rr91 z!tEN5&uaB`K0PXQI(!b7V!*m%aIXViG2`j$ukPKe2cT>{P0w7DD>t{d7i0J`bEQC> zdDIY~RnUN}Ov)44ar=|@C&k58q7WDsSc^fJh)9(QXJJBfHal(#PILmE?ZAKmdubS2 z24JTtYd!rIAEFGHYC)%Ts8N=gRx)87Q=6hqK*}rbIhd4`RJ$N4VaXneO?As`&F$8v zPDz@-X+cuy5`bn_svu-!c=-Cr@L>7K$jzI>!y~XRAGtYP4vU*3BQQT3fd{~TxD3K= z_{K%SPMEl!T=l|e}Vz;*7KQ7E?NeiOBpb&f)26=@2Sn1 zF$mwlA8buJTge2m#TD?^Jw1CtPQ=K_`G_a>?azKx1OOgNyf`5HA8GY8{;cqNH9$5s zWnQeC!ZK#yjz{(0dApxmw(Qx#jEwSIuWos^Jj3zSje@xw$+9k&YT>e%urOq7?&t2W7y@;w?!T`WPKfg&m>S&zSQ>~32br-E(*7#}sndXQ4 z^$y0b$-OXI;NP)m-Im>H4xf-=v35Q^RnT;K96p!N@!_InR_hDp>W$a+RzO{s%Dce@ zD}dkJUaQsGOHX1Z_VMDi%n+0!kpTzAJyB&$eIP?S2|#n=#>Nzj3&Z7 zZ3V^(EXstjW(;ey@Q9H@ut0s0WOHEG9|PbUWavidLec_t@UH+c4AYE>%fywCe_@Vn zjoY_x$??kQIr|fKNw?3bt*2+1V?ffc@79 z`68lre!}}A0Pw91s6Q!*S~>r#C`0@e)kjM#lw4juw$ua*w0|UPL8*dL)%5ooKLv`Fz$YDVqokwZ- z9B>%kw`ag%xw^OW$_wP#16Q{n7$r}s{Ts`T8~Rc<^gCP*-@gy8KR^mP|NX{>CiGK; z69+duf4NpG-vtParED~VO97ZNU>zqmY+V`Mcz&1+#x%|;&3=cG{8~AnA9Z#m><6Yf zedYdp-hnxeX+0^Bv3DHF=Q`yO^mq;!0T^?@ZIoykX@8HJ`T?g(D-!n4iH;ii!(dF& zz7vgm0^>DVY|i}S$8+8uUKA5GXHL>Cv4zAlHjXo)H=|wfb;8GMb{MUGbEM!=C^Y@6 zh{bAP8K$$7VK~We6&c3l=tNHjg+krkw}I676oRD%os1M6x)ff4kO&Bj99YTfU_KxK z`d|Z-k+u$dgo1(&tHNN=7~rPSz|C&Z*zFp-DdR{=3XonS$E7+A>@ygDW-0!nK!<@h zVF+5lHY==oHqwe`YO~aawhk)!3U{$L7~LMQz8Yn)=(f?<@!$Lx6f(;vxG+UY0N_Cx zk8zujLw%d(pQ@cf?i-1Tihe2kk~rSrB~`w@GGWH>HS&iU?=9IB4e!|?mtNt=(UE~F zDL{d{!%A4;5eDG!_)`qn!k5WSNOB)=?}v+SWHE=f?%#AfHur}m3pVxnk+X@q8T)f? z?_Yajf3(*B;iBQw4lOndQ~Z^Dl>dsFvevFUjS8@Y#qGAC%#c*Alc?N~?ja6Uv;sD5 z0PgBi0t|v9GfCfSlFSwJwIVE8K8s<`!4oitUSn5BMlMGHj%==Anc$)3^vKB7@Z=r; zK&J;H%ZjY~j-UU80vAYE1c&)p?2e8d1us0cvEYK|*cJ`nrFL|h zt!9U2$GUYH4#$Tt4!BgVOt=6F=ia=4P!eB0dn)7}NFo;Oe|w4~^&dbbEcz6oQs|>j*^FUQAMjzf)54=6aOnG9 zu7=Wa?C+9}Zw-As_bu3$GhP-gO-VSuFZ4PiOQJVbx1i&#+qN@#)@O&Ct(Ms2yjfN8 zotFA!l86;unsubZ$J?9pl4Fyb#TBttRmq>NZja6QQEY}n!8`l*lI=bPkIo0cy)8#l zj?w;HB%f+*Am%7bG==(eur5r8_M7nx+zW_I04`D>K(Fvu0sFXs-3~~fVuF1pyTk+n zc9V$P8Z8s(_gQ^dWkwBvseuDdJ$TA;jk4R4o(f;dacG`uW`%UIE^oLUWWGTX6UT1< z^^YVb-psGL4gmZy{3~oPPJ0s{SYB9_Pbl=_ttKBKdG(Z}Q%U1L_1>@J8l+VETS;#u z%}EG-ro&qoB)uZhYH?a74hVeA(nc%9cm6nB1sxt?01l6@kD=RD&@uwc7)+%onZ?B;S?KZf+xtEJ4s=@37}Xk$qwA;wg&=(n7rbwW%H?n%(mFc*o#xIfdMl7{huLrS zTVh{b_Ugu0^(e(?1uATH0PK2c;Z?3nX25Md1`9olGJ3-Ls9Ta&58bC@b|&nPnmC=c zaa*<6#1#}9;?^_{P3%7#cSJO8Cr`V)m;?^-;LN$*rYyM%8gszIG6QyY2Z zqh}TAa2Opmbbn+!#joaa1hF)$TFv)#lQ$jk$`;xWtPn8WiS9-i6XtaQ`X=Qh-6$m> z@-+GsuLS^Wb+5I!Q{76e9#*2*1ue*84F-6hhwN;?o#N(FmF^Tf9MlPhRJTD$u^6mq zHlg4xZ9J`e=0gkWtb|QT)N%bP#F)-kQb@19_={K5prnko<8rN47lGgrY zcYJd(NkagxDoIbzY9A)sv(l>~V*zyw(+9~&e0_Q{A>|bdRwhi~_Dczs0s1T1l<%yZ zKk>h?bxmUnt5YcCx;R>%F6V$FzcqcpBY*dczf`i|R`_c(48Y-WS3}U2GL;vBH^hOd zAFy~SyY&2|hwgi6m+Uw+`|PGkUnFnuUyxzFu;|A7j1=lW0{*MU`YTPDw@aEN>MTj0 zW z&ZMQrnPr|k3YaDF+#whbIS)BMJ#^@t?zKZY1Yljup=w>V?i>{p6f!pG+~-)oNi&aE z3tc_@NxYmypC-Nfq`vi}9w!RHc?J~5Fa!R&Tn-?`c_r0OErM>Hy1AstJQUxCV_Kh1kTO$`fQTu92(jwzOp9j?c1mATGUVP zd7r`dYB4=w!K5Ofs5SR2mP`l8i*!nq8LGj`oO?{0@%1WbWWdw|Nf9dh!AdNaduPqQ zFD5>qsC|_(7nL4OI373gIx|*AH;inS+yKCXhCm7_+)Lu67LR!>(UVSgbP7fz1z?3{ z8p+~zlA3h#T}kJ$M`mS}4|e#}g4$sL1}rN+p#-D?+mJB?-G*WttXr_4z6b4(m5YTr zxBOc^$uO()LJ6K~xby?OKc&0E*YN3YAg z@#amEzt?Ou8f+zpSR>W9qQuvT5R1*hh_^Uv@DOZN;&~&GVPs-09hj29xmElOD5`TwtIUl@SH<9{sx>s!4p zSqH1B$>mjjKJO~oDOM&#O=7ykD{GHq;jX0pEUt0VGyI`;&E6{?4$Wv0L;P2(@MiV{ z7;DN}9U;4V+WR9hpB%U~I=XP`=u{Y^Q%6Uy;^q2vxWV%3^-(%-Yw#(x+|T3kIpnIQ z+}uob2cix^z<@m-*(nM8YQMW^bRiwP7w+DDVBz)yyAgm7?B2fc!0zXsJMi3r0|$0L zyL;in(fk61&!Cenjb#r8>aU2!-IP*$HuPm!M8A3f;Mei=`t?t}u=$avUU=-Or(SsE z$B(@52#lwGxa_H?9(iOvZsOSf?15*W($g@s7x6b25V+UTD@%H2X69z*Hu-G8tg#Kr z-9P)pr1LgBV}AB4REJtR`0FJT`>(BClO0XX7@EA^kG!E0tW59R9=2mb3wn@NL1PXW zYoHZWgc9YM0SsAP>AuoQWxX-c(JffC%Sx3mMSn2?0r!<|YDg=TSU2;)Aj?z_7smrB zTplTq!;J97GOHjc996{PQ9Gs)15+}bUqE74EYIrEGFjx+PL#9q0R#4-?;hoOM$`h4 zAs8Ugz!@@9bQY@9I4&z?>noyvai#!p?&1$t6;3OhS-7fdW?|uHRjXG03h(_2fVucr zg)n}#stU*9S%>R?Rs2D55hc(0R-;DN#z3@{C7)GP8CteO;?aZwM#vB_;0k#!iF_ihoyMz&hx60YhjDA&|BWHZQ`RI* z`kNnqDPg%p4VEkRzdi|=$?MUtaBevsL9c3_rhxg?-x3Cl3ijXmi$wQ^zcJbRFaU?g z|5gCr&9}~LlBJ+?GgVDZz0?hZ2%j z;Q;)V>!16j32y>P3P|6*K6n)%cJjB-;Pt`L8@ ze;vF75g6c%hIL(;4$&_NJv#cts}C{KBa3bhlffI4e=7jsMPw0Bj_ZSq77YzuA4U4H zh!pi3gXbnU0sALRl7QLU^!g2UQS3K)`pw4C!O`oZW20BEjt*VDJ~Vh0&J&#`;M8H^ z&8aYHAd9Xp!WVn7A9bC5fZBk+xmHK79C~(T(qKM-dl2miW9;gmJRda)XopMBJ`MmJ z4BB#jItiGsjm*!UE!oix$$Q!B9T(#8&J|4EQy2cn9d1bHC;(GoW;I$NVJ()CZD~9; zpG=(N;e9#PLCV%D*DRRaZRI++0G4a@g~Tq^G7igCSa{KQ!y_yJlJVO}8Zh70tLw8~yGF>~a?%bHf{48c zM-+f#TVi9gDsI%L(|TyQj-`*lX1=YCkmSmjk|zIwEl8@6klahV_9tAMw14Z*D>;*V zPACP&XaI_Y?fiBqVci`Mx9>gp;Pvn~XBdFP<1UO)A26>f^U?@3DnYwkpUXMm`KO8| zO?}s_Tucpp#K+H;PI68hKCv>x-$7>dNwoh6@R#O)9bQ#GRhmNWDVAnqn?pbGz@^9Y z@*ZFM_@z1+zu(nfSJ%9&xuRnE6QSenk$F2&*^yyHv(Gy3i2Z^!x2cSl8Dl|`RScf) z>pm?*sEuJhU4O6q9XS0`-V-w)c;bU;2*BqfBF@h^KXU%Q^ZB7T`t|(uZUe(|j9(OQ z6LUY>J^6#OH-pxr4Hb4VV(j+Nx8)Zj+s8((jf|Zi8yUNPy?hWZ6zsRJ+n&EJ`LUYB zoeXt3)VctEdmXZ$a;TiVDc3A^>II#2h{UMXvsX@z91NGnRifjgR(ko@llR}7bT*oi z8E~fjBrxyrX3p&~h1`&aZZlvLHDfRusooN0pXjUGvgy=h20R>{Q_Z4MV z4{r8?bCn?4W6C@=_%%W_46;t2{EF6_KuE;BoU^8qlmvQFA`tL*Xs31Hc2v3iWyj)p0%_&1h8Mc5hyA7&lV+o z^QLko9DE0tlqee-s<~Hy|6x3@Qpr}ANbvRckRU18|;iI zxnHYxA8LPNdI)aT?y0V5U%IrS83FiGMP2>Ux}{6=mj3=yDCU-Ix0~GVNcXrH7PT3q z@>*JS?e$Bcq%vazx+tcPhiV^P@$uri$D4QkzWtTDrFnGBoSs&cysDhktXfqF_#4F9 zY{oo*40s%WT{H*m(~5j|-)Wn3=oX**_{t@dD9}Av25m!2i=X_obkY~|jD&lpFrG)q zt5gSzrjZeWQHbL?_!hsz4G9=9k8QNn?j8xSpf;W0bRVjbBlGLl<* zfH;G01K^5JF=M?Idw8+ymFi$31;)Ny-k~sYI-?QQx3uUAp>(@x=oncou9~ZrB?!Mt zWectwN+=l99f-*xI1b&Fw^NyEWF4?!HtWp$-KfrNa_clkqe@YbR=5h-@w$g=mLd7Y zI%u92f>A5rHcQHeP#XfI$CXa&mE2rc)8!@_ zf@X8#PK>w5kn<;g@RJwose^&7F`+hQ{JUhvsWrPqF_O&aX$2V5YP?grxux^#JUbwf!rZ7n7vjWhCZHJ2y@ z|8lEEbU3UIpVfi9JTv$7gmACh}+2X=R@sA#SLI*kC_zGpeo zYM|F2PaB8QnyUJU7!uFi4m^uN>PtvV%Ww-Z_|Wpz%j*jB4<5YD6#Gi5Q&%kC1Mm5* zl079bb}oP8-x`kOg-$?KeMMINoA9h=50GFa>N5PgaA_0y9{Xw2L*$nJ%HE_o6A^{s zsDuO^puLvs%t)x6RBaxWko`Voz~0N0|Mp@wxvUHr@T5LqxeA)PA)zv(LIBK>`)w6& zY0B9jL=E4j!24>KN^%#{^0+x$@43A{YEDiG0S2tJkKOEcvrb1k*&(`9H2Ea`{B{qP z@b+&b$21Ca8ZkNq!JJOM>p?~6VIr8&a!{=hMvARGdLtqHQZ)|D0P}pCV@GlR`SXcm zBmZ&pxvT)zUojGVzSSiyC0}7^IS^3dX)O6ZE?QD?l$4~(_gnrmwWQ_yC8>BTf&F;D zrEEDMCI2)%^2^1IQpv0D53_??bVCs*I?n{^^R#O0em`R2| zutVwF)3TP9J8>q`yp2S3V3uVw%>mcTVjQvEGmEpZPN>~p*cvno;f5T)ATHL<;P^i~uZ2DM>5mG)5qq`or2E{9w~Xt4T{iYEO1T zX%zie9$I_q2TP7f=!VpT$3ps74)uUX*0?}3VNu)vBH;D;C?L4^0>M4=R>`isqVxBy zogNjlwkT@)^eDJoT2XT50r}tiV9Xb!rsxdw(0TyiTq}%REN9Bi)nl2HE7PY9!Ft84 z3ilYf_w`WzclwIu&5u9uK|~D#aM1@drxi`l`+Y^-$1`t74#~(gG8}InPfb76LX|bC z6Ol}XB|lTWYU~Z}O%ewHESJ~J4m@*YMe}E~^JdQi^80w*()9L^tE;R3^Ml*Znh&R_ zT?;f=>uUlM+~jp-!hAu6lLe3Hzg%XNfC1~R>Vwa38fT`1anEO0O4I_$?EPIr(#ZI8 zMU`gfNYo7p6TrE>z1H5Q&sAk*^NxL;0Z%>b!5lCe_!@;atoFe=Xrn#Qkp23cwQt`T z4^T9&2vQ#;mOHq0O49iL;Wk0oSQ_a76$>F#bw91=nH5*L^UuSPqQ|4vVf|gkEji}l=wNY!Mwr)Cg;=PRCT(ev{ zEbYopTDdhUYVF$6IX`%*1*Is-3|0)H{stC4_p4MIT4yYpPxc7vt}adYFuAsNE%^c< z?VTgftjGg?vG$4CFdl#T<;uq^AJ18PPgF(V3~<$Z0f1|OU#~sG{L8{4q7P%by-k^z z09Lg&spbI&XR7-<%{~(&HUIv|Yh*@IsOdH8|0!8IO(uBgh7|fveB#o_d&YU^NI9t~ zPTXd;%ko*~7k?yo31hZ7C})KwadpuHCEp*qHf{Det9eUVF>CFeAIk@if4t(Y5Ci_= z=6{fD*REwb%oqW{+U;IPFV;f$=Jw{6nMA+!BNOu}0I;ujZ_B2%1DREkHPh-OT6AMnwIkEqp4Y|2Z8h{LhVCK<;gy&Dp zIdNjnntctTHsJq|)bxqAF0Z#AvLURmujF381VAI{~axUKnCEbBS*fZfOzk{G5~)ef0f2mt|*a%&|i?T z!J;wJ-q~;07!+MyU8gr@Wi`{0bq@JDl3?c0yLD$$^U2x}tlziz%8Cet{N>ZHKK-->_Gt9>pm=O3k%W+eO1>0fHBk?@fm&+MYEQ^yS${j1qm)P-0x4spJ})`guVdEsVl0U z{k!|`|Ho&mR{UGt2Oq#+N8$&0MWpJpYd}!*>#pZ91`F97*e)mUi!0=S5G6DM2mXsE5P6LIR~R=+;h*p0G9WDfs1=)l&!w-9 zJVD5{58&(agP&A?6{sr_9WWcnb>;RxLbk8^`@b*Tym>0w3-2S-m8)T-)gPBAze}R% zA9K{1mIvTx@5O-tjL&)>#o#YyzqNwq@9w>C5MW?>irLS|3R)cp25-pOLsAuz3-L1_ zKk;P+(@eI?IpF&qJu~xd3* z7epVQb9~C2`IRk6xFbEjJ-#5mxh}pgy`ZkSIi1w>3RM0IYkpC40tK33>5C{|y*z^aHd(iqR9P+k ztH=nsfuCwk)pQI*%&Pc!IYyhSQ@`SrGWxbq?h70k1JM6Tp&2&5|G@vbpN{`CYx&a0 zYk&aP%z9uIVmN-FGs~+O(+2Wb^WzUZ@%YCU0AMRHU|FD2)}vI>rX=CNbwkQ;hbR5R z1pH1~4k7}R8><7_Jvj;UH|>i)_0rkK7D*O@#{OpMNKQi1oH+~jy>vEivE-Hk7#*4v z3clkj)`Agn0RVXH8)3lX=kJdLFthZtS)a{<^_!tRbvP3t8U3$YayY?&bFH17K4a&VUI1Fm0cUXl4*ya;7%$|O&$T$mQcg=2`KKoL` zndLQPZBEqN0FZ#d_sBO`+4pDp97^72V7`e{FihTeFb;egWe)0OLRiu54J0fABNzqjBhF zfM4oR%ycYzYOlo^xzqXNXz_Snn2CRQR@yH2ucj5PB!>sSe^bRSw+&i2pMNK%)oV<=JQx3OA(%9Q9O2}xTw zp}n#eRZZZ0xm-=Xmf2Bp*>MR`l}9A3!A1t`ZMvM>>9eqXmd`JHkDeA}Day%O(C1P* z0PlE(O~dJH6-TJ&X$senJV&sA32UfI`Dn_SGCM%Yb*+qk-sty_Ov|lZ)TTbzo zMTXOWQ4fDMldNV; z8Ki3G@Ze4IfHRrwwPIrus&ViXe9?`8hkGu|U;2yY2U#}IvMYMirun5WSFqB!yfx;5 zgMEuDqYrM{H2akj2~8gjD1(Ll*$Sbfk3A-+)e};be{=qO`~3ZX?7a(EQ+J;K?|~C9 z0YnrPLXdK43{6rMlmJQL5H5*0;Sf!*I*Gy2cp+_+(s)^*ST19y?bO6(r|CFOM{PUM zv01xQ{k7eFcIBC^({y&+_SbEk@o{&Sf5#vN1>r&I%*glu`Fu}MY&)I(?M!F7^W+AqnlM^_v@B4H8JaB%7x$Jf3#@@IOdFE`|H zT0darKnDz=m)?b$B$IO)Xx0(!@$0f$-EL2>Mh2RVqXnF9hY}kaC80KQ{0e26RUz1qg|dWZjF^0WVKFaOM~=`UV51%E?q?NOR+1AduPlTo$=1xciK&7 zr7c?+My8jEz3X3LLPDd1?2mWea6Xopnvmm~J=Pqet&%u3XKZTXUESJd-GSq$OqH|9 zl%SptV01gri`5@rM24SfZ=PM-cTvx%0~&YGBMJR*IP0|^TNoLm-dfFZ0gnd5v)He% zZ&}YC*1o&Qv>>se`yw@F<7VMPB5xpAw^zT2rn}*P*KNtn+>?e4BRGX>keN+#j7iPS zTUwZJ?CpG6!>C2~Sieq^Em#Z;CMc})y>_Po`HR1EoaRz*Z@)+B=_+o}JU?3<`^atxD0AOp*bDyaNZ3lg4Hk;GBM6~XqNFg^HsWOwn`)G~b9Ib&R z7Or^X;=*37Qyd0VNLg>)h7Io~?Afqk&xSn-IAD1KZcq&4B?)xz{>(kNZV#?M0hiQ- z)Czp!3#k=VD|&?3FQM)es9=#$iZU2O)~D3jvDsp(_}Q8A5i(ww zQd^5*RY#<3>V#J{=!z7&%w<-Yr)iKqXg0mqL{;v>iJQ>T)R z5#>8|OBOTnXVBcNW6FgUQ3V_Y@K+VUf8+*ea50IAV0^0LRLqz0R)1IlKW;C*lI_7X zV4qJ3N>_OypB(30++d_?W5|HmH5l9y4K@libQr7_K(edD@{!9bk{Fn;U%T;(-X`?_ z?k?4M^9x#Ef^8>szDu^bVQ36AQMUD0lY0HB`1qxZ0AzytorOO$=1~ZbE}FBbLEApr z(sHg!7YU6rWMlCSPksH)n6$@=2zgqQwK4}EqWE_sF`2{F`}DQ7eeaXuQGvRn0)QjG zAS~z9n))uLCU-|-u3#>Km7CrBXXd=Ou1?qd-bXtN44tK=yLWqfN@!(xNQ(L|-^~I^JHW`?ZLZzNPbZ|dD`cu(2zVi#1lPF$p0w_b=dXt%aUNQ$>O3j9hb$0+S#Q+1uVG)-^c)bC(8QX(tCP@G^FWK z(EMS0jS3TiFa@|#=!c}zoby_+^F1qbxmd3SOJQ5i!3z50HCjMlyDVP(&DcacMdIK% zqucHGb79^eaJvHz;o?AtuqFUYtK09uYrt<{3{4vBV#UJ2m+^9RcPeNfL(*Nv;ka6TZBFNuKDv04x z_;vjL`-gzk`m+0@<9|4407+RSD)CdNlDC-O6~+{fz->eU*VU48J&Iq3siUVPMwfCq z<+3RX;3$Cq+5oJhb4!yD-f&(F{|$veU*<0X;NPGLx|9~;pq*@$GzhDXak;QY)Zied z>cAaro@-S|uz|fNNQVfojS7%+J=e-k)B2NFN;S+!Gt*DpC|tcbl}#wyrgXy@9j<|Z zHLFj1R(p)hDI6W8;&&dP5jyUvI^5VR$!gIAI86O{iZpBc+V>4p<{~ID?&NR26X7qqgvszllgaiilFD!fpddCB z1O&S~9?9RcE@o_ayt@49r`=aPSF*7RG|VpyU1@_m$pWqTS=$2iD`SC>;ZYjHjVQ+L zQfu~{_IBxH=IqEE#jOz;Km)t8Ztl;jjvq=tcwuKU&v2bD1JrxSCtj?UHHekB(78V7 zav6}phL>{#fIkj@bNGXBU_Fff4gIKM0~6lsDGlxFut6 z;anwrYf`G!qt3l`3xlnsP9YVEW*teV%+PT2+xzby(@Q7yLs5|aQ2-wLd;o8xGsl?Q z3V4M19a%ta&>LX}T#hDaVMGBO1@KoKz>6`Qa0Q(;#?-<5@k6>crItaXoA4-%^CU*c z*b*ZEhRJ2E4JMcqWQ8r|GQ-$(w3puRd#k(R8UMsSVEJwVz_cBbCtFDYY(TvRzz7W* zFzzaZc{-q$LJ{5M0wHV&g$yASx7W(v1Cgug-L2u&A6?!2?ZN}6j<1kCc6}Q*?X$Wy zoq)WYcI~98aNdGh5d-w7@QG*;7L~!X3YWH z%-lcoU_cb?^Z;g@6-ZhBMRQpskjs2H{dS-bhYVJZ8KRH!uEy%_(5In z?)YHqW->lP;>qgG$yeO8rIFGd3;>`F=AC4BCIMrx zGY!2uLir04SW0h@&xt=l6SOUAg8rjT&_DUT3i!i23V1PdN>|GWngGsXbx|L16u|#m z0DPG#zg&Js3fV;U)E z2$#`CONzDPmX_^=9OOU&8~iRc7eo#G@l!ErzdFO5(dFzXwDz)KgH~JIR?*GTzP`Q# z@nkfje{aW~Q2i^Ii|4ePOy7zC7>0uaIP?g~tX#5W>9M5+BsmbEU47kd+Jrdde~2u3 zQL0@+t7DE*{d@Zxh!A*~kY{Wr?cx&#p=mK7*rRZ%nf1Rtn3Qt)a!Nwa&M_~es6l^u z+qF-&Y5Z<~09zXSElnDYCg6ufCx~XNLek$K^!2-a!G2{BK5Tz)_N6?ssy7$AFw(Y4 z*{FcoPvrs6-0n@YW2p(1StJs4s2OvTR3ZVQKs{Vg{i~3xB&vwEg`qKb;(7)4FPu`q zK-bR0zXXKi(?nDNqEj0mC zZKkj_C=|m`sd}2c77I%|6dE>|!di3!I|Yxgb5eRFk`S!Lgkb5Ua}sM}9hnw{wdGb3 zc_@r3S|(%RM~v}Ki1R+J^I@Cq;dY(ru#1&>F$~Krfjy>`sIWi@rU4mcU0oP4)z#%P zZZpCiy2QZnt{#?6gZYHf&WoLPUdnpARL`c>&{ESia^V)^+eEhy9!5FC{7D3>@c`1} z%SVg`aJ1xjV9m5g2F=ZaV~4e%|1y=ZzBmYL>SQyefa^>k2Wo9oHaaHi1C9dte+z(9 za1xow{EiT@>1{$r^fnshPp6gT!V?H}t|XF?Gv#E3P7Hc?W8Rr@_#@xAS|9V_L_D+j zbIm=GxBAq-(x2J~{IUd2^{4=a9s;xwhYa16*zmwWy_Ue?P>2?6q)S>uIb_uY6`s=i zM~2FbjAl31-%uOmN7t{HKKtUc&h>{MQ2^6`zYYM8qxrzIV%?$zi$*DN?;_=_h&OoC zajDdl_89pjEo5K@dA8G{4)kIZ!bfsg8x|5?e>jJqa$9nS0B-xKc{*MD@o^II|Kg+{ zn2VxGaM@C0@hOuylcWGD9TdQnz#aDV_JUIFib@|YF4tIa+a8d%NR@A_rGGD*; zNt#-ST%#2*2W5kUF5!2Bq_-cWuf}ifFnr_>_R}I-0N@kZrKP>J9dIc&Lq;F)<1;7j zih{;8B!x<71>A_Nlv7tQ!k6d0UW*s4&}JTi4D^*yF>8c1BBK!>5K$pam93X;!yBU$ zIV{+nsf4C5N4vJ%jQW|fNDji+3(RJ*ASM5-m&f8$0A>t?#sU~X;)8W2y(}CSo3vF~ zL7-QY5uMRoxVu{>?v}}zy1p=0!ip536!L!s08cu#l)aNQHEA+sYSOcM5?D~hpc@$= zECv;g2xh%uJt+_`S(38gKuab$2(tp*8H~o3h+u(TkuWJK*X!!4fftCoR5I^2m^H`{ zz{qgcu3}lQz+T}H>uG;{{`2+HoH=;}3Vgv>wf-&ow@|VYt2gek# zOJmY77nvd$YjMF0pauc_7pa8xg=t7{F&{>5HwqT$cj@`+JSj(0o=zN9z)=AI?@_>S z;Y@NdAeQEh{thOWeqjJS5lJ|S0YQXBaFTUkJO&3Q-g&1gZ|NUjCdCTs3Hy6vwu^A@j*1I!E#vIty_2ul*90ycVGtkJKrxDd`Nkv|ZGL*ekdT{2$d4`Lw> zjo;z$WB8TB>hSwJk|yjODBbhR$=cG1`dqd53>l~%MNnz#+=K0j;Cd=XrU{>FU!erO6BtMf(IQFvm`=GLY$TWz`F|m zQkAfT8Rm-o-QJ=g)}CQ*_Zh;3$CqH!0xq%PHd85x65bf?@6$ z`MXV_92OLCoo(taHWJW@&j_Aj#IcEC>U7L!{?@17>i+xb^!cwU9<*#8&r3|?ao$$CUi6HeNwSlyT#@3^wPL2H;vW>mTsL_YtmmF zBeSRm9)$x1M%f=b2Qq2XDefc4s6l61peCTO>nk;YO07c&NHfCfgx$_~DX>FUWR z7rSq@%mJ}GjImv_h6S>Zj(!!s0TS^6AGXU?3OQP!Rmflz!pLJD5Mw(~dGT0-Nf!2^ z$y7v(WSK22C#^kj@nVCG9rPMinuFi1s;EeS;RWg6;&>IvVIJ#oH7Z&yd`+XMHO*O5 zO}^etR@aT!n#kq>xiRcqvAU{OdKjc__{Bmypa(UdGECTaBt7 zQBdC6-6a>H{*_A<8>)+{V`8dfs`Fs^7A|A(8uM0lb@f|x6fvI`l$g0Kd2P$J5PDwe|tBO!rjuB}RJSsvd z%D?+c^aK7(C9Lz2TN=TVQb&I)uOk!XCgv21-)JSQD1iUBDBxP%8AcZqQMz>Q7=h_! zI?oi=(^d4YPFGise&JeM%EZWrwdI8{^;~=zR{UN7m;Lnt7{iH?lrthW=(m?POiFF* zzkO|QQ^=}j(BEvpo(4+K&yzNo!neZu9Pg@Jbk@3+)U53W1-x}sXVM-RhK(SB$xlG2 zj?SWSC!@D35Y9Pel4ha;o-TkL7K8XA1#r8|ZE#Nk*lMseHJ#f@%5U8=Ef}R-hot~u zK>Jq$z(OUgrZhXXajK^Lvw}^TX9u;%mp)LEkx>#?X_I-4W)V+e0irLbWN93%Ejej& zS$IDE5C5TmCf$8{FZR4a03OzbM!ZY9j7Yp1K223kOnoE!3iG6WWS7qzZpS%kYWeEL zTWs$Z#*D}BtAlS$e?*YEPU(>daqqB~;&-Z35|*aaYE7oP1;05zJf3>Cd~u&HF+NW# z)!TTZp@rlb(^f3L*qoC}GA%6ZkLdK7G&|_it|q%&AwdtcM3wxc12bP!Y zcwphNb|5X9_RSiRnRkUx#g&x2`ug%saSbw=SEvAuEvnE9t-uDw3R(#(S_?Wlq5%GK zeZVoM+Pf5R?PnA)wK>Dx#X9Cp-MFos5YxLj1C`ozrq#78zCZ#0h=hzbXWrpRKPcCP1@rl zM99sZMP0Q+pK_LOI@Kb+ND8I^OtX;O9rowyiqQvrQdg0VP_~8)RzSM7!^&y?j_kW7 zrU1tB8;JCuQ0MaKU;Z1Irhr>(RE;VLs$T^Sn?ext-a*@=%TAs=8F#!Pqh#qR&a2|7 zECc>l?udi+u_xy)Dk*lcP3dIh_YOk#^Ene^(^n1QPjaL{^0kpMGQpw&nx|H1m0VFH z7nvonbjOgE+SEi+F4K|CKBEv<8xLDdEXTeWF^gBct2-jZJ!1_H?Nn80%HT;@rPrU; zYq20SEywATb9D$w<`-ao_&e6j@}irumn9wybAUNfIOT${Wq* zwjN-gh_;ZRm6+wm#4kFYThb1WU@7S7#h{1C_yiH|4_zA}dFQw@aSvpi%&0sWn-TYn z4hf8*SmtxCaO}d9Z$9`$$?}Zl3y+BhjWoJV=ntikQ?I=IPASU2_*v^uQdhn#3g9S! zzj6xrEkWBxe88*k_<(EA5OTK>Prp6 z%9ro%^5{gX0>|Xy=yi_`s9tT`G+^!QIQS~a_Wn3oZKYL<*zMz^VK!K zsCTptEmBAVoZ4Vk*;W3T3G1u-O#3byx8K}`T(hE9bzAqBi^aC;^M%wmD+DzS(N8oQ ziNYG)7<+0`I%zB-V_lpz5KyZFo@}_d1CE{PIeBDc<)Xu_pR7`PXueRyj2zfGuhwMh z8z(f}3P5=~?qu}#ryMP5H%T{;f9IwYu#e^ew~noDh`ktlymE8?m?jXQ?T`$PfYo3P znV%y2#LwDR1JOZ8(|R6v_IEh4q)YcQ+t=LJsEd?gp9;5cwqj$#~DM1!!h798)QqKFL`uh{K)wEr6qIktz;~o zOL^pIeQ$PluW*5%d%7$+TWKK@mzx&^g{gxyf2Wcc0OY?!v3Xw`7l%gcBv|x)OrWOF~Ww4s($ZGgYN>5ol41Y`S z>-ze%G|CDDupV&hMDjX?7KMTjSnvi*wUMeEubBFDRpl^W&0CkU06=~W|BbZopYZI? zB6*rLvDn$otOEe^Aa_B9H)3^ak(u^lkkr)h;es#v7jSZ2cXJ5|Op*-a5fqONkqNIX zZdpbNOtMGD3s0V0Sj&B61obQ8E#cT@8BffGKZxPN9c!1x$z*8pm#fS)42#yI#<;bX z?|vov0sn~#=zix*t&ST7aCH0+6)-@Q5U~x?TkHqS9G>&!qqi-P=hrOU!BYIHz4O=ZxV?dmZjg+!lEmm$%>KUhW1=%RnbG$2IH!|il zXtgiu^}7g3GZ?HEHFpJItHB`bhxWFn!;x9w{MJoWz=8`HhTrPmd!r5rTu1~0&zedv zCbOpfxmW6K+ILCSR2ovitptKwKe$@GXyd%|@6Y)6qPi?Vio z3T|~C5Ev&7xA%9-vJJZ{78mRhwrU9ZTew3Wx9@|MnfnX-$|n}66Fx~}Q~+Q}00FG# zmj2+)Z$=Ji;o5~W+SMHc{tnSOCU#*)qN@cAn`qRp%T{0 zp=k=3w@2!4C};#0)wvor9QUJ>agpu4{b)v|*uwik7_(gQ{3n)2`reFeI(baX#sFW- zM#w}uAZ7yY4-J9rOUHX7Bz=8WP$dAEkmSt;V`S+14Kgw|R5mo0SCpQNMX)F278$@- zMK!R5b|q9u%-9WSy+zZc;l<4WV4k@+95X@|!#DKLTd*0!f)y*uYqi)8i6U4Zk-l*6 ztp2P?f7=2*>6A`7k2sOTdfS%r%YAhK@0jK#gTK%*Tf3yuPED^U|qMBQ_+4E4D^dVJ+ydL_gp^Q45)W`7?Ebivl=0 z{`(5J{PGGLs^3ILe0jwgDu{3A0pC`@ActulaHJB}hYTa7=Y~_#GdiX={tGK%-4)OH zry7wwV0-DMUW#5!`2hd}0Gb)y+y|#6CC~l-lf`P94cxpee@ z(4#`)(Wuaefu29lKT~Ydzmh^u7=${I)CH_mc06+Rr-k^RFr2U#0IW6~QmM{ySg?v^ zI<^9UPnmQx2o1oZDaDcfy$$w}O~rtXqB=$>g%z@&mW8k1nIK&&iTzLZ@HxN6>yo}x^2F_(|Lu;F zSPI|~Qqg)eX}qWv)oo_#xP5lkV${J!TbkW`vH)Ogiqus^QvHD4tyv_!E9qcsCj41X zw26$Y*kzQPfxy(=*@$t_Zshj(L)9Q1Nr6wrcGs3KNYUwZb$w?p!i!Q?{Hl+dm9YTF zRJhdMO5X0^eo1R=46}-QxK8vK7CwSuC7)s+#NA zP_o@aTQJB$08{=67v3f7q|WY&&9F#LNGKam#b2vPQ9>2I*kov>3OKVGH8*`K6|>fe6tYoA035C!m83c$41RXI(oi>YJ8b%M}XT+7(XM)mD)Pw4h{WwK1WKe=mo5?2{}j2-OfX zDC6{|gyu6KcT&i_NJoQFYRVnHt$$~2jMa*zVtp<4rv*@k;c6AR)P@?B`|rlK9o>-m zSf;FJntvBh)!-(~0T>7f;oiV#sux^C-C!f;BXEU%N?f`oyed7@1?HWTu{gE+S?gWTTV0Yb*Tr#bi<~+%iYh4wF_v4>EWp)V=8oR8wDy&HtnfB zY@}YF!P=p5J3s-G&0TG?caH4g9vVwyI&-^23M&BE$W$&rIerI>bLQV`0|5KY>I2J4 z-oA4@H+_F@F=x&vtLl4u>$BkpAlzG8dQXov=W*&tj40p<8U?MwI?QH;Pz!_BieO!p z%QL2_|GBZpWv`h1ev6^~fvJ}A^c3*KFbqIiaF^P1o12(RYuV^MkT{oyDy48_J z6);()swSg*W|IVU+YR!NYBV8fWMpD?COqHhmwQ>AVM*o#N079BGm)F-x!-h+N+F-LFIxG`a6%rRKmK1T^OhfSTI4WE7vZa z{?z49R;p?Lo+Wp!pYeJ|G4pG(NYSfN`+?&9AfNLN`|X_?mwNk+98jA9PW_5L2_SZP zNwH1eo(N2fbTq&mAB=<+_`4|1q!*vnU4CXsN{a2-N%4{OEQ9@)%-g!}d1@%jsvaCv ztA99j(4CDXL)^^ZyZ^jmeP;Ze1@F&Wdg|gaVXz z#A>WwFV?TqbxZZqEiFvQ>aaRss~?bmXRL0;ewO)0GROU*hEt1B0kf`eW|Z7{@$mVD z^K&}<1LkwGB|q3SZL5o(zc-FCqY1jdx4s@!FkC-Y#s&bdqy4ib{Eg-npLgshQk z2;dK_)C5hgcO?qu*$Pcp4%wPEl8}V+%&u_&aJa38cIA`vVzffjg3tr=E? zibX8$7PDba#>r%~9pJ6bZHEpS!rc~&#Vn^rXL%z|1!(?}q=uJ?57jg!QURP=K*q;O zQ61U72S}Spu902n4YILzoM>h)&Ws@i&G=C#$f}&#Bj?-3GC>G0_KuU(;*%$*eMiH~ zmzg-;Y(B>ofB%W;e-e*Ac^m;uv%wUC3`YK{TD}?zm=gGpA5s2B0sNN-aM_>foyz_! z3Rn*4MB8(Hwh~VG2;hTE-9J1rKJBRwJ{TL~I3RG`njO<7(X(ECqL}F+>7BbZYD+1W zlaf4sH9!Aq{@&;Iu1r3JjTks4;r$UZ?_Q+Ai_g~HK*#Fn=)4)DqqpOq0m7q88>C^= zf>~rvAt6;8Ok(Lvyc%0T_-j<#o+3B*ZhbEAxvf`;V1o8^h71#Av2G=a!$0OZr?i)+ zOWy<0_w-wV-ZNJ^#Sk!$Juj~+dkl#_Hd9j)h9kHcY2vzcDZ zBsZR!v51go&WMlA8x^$gtWVQ@H13r2Y=fzQ6g4j>B1;%9;0U%=G(qk3>RgwAF zwIXi!JuLcwe+>X;H$6WMw8JwN&Og{OFyQ~l6}NWbofGr$+so!JK?VGX618vt$MyYy zVcHFenxLoofYAhvB_@TSTdY=vE?}4Qo!1wVp=q#)b+T>yf7oL={=^fb(`4L^jN(;- zg?XZtNhEmyR66_H&QUItp;m_~9s#@;9=V>7w3(#ltke`u@I%1qYb4p8Op?#ZytFv9 z7_HE>HxfceBGGVR3(vd4VV9AY*T}Ilm&Vw{Mg~{cck2~B!q-W=5bE&u`d4con7)4Q^Oc+zZO`RUC^Ff|l4E{4{ZnkArZs%`J+()KgAPR#&_EnO3>VqUJ&tQOE4mb?NE% zrSDBouc%Sh3yHw)ypcV>9G?|O&HZy8*01>e%$23d- z_`SsCk93B??nyl`PH*o@)b^|xr% zX92&UcJ(%Zu~u(_i&i>mvQ6sGn$}|)FnyX9P0+WhuNQQOk-cK91T7Yek-)Gu+qP|X zFT9P$$jZzZ1uc=N(Dn>_QA7C)I|kqX-li3M_z5`fc?a{zp1gEym@!_oC4R~Wyq#aM zrHdqF67tg|)mTE}jjV)KWJ5Z9Bdq}7;<&p&`yb163=ao;u;KY-)7Q_Re~j~rXd$dd zv&1X{F^)c9`TDPl0*;O-fd4AS-~4If3I7}8%MCeu{V9#n@0nGk0! zy+TW1!4-B9$)1|GLN^f~2_RlnY`YkV4I7@Wgy&S+9)4dy@x;*T70IMI1akr<%4kpS z>7$Pv{ipq1ZHM{J!H`<5>Am9a+FRF0h9`E+rLT!)Ks=Mt&lJx@bx>lrZ?k`p)#l`DYAg(=c-g|VUHznst9*XPv=i`*Cm(1Dbqoa04IY1D z`ug~VZ&Y%k$H~!b3Cx5X9sR*zV{h-J({@YNJ6>KX_E_@s=X|Y$KWLNKr=)Nva}bPZl8+@5N0wHIFQxb83(` zi;RP({%!5NY3p~qQOOvAy;y={DiTW}m)ETSiuiz|BMRWZjxqAJKT|0F-+t|DH@;*5 zqYqdjx#9`BgFXSk{kb#AQI3mU^ZJ~rbH@4CpZu}Mg?*9KuBB_A*f@2DpZn(82DN%U z*}MCS0n0`P-AbRLsVmo^bo)FJ0&~nSFYXzq@mBDP$}>{!#l-?Eu`k2CdGi((E@)`i z-_p@6B2xIx>m#b4(URu6Q-zUVCP-r4g0bdMfGS{RB$*gZYYYktIr27Ci%LwiZa9WGv*JAbZC-H1V0l5C}8K;EV@i~4&@PuoAEfL}856u@$o z7dsYVS0qdW?mn+*^}LJ-TuUY0+YX0#6))RcLN-?)d)PX{XhHc%v45!?ZLvhF?(z!=Y$-D5`*?BMRU@sb%w2|aP2DQOMU8`u<7UF|8oN&8|U20Xz|l?{&-Dj-)zw+tl0E$Fk~H6bCS~DUThGA z5XLBI%Xi1dQr6$DQ~P#^OK$`CQ$Apf_q7`t zr(Farq}>Dg!54qD@QFEZk3}XvxGTD-4C+Cbz{msUntYw8D=NqdIqSu!c zP(fUkm6SZ?1J($ovdE3hEjf>sk)q9GBP2axEHCL`Qsx91BYBPRmellYbb%UG@h-6u zy`GJYa&*D6;t#sm(_S&BO?f}D*`(LMIC<;LnX@KSm^nk+5lS%-OD_-@WNxGnAwc(R zBnAtAlj@IXZAYZH7;WEKt?7*PMXjm5R=4`H{uLMPO86{lVVT!{=)E+VH&=pwSLy)9 z9OW7i=RjZ;OeAOtO;{8Z-TCWZNADlDwvLk=WdW%Rd^q5_y_{Facm z*yVR-Pv>L*?V{R9i;How3zy$MnT{-*zhjW4$zY8_F9yoruTCCtbVLFC*F@ky%lLAA z&5=Cdno>zW@ONOqF%VQLB~$^sE$ZThB^hx$HqDt+^7`6kSsyDkgIoyXk{f`)C7U+Q zd9)vXhuw)P!(yis6pmPo znV%-DSZg{vX)=km@w9gW*(7$h=nfw?t#88;9HBvYOHGa35^{+Yof^N!?G9d1dg?Wd zVb6wl({qeT)xt*^FV=6VZSHGNYSz{D)#|qB+S_aUw$#<$F7CN5y?I08iqsah0R?b< zwx?IpEAiys^O`|zIaFgeV2ah@!)=*WkLkajFfsM2vnsvNQhg}e+BrvyT$MyKJZf#Q6uE{`$^))hd ze&hdn<58A#_Sr2>`D5)cb;Vi%~Ah%`LsB%aZln z-Fd(-7*(x6J9CYyyG=!#<6$WdvxRGT0Hb-pjSmjf>qROf1Hi zo;=2aFcj)+j9`f?p#&DK0yQE4*opua9x0>Gq6X-IxL8^Q2_syjz2n{@T(AVI8_NtA_4x2{Csd=KoOXVV*7%`G0>-TbO|Zt8#ZiMv8S&5 zKxVnFR@Ya%rLV8HeCo62SOYGa2iyTdJv$ii2i$(QCSdi$7CWq*TIkjb^9wFK$jGJ| z6)fo%pK1|L>d_`z+pce~Eym6OCUITl@nZ}lP z<%Mg>b`h&SzWmL&8H?u3*|c!sy>o4x)fe>nf)cN~VgABL=gir-X~FX6=g)88ES^jG z0ANpVzpo=G5(VWSd;kD$n!WY23RsR+56wL_K_IVOMO)-GvE7w(Ga61VSaiOy@??n) zeXwTU&!1zt;)QXrzHrg`rLh^u#4bzK7uA9u>IsF`k*O-sk(!jW9Q4p{u|zT%CduX? z_Wc9l%gX_VVlQUho|DKGax_EBMJ(;C>!x)t#$oF5&vh6L7qdF$-CDr|EOcVf>-A@; z!&k4Teh>WDvnJ#9!RrYP$de8xlPG*)? zq7>4PQ2HLqW!aBdvHg&@@QeNjoXqr6ltYor)V&dc)SS%}Kd>hDuEoxik@-=H8_|c9ZtI%xgK{GAYz{c2;wQFBpUeX{_s|}65 z3#5>BXDfYJB2ww52uA-ZMX&=AjKwGoTZH$#F)=beJ{}L(@wefYp45jhY#7e3zqvks zbLZBTd)ZLP5DHl}!7HAiHT03(a=HfF-qRlo5EvT*!@Ulx=gL#p9(pK$Z*pGI-m<*p zyuB08VHdf)^n!x)#DdLLRjDbFkNQd8eydd-;y?g~fxq%x(7&QmI6fWlNAe12`onkS#UcVRI%D9Q!}d;&AF z`+W|_faAh{J%Rvky-NX4uN2ogzX~F z0842&w3bFeqbxRUsjJdmBqT3&^#V*SgAEqQ&i~YtdpfK8G%Hr+%K0Xvit@K6cegwj z{l7K277WBbWVguP|Dykage@D!KIcE<_C5TXXLH=C9n0|0oy;g%YU7+LZ2t&H+Z%Q+ zUG{Hlf3SS*gY)OM0Dpzr+!%c&ihLuq7IahrM@JOE(ee2T_;FCcK1Yxbw_OUz#6Nx$J_&vpVF0RNJ2S5jt(5V|z&ycXfw_YD8p+S!oA;^R8=r`u$csrnpI03dbGu4sCMt6-#9^7v zkO2ow5+ul9MU9mS1xr0aN6*TM8edQ|$k<{t9(Z8k+>%(9F?h23J@x%cpE3yRPnH0d z=g+M)axQnT^3qjuu)fz*uk-<;Kfd(s)1{~FO*x-Zz`KlXSv7Kuyh879BP>L;Euq;c z<7~&{mc~_9>ZF{Q=QY^3$IqLMY`3$xGOjW%_P{A1qd8FU$Nu%mMYR9CMDPR4K=Ia? zSs5>(=}7RyTVR!;8RailntA^s=G{&#e)mAFQ^@i~7q3mLx0$HRS11H6oz$C5CaQ_? z36t0?$)wx!yIS2Cxsh16f{di1kkuJ^iJVmTIp#xfi=a!KyXHMzO4FZNvY z|H|M-=1Tu#|4&-2V(!HQOX8l`@yszD%Q*q909iCbTf(y9*k=|leBhnqPR`q@qA}1| zg##u4Rj)-4@ziz9;iZa*{aQ7TMcy!B&)QVME zNm;AbRjk7C?R5p~wx6gdDER4#?VHn|PT0SH)%I0~tmr&;fa(r<+(D}v_Q4QBvKcx; z2LEo2S{(rVda{wg7b+^A-ucvhTX#Oa87>tSyY5Th`t*NQR8;J|Z|BbRf~Qwrht*r} z+nWB5D-g$+LRPnPMm z%1|1Qjp5pf>t)ql)}}yH0Dd&V&Q3SH9L8=%NUaW*TGd>zx8LLI_~2Ty-RG-!yVPoD z=8u1z1BcPl*x!2zt4$(-K`1-h4>T0pIL;ER&#uqCO0tw#hO#ufwBM8M=`B6o+LZI$ z%!%nf;9btPtX%8|4Dwe*lYvo=Vjm#hD+{yQBT`w|<>k#95l^`+0$Q+~w5zMjD3e*z zK%KQF9ZX8vl6hj!h7Ad+3H0W~hE;oD0XNO7QWN&9N=iDBkN|5E5)xJ=WuAyE;c-}X zB1t5oO0ZGI3w~f$Y>}&2EQo<37(4O71K#j~J(;V^b#=Nv=W+O(i~pUjR`3A>V4ag^ z^(OQIBY@8eYeDgz#mXE~YND3X5?QssDz95HOs;J)UEEi$Td`oII-Zm>EPN0nzO{rp zf2sXBH}@XkuWMV)N3c8Wp&GBuTa%SqmAdPvsi`Yct5T|}s@A2hNZ6AKcT%e=QeQ|( zO-)Tnt)SPc)CByj@RJG``nju8QxjIH%sfnM#9EulDdSipwtqya3-XpXvWBqJ)S~U? zWM00Ju9gU2L(go++atn&@TdZgjwpbmEE#e|7}BlAT3a;J2{kMo z)DH~1$g)^9f;GT}b;0j4Zg5aG=o%d4VCiBpvDGEBcsWLJ9n&RjEd+A~gF(%NM4*2; zPp{JBcKrOQnS1R%Ag#x52*I=hB(msIwntKm-4>KSpHIabu+Nk_Wc7Qn7AQucd$15z zX@4(mid1@!-TLV$Xi&fhbLD97RpEIb01L7VLvTgdCV-W>Sg(=iQT?J$MSmo$_j-Ae zhKC2xWbNukyRbfBytCXnxMvG z3A3H(&F5TjXo6;y+{}AfmyClc4g6hUuLq(1vRTD@EiMD+VvW2RZ4lUvNz|yq1K!h= zhRq29z`LS8;OK|~I66KLz*GVE)(0H}9UZZuz>0Aoma z#6aPQKWgjC3VdmV`2N5Y`>lqEtC`LU49I9Y7`lCQ^>RX^rYXNK?HfUVsHp&E6mW}b zT_H#Nb8o#z=^Oa}@~`G?0|5K#@uNs$FpY#pw5kxcW>mhsNN5o+U>H{M zv}XgZH=8v*Y0g%KNM(^?9JQH+o5&LzDO+fNhsafhz>&ivD%yY;D^ROw2$;~4m)684B{L(%57{lz}pSECVwB2qA1AkeutO;Ya zyuwAydZl8o*ehklUU-mA>+*_?HAWd+*)+kHEwACl#vYtLh>e(OjfMs|8a$8m#VBV5 zu0$D(6B}LxGaWekH0Y{PPJO^|*hLz^FdVKLRa;a6M@JOE(eZl}@Z-6=`z7_tpwCB( zQF@dYKmofwNMKkA7aX9II0GgYfkZ(2FeoNeLVi$_ZUFE$HbbEDi3mk(=~*2rJyuSQ?P;@6%6GO8gsXUtl(;RS%F+u?4~AY!4^&LQv9#9`ZH`{Y5yFNR+9#*&={gVD5)&}X%?(g+n+Dlf^PDqI8OTCv~rnR8+r*}g_ z1>AD5MvlcE;5;u#UtCgKH1bkzj?h%35*|`fTQuLJ64ufM--UH7y=)u8*6VCj2zVBj z=)a`Di3AkW>>8C>PSaZ{W)wmpYO_c#F}h^DTqC2ASkwxQ9qHw?B9$4z)ntj3f|iL} z#F6x0DfRG13UcVR(kZ(%*5a7N6eKAv#i2Jz#o-T00fS|*Xe}(E6f_{S2GA>_wXfjg zG%DmZxw+m!_V2S`A|PY8A%C~2Sg+T+O%Ak$LD?%s3VXc>;caQGI86=!wgZ5>cyC(7 zn=I$q!-wb%BAFKYq~2YX5L<;NXgNLR^ngc<41y5?j*3E#hejk!il&0Fu16JcbVLCh z9n;5DKj7WH*yY|wi&6I1e~eMkKESUBgc;ysz-k?EJAxt$aBOf;;F)320C!!3z+Vvn z=Efn1N07eCi2oNwEZQ+6`j;A^12jkpMW{iDSE3P128;0HiO6RPZ%0QD&zx)R=-Iko z)}#P#WedaODHVZ&{l#vDPuc&`k2d$djELcFR3<;!}V6uuGsvQoQB z%<_lu8RtL_^I{bOxQ1HJF{-+Tf0k-uGuCvDOiM%<;w+~CmebVh2!H7pAQYc8V@pKJ zUw9SB^7RoDbW{OHM-;%(@fihNL*0=|p%ip~w(k*aIs}T$?^3HBL0^Y@(9q#<4EX&n ztHosy{FQWs1`V!$kK@A18{0q`qu}+qZ|5IbF$5Z8upCyZfZYK#6S>@3FzU!H1H|$~ z)HA|+pvTCxeGqEh*~)PC4$#23f4+JkaJ|)~HfXF|AmA5>9+j`)+)Cw)0YQ`jHh2BYcM{I|=LRuTk8fz>vuiXoC2RT}o8|A#ri5~28@R3v! zG%2ghyx;3JTJX?efeoC0pxIkw<~4ZWd86G(HRb_PMPC=lteJ zw)_1(uB@%!*jfES>(lpbt&sRUzMrqs7}QK#62~y1q^ezix6AqK4KM84!ZF+rQ*~iZ z%^0@~su{zU$6m_c<>iw$By3?hbAiW)ps8j&Dyc_TZBQAS*t_40x;Rtb!-47!X>8g`KN8i5;rYX^Kk z@Ld_i#(>}IW?5dCFAd0k{xhybs5&5kazrzvmTj0j6GGmnwKr;wGMWc|7 z#Is0X6*`0E*c3q`_hS8LsUBdP#)h#NbXY8nl!BHX(M}$Tl)S=#E6~GIbO=vQPErrC z5Q(KXiKVynnNlVkz9p54sVkXdS(n(D3joduhY`T`Hkm5d?3H=9orZ<%4COBfT#UjB zV&EL;W*Kc}2>A7Sy;7Enb&YJ$VrIiGkt;0ISi+Vde04Az62V=KJ18>B;KuJj{90UL zv~mox78=q>!hYqYd@RIaQF9j`o&Wml8UL_wN3mKB{O$1he9C^SnyuWiY|VpDKDls5I}kY7 zabe}eA$P>^EYgS+aOzShYwQ{T7%jpPaA@Gn4k+tzU=S9-%IK$&PJWGFb7j~w-%sxIC^Uxcq{|vGUme=D zd9!gl*}H3Ko%#i`w=9$4n4}@6n)&G3Sj7tkX^)Y;50#~}kCBNRvl#=k{S%j(`zW83 zk+GJ?$alU&Dm+(|-y_?U+1TU(1~qfndoVOg5p)MNK=L5$zFFf40c<-Av_gpBdk%%@ z$|XWuiU2$HW?VUrTNDP57;=E&|uWLf572} z^Zg*hzNb4LTWm7GA&}H#C9I?Mv_o@mZ$0c1DBzx^oX79>0l#2u>k`UuV2lvn+Nt|j zWc0eiw<JmB&po8ITt9fT_RN>*A!v7b`CwFo_329s8RrQd3iRrB>}qFG@^LuYzS! z`Yz1QNv*;pon4z>s;H{iRaLP$@f(|~suGKeimHp?IYr;yTu_vlm{^ctL}x5dlb{+E zH4;Gs^PqvfH7XYpSb_ZIw5i`*yuv2c+ML}lo)Moli5W3=06r3F#()@>PHEstp*DvU zl`zIP0%X?BqrNDRvL9P7pAgkq4v z+hpBFJI)69ZRX6xqQdH!x8ACLt2(BrFeWB%A|@{{rYJAwE%-o1h48Twi>eFZULt%h z`Vnz0929t@I=v`;vr1!han4f*j>k6GWE>pRh&cfH%gIa!Vk-}{%Q)7n5gwpfN-!nC zkZ7uaqj|v55e0B`d}d7ffF;@WSo|Ns1Ngx-q=UXD&h^aP*WY|+)28LGKKY{tj>B5f z4xiG`$d=su{n*$CcD(uK@`VlR!C*(v%H%^1RE^f3@7%g~>&~a1`cD4MF>*8c=0tMd zjft|6vZ0|H&rRf&T_3+bG*LYfpH~!rqq_Q`hw{F$dF$4jS8rY&{^b8B*Ho4L*2I=iQSO3Y|Nk)EzzKY zgBFe}erE2E=Ffd&?$Y<*5Hu<;%_Lb$ByWFxJvBjRV>5>5KGh9L-_=STwjxaTQ2`EG zX&pqPmvbI};DI%3GAiRLO;`y_gFhlOa9OuwXR^bMe@2 zP_6*2XXoX#_7&B@?34xu1!o2bS(w{(Q-rHOFjf7G^bQZNP>|;Zw(Ul$5MpvutT`*nkEH8bmJC zqNEj}B{iUcqfyY&5e0B`e7*vHyr#65nxO0JF$lWehk2+DnPJHr85!sCEd2h-jQO$5 zUA&f(45cU4sEdLiM3gvSyR61Kmv zy(*!qpdd9dF=5@V&4~r+1#gjwqM7;Rtz9oXv^DQ){zKo$f9|>GW>&b}ogAr1;y)DiS^;eB(Td_8XY@+TJFJNE$0 zC+a2nGqoy>|g?>dyCmXTgfq2vsUx2#J)-tS*|YwsMP@R2CN@(k4qw zq8m?apxjDvMCZh1rbLIa7JY?s=!1XU{M%vrnD&xQlx{ zoIUk*40Z$z|VuM6D{bi(>v z4mi2B#YXin%~}G1T-~69B~~;)|Kbtg?7E(mh3nqB6+kO!5WxYCTemdjh1hj(#K!i# z@j{4oB>g!r=#BgK) z0@#L5SkWACbVUIiU4I0?v=3NA1D+JYemMkcF&2IOskMrBn0)H(zdC4aYx}rvz+&A0 zNB&$+wzWSKJwkH8p`6#X$~#k?lu%i+E48w6-`R%vhOE0T zno{nB*Wz;CVpl$KabZlDj3qu2`^?wA%?$PjgTasOw?gZF^vuE~m&PWyJo4m&U*FF- zJRTo9VGZ{cRMECcD+mt$Q)H=h-m1J^A6no+tN*+$(1JO8=Pj+Nbiiv7|*UgN{691_S-45*{P; zqCER&0hSO6u{B-rxfrG z3_Kg;E?_^+0soM3Jo5P3**Uf0l#2_y20sqgeJrxir#v#deapqaUB?V|k7k{4VsCKU z@$3^8XLCpl0dP5%o&~H*hi(@zm}6x7ijaJM@^DLV_tEE`+cvrj0e;9Ldg-iQ`L*~v z-y`*)fOGz}t*z>EZKBO^oaEM39W4h|e%vtO^44XJ=fW?ldp+C2Y$h4kYkkQKJjp(i zj3MY<_(ZQKicBln^KyXsKC$9WaB@8-iDBvtulo#bnWMhD<9A1nA$hA503(0tR7E2* z=+$`754McIGEIoiDO!3N<;DN$)fK=~%y73gj9#ci0()JfKAYS4!vA@3y)w&hb%&C<7@jg!X*E;#bg*Vh=GL$v_lf<9US4f?mBpzmRq^u=jNrOB;_Z8#2z zNBm)<5sEJp%dPv-+fORb6JGknI(0zmx7&jOam_eKU+S+FbC!1212I- z!@3iROD7n2DVGu}aI|INh$4HZ%ge_V3A}mDld;dpeZWN7o;&d-H(NcBzUMVfp*$I6ULt2fw%I z-aRk%JaKRk6tKg%_oz-~GvfoDuF9ajQdc-(*y$u8~`}{LUW_Re4r@sD(Xz?5%X;njhBrw1iO-LSgHP8RTJYY29aPc($ ztkTmuXzWuBgx-JXA77mP^E|LNWdo=((7H;+7V@9(y-=i6M20$>s|e@{kIVof1j z%uOWvln+H~N z4jbrEHOq!xI`h&8zu0rN`0Bxz@L$r0tG-V|78QrE1C3zMshlGJX+1R9&2`ndo+AGQZ0f0O@@cKD~)jQvMe zE0<4p9i$@(lUgcD3*#wpcSeQ;Cy4R#h19glgqmp*-wL42%O%yWJ%?N5=yYMx-^H$- z-F1aMYuAY&fhGHO?v0)!v)jW*j;v+f@<3n@%3peLfJIpIqw|2HD+=H*cip{z^MHT+ ztvg?_0@n2TQ3GQFIK66^hM?;*mg4yM*_HCWAA$n@*dfNItowA%Kc$P$9AsK@@{^tD z-wXhjEKbL{nGj+K&_vJilwpurOlStUI}_^Q)H5AihdE$0x_6KLZu}Jzj|$jiF?y*0 zt)e05VgHq%96R>&%kTaCSatQ`oh8-Pxi|fK|9hwX{yxLyW3@it<+HllTHk!v>$Q)T z_=g%Bb*D;h_NDK9Wojz%e>V7zW>4hq^qo4Dr1xH_ohW5N9l!kCscg6@JMq-r)2Fki z#uHEb4Q*Fyf3jovW)-4e`SB0?{T`>$aT6<=+gj*5)mcP#V-p-h^wOgXY)R#M;T+u& zXFAmImhg}RZ|dO8X6O0yZM(Bu&U@jPozI*%)otAWcuL&8BcJEjKA1fC@yEgIgZm$U z``-5Oi%&iHzEO3Q?8E}-bQ*%LDgXeZ6V@z%WhX4h`w6Ik(eesSBC*p*B{|%&OOGtR z_esA1K>OWf0I+!Q`IKe%{&34;W4Go<0KBQ_)5*z^_6ktAt-5;vmgpTwe0vrlyJ|=t zvlsS4JE^>O`}U>1yAZ$}=Vm3GiKJ3t(A7@OH%u7$HF0bQ5*Yh#MQvGA(?)GqS=q+o zU7IR5hC*tyG7af9#eAblHhcyaBavUDwOL9da2dTx%WN%vY1N*ljT_BP*ES|^DB8O< z6teQvh7x`}0m^$e;10CgK>q@NSa zgwxVUk}&~Dok4bQ3Ky0qm*P!%-+nxH&S&O=BTsg?rGAri>)_gpbGC1}xO9Uk$vI#I zFz>PR8uWsmAN7Kct|)-N)b;4o_jNt`)d3h4aG$2H%0N@VRq1`{SOtCBkdd->j?xW3 z^Y)&)wl=Th*1Dc`bAH1oDJg4=Eu*?-i#RyQ7#s2|7E6qTyszM9XI*D!ouN)PwLFgllDyQc%Wo*Cs#8p){Z6Nz&Ia&%k)3^- zn|_UFhX&Yb(EPxA2p)rT1Jc_?qs8H7j4BNRR>OO}dX3HIuLHGP;2*fDp_yk4fTMXN z&UG?4aq1x)6$~l>7AI#Q z?IVYsrh!ACfafK4d)IyM*?YTfV!<;nwhso|f zcEhSvXvVC}*wWWdUaU<^Xjfb?rkH0evHAj$R7 zv^=X!doHwLg&H5qp^rvaNMu4B+f2tG@%kam|FSmzI+|_RPOx3p3ny-=Iq3o@Vkt9I zFGOZXjwi1wohBrsf{*|+{donPxcO%^kW3o(xJpS$DoI75d?tem=h(GJ=KPIrFI>7& z#KgL@Xzep|woe>cy0Q&Bk?1HW!2?GIXi$P7=%@mYt|)-NT>k#_(eVBG-Gz_-^s6H9 ztQU0OFjc^YDjZTYpDgY1qk^lxQxWZ8+X= zJl6&AHO7ipJmvC=XqE*ag>Zup4&RaI|cu6mt0e zha4hv{hjIQ=}W1i=-Aj~E~CM9wZdG`y}dItD1A{81CVFn3*)L5i<5bII)kx@qT2}o z&Ky|x_8b6DUi#iMhuc054qSJ?@mF)U-;P`Q&^i$Se7dS{NbW#_uYv+>L;3?R=;RjO zLp`ok0!;!VirJ<|-hPqH`IotHojLFukZZyHM}9eX`-_jfUlS3#2}PxQazBZie~F}F zVb+KY;JReY0h6qjNm7_s>Lc58VVbU z+-#C0lceY6A%q&xxU~KX^e+o%Zfm^&e+=sd7uzA>pHhe@U|;Ksq}CX6riM%>thyZm zu#qa@ybbW*AulhHRF?Wo;k*Qri(JmXhPTDPkTUlmi7Z@tO$?ZV(#QMX{@nKG|9+*H z8d735oYq03E2T|91su%*M^_ZUU)H+w^wZzEpTGZGPd|P4t9Tzu4meZOr}0PHkkYGg z8q#6Q-ixtY<|yEli+kG!>IR%*?Dvk$`5eFW_S&t+mU)TEjCM0yQPHJ7*R*GA=r03! zrb9i$Xq&jMrp>8a8J06!jYbnF;5z?+e*it92mBuY&;fXcobl|!3e(X-sdA){jOCE& z(|%s#9XhJK0G%*Sk{jS&^F~RQ&7jx&`9?gj$Qd0wrkWyB0~tvqelD`!+i@ewAqCm{1eTHsNT( z4Q6xMjJlWWMc%?UNM1Rn4h){@?LY*BMg!&6B(f4qOTQUL6uakTyZq~V9=W&M7B5@- z%;AsgK2`cz3hzDBH&gZ|$N-+C_s%FKo07&e?u^YU;5q?wz+@Uw zJ6)11EXzMlk}_&tBpxFIG3}EGU_1b@(;_hZ)}slO#sgxQYGA~!&4#VYIE_KF!fLiU zn%TT-j9Tt7!ZWoR6t6mR5x(J~SsTzQHdvs4o3v(5J59=i0A770M^yIRPd%_Miv?1qFvniJOTh5y!-E$!rNCE1;t zmrHVS^P(CBz)yV+z)x%t`=y}d+;rrx=5BxDnX5tkWAGHdXr=8zD@s19fTJr4;4gFi z&C@@CZ)!ct22KYz#Y8+;Lpx++Kx)Htmzl|iRFy(JOKE3W23GX zzJ0o%=na|KclJ2M&AN(}#YyWo?b21(zt7Gez0;U@?9k9?xW?Ml)RfFJn>R2aS4&#U z$%LG&YF~*TZYtW4v0?LGvsiOg?BBgRclZ2#B>zn9+2)<26G=5i@naJ|+*-Qi{XI*5 zo>a0ae&kfivD_=85fR|3^k+pCLfD8cc?LggTwI=VWcxh8o@us9QrhDG0cIQiT0ZbM=^I`@b(DZZr z|MA&5AIx8S>Y-T70iQPXr5B{53zomHps(+Wi-w@b=O|zR@D*NVm**T&yJ!6DXSs#{ z@WjvV0r-KGb)N-VrT(D%g(nt%ZO(uEg$t9FdaIGiYUFJa$=?*8dap1V6fiBqA{kfl z{_U%Mhd(6=rgoBxVcArmaF&W@f90WkXcO&GtdKqEi6s*_Ajzv)>Tm9E4m6`J^pbbA zO|bhy9F_@SO(*@B^1fPn>DGwg}#%W77mexOa z1Ueix0i7r9=oS620Qwj3ENC>|NTY9lJ|U&;z}(Ur-8}%yIpFcl*e+F=OyVoaM2nO} z5>Nr}NuVLqN4Z*@wXiekfcaTD#6QfxKpzb5@7LY0og8ft&6=>=`X@VmbIQpS=CG zxCa)K@mTZ?N~bws+6O!*2Mhpq@pAW%AgBao!eBt$ z|4_<;uiY!FPPrO7DM_$>>x(J>&(CI$s8%n0M4hM5cA{oeRzfS>w8!Ejirof4$SK58 z0Kb!bZT-8c8R1glQ*y^?C27so6{)60z_S54<_tPmrB?~G`ba}F!n78e=7DDu!18jV zku#ERI_91H{O6V|UzERmdHx5B^50pssQjJs>B;iEymw2hODo>ZD}}W_?}OzZeE3ex zhgtZL;2{$Nn2sORc=Wtne}%2TwEl`?PuQ^X%8vRs6UQ8Z{slzybrAsTOuGDbc=i}3 zTD{PfdbC4hHmhW(vr^!(eZ zD$Q^@=761I@{3C^J{zW=8p{@5>}e8%RfbM~(0K4jPtOAMLmD9u_Ixje72B?iPFtC4 z6|hed;bT1f$;Lkq-w;*6+7PoLOyUwrIETEoic~Ndg1&V$#$hsf>w?C3lIG1EUF9ZZ z{k7lA2LW%qv0`}H-<<{yt>tF2GpuC>#LsOx@NHCSq?&D7C0o|rZsN` zJjG4IE}G0IVFa+xC2H3md1RK03*LTc9pfDK{?_hp`sFhVX18B@=Amy|oNxeip{ftP zQ7{fYjKdgQj?a5RPtQAJm0ECIpg^O)6u}^at=ze#|B$j^u~P56tmmnX?&R)PI{@*K zrLixDCnF;6#iEeXhLm%AGQM&*z?S6S^Tq-N>=d%(Hl)eoJvF-ssV(`0-bI&?nvgmT zfBpPA96;}(W0=qw8OfvZ$R^0V3H>PTsDYaupnEZUE1x>p)?KAZt5*FYKE5QrA*nJx zzA`tyRHtjy>1yFCzZNcR)9I??(y?13Y=1Y5q|D_el0T&eb2hfb_QTOGt&WQGpG>p$_zFn!HvC`1HOjN2!)d)WaZw8)r{yhiS7d{T6OUGUedp> z@Iq(i)OyFfPk;aKtK@&R-!29*tZA4!Fml&5G`{3F<0R?VAIjW%q39|h?;Rf-8M|9Q zG_~sF6j>I@tSRGj0(O(t?oq*!{rc-M62a0 zXtQ>++`yF+CU?lBnQ0mIwL6SOf7?SFyWpr}Ny^d}&lv~&!-iqWSoF}+1z7F|$2wac zU;5x*iwNM;{$ZN`O;0cA8v+2IkiDSqDPRCFDqxj71W&J`c36Vl&Wf==I+CKi`DN># z_;$$p8yq}n?b^CD<%MTu0LQKCS;)F8X5-E16iLq&$4RPy>yq>3iY(=yEs>qD6pVx? zNWK>fuR;8J=qms*PD`OZaM=SII3P!%TWtcJGAz*QB-H6ar&DB%jA&_d(%}{sanR{- zI^3ee!Es%VW;g40vm7;Vp|hhc4im>&O_mN;va4Ll0_a*^PbV#DG8O)IVE&itU!1?t zoJo_=8V~*EKbHemR{3m!VNIkDn2psSB!?3|W3<@~ctFkbA7yj=lJuh6m*pm{wRdjgL{lk8P-*ih{^TadXOGyDN zr!3rRbPUu{0K3ls?8 zV0oe(f<921QMsf%u0&{sLI*^Nt7&wcvA2l+Y6Obw&i6Xedek>%av3yQ9N zK;Op)FZ}z8$wb?6GB#FNKQz8e8l5cuclo9TSAYHPM0nSCaz;twzxC(rI!VGee!ZFs z=Pj|nUO{xsK9U0f9$lF{O5#?Z1FABc=Y6^)^-Tb99{{)?J~kJJs5Ema7s254v}#uZjks`_dn7og0Eya=?-c2i59T zl2QeQ02U;+Yu%3)zOZo7*WwoZkDendxxh)u6qL{-`h|zqUW|Qq%a+yuB1#K+}T-_><^9w%e%{Bn=GH`9FXj4=v3C0-IRQp6TF{ zu}~QVD}3SW#1ptLS}B`MreHHHI00d7VncyuF65Bhp)T4)j=AA3OcZmhWD-Nof`emC zd`qZ3Q-vwui2lV&>kh?+Qj+H%f$|Pmu|bJP{(8J6fAA0g9kDA?8aaUu41;3p!(R(a5FSVXA;b_j-|J14m9Fue=R0h5(LRA2U6fMT&Im zDS)pZE#IGdo5aO;H%!$VhDOT+*(7W3D=r*p7?F2L+a6S`ET;z3%`DsOcck1{y0@11O-gU1ChA(CvZV$+=qedH}6)S94GHAq5yuG z+(~_T{@4#K1^V-hd(rkBctv;O3d!OnMOrL=#so0@(59mfbuX2^h-LWZdbMhE(*~N= zy-lV;NyhCpc8?~uc3xaQd>7RL6(0)AtgIBRq19}Hu-$6+$EuN|E!6awSP1bmH9HiyT;IDaC) z&LaSIk*Laadbsb5f?{R?{r7TB2cUUJndb4g8@3 zUd}KP0H3*5@t6LaOw1QU`=2~=F}9~Cw&%$68^r*f@CbW5z#Lrr%e5&B7p5HfhXrdy zR^sin2+c#aKHdd~V?~{?qALpE`w3v?hH_p6u!YMjm>a7$FmIvw4HvI3Dq^-4Z7hmV znkwK$2;7((MR7M)$9!1)R?LUtKmH8={V}@!`~6hF**1^g`*BbTNqk#pm4S}K%k`#v zRLvIAk#;!keOBax9;}b{`|(WW7R9E6YYuKzix!6p*xfRkXl7c=0gp@K?%bJt02S~I zH(PF{NM4%$?G4SgA%&QtII^rbX7Skg1N(n>gE4wd;`Lfz2JWUU?G5uTcr$ZWFc}Gl zTMol>ojbT@Lvdwlk@306E=ej%NGjj5WW=hpEZ_P-#;&IZ)It9b<&DeyH+JF&r8}>T58-!#>YSbCk0YVvX=alTCJVg z_+09qll>&s>GzwMz^eF9@5II3o*Y}eW&Oc2Gf4RvZicq}syo!wi=&rHU)q?YrXlDJ z@YlUvcsm?34u=>UK>=sEyc&}z?p^oPlg~W$_>-|sj9b&!S5;8uuhOV)g$}NL@^2sf z(Sr{?e^9iTG=`y9$p1|NJWP#I`qI-MZf{Qeq5=*iyOcI0iO#?iPynmw48FZTT(|a# zo^`PqR?&*XkW>H+dyow^eS77?mFr?-4|2fe=IZ~C|9Z;n=uliN1VaRCG;|OlRmG@) zfxUJc@8GCmv&K#}FlDdIY~-)qVYE2i4u{2JaXMJh0RTSffPX7ihl6#ntkW5E;+p~j zw+dL*1qT-r55EVXMkg#rI*mIVE`jow4X7o=GUYF-WV=SM8Yut6*S`G2|HKGuZsb@I#*kg|tjy(F< zWA{e`%Q@f!pnyBuRFZhIn<`)oK_5obDZkS)SXWoqCR*wY%Id^9fpu*b9Hn3sEndI3 z&Rf@=yxj z{r$1)Vh?tS?twmP1)7UyBk2X{>6rxx;fK3TU&sMxQzH(&APZoOL<=+qtrDzkKr%_~ z?R#4VhdXeRiZ!|g{-6{HjihPgCjbkuS{p2Hohl;Xv4`JUnkwC)XzncCO#% z@n{5~FLH^hbtPnOQaLm5w>DJ9$DgUrPt4lw1j;tA%3rZ-Q$j*&LS>0AG0y~|8l*2L zV27`b5*UNe7;46Bug%V?1FRzxSS($UV4DOeW+fX9P}@B;_^sbveXJT*Qgumb{8{)) zO|3kWR9U+G-RivR(uzD?ULOAFbZ}Z-f%mM2EqT?|rPX)WzP{O)6CFX!ZJKl6G+Nu`w$-`rkW62I&F zB-OIRKVWH1tt8>wSk+7xuh?MLDs4#0LR$_Q!c-J%&FYSG=B5oFb{S~larj$B+0)(YBd0Ja9$lQb+%wXt2WTUlD)6p$p4Y5V{l zNO8?3Z!qX}iXqk%^ai~qxay63W0uzB6eU+zv%myY@{I$*0dH`?6s+^|cB=TW0vbIy z+-mr>EY+wkLC@Pc>GHV~tsyG_*yd63D&C`LUpl}E&zVirzeuRLR+MqACZRGbakt2E zY;twQ=8c;-Zrr^0+J-Y9>P(W|q(=>mLYNZR4g|KlIS|R9e+4&7%dn{b1{;8T$oiK? zpamR-VCU_6(|{hHdBB7oFW!LxIK&b|Vj$pVPgq4xI^p1~LNgmUA+eGQ-txd9z23@N z51G7rxW!ag=fx5-YrxHkBF9=Kd4IzJg$j+h0m026<{be^P5}sTC<0QSALwomu`Xcr zy>W!m|Gd!^1@L`Uz)Gr@Dqyk-PM51UEMk~4RK8l8<}Kc^1@vDLMx1YKy0Kvs`Lh6i z>@nI1QTSMN-CKovzrSGQvBxIzl3v~ZrhQ&cV+kDuUS)I~q=%O03N$NsLAR@%8T{-Ypy-AGv$j zc&m}*%*(!eH)gMM$G}Ykzqy8lC*me2$l_(|H<-;ca=4jRK&vqdtwvK3I_l}4%w@eD zy;`$*<7zTO!gpxFk}lcl%1&%Ccsv6`Ja5-vNz#=9&#-1lquDW}DbQ$!Z)#lj;CaBH zYFOhRwt4t$l2%nPOr5Z*`p}N@;dW=ufzRiFx6=@`Y=S{;Fa$X$szN&~NtV3mgCS6} zXk`UhEgOKXb~!?d7wI^A5R?JCNfk*bM-(bu66a`7PL?=2_ZJB&QxvnDz#vq?v;s?G z<*cq&LBjEbE!J~a^uR`|&e#pB0GbD|Voc9ti<6|bV)>MnlLTHs z{^|ugbrezdF*=XI1yK95I~PSSkJ^_$Gwi@tJpA!QbHLFR1@Kp;fN|Z3C}4`=a9nuN zaHykwV@-2jGz?fd2r%JN)T9?2=EDtuCwEl=;!m(@yU` zy*o|s)%dGGQg&)Cr#T$mlGvQ7|AEVO;)Km+^EyQL4#8s7XWE(_t`;`Y|;sv3d^8bP^xgxmag|*!}tKD656ihfLUh6)sVT& zT(;HxTIgy#gQG3DjNhx}ISpF%#&RjS*W@}32z8+J#XN975ZLZ!TiTni@B+rX11_HO zm&MRC^4F%31u#4tzF?psT34berR-k`$0b&JbixMO1vQ)O3Ut6fBsKi7t<>cbmY|kS zz?q~@7I4Zj9&E^zrN=zD6X5Nj{g^y;xK#IM|iq?hZ`?G(V#9B_0+0sK`c;2U#t zz*GSPU1NZ+OiYBey*XQ$u)0{jU-4f8@IOaG(0?QZUBVZXz%CgZ85ti9w;0<#8XGSh z8M&Kvx)T7b@pm?ikBr})nm3*19QbH_>TcoPyNP=k3%|o1YJ1N&l{ht3n}4{j?R56h z+N0UN>IBBbJH_1EMqd^nG3}Od_uY|G+qS)Wrp&4L>%Bt8FW_01#TACB0@lj%cZSwH zcgWROGhH2Bu&Gy>h-7ZMhPD>r#b~9RSl)h~ZycZa&%MdJ^#)JhZwoG5zVhFy=se(V zM@{zUov^lBPqu*6qF&I{kQw2rSVFThSnXEITUI_%vkrP$hAf+F6=CU%g`7`E&7?F-^D9Sgh=@3G#x@fH3VoK(_dA$b2 zC~LR5L90rjj9J#zp6qJI2@lkULqPv$HCADP2uA#3r52q?p^bY%}9dwn!-#4r=csmVsO4(JX7fZ70I^|)2%G`Q+fW5cVYrtDYCZ60T zVO^pxF8m*{qQtBzQ$xs-m&(KA)1)|N1uep|%+t+(Yr|U`uBrD;)Ef*#G3WqWC$xq$1($*|Vv5)4qg#sj1sZwE-vj8VpBCb!B{f{4Oig`ey3B_%mm= zkt9*0af_DWMxrbI{;^|ud*M;rlafleZzK86p=Rv%^=$+BnPg>*39o*qI`6qxNUFu} zKQCIZrIPTSY0LrNUS8DH+rf3HXJn6JYJ5fef-xRV^)Tjw%gjY_WQ>F-N!&D`+iEfC zGq3DS+nIKHXWE693zu7Vo<5zHwlfzt<-V7D{PfP;86cCn3a7kvcOmtaN1BLZ^YU=!5n~I_bDKCeql{pL^Gy(D0L80<|(Bb9+dO8`& zgO$MO4^7Ro^z^!10F8E8vU^C-A?5AD$w;4>KWhs8ev(D^XLUy2Mm1bFzh(}-L6V(x z*f1(ucm{!bT}hmqRl6mD&R7c6V-(p1cvhP-X$G3t3}FSdKn`eUaArUF>d0DxOv z9M=wy5476=+b%Sawz2_G!Sav?JxX5*#W0*vbDrc)nL@X`~3(iqe=PlE*>*_4x( znE`X*9a4!58}OG!ov@-S3gE9q0ne?1E~Ypx+DeKy5vKe`5y+uS>bJtQ4|qAY;E)fQ zRg}Pg8o*yc8xr;b?+4-Mo64^r@R}^fgfLlrXIc5O>5&EJLTG`-P|vHGjt+W>_8*02IwHduIM_e| zoJc0eZ@)nvVT|5GgSQSOwc-nVpnqTC6@wu&r<`qVJs~xL=K1d7WQU#k%~)b&mrRO+ z%4uA!Z>aYHBK~%g6X_7WW<}q zF6P$n9@RTUV>izGH90M??G`*l3}F?tMelbq-`$f6Z|u%wVVIE8HCkG6MMnqBgp~Qe zSb^0c16hr?H<|awka4t^x`P02Vod%>5jh;)80cY+a#cQ*se+>%9KVQL=`covAsr5a z(&;p$f&!4h54Sqf4t!1l&jSVA&U=(040^j<4lM{&n%P0zfmYK1UD1UK83I2x$|AgM zkKlw-6!?SsSFUE3Hz_e@SzZfPoNgeu8&S_KkDPa=O-KM$ta-*9Eg+I(t#&kE#%Qx0 z&jgQ0xeE6}cM1=VD)3OhXuHYkh_7UuaPY5LYrYgO;>f~4LWLP)&`nx%=z|f5!-Sd{ zRIEZ^AiNEy9Z_Rx#4(LO2Vo29Up0+CqX(r%w#(83h6TL_39La^3_J@21Q%;{NdZ=^ zC}56;ply;m8573HU|9hRR@g$*x)^#!SqpmB?QC(M==MT?5V>Wy(qAMo;CHHGty z;y({ya_VpHvk?bQL*ffi&{87MFaJ$L!${6}&YincckYgl-<=v8ot`2j=WgNMY*>le z*}emb*{9$_V&buzbpzf3OQ_~KLUhZQ-5CkTZB^QT0m9f0+=17qAC@{4@#jGMMg(yA zk{FT|jwvQdpnz54tyl7DDwa)7E}7qOx885a99@*4OUPfbRjd7stNB?{{QTCOV<5B z;o;V1Y(pCVf)f_PL6NKxFG`hMn+xhrfKPvP%Ay^(l&x?IAd%Tgui+_8o9ql z6-fpQvJ?j11wd*FsP1O#w5YbFIvBIS0k|1msU$2*!qO)kN{BL8Hi@QzSv`$HtB}JK z!En1nyqXX=spZtKnYpsKGz;!gwndlvFJ-W;%xqqfC$b1U#3;}c3Eb@n0V&a-gAD{& z$z|s_p}v__>aVPsHVh!c6Cewz0|<^z5|j`$PYt9&>K`e*UXbC#>j-0{H#` zIO2dMpU2E`!crH7H*5?O=AGY{6|EqP!X)m-CN2xTtzw@I%{(wK+l=uVhz`%J?yjD6w7U}Lx-Y%q8lp#P8Fji5#3XRbS zdPXtgkQH!vSw0yhACyh6LVbiJQ_DY#+OA__I{=g6%$|5Zu`;vE>Y#roQO|5sv}z%Exhi0vRF5NGb-SlL8gB) zZ|rtld0ZmV?J6%aH_gyFz-pAhH~^UI0&&lEse3VcN+mI8HrFgBljtV(J91l>xYcO# z-}LADYITkH?Q4{4tr{P#ZPYa$(>2OpjoTV=9XodHGKgOgy+c)+KI#Ttfa3@ez<-bf zcJX=|3>IW)s$}_#!i)zo7(mq~AUiNOjO+#VCMb=&vW8O$9=Ib$q7T^*DKi}u!cuAN z(c^{yP>A|qD4}N+9e;%G&$6wgMhI|fUWTxSjzdEA8L^~P(K*2YVLi_0^QdrSFpqeK zm*5DwS&O@i(_%=$Dw&Y;_GWAAci9jd_-+&1#4!N@ABWY<8d?i&w*i4M_KvHa7F}gx zQd^QIKS)x*fqhWe0*n*}{^~U@YFsIJ^c0sGJUTJaf;7wlb0=*9)`}3eVF((d%5n%A z2+mtsIK!QW`wb3v^cYl-Gr`nv!!FaFUXnMc^k`2;YoYPU(Fsdvk5)lPR}{ea5x{?X zEsqNq#}E<|2F_Abj&M=Y?<2P@S2k>l`!52pk^^?_NY_-+sA!c2^)Gx^HQ=oyV`C#Y zrruY*y`m4wO%&$s+N6IhVnIyO4XbyNrtL~-Jmr>%; z9hAl)?w%L)uLvo;lvg-HzOgrJ31c*=#Ow2t#N4#Xv#H{~i8O;@h^**83LjhhnGQ8` zhLFjY_$*w-xSRO~d%>aP+kxwR$ zU(VKv7L`Ug#5dlVpEvzG^3APgHTUZ~aTRB;9L*C4ZUX8{(h>{FBf#tqW<4Q`=C_Pt z4%ozqF-y*nxQe(!Qm)gjF@Hvb&NzgygF_E!BrcuDfLFTIax?J$xbffNpLUuoPFi9% znl%33HvWhID2L(g^?A~%4|Lx!8d9dGUvM>Nd@ct(P5Xf5h_hTQrINj{B1+fpPzNLx zdNG;oc1eX9V7vScU)WrW+f~@b8j$_0R1x)i2!D|(B6aP&iA!!tHnnnAoV%cSNUCu5 zFRe2|Fadgbo^>PsP!S_+k-W%Zk9^fbO`|?S;01g-aWx`tb-PIJ8*h~klE~3%kk%cnssxm z+U)?Ts?nqB2Kr(Nw1>79Aq@2baNMe9DSuG`vn2@RthU|No35q)u4y z89z4!-PZ>IM)Fep5>kE0)>5BlYrx0oT#aO8Y(!p#ImCCO&g(S|GL;pjq(r=p}SRVAcwtGnG>r5 zujdhRFr-#9D}aETe>3)TKl0ZwbT`I&W_ooo&L(0ir>D2S+5Jh00sD{)pnwC_t8XKK z)yyWcxcvB)>{XV5fh)=Eg~rMEx50~EZ#MUaYDSlpyxx64=hfV-%N(z`JT>vjN&xT- z^DZf`+&h0H)uPdxjK=&W|3YrBj|)#M%den)z|??4&iO_PvE&3W<*-_Wg`x~pa4;hJu z`dd|ksl!^IY;C=T3Ro_lk|WTHpQOg_K>pI-@1|CidRlEI(Af;gB08S{5scAk>LjVZ z+?1TD(r53ny6y2QJ8r|;C_{XHH89nWiQKw#GH za z4y(;UbHKoAfle{BvslIksFrx%M&r){9}&H@aE;brq3IP?NQ2m=ok|`Vy&jxJNE7h% zWed?h;OL41_{&^Be)`n?eS$}y{_$6+fNeX{{Z+G7La2d<4YC48UH}??ZaX?PHD26LF?984$?Ih7QaTZ^8+1 zd0Ax1wO6x20jmxT-pVF-r>3$C$EU~$RzZ*G*pnG~E1R&zwr0tm4E4#eYRXu{(0F+u zwV13A;Y@@Li%Zis_md=V!LYx|JDgqJl~i02bB)ugnf>F{r7hP-tG!j71Nsv~jfG|V zlFDzdoY87$iaynCZoQsej)hy9ITg+E)#U07nnL_)%dQM->sYGuroY)}%$wX8PvXKO zun~7#TV3FVOU1`nPH*9RS=1{OxNcPa1So>FDEH)xtb?T&XdehT$5mzlqzVY;tF&f+&{S$ z?kUL4L;8qShh8qxLj5a5`kh#{LqJui!L&1|O$}yzL3H94tcc=iBHUBobi#$IR$qq; z4&Vj`^g+?l%?8>Xj0Lvn2MivNp`6%EYod^xdicrAv~q3<%gTfkGzQJv97_EaEASXg z=54$QL_Hd6=rNy5lfm#xc={TsMYN=b+Y!U?Y^|(Xumu3V7>|}Xic@Uer3zTjTiKJm z&<*!iVIvYourYd%Di{m1RG8_t(?~OH!Rj(OYYy)f6fUw-vfz*1r3wryv3q#H8FeHO+d8by&~L`Gy8W-~c!s7g2Z4MS7Q;A$C)ZIN-L z!RL1WL`f%-t7O{Y+bq^t2I}dS3H( zIX(@_n0i4+6>xM#0sQ5yyH7v;t@{i3rzgKc1?(z7ZdEBUXjH)IhL1=j%nXvP#07{T z)tR-Vc8Z*Sosv0+egl9{7`$GuXf!fn=;VBnVMVTsLRUsDNL?C<{;UK0ffx#5S_Rz^ zVm7C4%GjICiJXJ&5Sc;KO*i}&qbaRqr%5!{^=S-4Ipm$%=eBLzo;*0XZ`<~g?bWZ4 zTq@Dg@%gzk4e{}3tc>x^>XPlH@!uyUUMk>+v&or#@s*XSR#Dtsxi58J>Y1^hd-2_Q ze|wZ9r54xJ{K{$+`x9QyNT}I23JQ3@o0;>@%Qc77c4vr;vGqHNXLo1pBdMa_d&qdJ z_!pbZd-iNhjfuNd++@~*@CDJ`g$+pDj9iB`6GA~u^S_uE)|xk#-ieFTl`p%xGC$@U zx0nIVO$2a`vfBvxNhW?4-`(+1mJ8JH-OO$H$CwzKppod@beX+Xv;HY?o8(yh36GF`ALk@ki7*jHZ3{cKHO;!dQn5_qRoJz|j>2@RuDTe)^}U?$dv$ zkw<^}^wW=iC2vFN1I|R@INO;jyKyv-u^bt|fQ4$?@sg5U&3j{HgcRY3h9sLaBM?#;)x9otrMk}*2{pn#2omS9_(DJWV% zl&7aR__$Z+&w9sWVzD}kNjE;@n&KSH2 zq8tw;%xsxDbnaYJnc8fgndt@ms;TK!NS*^MGgvmof(_;}vo^VXuN7oAEI2S3@Ox+o zS~;W{Bd0TS2u^3(J~A~nMoz(j4TxX-f)`YHI(^uWZ+^Is;lir40fqD=Kt~nIW}0}(o+)u^%-m`OhuZG4wst${Rh$LP%N;=;#IJ|id1x@P zYjRnwu6}r-CtB6+WLgDn0)5=p77Q9K8U(P{@Au!--1Jj_F3k>2pQg%?jw0Qkev`LdxM1UV z=$*#k@l&}DR?ye^J3FzK%zxo<8mxMKRh7o(y1X;ZWuul}@XP#}mv`>G&{D7W`!!cu z@LpH+H~n6N*OqoU4X(HJ4T$|M-7mj9e|~G1)9>}3w=n(L6O%D9dl;iw)}%Gd6Bw}e z3QM7B4K#J(fGeR6YRrKE7A;QW$#{+dMQ?HX2lNVn$K@Pw?ogx8cdVYD!X0|Iem9Lj zlc^CvFy?@12XGZmK|&WST$zF+A$#sLq-g-KwT0I!wp6qVT8Pw9DaBY+AM?235Up*d za1|mNmVOCJI#*65Be?A<6B>2QDTAIJ&>)`ze$meg|Ww zupKO&UD%DYJ_S0$Aw8k^XS9697E#3r<+dJYZz1 zaIcG(Za~{+%G8Ln6>Kn>WUESLbOXxdZaOXakX@m&JUdt~*I)sPabSWf()}x+>Xk-f zYOH|+0qwN(3K5LuPdE~|$;u0n0YR86#f8Cco0HCQUEEAiq{&T%*HEL*aqBo^gFQs7!$mhxmDvUKtC*O{l!8s4K>K{ z&>}22rENht4GHVexD&1b%O%^`4p6`}4=f?b^|A-0?1UxJ=3dag$aA4CpQP2{F@Q#} zD|3(NB>=uk@W}Y}(0wD&GHBR@;|QY)IJ%+$j;=qUfDhOTu<9ogex?Wp1&lqwBV!Xe zV`JoBcLIR%I`BgQFqRaJkLQe!CDzvsP^Q6GTf@9$=XtC8Pf&NxR<&9i3TYiqivr-> zK_~nU3gDpK5tMEX`cVO=_oW-sLAO$)kSf_D#9xIyQ)oI#m&P_|#IH8*aDAv=Q)f^d zt<$UMBMr2xdA7w0-y44WWm9WV#fAaI?=0Q{+~)`J_Zf{AyyEo^rj5OFn~-=AwHup0 zYl_SPM%d2KS->cN)#@(F;tmkTWoC1eg#x&B(22Y^4EQ_0Pn3i@D&XB3P{334^Vs)q z-PyDPOX>Im1q??Um<7fZZ~YI`?vE|4ru^fj`<#3KM^`CUpG%$@_)23fIw`a;N zMtnc#FbQ_5faQ6>l*_b-DN+zdYoR5F8c@x(*9X`D02maoE5HR@Ru0>cG&uS}VsQ!s zwjt48YjmL01DFTS0Kz~$zv{XNcr3Ru8Ujv#G%WX)Jwp9{;c@!ID5W8d|?R8q8HI8ZEobi!Fo7bz%WboEC zjJO7!))^+$8^R*25Iu!6yo@jog_QcN-p|Z4oHk&w7?0;<Wi>s1_v8@1$vHY1k{B6KXr{7R_NOH*s*;JCL#9a&{& zt=Z{p8;mEdMki`$!+^K$buv{b_aVV9Jj_%0!impzS^ivx(-E4wo;aL7+*gGbShNVM zub>YQ{IJkmb70=*oUmTCmbv(d5v6`MuB@lFR&p(sJSG^v5w^hCR=dd*i9VYI!K4rv zOP~ZL0gR^5CdzXO=q(H2NDNv~SsiMJ3{EV|VmSw(R;`R$>b3>k>gxbBE05C>{u3*p zfY>eZCY@?AFZh-sUlJ|!!YHqvw)onCye^U zD_2-!Yc4iGp)UtdHLHfV^~3Y=E-StfDbj{Sov2aCH4y1&sWa5v5=$-Oxa0ONPkU z&vWMy>WT$w_--!t0b@9owjqrqx@f!?BfX%2b8_2TT5&EPwg5$N`$r_Omilu9;M27+ zXIt$n0#Y;>Js9IBcU*AnEM)DV+ltmnaGW7T1YlLf6J08}63hv7+@b~F& z865?FoXXS*ccuDPk+|3~?630QD>0)HZER$s@pd^>Er+s|Ga8OY{|zS&14d=NBSZ+L_EI1<1rsT6l%xAL)xH=>-qBHiH6=SU83Sp}1l7dG+9R=IhY{+f14Fx`tg zOS5rkoOtv($*RPkso{ssCQDmR!dVFzX{Oyy@JprHiS^h96$wqx2~cBHT9AZRfe&^d zf6=f~?i!Ms;m`o58qxY?J5{l0b0H5*h@4Qdi`}~(_PZ_Z%sCgWf|e&Dp$jJZNZY9( zmM1fSEX}lXfOso?#Q=4_IyG?Xrb7R%cNej8a#C--ngZ6t)`K zC>jR=(-VREV`0*njzi-4z2A@KfTJr4;OP3|ig-a6Xp{u-usp4&%F{`UurOnZr=#QJ zV`CFzIVgum=S?XsNI5vKfmT5)V+jpyyGKVyCtun2YHdtR{&Tv#5AyQ!7cI{_Q=0c~ z-ip$9-(3MGrQ6>v{m%C7->H80O!aj3E7|j&d+xdK1AsAA>h+t9gF%ytcMKW_-Oe_P z6IPp3IdewN&O3unM|U$^2>!q9y$w`Tce?M-)*WjCqM|_zC`D}CH0%;zFqROApb|@y zP3R6*niyJ*qSUl8r0P*bK}NK`B+6+s9i6t;&cLXYbB|@UbIv^%?wP|h?HOpNQ#`|U zI`udOdwrwrvbMKF_y6}iza6k|v(8$#_Wxi1l^-#$J0#f%pZ$GazKvZASqd)wjXhv~EjO>5ge%@~(ps$P-fn<8eeV7;KN~-#~jH(0_i<q4}ZnI1#1qw(~SuODU*Naxq{N84UrB-P<@MKI!NIll1m333;(^u_UwOCh8$Ny~g$ zTTaZ`^0cgn@lW)LY%IZoe_#Vm7+ly*0KE3uZ{~nYpa@GI#W3n-#p4KHg%CBDlpQtz zc=e8YF^q{|qJ7)^HEm%4D*>$0ZS}j2QKic@wKj>0z0m-*FH8uDAMf&*K3d;C^G@C!zA54lYq3Wxk)%SMe5uE-!Zj+B>!chfpvQVTmE={|dpcLlrctUtn;H zX3mN2xra6^J3edHq}@Yr}>QHhggWgX0Iunl)?P z!Q)Rq`|O@C_BBEXIv5Ey8Vrq&en`P$W7F-689QeTW;40Mc(u$ow=$T6H1!Mgy>0ei z3r;r9){u`WyKZI^!3-mg;r(Z05gArW2QE9t^e-yl340!U485Fh?NGHovbJIE{mZhJU0Sqt-Mx>`y7%#0&;=~X0M4z#k~mBQ4|R8we}&!WkN9uP0bj*F;GR@B zhvibbXxWrpUS*_ak$cI-UR1ECiH%0+{x#BeBmgr%mgF^xO=7glnE<^aa6OcXhrt?7x_JmA=h0XVk43&5BI9-=kH7wF*Hq0C_R@3wA* zX@d*5F4zj!Zry?#3vb=JMQ$%#uob?xlA8+`91M7{g+728+M1e#v_Z30+e)*Y+Cgn76q;C9_sc`8Gq&^Mob7Yx%$YQ4 zYJVf9fXRzC9*3h9y8iahPGvY`7a#TA9BNtwRv3#vYog^$W(^zu*qRAEvons}ZxhkkBP}iXd?TwSZS0nmOYv zU=bLMvy~`*X{r?+HfW3)J*PApQRQ_w99}TOqLYyDPMF7lqY*gSkPF`9`7jNh3vMv_ zs)^=+c?E|x&0qqppcF9B)TOS$@X~Km?m2zL8i>k(FN+&(r#>T$6JALdtmz9_Nj-06wX#-wa|A|f34tIL+b=nwh*ylf`PBYJs?Vp>yWlxYm4H5%o(GEEuNTSie1 zSns82U?8~8CyQY`2fr&VYlS|ckUs=nK*-+FN~wJ{H9J)%$%!Ppt*xHKwalvkw$5Y>Xr{qT&|lgB+@3 z9j$`)(Lybb^0z4qCL%%Ims>>PjsqD$0o&@a`k7@#%mEXYi#W&-YONr#i#}L9B&0v^Bn77RgW%iX{pPkY#AME>4RU_!EXOFv^UJKLRYxi8hV z69ON)I+fcqyvzv2#-oK$}<^GR?$2!JWwbHo3m-@bJb;|q2Cw` z8lmV33$$^1w)#I@oaBRf@99!R`fNh$gNaQ1O@_a-EA}u2x(rAV>L*1H8 z0VS$sZCFP3Z7Eqd=M)Cy!YWE0E3A#s@|#tH@nXBASEIvge?YkdgHo zAkYorZVNd%Bf)?t;&yD&wP3{+6~Y9@9$(X`^$`yd$U#U!lYd6D!5B^d5-|?#z)p|F z%orRF!rT6KC(-W&%LKU&ix(b*WoG(E=?kA6yQ0C^!-Iz=!63YT%WVx$c+5ZqJk-7g zF9fSDXtIN^YG|mu3WLwx7s%)Q$lYcf3U(L%;=Ii|=e9N^aKa)0o(N4dg0(f2YUJf| zEKKYQ*p8$dHMoL~B%??>edXM)K&7u7gO+75Eq11NV{?*h{|xOtZJdJgSEtj6VNkoN zvg{4Hc`c4>u-bYc2g@F_@&t*X1qoOq?)ug`$j4&!GV}_O8w##&u#Qtua8eBOC}y$3 z3I_*MsVjnDrnf~pO&FkyqE|t- z2k0T2S!7dD*&>IKTcU~8fRR8qK+)@L^t3zsA%|;mGJlyc$tt!jT-N{YXHAWJ_VusZ z=QJX;JaX%9w(JU0h3!IAY*$5ldLcMX`=#jX4;9kR-)vnl00#s?7z|-HLk*YN&~L_+ zve^*<-10ie@e&4O+LssBnyqTmO^cn;+;lvo}4{qNuQf&kW9 z|AWJ7E4H48f2`Io(uye^fue#CG8I&>21}rD1R;Qw7i`GVvCJ-TlwyNhIOcz@f(0o7j6&C)zNe;02(AIj75SO4}`c!vU;>QkWn}<;3trE zu+6GXg%Yh0Tf?LN1<4P3A6%bl=oz_-k!En9pK;2+mi&qK7mQif-)t!QwL!;gyClDYB6+~u#Y-JQdt^p=fVCRg0mqF1u?ay z^tgG9!J@-sgm3p8dSXNFh7HTy{f8E|GM4__b?w}QNxN=wyB4}V?Y0e1KYiRCz!st` zbiN8kjjL#68MC~od^0asRZ%A_Wbl)PGy=`NYlAM{0Q3+Uk)IJDDfx;-EQ5|A=mqi& zMOuOcyKszhh3i^4Gv>FZNFGm!z$blU-5!YY}4GiW%u>*stOjdAhV8{)9 zz%eiA*opx-w!XEZeZU%Dz+*JBZ5&m=7lPEW0*3@^qAAzRAPoU$qWbK8)=iXf zH(<7#9B))r5glAeBygrY2e_)LTa*32JrT|qxuD7Hezm@R>erpHCcI)5CfdNA$}dwzjte36({Hbm))I#%uHkJ2=0C_$gE#vaZ=KxCbm6ggPH#I(Z0UAyQ zU5o%m+h!_;6|~_9Rjx=iFJ^g>*&5L&_XfiSR5xSV7)!Ne70uJcuqa~O8J#uc`e&8a z<_@!}ODgF96|}Stnuj!S=!h-E@{smrQU5+kK6MB@tbKI6G6gTTL}8H?&Mo9YF+&9w z5E%CGnC@1zHMO!fg%1^QEC(E0F#yNb_bT9_NTl&2QEWi~S7|b%Ly@Ygf>G&-(O+zf zp?O$McU1qj&@Nz{dypM<#mc4t0v{-y&YAo4UPz5TJ=3@`*SUSq_NQm6o}FZggxzkZ zZNsu7jUOy%{2+aKaKs9BYp@I&-c;dv4S8c>hr?O7CCli5 zTCZR`(;o;xds2Y#*BA~v6+td{#leFIUpaX2gzxxF-S%Z0zgTuWmun~dl?mKJSs4f@ z{Dywi&+Sf-zK(kTdY0T{W-NR6wle)jFB9!Yh6*gIe4`4OTnRX-@TK^bo1Ox)0>+%L zZ1P-14kI$j!2#hgcs*;nhq{A9kowJ(E3mqUva+gtLoGu?-GznS=iB()Z&X1)Cs^w^ zu-xzy1oQF`B+6Z0?mj}BDY?E%2Vz(^TAvkdKax$PjdUO|`a?&kPqh3v-3W&XTIuj% zzgFPMt<<;u*o|bJV}08VnN(FhuNB(ZP(92`f`Lh>eaVWzH4wmDU29Vor7=($n28hy z*{GlaX#_3AuCY`LLe6*xrg>?iSV8fN?ZH@QMH_;BXbOocn074j@;BtMe;92zvS|ES zcI;YD>#wj5TE(UTe~I*^`ClmKf}0vdE#%X|a>GZ>EYXYudXm5=ghN{EAlWOz3v*DJ z1#xJFt$r}%R`41dDBxHQIJRN{{vp>Lord(qkDUX)9E^ksh8kPOEE|EinL{-Ao2en} z14v|I2sJzExGeiy$PC6(tZa@JQpxhK@%+=U7CtTpJpFaIa{C|K=TvN5cq@1NEH7hm z8taZvm@wVlxN(^?qH8>~H8{40x`*(RsNTzPN-BSAT*fU+sy`s>A#$v-B0dvM9wdgKE8Hs!Lti891GW3Htcz3`ko2WI$MN? z-e4+$J#;owL?B{0;PiOB25d7jI~``mV6@;ZgMpxymOo=C+UYkNEGU7YaT%n(#Tl)= zLa59BT7X_Su0gx8?m|fSLNQw*2w+WN*4-CS+*grDsQiV%G-%=~7)6nJp|HE~ZodAh zJ-1gue?H+A!P>-O=2uiu0gOrD(ILM?>hcO%yir}Oi~3T^sb7de(`>H*9Z5!`09DaO zqmlYkMy)vT+#m8==`=zgjOg=XL$Hcfg;cEdNE0Dh8p{#@AGHx`VPKg?vK0}dLJC(13qJ{iH76!vLo&Y0Fe)Ak}rFOL>$ z(ei5@z6NSkkiZu>t5#*p3TeT-OUna|Ln=A{3&zl(hC>i_<~S(Z3aPB3JRKO)=&&0_ z7;(g5Od4X(I{3#ysWVTf0n;`l6#HmO3CBg`#clP^O^7Mr*op!82VDPung_hcT{sjR z3V!5~Gr+XEm?+%f5RM%x4EiF0up{gYJDg!-B!Ue{(SZjtZdeJYK#SW zR*#3vJ@mxE;~TfS8zb8nUVC)=gcFT{6ED3qN4M8$zVh;|3F~H-g}mks*HX5!!3PSfkP6B(DtK8%}R{!`5dOK7H@Tjq3xE4eK6Tw{hdFW#_Yl4nxV> z9jkNe>gG=T6=UA8VBEL`GYw4s#fkOqsdG!_rkOqOUfo(_VA!=qc^xNDy5{CimhY_|= zEesvcck@EVH=M9up++3M0u(RRwy1XT0-d1gL?oVaHZ5_shuV4%V zf@yCOb|wk53K}gcWw0Z*K>>SJW1i4nXb6U;o;E=%Gq1%cJn6`CyG4VMcC_%3+%I1?h=mS$4J3(D{P2c^Ky~&{Q%?WVv7qTbg{>c?1`- z{{~EKg1j%(KV$xPy@;(;Zks$2A|xPLeIX+FIoZ+*rwn2TFqT(yxG?_<3*4bOta=t< z6q5V}!FMMPNAx%xMb2eKLyQ7Q%|5Oii{N z0gf06bs+M}fc+zwPlOS|qt?pUfkc!ZYQ7c^wd5do+9Ko*PovWl=-+aquJMEGljc1A z@uSAZEeqFe-MDPyZ=I3j6RxexXd>VHFAJu(G8-mXnJeHhY3Mh6+hCHsfxj%07Cg3Y z-SowNbN{62(-%x%a7}tCaM{6RNYafZc}LfNF^#!GKiQyR!L+i}vIHqX+R3#4PI}1t z)Idt_6zP*Gk~Agmp@|dcG8?Wh`tljKM-G$|0?#d4yW{yu%+#%A+g3lYlX)~@meqXq zvlYxES7)U#Q>V`_VW!{zXxgt97Qe}?npwP-$(XckEwiIymHnxwn4_!bX3Wi)%2=TN z82X7Z3*HilWRK3c7;RO?e0HWLsKfF0LEq&eB89t$s!$ly7<|>J4;HPMzPmoW?`u`i z*A~8FJ=z9*#mXy%Yx@hK?mn*bDE`#T@-0>R@Ta7qOm>gShvMIEPwOKw|jtq@M*nXtb$o^MH zvK%OX+0^sMU)p~ZI>y?v9LMNXW1I-gi6O0(M}I3UeAe)I1&y$Py)ab*cCA$qMn_HH zNM)%00+&kcXogrcd1qPN&X@v@tr&oR!1cw05B~j~{QiIc;Dew2hzi*DWMSqIjVaR< zEFFrZ32F#^y=I2-y2^H+T>i$3%a`xo=?a+{v&91u;6N0?5Qmmcrh;-+G=bWA9g&w@ zohJ}+p5MCOxiQ!2X{&1wMBE#eZ8&~SS{4Wf_}qgFKc1D^-l%(tcfQLxBkhfWF!U-# z!tKs*pxq)HSz^tT;V;+kH=9Fn7+_|+M#WwWv!4K1<6w44H&*85&9x7l9Mn#o^wgwD zJG5y7oAP!x?6@UKWsGNov}2+q%{ciUIlM`@sXTcyWzioD8z$_zwsj6|9SXDuoZ;y! zKU{o$GV`W1`~F)}9=ViU%mV2~>m!o1guIfpgLzL%=nO5Al9{8Dl)|i*qzXoQ=hT37 zV{oE0|DnawV#Z=LTAW}f?Nq>gM!8i=4nNBQ147z}F-+t#J+iP^9L_*wsF1c^VS*UA zTa`(N5rP25VGQ5Q0fPdDiG$HG3`k#IA^SfIg3%gcy@TdKgLx3Y%xowm0D8k9bY&yT z=sZF~*&fzGF32{rIi)B&Q7T4lqABN%+M}X8_@2GQs>X)=wm}irB@98s<`GfR;|ME! z#!G-1YlZvc!-I7E%1_qM>Jng0>bxX)~Vrc)8-4mP7mG3M;U4mb;JZdssi= z+yxDf8*AuOuw7TAPlS;SoWN?2xE*-dpydgF!9z23y+EkzW!>&ez~d0qUvb!fqzYkp znWyAc$g_Px^MWm>;|kfGuuHF)udoiQFlwre(50gap^%!^XmJyth*d$yRt&&DBp`ot zXJ6nq5B}YcmjfmM9-_8V^1$4v1=VHo#8Jj<-SOh##Kc5(l3JaZlyr~M6u;Z0W%?Zv zBz8-7cGOo2GM+=hKor7QfYtc!r;`HC#zR|;LmLks30MLj>}^vLmCBPP_L{V`{QNX~N!|l-wbORbzbfqp0MFeo^%lRc zl%#QI)+oCkc~hF%zv242g_M0NOq$O>tfMTza7O zk!!V*zCs^GawY|c=RNYt(7^Sa+)tU!YCHA~cC&}8>VXx6LX4c{8AyPOT79iDYRLBu& zh`l@5!J4{>6RlcrND(c=Qi#z}gk$Mop8!Qzz`jca!Q`J;HpF7E1&sr$l*4E!G9K${&ti#fxl~)M$FOT|{52^ex z%NP7apz>KqyMKYGqSbN5JP1F!O+}mjoR`;-uN^d8VMAeo`gRiKuY(x2kD7Hrbegj@ z#T0OC#Q^*Ru7AGMA>w-<{O2D}0WWlGG?~;sIXkmzbXH&0ki&ARreU5kDN(I2Er>5D z&=)jU*Q!l9>e_jEEMss+hJt7SolW`MBJ)>vwZP7vNMOUqPc$96wmJ|vG+{xVd(YMN z9*^z#tw)bI0|Cv3jZZH)m|J(*vr#&@?D2z-=X&1#cxL4Ir=M=U+=6n^3FCpiijO=W zDMW{J`}Ik=OCOb_A{8O*tfe!z&Zz?h>}S?W(<+kV{uC!IuPG^Um5`NRvrYOWZpys5 z_e%qe^N^IWR+>C8?@LL#sl1sy@aGiiq5chv_Dsl7&AO?aJ$u?DqN*<)hg~uy-}SlF zD@mJr)_t06KeXr5hg?(FN!yOTvgodg(B$D+uKmN(1KM9o(!iDHr%c%~I9Yn&oykks z`h>e?FTL@QgJGDppI1&!S*}ews^|puv8n;YX^nd0!BLPp_#%tFW9|;HC3m4u0hwc070)@|9|9D*n?+ipX9&E=a zwEXVY-o_8M9$M&bfdhho#Sm^|m^MXYV_S$34qg52oawiuIM+z$v675oY5L#)PI{{4 zvU%>TgyP*(lK+%=*R-zu5*Im@s`D0}q?@lrUUy-QcFgYwJo8Qspa@pUkP-%IiJP24;z0py@*lX;^j$arm2x^j5X+y_Y zl~<+pbEu6&Slp}-BV?PIe=Y0kun(+QrFDpkhyv@Ybf|(Al&Ct{KoTx+;1PBO)8-+p z$f6HHg%#eRk?kf0t@V5x3)6x*x0TNVZxD{7+8X_+aHtZG9mCZBSKW~J1 zvkLeN0d%5&o-AY@@6Bhz(~9MdEvsZW!$(>ZE&&H=*VHSuMq zm@D28J)|Kb80Qa*)Q^%nVZ{`1Y{dZl0|NNl$o%#9FnRdbk~Hq7^!*S1S6|_dDd0Ws zC&6T+3gvHRCiT*YI1J{wwTTa(I~%VD^&4Lh-&|lK048F%K%bsoezstfnYl6)jHZ8~ z>9vKXe_PO1DgY%&L62wqq6rgrI9np%ws8%V@1bi?@0q^vi-Un+WX`g6TNlpaJR8Xk zbWA=!;oyd=PrbYFAE+rM0NBFTwKRG}UhDqdqTjkVE|4m_v}vdEpT8+>{m<>vvcTp3 z{fl~coSbq`wQ`Emm6lJI%kD}mz7eOqp`;3U%k`O-o%{Cf`^Oz8H|3q&eKK!VSq-yc z(e;cK(x$G>9UUFxr3}Wrc;>X(72A$x%${A@(XncEM`w|1)$GGc*Q&1FbG?(MO)IK@ zBQ7q#EHCfkuXa6^T*11!Dt4B+Mh>qWNN#9w;${PlZ~a& zQ~(D8!6742$Sy+PdlHpu6ZujS2CEN{e@XY;b5HH~8iT0S)z#J6F#qD9Akw}h8NI@7MOfq&KyQj{$Pscl;9m$X9S*@J zuq*{I3Si?UbIRnJuev(AItShiv9t~g`-gZ9mB2dMa0E6Mc%h-hMP=-x-dD5;8vHM4 zh+3WptPw-jIjKx)mQRz_G^lcOT!)T41Um%dqnj3(^bXUr#^Vd^WwHfa2F=A{V8E z!SV6u{%LuM!5j|KIle8l_-fP_8ashK9*^d+k0*&+zS!XL{O;PqI`^K1M?AhQ+xKlb zv3<_vV8EkuZ{IlG-MAsw36;o%R9l|@__u+qM{RWKQP^OC8d~Q^jUI*OqqZ+!QarU% zk{U)-D%BIxw6#5Rq}+hUa^%|UzL=k{p7A>W!#dy#ZnQ|`0n*t zM?+0@ZsFqM;o-$)SG=tEO8uTik7itr+q8Lk&YCm36A}guGgD^F-d4oemD_%DvM9gA z?kZBH&9AL>mAHy_GI>iX8`#-Xl!Iv(H;Kd?oGGmEo0x%2-N}s`y#BXM5#;flk0*Zjpq^?a;=9mb56V-&rr3LEO zl9sauuW_hwC~C-&SqRlwgvd~Y^$joR=Z*?(9H9g4^`#?_$TEhsX4UefL_%DBwW*Yl z!qjJ~Er6wO))zcnT3s7&AH3q|2@~uZ=^O@QkI}2GSkcvG@5t-wD$Ym?(IH8aM4JYeN)#+$BHs7`b=v?!73=Qpc(zK zun1Z<&hSx}Nk!D}nS=gdc{UQ3Z~18Q7&FA8%3{J2Rg=_#qQrAHp-qgX84e)9T&4|!Q|P?*C=OC`|zez)9;C( z0*=5y;B1ALG4IYfK#pQ+m5J(FHPOGOTD81Pr9Uk%Pr4`Rq}l9%OfgJjkc+S&8GLt> zf6mwXfIpw`iq-12LD{WBP5@&sj1anF-mUICvpoGwdVG9AX{nwN*pyRUpf8xGug!^1 zKePNye0-5=knI8E4RqrOlNHK;XXaO3u9Gjm-+A)Qd^VL%D^z^F3R=FU6Ny}O5M()6 zB7Z~VjKzOifp;8p0JC5_2eW#(V`Ov3rjE|{f07XjaS`%n9gsPuqZ1U=4+{Y-J8;m* zG`9Sbt91U6>`qBrgJtVzqEo%BL*N9k4pG=R9b|cl{1$PzAtG4Bj51E}1^(KyQ2(l; z{u`|Jh>a2%6!0;4D5Mf>WMdHux-fqX-Mm;?t>cL-HfuL6Z$6ja9N(-a+y(7>`n0+> zr;jM$^5*9B^70pQ^t%VmA=szb7EH7+uYq&Uw(6Cb6IN`+0DQ*)Tr^76B8)4~NFkRq z7|^&09~Ltojw@oyif1H@`&N*8++^nFhvSyKS6sH_z2WbCh5vpZuK#`~bHICSPiiu= zGim!#6&6#O4Ha=Y^XOX|UQ=LFD@{cEmKNwur3K_fBkIG-^z!9qgCi*WO~~YJp>utq z2l!pLC&J}!+_*8<7>KkTTK4GieR~6*4cC^vG%0u8*1Z=dY<=|6^QPI@MzI&E1uevFoJ;(Y<+p#_E}m&NVX`Qtyjh zn+K9ky5{fDnu|`(9w=&H?QiZL$g^ut<#*XxRmHaPsL6&2-GsOtJ})3yhQ)P_&#dE zp$L-$&W@4y$B*B1s_Vnm1i%V~4mzF4GenAC3S3ckqC|rZn4Ux%lBhoxErG^jXsqo5 zX$fMP6X{FB`*4U@XeFwwG;z$~5JGYfYUZp9guh&t{2r0NDu_JuZbQvf znYD^Ix`D$gGYxhQ?|d#c4Jo!_0KRhoCcGWTyhrqH5j2`gQc6*g%;RxH2^Y;M0`V&q zSA6sPFq4@Xb_urso>zG0zWeT7y7b=r?z=M@II4i3jQUH`Ue&OH8AvRjH+o2*JQp9I zZZeftn+SkwP4T1EOl!)M;yVqFmN8GtY&2kuIzbZ#Yu4R5xNPInmpq- zEx)WNpJ|x3vgTL2R}QfGWep`-dqr`B>XDAO>?LLPixVzidfiE=DDs)daT z9dFbU%m^a5QGgEx3Tap{CP^-BRwynJ0GD-kojmz|S69kvEdj7kxFqmyvX!8LLM3cN zQqXX-Le2!!K}VPh#<{<=`dLBa(>j#5@*E_QXl{qq@31J!u($>&?46^ zp#H@+UzJuw-$|7hQo&&T90CTfPX!Q%*kh0b=7bOdur4|Q$%m5$MF(S_mtOvf{M(@K z%Q=v9njjbiaH(GZI^C<%&Ga0#%Mh|s158mvBhUoEO|Q@pbnFjjY{dY4Cjeabz|#;H%;_s!tIBp1t+LzgW%d#xgSD!(RTtN;U3+nrJ>OpDN-MFK zU7UKcY?XcIsVo+A z>RM%7RD&t?rjvu-kN`jx!p0tdcxS?j&adoU9UYw=Gb@}z1m+j=+!1JPk{u~USpoY9 ze~H+2$R${`7RygAS#3xVbzD$jY2KSylC^SJ zngN%^OflS^AKwn-tX^s)(=awXHR1@HG z=#TfNDJcqHSo+G*AAE0lQrvO_Auvq>%f47yP5!BS7GC?h7xd944)7?_ISV{5c+Cwa zQ+)N<{~~pBU(UauKJajLpGjX(t&bbiVAb*J-DYh_R2YS@&=U?j>wD*`x;DT6;>pf| z`4bgkK_Lo$zrb@a$U#Sk1=D1(P9$29cWAZ8u$dP9sN{&WLx3r|g5c*lMcCN5`exAx zXzH%6m6Mu`MupG8TAQp*f>(%|Y$zy*Ie8cZ4M}U{Tcd83ict!S@_-{BcG+IQd@l#& z1+^Pe@i_BWo>>H6!Oj6}j+feTUL8*&TY5SBq(Q311780?Gaq$7Vt zmdUHFP9Ht2k#5wUR@V~wdm4(d`kK$(HTp>MxunQ*My^w(VT|nDlAF92|{A zRzxrp{_4-J8Tb?WZblmb7ie72j%4G%H4pf4L1?q#{2es? z*NH;N+>oS?zl{`9a(a2GDJQ42v`=rUZhql*0G}z)69QXBF)Tn=u%muf%2!<-MFSnD z{=8zM5wgkJw6rwVdW7FAjyh4&;YnJn%|XPj5x)dKoY5OF`^U=S(?rqOI8(Yf^1gjj zN7q*=E7~IPU4YRcZ4W0~VcpgROjR)S4vlsRi}Dm7jlx4@(dwCqv1JP2Ca$ZfMY8L;5!|H9=8Om zpon3n|;7mRKQ@tK@=x1vSyb$srupOxUs+U z$@*r!zO?TJa;DeEH{Uh(GRiZ}@zq5PD~Qm9)MNA>osp7e-*hprt-A3g8sFS3uUg4(A%9iA(<(H`ZLfA1$D(dVY%YN#^N%cmB81d1` ze*%Z|iin1#G3aPb7G*Low;_qxCM@5Oi4AQ>vfCs;n+{&MU}X`&U?jhMW z0Sq>d*e+3t&dd5&14Yy!FHyiMbmj;_|8g3+c1*B=-3EDkJonF(vaMtrefjFOu_CM#!|~~kerDp$DTn7R*tNebL4rs_^5(%)DyAf1Am9G8VWr&09TSf>`C{y4B>9D;J8qjIYc=8D&M~LYYO;t zqJWROISukxA&NTQs;#Nc(d+w~?->JdTyt}Qo>pO1mp1?WHZ<3!6Q-=On?s_J=wHF% z&7V2H%U;y+=MGoV|FB~TA$W}A z(@IqEw30LezlvWMxjM@Jyt~7dl2Oxxt-qq*VU=l3#~Uf=^jwZM8_5opa$_)k2-3p3 zXfjwsGsGMXM01$z<*XsBxN@j?jmT;pg3-ZR+lX@2vMPs-gE2>1x&B$?s6Qn(`_d|I zRVa&>lfhIxodb7eO}MRN+qP}nPRC})w#^PZw%PHH?T+2CZQIG+=X__}Kd{GGW527a z)~q?_0}9N1UVcdu%l7-x-R9YJ_ZTzGGEjc0*&_ip(MNdyvmT2_``#b^%sJD%HPyIH zE+?UoK7vPKn7~}Y_A3g9rl|ZNC9EnKduXQqE*Z#`1aMyfbi?3;%SDlyiW?Z==_JN~oilN`XoRQcgu@ulG7~FU-&lO;EtA2b-#bd6==FR}3Zwyg6A(Q}YhZfy)Gb4b#gS%Xd zMVWy!E3;K7-q+dOaX7#?gyIwb)wxZVUp==nJT;fndaYj+%ou@V`^Ql(83&$;lzL?% zsz%mC56)F-uOwmUNR#zzBON0lyeRTd!W#&6f}rCLlIKAvV%2VAJbQWh3a=lcSyXbpP-! z82mbZrPNyC=!_=K_X5xd7U`Aa4>9xDTh~b2k;xlVwLp=`+>A<#NMRIM36foa>$rE374O9D|s!Y`&`|=8S)Pr4|lwP6tg-8$r|PG zfmK`DRa4=@hJeA*RRo)vI^t_UJYu_U_->VX{UMK&Mgr_@9*u8dp$Ogx<}Z17I>%j+4o;FQo2xMg zmw}FfoORs)lFruzK_-l%vU+0(@&qHGO}Agi}sZ*)&3On3RlF69(AFzo>#r zEx#Un-oLJtaGggDXLWS4=&U3v$FI2XJgCyr=xhtmwG6z`(blxk0|PXTSnNfwr?RaZ&GYlMmqf^-W8SpKv_ic$D ztopMpV0IUYKlc+#sCn^{C3_00yk>D6zgC|$Y<*H8*9x!_qVmyVX6ehJXqS9k%sA58 z#o^AmJAR~?ttFRVGU?Jw-+j<-$6A+gG^H{8DU17TI#$^L)!BVvDjqN%x3)$bSoz|2 z>QJ`X>afybdkdbgSmw)aGNOBZKd&}5`FEyt+!;1kAs~c900GX6;(J94afXgxoK7s? zUPXWU{0AzQdpyEXZ>I1+9n-)-DjDOCPW)rCK9x^~%UfBy`6q%wU79q|!en9qS3Y=OqZ9G$j9*>=D6#p3Rq_{Z!bkh)Ju&P5TZJh3lzRsx}TF%VBPIFD zU^!eJS3uKYsCc`rRv;bYYR>bM39ZRj1Mjt5J7{jGw_z4%fNleu_c#}J6YT0G;!~2h zDjVp{T@AM-kN3+&7{0umhfn@@(by#5w;VEK-r}r=n;PCQirYEN z?)0~e15LfKD%%R}v7O_z0}cTYBBNoQi)}zRupNV|vfglTTT_|z@sV$RZM4dg<0RhG z>N$T@9#IOhB!c0@pZJAX*0?B_yr%wxUxD)ua94hI*JyLdZ>wNC%EZ9P{7Y_UOSPFz zx`r$BYV2q1CNL1dfvEuUF;RCIRLAJIk#%-N0yZ_c;xPs^6>J&-u!U<$F6qiyuX^Qe9#UvPS9i|RV_wqGO)hrWiUFLn_li$ z2t6qVWkc`0(6d4Ao(J;@K+~z5i?``x1z=1TQva+q5`J+o8Xn|3YwiiaCeC2J%zeF9 z+%gdOS-C_9p0Orq>wrJd7k89ET30o<6AMN7IFiIYCwZQ4?YCAwx;EB9p2#b4PsgF3 zkt#mRHJv@YyokUR6{Hyu{|FO#|NE%R-^TyKAnxfT0m?5|G0#w!MxZs`F@iN5Hcx&C?ic?$qh+DG~BDD zb#XgDrM4%>%;MrLAv_!>&_zcNfA&Hf7X{htcv_MMcg7tx9Ng)a;UzW0u2n z3PrbL{f`>F^JqHp36hCFqli+zJT7n_@o+cUvD@6UUu2*m23OAI1z`V3=JJ4!#Psfl zxnJXKohf=rGOsZ|&cdwx{H&MJ{BL~2Ixs^pKVYEk7J`?~LQ;S0%RtR@759Do;GnGy z|6jg7Ig0k>Br&dvzlJHZx7i|vtgdQyLrqb2iQRIxqY|T!*#laKMCN6uGdzU<}`@Dmi( zv5`|yrJ_SmMoTSc$Qp1^?+@?gnc;sDe4nDT;zPz!>cU}T4pcPSOjpyh|A$>NqFi-x z3HhVC9rv>;(7)|2?&ab3K4q+X%=TY))%$}F+1TT)1T7p3f^2rZSHQTD7Sk(WZ}1aB z+L|&q6eaYk;hF?an>3s-XQ8GG%ggTr@i6uHGIB+G z7ZyCcbP2LBcY!X!3o?r%$|H(g%|ZPb*QsV$*s*bL!$5;Nq8PrwvRELL(bZf`U(DS7 z9-g;6S?M@Ksh8_F?5%bPB%_M{=RW+;|0Ww6;)ak&y6s_va5&-djCt03_1M^gI+ad- z1`7itCAoLn68@pIY~1m4vrUMpTOcw4m*8tAOW|xy)jxisAXFzzbfI5lhU6xl#+W_P z%6BTPSNA*ddu1JtrsW|r>IiIiUHPlQH*xw>D#Q$sWA_l2i`2O90n*y19yxq5?1?RC zQ{Q2sw0^Mm@$^#D=%Hk`R#E{P7pl`)q9w<>It#FmlxqfR@6XISId!_MzR&T(3duq} ztmz;x;HT}ei&fO!A1UFmij=mO3-0GRSk$iO^-ZR4O`DhyeS;9WwtUdgxJUJEx$mAe zhM#^z3kI0VQ!^_M(+6r2Air72t?5#8XFsbF)g<%j@Adhq4Rboqr;d#RydT#-#_lhY zml;a8CA0Jks#6@=a0ZOZS^plS4kvF~WkH*3*_7&f7knI_ZSAfh%L%gAh17*$MboY;z1S{5-t!Z{87OW5^D;qCmidHcl( z&r&Y%Q^D2S)yEGs1v9bHOD%7gh8SxAi7W8mq&+?Tc7^t5+4w|x!z<+vuO;i&>v;)G zK;oP8i%yN!#9fgXHFbnLiQO$8^`ARwV{DJq$tf2rPo}TOwy-T|DrLhe#3&)W;0O*t ze23mx4AAcU+6P=1_WqUt{ra4PA<#G;m8J(egl+TkC)vwP46-&e@dzT=J9gu{n*hKC#*w7$iDVwWR=a8 zc)A$$e{;P(wVduU%zJt4emmv2{5Qji&5=Jpm_b1^Eywq%i<{U-0OPMTc>7=6|3kbs zFyLm3{~c^b;AKX5_&C9}@5;ywF&Nt1;%^S{JjTSCE2#CuhK^AferqOm`|)pJjIx$E zM)EJ3208dW*J1Yf%0C~J4~QY35`D?`W@3861|2-9tl5Y$mdj?7-1u*qQOtEdUtj7G zFk7NW@-V^67OHrJHvP9gkM zvTyK4d^f=f-A3u)VI}u0{|TUoGfDH$xp^I7$FaCVs^b26Byam1o*`rWer%*~@OH~6 z`;T|Kn=@E{tK%^#oWbIFQWiIGC0CT*F3sVJz=UaySZ|1B-{hc|jyE)K)Zbpgn zH}M5QaKgoCL1p8?LVeRmFs*kL(d&4R%_2D^WfjxcExpBIOT?+IP;ynv)|{3Qpdc8u zkQfA1p9oovL2eo4tI}0YKF~%r;N0<+ry-musaN6~>`&_1-!-)(>cjf5a2>xFJ^wyI zmUt8c5?)p}bH9JR)Qe~^RjvxWZ>s(RyQ0^vfext>gxp%#f6t?o9G0}QvlQ=}3g4Wx zS)LYh-hMjYW`kqeim#~~TAJHl7#JO{+a9d}M(LuBP`W|}cX5FAr{mMfUS<2@m34g5 z@&2ir!XuVuQ?Enx7A0N0-+LtV(Yr8G1(GZ&C0zJ91d+qh43JZ|E?=}{;}2l%XikrX|Ht{6a*uzT0JFh2peN-YH&AXA%5~G8h!)5l3zH)FznKFH z6uvjyo==bg_dDC)UT|K>&lCuoW3_m9?3l8p%?H=QyEfL|6>DxH!dIR7nJA8`=ZeOZ ziQuvd4ZQ2bI75yQbbmrXpBwy@EGnDq0|p!-tac#fEW#ITSlHJi`H7N84JPYKxW{|+ zO{tbOWdZ{fDp~bS0%$RNfgRmB9d-mGC@C{PU|i8l^x#{CJ}-vxhS^SUN1p8bo_?N6 z@W=8R=}Io_P_$MtR4=$klJ{?t?`Up6l+fwLgai(kO+O|)t@%W9Zesd@zxI0^jcNuuz|Z( z3n_opw;Ew7SfY0vXa;m&9)*CA?3j~*e)u)DW`BQK8!!-nWhE7~)bT^U-|YUcr){k{bzMrI*I~%dF6_uizecln#R_l&UqjWxn2?lj;E=n2Caa^RNv2$gr zwL1fEG}|jE&;tsLY0B0-BP(XVXw;?ab~DJr1^DHh{+Qu2WX_PriVU(5frHr2LhEvL zq9voDD^uqxf!$XLxvV7BeoY%ia-RAlpW7-wQyv~X5RQ`SQF9`Qb+QxSIJIcZ4E=Yt zgxnfI+|?NL@ecGT?~Q-~=M^5FJyfILcy?@BNaQbeqU|B%TO*`gv*D}1a<_Mjx-yJn z3zr5q%2=s`vDH4RMlDMS$$MK=dC$fpkqO$NnT1qoi$Nau3%}NLO3zK+wynP zb8;q#ax=0$*>Gcu>A2Bz<-@MpK&2Kb!811Q12!xy%*-S>lhPcSPwDE>O)|KyZYri} z0;P4O=~BEU8;x5xAVIDSlDl#!KkVInJ}mCcd@ z84I)tpUX9+NtaA8v9@yI<`a5$Ara>jyda`AI^Q|bV}DWKrH`^CZ>1PI?RN$`sL5qV zJuPO-y;qt@sWw`JAkYpG71N-kj^2MIq+-WOLC)yaklH3ADhLJT4zCZBo(@y7OVquZ z!MI9$*~X5k^W@L+Z0c-^T+L$9xce(iSbICD{|d+irs}LJD2w64s@{5@{xs%)Z9+S2U8v ztemqb9zEl*E*I)kPY-^C%m3}p_1SNxPTc$r-pA#n7z(U6q2x+l*I}4}WyID_f8O=~ zRv_?NUt+%-?&qyS^0lg&kE4Em!o9B!uog@kV8}bNf!rb;53PerkRljf0a_ul_hai= zGmmo@ESa(>DEXfWQ=!7P2n!mFPfLQM5Iu+I*L@6({glG`r@W)=yzW#4J@cp8(#_4f z1je$kvuiL%vcRxVi`!C>+!D*^$6@6|PE(vSggI^;91h&y5SC>jkbX<{1$W3NpPcUk zc(e1ouIgFHIMe|nF=H_UmUj~4aLgYlZ0NDj?g5RrW5zdZCQc}@c6O1Bj7p(2vJ-~m z>nc$onhsYIt#Kb?)SXI(O^%f`l{~yZoL$U`z{@ZsK+4^T@KxMPa~poI_y(#rWeW)X z5CC)*nUa+DH~ZdM=8uE)czbPFavzC7tXXp|q+pkbL*P{dlLXtCxMkArwn#rbt;|hL zDOLKSoV}q45rO2)7hC_n-^J)yGJIR3R{|e+8M=AXD#s~Lr&X?djL!Okqq{#H$`>A_Nu8L=jQ9j9XxZqx7d~~B5efkHmS6qaUTX-(%9wCuHQtF& z%nXKCFL)BnJ6Y=PfmCMyObQZUdNF{VI~s(gBXq_Y^=u-eD=ktbDp`$huY~5$7U++s z1iJgPC^(-24+o+Ke2SV7iLV~Vf$wC+)CVi1hTwt{hXOP^=qsGcm?i@#81g_z5v)1o zh}+7kQ&R@tH|pljYt;y+KXmsZHBXhYl-;-~85tq*3LD`6i?*Uew3l&#;d}CA2ikGI z`eFR2fo<2@R!G3Wp(i(uadA6M1=eKEv=}Hyn<3>#+_C04x~rUGsbxP&)lM~S&mtPA zRmd}|A@BDE&|r>bHVLFz3srwdc0VKAo=rddH=0RKBD0F2bCS?v?z@;~Y1@mBA*cPI z$fBm`$85TQxYXvy7;ah(YStr6w8^%AZi%{R%+7mNG0SkM4mR<~yzudvUcJeYuA9t- z=DXDQ5mC=>S}Op=+@sY_(jaat3g~H zg`0q_AR?6s3Dlfj&13T!i?52sM_%(49o6<;Tb%PXGpDU%_$7olKTgr?y7YgZQ>90$ zcdrzwN$1J;cf8(4fGw@n`P0t@UoWSBw%PZO3JmK3@*sdajF5{N#=0FCw?_H7Yb!Aj zhrdfROsmgJ*Hc`e{)um?hsTG9V@kFDzisNY8!cu=v!Ww=H=#eopCw^L#fbqLfjq=z z_kR?3R4zo&v^?{__iQmcV7z2R$N_^F1GzG)$Vsh4Xa*6dp&5N%cOe+R@vsi+ICF0? zXD4LYJ+&eI8DM^%pZv+-Yl+|E1$Gnyvu!eRIUECfJ3x9GDiwm^Z)qy)L8u5>Y~k|M zMwZkBZ6Mi{eW~xqP1ydZ%vdq8#DeY$XgZ=4Fwbda`}dxH;D?~Y-xyL$C@+qEDQR+) z04Z)UWYy#MGFO`q=!VXt!tL$jZ&fuyFSSa=&fyWy%!RWL(WSv12{tv~z3^(V=~{-M zZzF@o@6+C|K*{azw|t@R@6&Yc6L6`IO~CMs=J9GG9UDCcU#@|@5y0WCw$v??MC+n& zXckG*;D!xm(!&ZbIk?T1P9TY2{uCgg_{T~I!(Ze}gHSuN<7!>@=>jQ7#|Y%Y5~54-s? z;cb8GQ%A0i*|+{FG-h2Tm5N$kf35VcKf_CVJ+Xtc#I1aY{}eazC4=><7cs# zMUTnNsKMLde5OX<8n>rGzdLH1bQNm@QVB;IWu?J&^Ob>Wl(7j~aVsPBkw3A@^1Vu%b7>A@r zIIV5K?Ts5_&|;P|<3P;FlH&&d-KF8Qgn>8I2>UByj6Bzu(XW+&Hq2puQsK`Vgs zoC^qx8G~OXaPlw*%`w^LvgDNDy~3D;3{f2L|=g)X<$W64jMtv0in z$ArHD5nJ@pBTr-?*VXDhx=-G;=C5N(l?~>`+aLOuuAR2qUV~PCgH|jO&A)nm9e8vm zCR(o(!i@&hidBRsbWNqLv$`vo8&*41eLiyxnbXP9u)B|(p>l>tluN*v@gCBbg_(OC zzNRlD(?Y)_sjpT?^13|%KXH2`U8!=HDKW|b_!tlcs1}D~MP$4K4#aNY#q@VVf47-_ z$zv~0B5NvYD#CK%e=yMOq@xDy*I>1SZK(_xX=lB66&s17;aD4$gcjngm3-aYJ))Kb z(@PNvt#y0={RH7x=m=@mIomq9*FPkN3tz_VxSBK1nKqt#10g_S<8wj!_IriFWsQGp zKrnvvt76-lRCx7|o1-jeY4)CC8uAc-0@24XSRUc?;gco|5xD)~;sq?4tt?icoBMFQ zp}e6bxUdm4L1as&29q#^3Qpj$ln4JH0uo8vDA(zAO?IoaV1f~?;NyuE!o9Q@iSjVg z2Mb`NvxN<BHMBxbJ{ zk5fi|_1^4jc0Q+5{8jX+Nz<5=Fn!69FCpGU;&eKKxdUo2C!P|lwvq0m+ zsp3a|K0H81^}DU`;r;t$^IYITHF(Qf1mw%;x^&VVJo@W30Mp% zr6gK_n1sfioMYJ>Xqup?eup>C(^`z{99CpXZ}-JcntW{_%lHJjPXSiF*&*?CHh@gm zI{wmTh1L&#!H?sECwvMp2u4eM6%*|pd#=qaZ&1%9M6r>7AK)mR2!a(|>vFf)Jck)*olLRVMk@wr5P zUn@cE#K@1l#6@aislPrz^a1A9{T?IvkQvs5*82><;)1)|G6EY?;RuDlBA^q$SM{ny zzM+`#jRH?I!J+w4fRFIu=I)~O8wuf05#BGMP)u^4h7=IfY(*s+hIC}`z+<1|!(7gL z$wAIBGPilB$csFd9u}>E?LA^|b7PXL^6{yYA3$XDt~6WcIjG|)1JQ2?NbLpzHfj#me(6R`caHLfM^BXylh|v*;Caad&sr#?=Skd0F@J zEpU%ng&JqsC0P3Zor`O=zRqoLXGM+<>2Z&iT(=ZhS9{J+ar5WE2Q3@yBKg~uhg|sc z>HKSDz_inbi|cuOD7{Atknz+22xw)kscRF(%;aY(4tJ=i5XZ6bM0qMB+&jl0!&v(E) zcByg=ji9b}+ehKstm#)Kh(y8j)?p0tjh|?Fo}BxsT1LNtq`ddkZtJVQ;i{*Op8V%x zuHFPPBR%b^Z_&f-R^RvAU8yEDNrw05R5=on4HJsktY`t#l~9QA&ajLqG}=c=$o(B& z9kcd6e#;_+{oU(ZeE*(3VN20#k+EU}J+9p}Iyh82+TUIB>ENKnnWG14G}sZcL%Tt~ zLGe!anju5{S>c`k}yAU8I+$cZN_s7s0}vijH4J zMk<%TBqrm__*}0(hn667nFMM>V4U>F8Gmg}qPXe4 zq9xNikfIR+4F~l%sS%~8a+Q#Y^gf2TVOAV-U11$iss)gYqVPR)){J&C=f(n9+P0B9 zr(YD0gWsk;#wWVDX$g=H**IRxP)bjR!+~1yye6Y;H{j*(zQ95@O`_XnrVMrYljx(c znA1@I%UXkds5_PMM9fJFjp3|h1;gE`jOWx|l*YkZCKH_j45sJvwfSxPvQN1;)djEU zGT`ZMVrI*~%Wb5;yEIbkPull8>lf{@;*zOOk$P(SjbFW@@@c2)8&f+Gt?}#iOM?=G ziQ&FkoaV&zRI8D%pLzdN4fIo5if*8r?>i6y!pr-$RQWb8N2Z{09x~RB;Q*N@|CY6k zspXCY?lOyhH zfcc&XV35+)nP@J{?$SHxI0WGL64GELd;C7 zla9L++A+zc(+*#Ix5bZv8!uaxH>yW~w9xixcK)+BwZG81M%@f|d;JS(fDKmEroG^xtLw=l7UI{HJZq9)rEvr^ zA_9W8xLxDb2l3ya-Xf!?pzEF0WRJ#f(YthhPYZk{-Ua(^r9b_Zf3yQJT>6ZvLcSiY zk!wSac)0ayJu+ZF%h%C5WWK;bCi$n!d%-ARhf2OU(t0J9;rzu-FK|QV#CBe@Qw|5n z;&)Xoq*b+liN}B*G=XrL#p0S_;RW5+G@ple)$V*(V>%xHBE%|4hYzel#c}w_lFqAY zJ!HavqRpTQzs7C{!7oG3C*H9H@|&u8LyCL@PP`;GHhA}jkY^NC{74HwV$b}ci>So~ z*bt5rBXNd-{I;f^%gs#CedW^&G#YT5177W{)+gdC&-{BM#rFqN`$;8`?VVCvLza6@VzfuEp?kOPuhL9tmK@E4=lv zayP=M*OQaG)nKl3`WrP!C(M}o-Zo&UBSfhvC^bFAwe84;sXgxa+PadHE)Gn7ueM!1 zed@UC*4?n?R>PYgx|_ZnB|n{#$y&W3&x|fLCt1q@eH-DhqDALR#+by|{mgZm8tb9v zN)+xTWJ1LfTP}l{X2DyOdQ!X+$GZ*inCN&A6i&tfLair6Br7bbMwTdi4+26z>9
P79!Xa}a%eZ&nu)^kQTx*^7DF@mH*{_B zu(=*QG?Ym_BP`K?v3ewHptBF|Z|glAtg{vA0HK>#oPm~?L^vL;7(Xi1;HqtRu-FWjv_z8mwd zIp(7kkBKoF(jSpGeaV(tnMKD0+@>)VFMTvgDGPOpsuO|^*ZZ( zFpwE8J5m#4PlVhY+5Q@<=a$bKFe-&fzOLERBB2pSdco=aInwZH-WF_ip`7cLaj9Pk zSBw4dcyL=8Pa$L4#H_P_Z}9l)C-@j@xJ{bSTq&=v%Ic0R2*(%Fjb4P^)F9#kis96U zcQ(P>Yrl(VYvbDo&1PSxCxcFZX&o;M>G?qdodV{;q)xFBUU

8zB{&%+D<3>I!fF%OT}W~u#f2tq#A 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

CnwJDWOdE1hJVIp52`5$fN+G|tQ<8d! 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 + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 0 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/gd32/arm/gd32527I-eval/project.ewp b/bsp/gd32/arm/gd32527I-eval/project.ewp new file mode 100644 index 00000000000..97e405f77f1 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/project.ewp @@ -0,0 +1,2177 @@ + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\pin\pin.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\IAR\startup_gd32f4xx.s + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_usart.c + + + + Filesystem + + $PROJ_DIR$\..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + + + $PROJ_DIR$\..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + + + $PROJ_DIR$\..\..\..\..\components\dfs\dfs_v1\src\dfs.c + + + $PROJ_DIR$\..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + + + + Finsh + + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh_file.c + + + + Kernel + + $PROJ_DIR$\..\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\..\src\timer.c + + + + libcpu + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + Libraries + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + POSIX + + diff --git a/bsp/gd32/arm/gd32527I-eval/project.eww b/bsp/gd32/arm/gd32527I-eval/project.eww new file mode 100644 index 00000000000..c2cb02eb1e8 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/gd32/arm/gd32527I-eval/project.uvoptx b/bsp/gd32/arm/gd32527I-eval/project.uvoptx new file mode 100644 index 00000000000..18af63782b3 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/project.uvoptx @@ -0,0 +1,1086 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 14 + + + + + + + + + + + BIN\CMSIS_AGDI_V8M.DLL + + + + 0 + CMSIS_AGDI_V8M + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BE12477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M.FLM -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM) + + + 0 + UL2V8M + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + + + 0 + CMSIS_AGDI + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 22 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 23 + 2 + 0 + 0 + 0 + ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + startup_gd32f4xx.s + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Filesystem + 0 + 0 + 0 + 0 + + 5 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + dfs_fs.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + dfs_file.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\dfs\dfs_v1\src\dfs.c + dfs.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + dfs_posix.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 8 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 9 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 9 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 9 + 57 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m33\context_rvds.S + context_rvds.S + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m33\cpuport.c + cpuport.c + 0 + 0 + + + 9 + 59 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + syscall_rvds.S + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m33\trustzone.c + trustzone.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 10 + 61 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c + gd32f5xx_rcu.c + 0 + 0 + + + 10 + 62 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c + gd32f5xx_syscfg.c + 0 + 0 + + + 10 + 63 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c + gd32f5xx_dma.c + 0 + 0 + + + 10 + 64 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c + gd32f5xx_usart.c + 0 + 0 + + + 10 + 65 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c + gd32f5xx_misc.c + 0 + 0 + + + 10 + 66 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c + gd32f5xx_gpio.c + 0 + 0 + + + 10 + 67 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Source\system_gd32f5xx.c + system_gd32f5xx.c + 0 + 0 + + + 10 + 68 + 1 + 0 + 0 + 0 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c + gd32f5xx_exti.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + + diff --git a/bsp/gd32/arm/gd32527I-eval/project.uvproj b/bsp/gd32/arm/gd32527I-eval/project.uvproj new file mode 100644 index 00000000000..155b0e22a4e --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/project.uvproj @@ -0,0 +1,1159 @@ + + + 1.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F450ZK + GigaDevice + IRAM(0x20000000-0x20030000) IRAM2(0x10000000-0x10010000) IROM(0x08000000-0x08300000) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000) + 0 + gd32f4xx0.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, GD32F470, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__ + + ..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;applications;..\..\..\..\components\libc\compilers\common\include;..\libraries\gd32_drivers;..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Include;..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Include;..\libraries\GD32F4xx_Firmware_Library\CMSIS;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\include;board;..\..\..\..\components\libc\posix\io\eventfd;.;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\libc\posix\ipc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion.c + 1 + ..\..\..\..\components\drivers\ipc\completion.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + pin.c + 1 + ..\..\..\..\components\drivers\pin\pin.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + serial.c + 1 + ..\..\..\..\components\drivers\serial\serial.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + startup_gd32f4xx.s + 2 + ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Filesystem + + + dfs_posix.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + + + + + dfs_fs.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + + + + + dfs.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs.c + + + + + dfs_file.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + + + msh_file.c + 1 + ..\..\..\..\components\finsh\msh_file.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + libcpu + + + div0.c + 1 + ..\..\..\..\libcpu\arm\common\div0.c + + + + + showmem.c + 1 + ..\..\..\..\libcpu\arm\common\showmem.c + + + + + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + Libraries + + + gd32f4xx_syscfg.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + + + gd32f4xx_gpio.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + + + gd32f4xx_exti.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + + + gd32f4xx_dma.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + + + gd32f4xx_rcu.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + + + gd32f4xx_misc.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + + + gd32f4xx_usart.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + + system_gd32f4xx.c + 1 + ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + + +
diff --git a/bsp/gd32/arm/gd32527I-eval/project.uvprojx b/bsp/gd32/arm/gd32527I-eval/project.uvprojx new file mode 100644 index 00000000000..6fd79c653de --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/project.uvprojx @@ -0,0 +1,2423 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 6190000::V6.19::ARMCLANG + 1 + + + GD32F527IS + GigaDevice + GigaDevice.GD32F5xx_DFP.1.1.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x080000) IROM(0x08000000,0x780000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + 0 + + + + + + + + + + + $$Device:GD32F527IS$SVD\GD32F5xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + -MPU + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2V8M.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 1 + 0x8000000 + 0x780000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x780000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + RT_USING_ARMLIBC, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F527 + + ..\libraries\gd32_drivers;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\libc\posix\ipc;..\libraries\GD32F5xx_Firmware_Library\CMSIS;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\include;..\..\..\..\libcpu\arm\cortex-m33;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\common;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\libc\compilers\common\include;..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Include;board;applications;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\gd32_rom.ld + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + startup_gd32f4xx.s + 2 + ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Filesystem + + + dfs_fs.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + -std=c99 + + + + + + + + + + dfs_file.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + -std=c99 + + + + + + + + + + dfs.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + -std=c99 + + + + + + + + + + dfs_posix.c + 1 + ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + -std=c99 + + + + + + + + + + + + Finsh + + + msh_file.c + 1 + ..\..\..\..\components\finsh\msh_file.c + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + + + libcpu + + + div0.c + 1 + ..\..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m33\context_rvds.S + + + 2 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 3 + + + + + + + + + + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m33\cpuport.c + + + syscall_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + + + trustzone.c + 1 + ..\..\..\..\libcpu\arm\cortex-m33\trustzone.c + + + + + Libraries + + + gd32f5xx_rcu.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c + + + gd32f5xx_syscfg.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c + + + gd32f5xx_dma.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c + + + gd32f5xx_usart.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c + + + gd32f5xx_misc.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c + + + gd32f5xx_gpio.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c + + + system_gd32f5xx.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Source\system_gd32f5xx.c + + + gd32f5xx_exti.c + 1 + ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/bsp/gd32/arm/gd32527I-eval/rtconfig.h b/bsp/gd32/arm/gd32527I-eval/rtconfig.h new file mode 100644 index 00000000000..c4e0b207b67 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/rtconfig.h @@ -0,0 +1,396 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart0" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +#define RT_USING_DFS +#define DFS_USING_POSIX +#define DFS_USING_WORKDIR +#define DFS_FD_MAX 16 +#define RT_USING_DFS_V1 +#define DFS_FILESYSTEMS_MAX 4 +#define DFS_FILESYSTEM_TYPES_MAX 4 +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ + +/* Hardware Drivers Config */ + +#define SOC_SERIES_GD32F5xx +#define SOC_GD32527I + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART0 +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/gd32/arm/gd32527I-eval/rtconfig.py b/bsp/gd32/arm/gd32527I-eval/rtconfig.py new file mode 100644 index 00000000000..af4839de007 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m33' +CROSS_TOOL='keil' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armclang' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -DGD32F527' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.ld' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M33.no_dsp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m33+nodsp ' + CFLAGS += ' -mfpu=fpv5-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork -mfpu=FPv5-SP' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M33.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M33' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv5_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M33' + AFLAGS += ' --fpu VFPv5_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) diff --git a/bsp/gd32/arm/gd32527I-eval/template.ewp b/bsp/gd32/arm/gd32527I-eval/template.ewp new file mode 100644 index 00000000000..963857b281f --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/template.ewp @@ -0,0 +1,1892 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + + diff --git a/bsp/gd32/arm/gd32527I-eval/template.uvoptx b/bsp/gd32/arm/gd32527I-eval/template.uvoptx new file mode 100644 index 00000000000..7cc88950b15 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/template.uvoptx @@ -0,0 +1,185 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 13 + + + + + + + + + + + BIN\UL2V8M.DLL + + + + 0 + UL2V8M + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + + + 0 + CMSIS_AGDI + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/gd32/arm/gd32527I-eval/template.uvproj b/bsp/gd32/arm/gd32527I-eval/template.uvproj new file mode 100644 index 00000000000..d7a936eb299 --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/template.uvproj @@ -0,0 +1,628 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F450ZK + GigaDevice + IRAM(0x20000000-0x20030000) IRAM2(0x10000000-0x10010000) IROM(0x08000000-0x08300000) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000) + 0 + gd32f4xx0.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Include;..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Include;..\..\..\Library\Utilities;..\ + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application + + + main.c + 1 + ..\main.c + + + gd32f4xx_it.c + 1 + ..\gd32f4xx_it.c + + + + + CMSIS + + + system_gd32f4xx.c + 1 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + GD32F4xx_Peripherals + + + gd32f4xx_adc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_adc.c + + + gd32f4xx_can.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_can.c + + + gd32f4xx_crc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_crc.c + + + gd32f4xx_ctc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ctc.c + + + gd32f4xx_dac.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dac.c + + + gd32f4xx_dbg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dbg.c + + + gd32f4xx_dci.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dci.c + + + gd32f4xx_dma.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + gd32f4xx_enet.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_enet.c + + + gd32f4xx_exmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exmc.c + + + gd32f4xx_exti.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + gd32f4xx_fmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fmc.c + + + gd32f4xx_fwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fwdgt.c + + + gd32f4xx_gpio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + gd32f4xx_i2c.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + gd32f4xx_ipa.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ipa.c + + + gd32f4xx_iref.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_iref.c + + + gd32f4xx_misc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + gd32f4xx_pmu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_pmu.c + + + gd32f4xx_rcu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + gd32f4xx_rtc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rtc.c + + + gd32f4xx_sdio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_sdio.c + + + gd32f4xx_spi.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_spi.c + + + gd32f4xx_syscfg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + gd32f4xx_timer.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + + + gd32f4xx_tli.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_tli.c + + + gd32f4xx_trng.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_trng.c + + + gd32f4xx_usart.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + gd32f4xx_wwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_wwdgt.c + + + + + GD32F4xx_EVAL + + + gd32f450z_eval.c + 1 + ..\..\..\Library\Utilities\gd32f450z_eval.c + + + + + Startup + + + startup_gd32f4xx.s + 2 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + Doc + + + readme.txt + 5 + ..\readme.txt + + + + + + + +
diff --git a/bsp/gd32/arm/gd32527I-eval/template.uvprojx b/bsp/gd32/arm/gd32527I-eval/template.uvprojx new file mode 100644 index 00000000000..555f6ab3cef --- /dev/null +++ b/bsp/gd32/arm/gd32527I-eval/template.uvprojx @@ -0,0 +1,413 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 1 + + + GD32F527IS + GigaDevice + GigaDevice.GD32F5xx_DFP.1.1.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x080000) IROM(0x08000000,0x780000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM)) + 0 + + + + + + + + + + + $$Device:GD32F527IS$SVD\GD32F5xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + -MPU + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2V8M.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 1 + 0x8000000 + 0x780000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x780000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\gd32_rom.ld + + + + + + + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h new file mode 100644 index 00000000000..169241476a5 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h @@ -0,0 +1,302 @@ +/*! + \file gd32f5xx.h + \brief general definitions for GD32F5xx + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * Copyright (c) 2024, GigaDevice Semiconductor Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#ifndef GD32F5XX_H +#define GD32F5XX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* define GD32F5xx */ +#if !defined (GD32F527) +/* #define GD32F527 */ +#endif /* define GD32F5xx */ + +#if !defined (GD32F527) +#error "Please select the target GD32F5xx device in gd32f5xx.h file" +#endif /* undefine GD32F5xx tip */ + +/* define value of high speed crystal oscillator (HXTAL) in Hz */ +#if !defined (HXTAL_VALUE) +#define HXTAL_VALUE ((uint32_t)25000000) +#endif /* high speed crystal oscillator value */ + +/* define startup timeout value of high speed crystal oscillator (HXTAL) */ +#if !defined (HXTAL_STARTUP_TIMEOUT) +#define HXTAL_STARTUP_TIMEOUT ((uint16_t)0xFFFF) +#endif /* high speed crystal oscillator startup timeout */ + +/* define value of internal 16MHz RC oscillator (IRC16M) in Hz */ +#if !defined (IRC16M_VALUE) +#define IRC16M_VALUE ((uint32_t)16000000) +#endif /* internal 16MHz RC oscillator value */ + +/* define startup timeout value of internal 16MHz RC oscillator (IRC16M) */ +#if !defined (IRC16M_STARTUP_TIMEOUT) +#define IRC16M_STARTUP_TIMEOUT ((uint16_t)0x0500) +#endif /* internal 16MHz RC oscillator startup timeout */ + +/* define value of internal 32KHz RC oscillator(IRC32K) in Hz */ +#if !defined (IRC32K_VALUE) +#define IRC32K_VALUE ((uint32_t)32000) +#endif /* internal 32KHz RC oscillator value */ + +/* define value of low speed crystal oscillator (LXTAL)in Hz */ +#if !defined (LXTAL_VALUE) +#define LXTAL_VALUE ((uint32_t)32768) +#endif /* low speed crystal oscillator value */ + +/* I2S external clock in selection */ +//#define I2S_EXTERNAL_CLOCK_IN (uint32_t)12288000U + +/* GD32F5xx firmware library version number */ +#define __GD32F5XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __GD32F5XX_STDPERIPH_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ +#define __GD32F5XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __GD32F5XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __GD32F5XX_STDPERIPH_VERSION ((__GD32F5XX_STDPERIPH_VERSION_MAIN << 24)\ + |(__GD32F5XX_STDPERIPH_VERSION_SUB1 << 16)\ + |(__GD32F5XX_STDPERIPH_VERSION_SUB2 << 8)\ + |(__GD32F5XX_STDPERIPH_VERSION_RC)) + +/* configuration of the cortex-M33 processor and core peripherals */ +#define __CM33_REV 0x0001 /*!< core revision r0p1 */ +#define __MPU_PRESENT 1 /*!< GD32F5xx provide MPU */ +#define __NVIC_PRIO_BITS 4 /*!< GD32F5xx uses 4 bits for the priority levels */ +#define __Vendor_SysTickConfig 0 /*!< set to 1 if different sysTick config is used */ +#define __FPU_PRESENT 1 /*!< FPU present */ +#define __DSP_PRESENT 1 /*!< DSP present */ +/* define interrupt number */ +typedef enum IRQn { + /* cortex-M33 processor exceptions numbers */ + NonMaskableInt_IRQn = -14, /*!< 2 non maskable interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 cortex-M33 memory management interrupt */ + BusFault_IRQn = -11, /*!< 5 cortex-M33 bus fault interrupt */ + UsageFault_IRQn = -10, /*!< 6 cortex-M33 usage fault interrupt */ + SVCall_IRQn = -5, /*!< 11 cortex-M33 SV call interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 cortex-M33 debug monitor interrupt */ + PendSV_IRQn = -2, /*!< 14 cortex-M33 pend SV interrupt */ + SysTick_IRQn = -1, /*!< 15 cortex-M33 system tick interrupt */ + /* interruput numbers */ + WWDGT_IRQn = 0, /*!< window watchdog timer interrupt */ + LVD_IRQn = 1, /*!< LVD through EXTI line detect interrupt */ + TAMPER_STAMP_IRQn = 2, /*!< tamper and timestamp through EXTI line detect */ + RTC_WKUP_IRQn = 3, /*!< RTC wakeup through EXTI line interrupt */ + FMC_IRQn = 4, /*!< FMC interrupt */ + RCU_CTC_IRQn = 5, /*!< RCU and CTC interrupt */ + EXTI0_IRQn = 6, /*!< EXTI line 0 interrupts */ + EXTI1_IRQn = 7, /*!< EXTI line 1 interrupts */ + EXTI2_IRQn = 8, /*!< EXTI line 2 interrupts */ + EXTI3_IRQn = 9, /*!< EXTI line 3 interrupts */ + EXTI4_IRQn = 10, /*!< EXTI line 4 interrupts */ + DMA0_Channel0_IRQn = 11, /*!< DMA0 channel0 Interrupt */ + DMA0_Channel1_IRQn = 12, /*!< DMA0 channel1 Interrupt */ + DMA0_Channel2_IRQn = 13, /*!< DMA0 channel2 interrupt */ + DMA0_Channel3_IRQn = 14, /*!< DMA0 channel3 interrupt */ + DMA0_Channel4_IRQn = 15, /*!< DMA0 channel4 interrupt */ + DMA0_Channel5_IRQn = 16, /*!< DMA0 channel5 interrupt */ + DMA0_Channel6_IRQn = 17, /*!< DMA0 channel6 interrupt */ + ADC_IRQn = 18, /*!< ADC interrupt */ + CAN0_TX_IRQn = 19, /*!< CAN0 TX interrupt */ + CAN0_RX0_IRQn = 20, /*!< CAN0 RX0 interrupt */ + CAN0_RX1_IRQn = 21, /*!< CAN0 RX1 interrupt */ + CAN0_EWMC_IRQn = 22, /*!< CAN0 EWMC interrupt */ + EXTI5_9_IRQn = 23, /*!< EXTI[9:5] interrupts */ + TIMER0_BRK_TIMER8_IRQn = 24, /*!< TIMER0 break and TIMER8 interrupts */ + TIMER0_UP_TIMER9_IRQn = 25, /*!< TIMER0 update and TIMER9 interrupts */ + TIMER0_TRG_CMT_TIMER10_IRQn = 26, /*!< TIMER0 trigger and commutation and TIMER10 interrupts */ + TIMER0_Channel_IRQn = 27, /*!< TIMER0 channel capture compare interrupt */ + TIMER1_IRQn = 28, /*!< TIMER1 interrupt */ + TIMER2_IRQn = 29, /*!< TIMER2 interrupt */ + TIMER3_IRQn = 30, /*!< TIMER3 interrupts */ + I2C0_EV_IRQn = 31, /*!< I2C0 event interrupt */ + I2C0_ER_IRQn = 32, /*!< I2C0 error interrupt */ + I2C1_EV_IRQn = 33, /*!< I2C1 event interrupt */ + I2C1_ER_IRQn = 34, /*!< I2C1 error interrupt */ + SPI0_IRQn = 35, /*!< SPI0 interrupt */ + SPI1_IRQn = 36, /*!< SPI1 interrupt */ + USART0_IRQn = 37, /*!< USART0 interrupt */ + USART1_IRQn = 38, /*!< USART1 interrupt */ + USART2_IRQn = 39, /*!< USART2 interrupt */ + EXTI10_15_IRQn = 40, /*!< EXTI[15:10] interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC alarm interrupt */ + USBFS_WKUP_IRQn = 42, /*!< USBFS wakeup interrupt */ + TIMER7_BRK_TIMER11_IRQn = 43, /*!< TIMER7 break and TIMER11 interrupts */ + TIMER7_UP_TIMER12_IRQn = 44, /*!< TIMER7 update and TIMER12 interrupts */ + TIMER7_TRG_CMT_TIMER13_IRQn = 45, /*!< TIMER7 trigger and commutation and TIMER13 interrupts */ + TIMER7_Channel_IRQn = 46, /*!< TIMER7 channel capture compare interrupt */ + DMA0_Channel7_IRQn = 47, /*!< DMA0 channel7 interrupt */ + EXMC_IRQn = 48, /*!< EXMC interrupt */ + SDIO_IRQn = 49, /*!< SDIO interrupt */ + TIMER4_IRQn = 50, /*!< TIMER4 interrupt */ + SPI2_IRQn = 51, /*!< SPI2 interrupt */ + UART3_IRQn = 52, /*!< UART3 interrupt */ + UART4_IRQn = 53, /*!< UART4 interrupt */ + TIMER5_DAC_IRQn = 54, /*!< TIMER5 and DAC0 DAC1 underrun error interrupts */ + TIMER6_IRQn = 55, /*!< TIMER6 interrupt */ + DMA1_Channel0_IRQn = 56, /*!< DMA1 channel0 interrupt */ + DMA1_Channel1_IRQn = 57, /*!< DMA1 channel1 interrupt */ + DMA1_Channel2_IRQn = 58, /*!< DMA1 channel2 interrupt */ + DMA1_Channel3_IRQn = 59, /*!< DMA1 channel3 interrupt */ + DMA1_Channel4_IRQn = 60, /*!< DMA1 channel4 interrupt */ + ENET_IRQn = 61, /*!< ENET interrupt */ + ENET_WKUP_IRQn = 62, /*!< ENET wakeup through EXTI line interrupt */ + CAN1_TX_IRQn = 63, /*!< CAN1 TX interrupt */ + CAN1_RX0_IRQn = 64, /*!< CAN1 RX0 interrupt */ + CAN1_RX1_IRQn = 65, /*!< CAN1 RX1 interrupt */ + CAN1_EWMC_IRQn = 66, /*!< CAN1 EWMC interrupt */ + USBFS_IRQn = 67, /*!< USBFS interrupt */ + DMA1_Channel5_IRQn = 68, /*!< DMA1 channel5 interrupt */ + DMA1_Channel6_IRQn = 69, /*!< DMA1 channel6 interrupt */ + DMA1_Channel7_IRQn = 70, /*!< DMA1 channel7 interrupt */ + USART5_IRQn = 71, /*!< USART5 interrupt */ + I2C2_EV_IRQn = 72, /*!< I2C2 event interrupt */ + I2C2_ER_IRQn = 73, /*!< I2C2 error interrupt */ + USBHS_EP1_Out_IRQn = 74, /*!< USBHS endpoint 1 out interrupt */ + USBHS_EP1_In_IRQn = 75, /*!< USBHS endpoint 1 in interrupt */ + USBHS_WKUP_IRQn = 76, /*!< USBHS wakeup through EXTI line interrupt */ + USBHS_IRQn = 77, /*!< USBHS interrupt */ + DCI_IRQn = 78, /*!< DCI interrupt */ + TRNG_IRQn = 80, /*!< TRNG interrupt */ + FPU_IRQn = 81, /*!< FPU interrupt */ + UART6_IRQn = 82, /*!< UART6 interrupt */ + UART7_IRQn = 83, /*!< UART7 interrupt */ + SPI3_IRQn = 84, /*!< SPI3 interrupt */ + SPI4_IRQn = 85, /*!< SPI4 interrupt */ + SPI5_IRQn = 86, /*!< SPI5 interrupt */ + SAI_IRQn = 87, /*!< SAI interrupt */ + TLI_IRQn = 88, /*!< TLI interrupt */ + TLI_ER_IRQn = 89, /*!< TLI error interrupt */ + IPA_IRQn = 90, /*!< IPA interrupt */ + PKCAU_IRQn = 91, /*!< PKCAU interrupt */ + I2C3_EV_IRQn = 92, /*!< I2C3 Event interrupt */ + I2C3_ER_IRQn = 93, /*!< I2C3 Error interrupt */ + I2C4_EV_IRQn = 94, /*!< I2C4 Event interrupt */ + I2C4_ER_IRQn = 95, /*!< I2C4 Error interrupt */ + I2C5_EV_IRQn = 96, /*!< I2C5 Event interrupt */ + I2C5_ER_IRQn = 97, /*!< I2C5 Error interrupt */ + I2C3_WKUP_IRQn = 98, /*!< I2C3 Wakeup through EXTI Line interrupt */ + I2C4_WKUP_IRQn = 99, /*!< I2C4 Wakeup through EXTI Line interrupt */ + I2C5_WKUP_IRQn = 100, /*!< I2C5 Wakeup through EXTI Line interrupt */ + SYSCFG_SRAM_ECC_ER_IRQn = 101, /*!< SYSCFG SRAM ECC Error interrupt */ + HAU_IRQn = 102, /*!< HAU interrupt */ + CAU_IRQn = 103 /*!< CAU interrupt */ +} IRQn_Type; + +/* includes */ +#include "core_cm33.h" +#include "system_gd32f5xx.h" +#include + +/* enum definitions */ +typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; +typedef enum {RESET = 0, SET = !RESET} FlagStatus; +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; + +/* bit operations */ +#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr)) +#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr)) +#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr)) +#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x))) +#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) +#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) + +/* main flash and SRAM memory map */ +#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ +#define TCMSRAM_BASE ((uint32_t)0x10000000U) /*!< TCMSRAM(64KB) base address */ +#define OPTION_BASE ((uint32_t)0x1FFFC000U) /*!< Option bytes base address */ +#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ + +/* peripheral memory map */ +#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ +#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ +#define AHB1_BUS_BASE ((uint32_t)0x40020000U) /*!< ahb1 base address */ +#define AHB2_BUS_BASE ((uint32_t)0x50000000U) /*!< ahb2 base address */ + +/* EXMC memory map */ +#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ + +/* advanced peripheral bus 1 memory map */ +#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ +#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ +#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ +#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ +#define I2S_ADD_BASE (APB1_BUS_BASE + 0x00003400U) /*!< I2S1_add base address */ +#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ +#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ +#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ +#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ +#define CTC_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< CTC base address */ +#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ +#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ +#define IREF_BASE (APB1_BUS_BASE + 0x0000C400U) /*!< IREF base address */ + +/* advanced peripheral bus 2 memory map */ +#define ADC_BASE (APB2_BUS_BASE + 0x00002000U) /*!< ADC base address */ +#define SDIO_BASE (APB2_BUS_BASE + 0x00002C00U) /*!< SDIO base address */ +#define SYSCFG_BASE (APB2_BUS_BASE + 0x00003800U) /*!< SYSCFG base address */ +#define EXTI_BASE (APB2_BUS_BASE + 0x00003C00U) /*!< EXTI base address */ +#define SAI_BASE (APB2_BUS_BASE + 0x00005800U) /*!< SAI base address */ +#define TLI_BASE (APB2_BUS_BASE + 0x00006800U) /*!< TLI base address */ + +/* advanced high performance bus 1 memory map */ +#define GPIO_BASE (AHB1_BUS_BASE + 0x00000000U) /*!< GPIO base address */ +#define CRC_BASE (AHB1_BUS_BASE + 0x00003000U) /*!< CRC base address */ +#define RCU_BASE (AHB1_BUS_BASE + 0x00003800U) /*!< RCU base address */ +#define FMC_BASE (AHB1_BUS_BASE + 0x00003C00U) /*!< FMC base address */ +#define BKPSRAM_BASE (AHB1_BUS_BASE + 0x00004000U) /*!< BKPSRAM base address */ +#define DMA_BASE (AHB1_BUS_BASE + 0x00006000U) /*!< DMA base address */ +#define ENET_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< ENET base address */ +#define IPA_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< IPA base address */ +#define USBHS_BASE (AHB1_BUS_BASE + 0x00020000U) /*!< USBHS base address */ + +/* advanced high performance bus 2 memory map */ +#define USBFS_BASE (AHB2_BUS_BASE + 0x00000000U) /*!< USBFS base address */ +#define DCI_BASE (AHB2_BUS_BASE + 0x00050000U) /*!< DCI base address */ +#define CAU_BASE (AHB2_BUS_BASE + 0x00060000U) /*!< CAU base address */ +#define HAU_BASE (AHB2_BUS_BASE + 0x00060400U) /*!< HAU base address */ +#define TRNG_BASE (AHB2_BUS_BASE + 0x00060800U) /*!< TRNG base address */ +#define PKCAU_BASE (AHB2_BUS_BASE + 0x00061000U) /*!< PKCAU base address */ + +/* option byte and debug memory map */ +#define OB_BASE ((uint32_t)0x1FFEC000U) /*!< OB base address */ +#define DBG_BASE ((uint32_t)0xE0044000U) /*!< DBG base address */ + +/* define marco USE_STDPERIPH_DRIVER */ +#if !defined USE_STDPERIPH_DRIVER +#define USE_STDPERIPH_DRIVER +#endif +#ifdef USE_STDPERIPH_DRIVER +#include "gd32f5xx_libopt.h" +#endif /* USE_STDPERIPH_DRIVER */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h new file mode 100644 index 00000000000..1260a698fb3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h @@ -0,0 +1,57 @@ +/*! + \file system_gd32f5xx.h + \brief CMSIS Cortex-M33 Device Peripheral Access Layer Header File for + GD32F5xx Device Series +*/ + +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * Copyright (c) 2024, GigaDevice Semiconductor Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#ifndef SYSTEM_GD32F5XX_H +#define SYSTEM_GD32F5XX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* firmware version can be aquired by uncommenting the macro */ +#define __FIRMWARE_VERSION_DEFINE + +/* system clock frequency (core clock) */ +extern uint32_t SystemCoreClock; + +/* function declarations */ +/* initialize the system and update the SystemCoreClock variable */ +extern void SystemInit (void); +/* update the SystemCoreClock with current core clock retrieved from cpu registers */ +extern void SystemCoreClockUpdate (void); +#ifdef __FIRMWARE_VERSION_DEFINE +/* get firmware version */ +extern uint32_t gd32f5xx_firmware_version_get(void); +#endif /* __FIRMWARE_VERSION_DEFINE */ + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_GD32F5XX_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s new file mode 100644 index 00000000000..cb0938415d6 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s @@ -0,0 +1,495 @@ +;/*! +; \file startup_gd32f5xx.s +; \brief start up file +; +; \version 2024-07-31, V1.1.0, firmware for GD32F5xx +;*/ +; +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * Copyright (c) 2024, GigaDevice Semiconductor Inc. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * Unless required by applicable law or agreed to in writing, software +; * distributed under the License is distributed on an AS IS BASIS, WITHOUT +; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; * See the License for the specific language governing permissions and +; * limitations under the License. +; */ +; +;/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000400 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; /* reset Vector Mapped to at Address 0 */ + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + +; /* external interrupts handler */ + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; 18:Tamper and TimeStamp through EXTI Line detect + DCD RTC_WKUP_IRQHandler ; 19:RTC Wakeup through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC_IRQHandler ; 34:ADC + DCD CAN0_TX_IRQHandler ; 35:CAN0 TX + DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commutation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commutation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD DMA0_Channel7_IRQHandler ; 63:DMA0 Channel7 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_DAC_IRQHandler ; 70:TIMER5 and DAC0 DAC1 Underrun error + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 + DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 + DCD ENET_IRQHandler ; 77:Ethernet + DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line + DCD CAN1_TX_IRQHandler ; 79:CAN1 TX + DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 + DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC + DCD USBFS_IRQHandler ; 83:USBFS + DCD DMA1_Channel5_IRQHandler ; 84:DMA1 Channel5 + DCD DMA1_Channel6_IRQHandler ; 85:DMA1 Channel6 + DCD DMA1_Channel7_IRQHandler ; 86:DMA1 Channel7 + DCD USART5_IRQHandler ; 87:USART5 + DCD I2C2_EV_IRQHandler ; 88:I2C2 Event + DCD I2C2_ER_IRQHandler ; 89:I2C2 Error + DCD USBHS_EP1_Out_IRQHandler ; 90:USBHS Endpoint 1 Out + DCD USBHS_EP1_In_IRQHandler ; 91:USBHS Endpoint 1 in + DCD USBHS_WKUP_IRQHandler ; 92:USBHS Wakeup through EXTI Line + DCD USBHS_IRQHandler ; 93:USBHS + DCD DCI_IRQHandler ; 94:DCI + DCD 0 ; 95:Reserved + DCD TRNG_IRQHandler ; 96:TRNG + DCD FPU_IRQHandler ; 97:FPU + DCD UART6_IRQHandler ; 98:UART6 + DCD UART7_IRQHandler ; 99:UART7 + DCD SPI3_IRQHandler ; 100:SPI3 + DCD SPI4_IRQHandler ; 101:SPI4 + DCD SPI5_IRQHandler ; 102:SPI5 + DCD SAI_IRQHandler ; 103:SAI + DCD TLI_IRQHandler ; 104:TLI + DCD TLI_ER_IRQHandler ; 105:TLI Error + DCD IPA_IRQHandler ; 106:IPA + DCD PKCAU_IRQHandler ; 107:PKCAU + DCD I2C3_EV_IRQHandler ; 108:I2C3 Event + DCD I2C3_ER_IRQHandler ; 109:I2C3 Error + DCD I2C4_EV_IRQHandler ; 110:I2C4 Event + DCD I2C4_ER_IRQHandler ; 111:I2C4 Error + DCD I2C5_EV_IRQHandler ; 112:I2C5 Event + DCD I2C5_ER_IRQHandler ; 113:I2C5 Error + DCD I2C3_WKUP_IRQHandler ; 114:I2C3 Wakeup through EXTI Line + DCD I2C4_WKUP_IRQHandler ; 115:I2C4 Wakeup through EXTI Line + DCD I2C5_WKUP_IRQHandler ; 116:I2C5 Wakeup through EXTI Line + DCD SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler ; 117:SYSCFG SRAM and Flash single bit ECC Error + DCD HAU_IRQHandler ; 118:HAU + DCD CAU_IRQHandler ; 119:CAU + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +;/* reset Handler */ +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + IMPORT |Image$$RW_IRAM1$$RW$$Base| + + LDR R0, =|Image$$RW_IRAM1$$RW$$Base| + ADD R1, R0, #0x8000 + LDR R2, =0x0 +MEM_INIT STRD R2, R2, [ R0 ] , #8 + CMP R0, R1 + BNE MEM_INIT + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +;/* dummy Exception Handlers */ +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler\ + PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler\ + PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC +; /* external interrupts handler */ + EXPORT WWDGT_IRQHandler [WEAK] + EXPORT LVD_IRQHandler [WEAK] + EXPORT TAMPER_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FMC_IRQHandler [WEAK] + EXPORT RCU_CTC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA0_Channel0_IRQHandler [WEAK] + EXPORT DMA0_Channel1_IRQHandler [WEAK] + EXPORT DMA0_Channel2_IRQHandler [WEAK] + EXPORT DMA0_Channel3_IRQHandler [WEAK] + EXPORT DMA0_Channel4_IRQHandler [WEAK] + EXPORT DMA0_Channel5_IRQHandler [WEAK] + EXPORT DMA0_Channel6_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT CAN0_TX_IRQHandler [WEAK] + EXPORT CAN0_RX0_IRQHandler [WEAK] + EXPORT CAN0_RX1_IRQHandler [WEAK] + EXPORT CAN0_EWMC_IRQHandler [WEAK] + EXPORT EXTI5_9_IRQHandler [WEAK] + EXPORT TIMER0_BRK_TIMER8_IRQHandler [WEAK] + EXPORT TIMER0_UP_TIMER9_IRQHandler [WEAK] + EXPORT TIMER0_TRG_CMT_TIMER10_IRQHandler [WEAK] + EXPORT TIMER0_Channel_IRQHandler [WEAK] + EXPORT TIMER1_IRQHandler [WEAK] + EXPORT TIMER2_IRQHandler [WEAK] + EXPORT TIMER3_IRQHandler [WEAK] + EXPORT I2C0_EV_IRQHandler [WEAK] + EXPORT I2C0_ER_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI10_15_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USBFS_WKUP_IRQHandler [WEAK] + EXPORT TIMER7_BRK_TIMER11_IRQHandler [WEAK] + EXPORT TIMER7_UP_TIMER12_IRQHandler [WEAK] + EXPORT TIMER7_TRG_CMT_TIMER13_IRQHandler [WEAK] + EXPORT TIMER7_Channel_IRQHandler [WEAK] + EXPORT DMA0_Channel7_IRQHandler [WEAK] + EXPORT EXMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIMER4_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT TIMER5_DAC_IRQHandler [WEAK] + EXPORT TIMER6_IRQHandler [WEAK] + EXPORT DMA1_Channel0_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT ENET_WKUP_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_EWMC_IRQHandler [WEAK] + EXPORT USBFS_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT USBHS_EP1_Out_IRQHandler [WEAK] + EXPORT USBHS_EP1_In_IRQHandler [WEAK] + EXPORT USBHS_WKUP_IRQHandler [WEAK] + EXPORT USBHS_IRQHandler [WEAK] + EXPORT DCI_IRQHandler [WEAK] + EXPORT TRNG_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT UART6_IRQHandler [WEAK] + EXPORT UART7_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SAI_IRQHandler [WEAK] + EXPORT TLI_IRQHandler [WEAK] + EXPORT TLI_ER_IRQHandler [WEAK] + EXPORT IPA_IRQHandler [WEAK] + EXPORT PKCAU_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C3_WKUP_IRQHandler [WEAK] + EXPORT I2C4_WKUP_IRQHandler [WEAK] + EXPORT I2C5_WKUP_IRQHandler [WEAK] + EXPORT SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler [WEAK] + EXPORT HAU_IRQHandler [WEAK] + EXPORT CAU_IRQHandler [WEAK] + +;/* external interrupts handler */ +WWDGT_IRQHandler +LVD_IRQHandler +TAMPER_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FMC_IRQHandler +RCU_CTC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA0_Channel0_IRQHandler +DMA0_Channel1_IRQHandler +DMA0_Channel2_IRQHandler +DMA0_Channel3_IRQHandler +DMA0_Channel4_IRQHandler +DMA0_Channel5_IRQHandler +DMA0_Channel6_IRQHandler +ADC_IRQHandler +CAN0_TX_IRQHandler +CAN0_RX0_IRQHandler +CAN0_RX1_IRQHandler +CAN0_EWMC_IRQHandler +EXTI5_9_IRQHandler +TIMER0_BRK_TIMER8_IRQHandler +TIMER0_UP_TIMER9_IRQHandler +TIMER0_TRG_CMT_TIMER10_IRQHandler +TIMER0_Channel_IRQHandler +TIMER1_IRQHandler +TIMER2_IRQHandler +TIMER3_IRQHandler +I2C0_EV_IRQHandler +I2C0_ER_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI10_15_IRQHandler +RTC_Alarm_IRQHandler +USBFS_WKUP_IRQHandler +TIMER7_BRK_TIMER11_IRQHandler +TIMER7_UP_TIMER12_IRQHandler +TIMER7_TRG_CMT_TIMER13_IRQHandler +TIMER7_Channel_IRQHandler +DMA0_Channel7_IRQHandler +EXMC_IRQHandler +SDIO_IRQHandler +TIMER4_IRQHandler +SPI2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +TIMER5_DAC_IRQHandler +TIMER6_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +ENET_IRQHandler +ENET_WKUP_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_EWMC_IRQHandler +USBFS_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +USART5_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +USBHS_EP1_Out_IRQHandler +USBHS_EP1_In_IRQHandler +USBHS_WKUP_IRQHandler +USBHS_IRQHandler +DCI_IRQHandler +TRNG_IRQHandler +FPU_IRQHandler +UART6_IRQHandler +UART7_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SAI_IRQHandler +TLI_IRQHandler +TLI_ER_IRQHandler +IPA_IRQHandler +PKCAU_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C3_WKUP_IRQHandler +I2C4_WKUP_IRQHandler +I2C5_WKUP_IRQHandler +SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler +HAU_IRQHandler +CAU_IRQHandler + + B . + ENDP + + ALIGN + +; user Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s new file mode 100644 index 00000000000..2858036acf8 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s @@ -0,0 +1,317 @@ +;/* +; * Copyright (c) 2006-2021, RT-Thread Development Team +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Change Logs: +; * Date Author Notes +; * 2018-05-22 tanek first implementation +; */ + +.syntax unified +.cpu cortex-m4 +.fpu softvfp +.thumb + +.global g_pfnVectors +.global Default_Handler + + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + +g_pfnVectors: + .word _estack // Top of Stack + .word Reset_Handler // Reset Handler + .word NMI_Handler // NMI Handler + .word HardFault_Handler // Hard Fault Handler + .word MemManage_Handler // MPU Fault Handler + .word BusFault_Handler // Bus Fault Handler + .word UsageFault_Handler // Usage Fault Handler + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word SVC_Handler // SVCall Handler + .word DebugMon_Handler // Debug Monitor Handler + .word 0 // Reserved + .word PendSV_Handler // PendSV Handler + .word SysTick_Handler // SysTick Handler + + // external interrupts handler + .word WWDGT_IRQHandler // 16:Window Watchdog Timer + .word LVD_IRQHandler // 17:LVD through EXTI Line detect + .word TAMPER_STAMP_IRQHandler // 18:Tamper and TimeStamp through EXTI Line detect + .word RTC_WKUP_IRQHandler // 19:RTC Wakeup through EXTI Line + .word FMC_IRQHandler // 20:FMC + .word RCU_CTC_IRQHandler // 21:RCU and CTC + .word EXTI0_IRQHandler // 22:EXTI Line 0 + .word EXTI1_IRQHandler // 23:EXTI Line 1 + .word EXTI2_IRQHandler // 24:EXTI Line 2 + .word EXTI3_IRQHandler // 25:EXTI Line 3 + .word EXTI4_IRQHandler // 26:EXTI Line 4 + .word DMA0_Channel0_IRQHandler // 27:DMA0 Channel0 + .word DMA0_Channel1_IRQHandler // 28:DMA0 Channel1 + .word DMA0_Channel2_IRQHandler // 29:DMA0 Channel2 + .word DMA0_Channel3_IRQHandler // 30:DMA0 Channel3 + .word DMA0_Channel4_IRQHandler // 31:DMA0 Channel4 + .word DMA0_Channel5_IRQHandler // 32:DMA0 Channel5 + .word DMA0_Channel6_IRQHandler // 33:DMA0 Channel6 + .word ADC_IRQHandler // 34:ADC + .word CAN0_TX_IRQHandler // 35:CAN0 TX + .word CAN0_RX0_IRQHandler // 36:CAN0 RX0 + .word CAN0_RX1_IRQHandler // 37:CAN0 RX1 + .word CAN0_EWMC_IRQHandler // 38:CAN0 EWMC + .word EXTI5_9_IRQHandler // 39:EXTI5 to EXTI9 + .word TIMER0_BRK_TIMER8_IRQHandler // 40:TIMER0 Break and TIMER8 + .word TIMER0_UP_TIMER9_IRQHandler // 41:TIMER0 Update and TIMER9 + .word TIMER0_TRG_CMT_TIMER10_IRQHandler // 42:TIMER0 Trigger and Commutation and TIMER10 + .word TIMER0_CC_IRQHandler // 43:TIMER0 Capture Compare + .word TIMER1_IRQHandler // 44:TIMER1 + .word TIMER2_IRQHandler // 45:TIMER2 + .word TIMER3_IRQHandler // 46:TIMER3 + .word I2C0_EV_IRQHandler // 47:I2C0 Event + .word I2C0_ER_IRQHandler // 48:I2C0 Error + .word I2C1_EV_IRQHandler // 49:I2C1 Event + .word I2C1_ER_IRQHandler // 50:I2C1 Error + .word SPI0_IRQHandler // 51:SPI0 + .word SPI1_IRQHandler // 52:SPI1 + .word USART0_IRQHandler // 53:USART0 + .word USART1_IRQHandler // 54:USART1 + .word USART2_IRQHandler // 55:USART2 + .word EXTI10_15_IRQHandler // 56:EXTI10 to EXTI15 + .word RTC_Alarm_IRQHandler // 57:RTC Alarm + .word USBFS_WKUP_IRQHandler // 58:USBFS Wakeup + .word TIMER7_BRK_TIMER11_IRQHandler // 59:TIMER7 Break and TIMER11 + .word TIMER7_UP_TIMER12_IRQHandler // 60:TIMER7 Update and TIMER12 + .word TIMER7_TRG_CMT_TIMER13_IRQHandler // 61:TIMER7 Trigger and Commutation and TIMER13 + .word TIMER7_CC_IRQHandler // 62:TIMER7 Capture Compare + .word DMA0_Channel7_IRQHandler // 63:DMA0 Channel7 + .word EXMC_IRQHandler // 64:EXMC + .word SDIO_IRQHandler // 65:SDIO + .word TIMER4_IRQHandler // 66:TIMER4 + .word SPI2_IRQHandler // 67:SPI2 + .word UART3_IRQHandler // 68:UART3 + .word UART4_IRQHandler // 69:UART4 + .word TIMER5_DAC_IRQHandler // 70:TIMER5 and DAC0 DAC1 Underrun error + .word TIMER6_IRQHandler // 71:TIMER6 + .word DMA1_Channel0_IRQHandler // 72:DMA1 Channel0 + .word DMA1_Channel1_IRQHandler // 73:DMA1 Channel1 + .word DMA1_Channel2_IRQHandler // 74:DMA1 Channel2 + .word DMA1_Channel3_IRQHandler // 75:DMA1 Channel3 + .word DMA1_Channel4_IRQHandler // 76:DMA1 Channel4 + .word ENET_IRQHandler // 77:Ethernet + .word ENET_WKUP_IRQHandler // 78:Ethernet Wakeup through EXTI Line + .word CAN1_TX_IRQHandler // 79:CAN1 TX + .word CAN1_RX0_IRQHandler // 80:CAN1 RX0 + .word CAN1_RX1_IRQHandler // 81:CAN1 RX1 + .word CAN1_EWMC_IRQHandler // 82:CAN1 EWMC + .word USBFS_IRQHandler // 83:USBFS + .word DMA1_Channel5_IRQHandler // 84:DMA1 Channel5 + .word DMA1_Channel6_IRQHandler // 85:DMA1 Channel6 + .word DMA1_Channel7_IRQHandler // 86:DMA1 Channel7 + .word USART5_IRQHandler // 87:USART5 + .word I2C2_EV_IRQHandler // 88:I2C2 Event + .word I2C2_ER_IRQHandler // 89:I2C2 Error + .word USBHS_EP1_Out_IRQHandler // 90:USBHS Endpoint 1 Out + .word USBHS_EP1_In_IRQHandler // 91:USBHS Endpoint 1 in + .word USBHS_WKUP_IRQHandler // 92:USBHS Wakeup through EXTI Line + .word USBHS_IRQHandler // 93:USBHS + .word DCI_IRQHandler // 94:DCI + .word 0 // 95:Reserved + .word TRNG_IRQHandler // 96:TRNG + .word FPU_IRQHandler // 97:FPU + .word UART6_IRQHandler // 98:UART6 + .word UART7_IRQHandler // 99:UART7 + .word SPI3_IRQHandler // 100:SPI3 + .word SPI4_IRQHandler // 101:SPI4 + .word SPI5_IRQHandler // 102:SPI5 + .word 0 // 103:Reserved + .word TLI_IRQHandler // 104:TLI + .word TLI_ER_IRQHandler // 105:TLI Error + .word IPA_IRQHandler // 106:IPA + + .size g_pfnVectors, .-g_pfnVectors + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r1, =_sidata + ldr r2, =_sdata + ldr r3, =_edata + + subs r3, r2 + ble fill_bss_start + +loop_copy_data: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt loop_copy_data + +fill_bss_start: + ldr r1, =__bss_start + ldr r2, =__bss_end + movs r0, 0 + subs r2, r1 + ble startup_enter + +loop_fill_bss: + subs r2, #4 + str r0, [r1, r2] + bgt loop_fill_bss + +startup_enter: + bl SystemInit + bl entry + + /* Exception Handlers */ + .weak NMI_Handler + .type NMI_Handler, %function +NMI_Handler: + b . + .size NMI_Handler, . - NMI_Handler + + .weak MemManage_Handler + .type MemManage_Handler, %function +MemManage_Handler: + b . + .size MemManage_Handler, . - MemManage_Handler + + .weak BusFault_Handler + .type BusFault_Handler, %function +BusFault_Handler: + b . + .size BusFault_Handler, . - BusFault_Handler + + .weak UsageFault_Handler + .type UsageFault_Handler, %function +UsageFault_Handler: + b . + .size UsageFault_Handler, . - UsageFault_Handler + + .weak SVC_Handler + .type SVC_Handler, %function +SVC_Handler: + b . + .size SVC_Handler, . - SVC_Handler + + .weak DebugMon_Handler + .type DebugMon_Handler, %function +DebugMon_Handler: + b . + .size DebugMon_Handler, . - DebugMon_Handler + + .weak PendSV_Handler + .type PendSV_Handler, %function +PendSV_Handler: + b . + .size PendSV_Handler, . - PendSV_Handler + + .weak SysTick_Handler + .type SysTick_Handler, %function +SysTick_Handler: + b . + .size SysTick_Handler, . - SysTick_Handler + + /* IQR Handler */ + .section .text.Default_Handler,"ax",%progbits + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + .macro IRQ handler + .weak \handler + .set \handler, Default_Handler + .endm + + IRQ WWDGT_IRQHandler + IRQ LVD_IRQHandler + IRQ TAMPER_STAMP_IRQHandler + IRQ RTC_WKUP_IRQHandler + IRQ FMC_IRQHandler + IRQ RCU_CTC_IRQHandler + IRQ EXTI0_IRQHandler + IRQ EXTI1_IRQHandler + IRQ EXTI2_IRQHandler + IRQ EXTI3_IRQHandler + IRQ EXTI4_IRQHandler + IRQ DMA0_Channel0_IRQHandler + IRQ DMA0_Channel1_IRQHandler + IRQ DMA0_Channel2_IRQHandler + IRQ DMA0_Channel3_IRQHandler + IRQ DMA0_Channel4_IRQHandler + IRQ DMA0_Channel5_IRQHandler + IRQ DMA0_Channel6_IRQHandler + IRQ ADC_IRQHandler + IRQ CAN0_TX_IRQHandler + IRQ CAN0_RX0_IRQHandler + IRQ CAN0_RX1_IRQHandler + IRQ CAN0_EWMC_IRQHandler + IRQ EXTI5_9_IRQHandler + IRQ TIMER0_BRK_TIMER8_IRQHandler + IRQ TIMER0_UP_TIMER9_IRQHandler + IRQ TIMER0_TRG_CMT_TIMER10_IRQHandler + IRQ TIMER0_CC_IRQHandler + IRQ TIMER1_IRQHandler + IRQ TIMER2_IRQHandler + IRQ TIMER3_IRQHandler + IRQ I2C0_EV_IRQHandler + IRQ I2C0_ER_IRQHandler + IRQ I2C1_EV_IRQHandler + IRQ I2C1_ER_IRQHandler + IRQ SPI0_IRQHandler + IRQ SPI1_IRQHandler + IRQ USART0_IRQHandler + IRQ USART1_IRQHandler + IRQ USART2_IRQHandler + IRQ EXTI10_15_IRQHandler + IRQ RTC_Alarm_IRQHandler + IRQ USBFS_WKUP_IRQHandler + IRQ TIMER7_BRK_TIMER11_IRQHandler + IRQ TIMER7_UP_TIMER12_IRQHandler + IRQ TIMER7_TRG_CMT_TIMER13_IRQHandler + IRQ TIMER7_CC_IRQHandler + IRQ DMA0_Channel7_IRQHandler + IRQ EXMC_IRQHandler + IRQ SDIO_IRQHandler + IRQ TIMER4_IRQHandler + IRQ SPI2_IRQHandler + IRQ UART3_IRQHandler + IRQ UART4_IRQHandler + IRQ TIMER5_DAC_IRQHandler + IRQ TIMER6_IRQHandler + IRQ DMA1_Channel0_IRQHandler + IRQ DMA1_Channel1_IRQHandler + IRQ DMA1_Channel2_IRQHandler + IRQ DMA1_Channel3_IRQHandler + IRQ DMA1_Channel4_IRQHandler + IRQ ENET_IRQHandler + IRQ ENET_WKUP_IRQHandler + IRQ CAN1_TX_IRQHandler + IRQ CAN1_RX0_IRQHandler + IRQ CAN1_RX1_IRQHandler + IRQ CAN1_EWMC_IRQHandler + IRQ USBFS_IRQHandler + IRQ DMA1_Channel5_IRQHandler + IRQ DMA1_Channel6_IRQHandler + IRQ DMA1_Channel7_IRQHandler + IRQ USART5_IRQHandler + IRQ I2C2_EV_IRQHandler + IRQ I2C2_ER_IRQHandler + IRQ USBHS_EP1_Out_IRQHandler + IRQ USBHS_EP1_In_IRQHandler + IRQ USBHS_WKUP_IRQHandler + IRQ USBHS_IRQHandler + IRQ DCI_IRQHandler + IRQ TRNG_IRQHandler + IRQ FPU_IRQHandler + IRQ UART6_IRQHandler + IRQ UART7_IRQHandler + IRQ SPI3_IRQHandler + IRQ SPI4_IRQHandler + IRQ SPI5_IRQHandler + IRQ TLI_IRQHandler + IRQ TLI_ER_IRQHandler + IRQ IPA_IRQHandler diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s new file mode 100644 index 00000000000..edad76bf50a --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s @@ -0,0 +1,750 @@ +;/*! +; \file startup_gd32f5xx.s +; \brief start up file +; +; \version 2024-07-31, V1.1.0, firmware for GD32F5xx +;*/ +; +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * Copyright (c) 2024, GigaDevice Semiconductor Inc. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * Unless required by applicable law or agreed to in writing, software +; * distributed under the License is distributed on an AS IS BASIS, WITHOUT +; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; * See the License for the specific language governing permissions and +; * limitations under the License. +; */ +; +;/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) ; top of stack + DCD Reset_Handler ; Vector Number 1,Reset Handler + + DCD NMI_Handler ; Vector Number 2,NMI Handler + DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler + DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler + DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler + DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; Vector Number 11,SVCall Handler + DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; Vector Number 14,PendSV Handler + DCD SysTick_Handler ; Vector Number 15,SysTick Handler + + ; External Interrupts + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; 18:Tamper and TimeStamp through EXTI Line detect + DCD RTC_WKUP_IRQHandler ; 19:RTC Wakeup through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC_IRQHandler ; 34:ADC + DCD CAN0_TX_IRQHandler ; 35:CAN0 TX + DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commucation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commucation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD DMA0_Channel7_IRQHandler ; 63:DMA0 Channel7 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_DAC_IRQHandler ; 70:TIMER5 and DAC0 DAC1 Underrun error + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 + DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 + DCD ENET_IRQHandler ; 77:Ethernet + DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line + DCD CAN1_TX_IRQHandler ; 79:CAN1 TX + DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 + DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC + DCD USBFS_IRQHandler ; 83:USBFS + DCD DMA1_Channel5_IRQHandler ; 84:DMA1 Channel5 + DCD DMA1_Channel6_IRQHandler ; 85:DMA1 Channel6 + DCD DMA1_Channel7_IRQHandler ; 86:DMA1 Channel7 + DCD USART5_IRQHandler ; 87:USART5 + DCD I2C2_EV_IRQHandler ; 88:I2C2 Event + DCD I2C2_ER_IRQHandler ; 89:I2C2 Error + DCD USBHS_EP1_Out_IRQHandler ; 90:USBHS Endpoint 1 Out + DCD USBHS_EP1_In_IRQHandler ; 91:USBHS Endpoint 1 in + DCD USBHS_WKUP_IRQHandler ; 92:USBHS Wakeup through EXTI Line + DCD USBHS_IRQHandler ; 93:USBHS + DCD DCI_IRQHandler ; 94:DCI + DCD 0 ; 95:Reserved + DCD TRNG_IRQHandler ; 96:TRNG + DCD FPU_IRQHandler ; 97:FPU + DCD UART6_IRQHandler ; 98:UART6 + DCD UART7_IRQHandler ; 99:UART7 + DCD SPI3_IRQHandler ; 100:SPI3 + DCD SPI4_IRQHandler ; 101:SPI4 + DCD SPI5_IRQHandler ; 102:SPI5 + DCD SAI_IRQHandler ; 103:SAI + DCD TLI_IRQHandler ; 104:TLI + DCD TLI_ER_IRQHandler ; 105:TLI Error + DCD IPA_IRQHandler ; 106:IPA + DCD PKCAU_IRQHandler ; 107:PKCAU + DCD I2C3_EV_IRQHandler ; 108:I2C3 Event + DCD I2C3_ER_IRQHandler ; 109:I2C3 Error + DCD I2C4_EV_IRQHandler ; 110:I2C4 Event + DCD I2C4_ER_IRQHandler ; 111:I2C4 Error + DCD I2C5_EV_IRQHandler ; 112:I2C5 Event + DCD I2C5_ER_IRQHandler ; 113:I2C5 Error + DCD I2C3_WKUP_IRQHandler ; 114:I2C3 Wakeup through EXTI Line + DCD I2C4_WKUP_IRQHandler ; 115:I2C4 Wakeup through EXTI Line + DCD I2C5_WKUP_IRQHandler ; 116:I2C5 Wakeup through EXTI Line + DCD SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler ; 117:SYSCFG SRAM ECC Error + DCD HAU_IRQHandler ; 118:HAU + DCD CAU_IRQHandler ; 119:CAU + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:NOROOT:REORDER(2) +Reset_Handler + LDR r2, =0x8000 + LDR r1, =0x20000000 + MOV r0, #0x00 + +SRAM_INIT + STM r1!, {r0} + SUBS r2, r2, #4 + CMP r2, #0x00 + BNE SRAM_INIT + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDGT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WWDGT_IRQHandler + B WWDGT_IRQHandler + + PUBWEAK LVD_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LVD_IRQHandler + B LVD_IRQHandler + + PUBWEAK TAMPER_STAMP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TAMPER_STAMP_IRQHandler + B TAMPER_STAMP_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK FMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FMC_IRQHandler + B FMC_IRQHandler + + PUBWEAK RCU_CTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RCU_CTC_IRQHandler + B RCU_CTC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA0_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel0_IRQHandler + B DMA0_Channel0_IRQHandler + + PUBWEAK DMA0_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel1_IRQHandler + B DMA0_Channel1_IRQHandler + + PUBWEAK DMA0_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel2_IRQHandler + B DMA0_Channel2_IRQHandler + + PUBWEAK DMA0_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel3_IRQHandler + B DMA0_Channel3_IRQHandler + + PUBWEAK DMA0_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel4_IRQHandler + B DMA0_Channel4_IRQHandler + + PUBWEAK DMA0_Channel5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel5_IRQHandler + B DMA0_Channel5_IRQHandler + + PUBWEAK DMA0_Channel6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel6_IRQHandler + B DMA0_Channel6_IRQHandler + + PUBWEAK ADC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC_IRQHandler + B ADC_IRQHandler + + PUBWEAK CAN0_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_TX_IRQHandler + B CAN0_TX_IRQHandler + + PUBWEAK CAN0_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX0_IRQHandler + B CAN0_RX0_IRQHandler + + PUBWEAK CAN0_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX1_IRQHandler + B CAN0_RX1_IRQHandler + + PUBWEAK CAN0_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_EWMC_IRQHandler + B CAN0_EWMC_IRQHandler + + PUBWEAK EXTI5_9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI5_9_IRQHandler + B EXTI5_9_IRQHandler + + PUBWEAK TIMER0_BRK_TIMER8_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_BRK_TIMER8_IRQHandler + B TIMER0_BRK_TIMER8_IRQHandler + + PUBWEAK TIMER0_UP_TIMER9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_UP_TIMER9_IRQHandler + B TIMER0_UP_TIMER9_IRQHandler + + PUBWEAK TIMER0_TRG_CMT_TIMER10_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_TRG_CMT_TIMER10_IRQHandler + B TIMER0_TRG_CMT_TIMER10_IRQHandler + + PUBWEAK TIMER0_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_Channel_IRQHandler + B TIMER0_Channel_IRQHandler + + PUBWEAK TIMER1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER1_IRQHandler + B TIMER1_IRQHandler + + PUBWEAK TIMER2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER2_IRQHandler + B TIMER2_IRQHandler + + PUBWEAK TIMER3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER3_IRQHandler + B TIMER3_IRQHandler + + PUBWEAK I2C0_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_EV_IRQHandler + B I2C0_EV_IRQHandler + + PUBWEAK I2C0_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_ER_IRQHandler + B I2C0_ER_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI0_IRQHandler + B SPI0_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART0_IRQHandler + B USART0_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI10_15_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI10_15_IRQHandler + B EXTI10_15_IRQHandler + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + PUBWEAK USBFS_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBFS_WKUP_IRQHandler + B USBFS_WKUP_IRQHandler + + PUBWEAK TIMER7_BRK_TIMER11_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_BRK_TIMER11_IRQHandler + B TIMER7_BRK_TIMER11_IRQHandler + + PUBWEAK TIMER7_UP_TIMER12_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_UP_TIMER12_IRQHandler + B TIMER7_UP_TIMER12_IRQHandler + + PUBWEAK TIMER7_TRG_CMT_TIMER13_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_TRG_CMT_TIMER13_IRQHandler + B TIMER7_TRG_CMT_TIMER13_IRQHandler + + PUBWEAK TIMER7_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_Channel_IRQHandler + B TIMER7_Channel_IRQHandler + + PUBWEAK DMA0_Channel7_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel7_IRQHandler + B DMA0_Channel7_IRQHandler + + PUBWEAK EXMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXMC_IRQHandler + B EXMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIMER4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER4_IRQHandler + B TIMER4_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK UART3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART3_IRQHandler + B UART3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK TIMER5_DAC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER5_DAC_IRQHandler + B TIMER5_DAC_IRQHandler + + PUBWEAK TIMER6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER6_IRQHandler + B TIMER6_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK ENET_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ENET_IRQHandler + B ENET_IRQHandler + + PUBWEAK ENET_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ENET_WKUP_IRQHandler + B ENET_WKUP_IRQHandler + + PUBWEAK CAN1_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_TX_IRQHandler + B CAN1_TX_IRQHandler + + PUBWEAK CAN1_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_RX0_IRQHandler + B CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_EWMC_IRQHandler + B CAN1_EWMC_IRQHandler + + PUBWEAK USBFS_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBFS_IRQHandler + B USBFS_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK USBHS_EP1_Out_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBHS_EP1_Out_IRQHandler + B USBHS_EP1_Out_IRQHandler + + PUBWEAK USBHS_EP1_In_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBHS_EP1_In_IRQHandler + B USBHS_EP1_In_IRQHandler + + PUBWEAK USBHS_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBHS_WKUP_IRQHandler + B USBHS_WKUP_IRQHandler + + PUBWEAK USBHS_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBHS_IRQHandler + B USBHS_IRQHandler + + PUBWEAK DCI_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DCI_IRQHandler + B DCI_IRQHandler + + PUBWEAK TRNG_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TRNG_IRQHandler + B TRNG_IRQHandler + + PUBWEAK FPU_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FPU_IRQHandler + B FPU_IRQHandler + + PUBWEAK UART6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART6_IRQHandler + B UART6_IRQHandler + + PUBWEAK UART7_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART7_IRQHandler + B UART7_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SAI_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SAI_IRQHandler + B SAI_IRQHandler + + PUBWEAK TLI_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TLI_IRQHandler + B TLI_IRQHandler + + PUBWEAK TLI_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TLI_ER_IRQHandler + B TLI_ER_IRQHandler + + PUBWEAK IPA_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +IPA_IRQHandler + B IPA_IRQHandler + + PUBWEAK PKCAU_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +PKCAU_IRQHandler + B PKCAU_IRQHandler + + PUBWEAK I2C3_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C3_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C3_WKUP_IRQHandler + B I2C3_WKUP_IRQHandler + + PUBWEAK I2C4_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C4_WKUP_IRQHandler + B I2C4_WKUP_IRQHandler + + PUBWEAK I2C5_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C5_WKUP_IRQHandler + B I2C5_WKUP_IRQHandler + + PUBWEAK SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler + B SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler + + PUBWEAK HAU_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +HAU_IRQHandler + B HAU_IRQHandler + + PUBWEAK CAU_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAU_IRQHandler + B CAU_IRQHandler + + END \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c new file mode 100644 index 00000000000..29790b223c8 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c @@ -0,0 +1,944 @@ +/*! + \file system_gd32f5xx.c + \brief CMSIS Cortex-M33 Device Peripheral Access Layer Source File for + GD32F5xx Device Series +*/ + +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * Copyright (c) 2024, GigaDevice Semiconductor Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32f5xx.h" + +/* system frequency define */ +#define __IRC16M (IRC16M_VALUE) /* internal 16 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC16M) /* main oscillator frequency */ + +#define VECT_TAB_OFFSET (uint32_t)0x00 /* vector table base offset */ + +/* select a system clock by uncommenting the following line */ +//#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M) +//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL) +//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000) +//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000) +//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000) +//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000) +//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000) +//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000) +//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000) +//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000) +#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000) + +#define RCU_MODIFY(__delay) do{ \ + volatile uint32_t i; \ + if(0U != __delay){ \ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV2; \ + for(i=0U; i<__delay; i++){ \ + } \ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV4; \ + for(i=0U; i<__delay; i++){ \ + } \ + } \ + }while(0) + +#define SEL_IRC16M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLLP 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_IRC16M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_IRC16M; +static void system_clock_16m_irc16m(void); +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_IRC16M; +static void system_clock_120m_irc16m(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_8M_HXTAL; +static void system_clock_120m_8m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_25M_HXTAL; +static void system_clock_120m_25m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_IRC16M; +static void system_clock_168m_irc16m(void); +#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_8M_HXTAL; +static void system_clock_168m_8m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_25M_HXTAL; +static void system_clock_168m_25m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_IRC16M; +static void system_clock_200m_irc16m(void); +#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_8M_HXTAL; +static void system_clock_200m_8m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_25M_HXTAL; +static void system_clock_200m_25m_hxtal(void); + +#endif /* __SYSTEM_CLOCK_IRC16M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit (void) +{ + /* FPU settings */ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1U) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + /* Reset the RCU clock configuration to the default reset state */ + /* Set IRC16MEN bit */ + RCU_CTL |= RCU_CTL_IRC16MEN; + while(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ + } + RCU_MODIFY(0x50U); + + RCU_CFG0 &= ~RCU_CFG0_SCS; + + /* Reset HXTALEN, CKMEN and PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + + /* Reset HSEBYP bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* Reset CFG0 register */ + RCU_CFG0 = 0x00000000U; + + /* wait until IRC16M is selected as system clock */ + while(RCU_SCSS_IRC16M != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } + + /* Reset PLLCFGR register */ + RCU_PLL = 0x24003010U; + + /* Disable all interrupts */ + RCU_INT = 0x00000000U; + + /* Configure the System clock source, PLL Multiplier and Divider factors, + AHB/APBx prescalers and Flash settings */ + system_clock_config(); + +#ifdef VECT_TAB_SRAM + nvic_vector_table_set(NVIC_VECTTAB_RAM, VECT_TAB_OFFSET); +#else + nvic_vector_table_set(NVIC_VECTTAB_FLASH, VECT_TAB_OFFSET); +#endif +} +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_IRC16M + system_clock_16m_irc16m(); +#elif defined (__SYSTEM_CLOCK_HXTAL) + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) + system_clock_120m_irc16m(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) + system_clock_120m_8m_hxtal(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) + system_clock_120m_25m_hxtal(); +#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) + system_clock_168m_irc16m(); +#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) + system_clock_168m_8m_hxtal(); +#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) + system_clock_168m_25m_hxtal(); +#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) + system_clock_200m_irc16m(); +#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) + system_clock_200m_8m_hxtal(); +#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) + system_clock_200m_25m_hxtal(); +#endif /* __SYSTEM_CLOCK_IRC16M */ +} + +#ifdef __SYSTEM_CLOCK_IRC16M +/*! + \brief configure the system clock to 16M by IRC16M + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_16m_irc16m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC16M */ + RCU_CTL |= RCU_CTL_IRC16MEN; + + /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); + }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; + + /* select IRC16M as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_IRC16M; + + /* wait until IRC16M is selected as system clock */ + while(RCU_SCSS_IRC16M != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_HXTAL) +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(RCU_SCSS_HXTAL != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) +/*! + \brief configure the system clock to 120M by PLL which selects IRC16M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_irc16m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC16M */ + RCU_CTL |= RCU_CTL_IRC16MEN; + + /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); + }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC16M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 16, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ + RCU_PLL = (16U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_IRC16M) | (5U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 120 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) +/*! + \brief configure the system clock to 120M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_8m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 8, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ + RCU_PLL = (8U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (5U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 120 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) +/*! + \brief configure the system clock to 120M by PLL which selects HXTAL(25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_25m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 25, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ + RCU_PLL = (25U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (5U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 120 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) +/*! + \brief configure the system clock to 168M by PLL which selects IRC16M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_168m_irc16m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC16M */ + RCU_CTL |= RCU_CTL_IRC16MEN; + + /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); + }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC16M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 16, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ + RCU_PLL = (16U | (336U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_IRC16M) | (7U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 168 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) +/*! + \brief configure the system clock to 168M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_168m_8m_hxtal(void) +{ + uint32_t timeout = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + while((0U == (RCU_CTL & RCU_CTL_HXTALSTB)) && (HXTAL_STARTUP_TIMEOUT != timeout++)){ + } + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 8, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ + RCU_PLL = (8U | (336 << 6U) | (((2 >> 1U) -1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (7 << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 168 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) +/*! + \brief configure the system clock to 168M by PLL which selects HXTAL(25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_168m_25m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 25, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ + RCU_PLL = (25U | (336U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (7U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 168 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) +/*! + \brief configure the system clock to 200M by PLL which selects IRC16M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_200m_irc16m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC16M */ + RCU_CTL |= RCU_CTL_IRC16MEN; + + /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); + }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC16M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 16, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ + RCU_PLL = (16U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_IRC16M) | (9U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 200 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) +/*! + \brief configure the system clock to 200M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_200m_8m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ + RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (9U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 200 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} + +#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) +/*! + \brief configure the system clock to 200M by PLL which selects HXTAL(25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_200m_25m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 25, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ + RCU_PLL = (25U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (9U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 200 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ + } +} +#endif /* __SYSTEM_CLOCK_IRC16M */ +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t sws; + uint32_t pllpsc, plln, pllsel, pllp, ck_src, idx, clk_exp; + + /* exponent of AHB, APB1 and APB2 clock divider */ + const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws){ + /* IRC16M is selected as CK_SYS */ + case SEL_IRC16M: + SystemCoreClock = IRC16M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + /* PLLP is selected as CK_SYS */ + case SEL_PLLP: + /* get the value of PLLPSC[5:0] */ + pllpsc = GET_BITS(RCU_PLL, 0U, 5U); + plln = GET_BITS(RCU_PLL, 6U, 14U); + pllp = (GET_BITS(RCU_PLL, 16U, 17U) + 1U) * 2U; + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_PLL & RCU_PLL_PLLSEL); + if (RCU_PLLSRC_HXTAL == pllsel) { + ck_src = HXTAL_VALUE; + } else { + ck_src = IRC16M_VALUE; + } + SystemCoreClock = ((ck_src / pllpsc) * plln) / pllp; + break; + /* IRC16M is selected as CK_SYS */ + default: + SystemCoreClock = IRC16M_VALUE; + break; + } + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + SystemCoreClock = SystemCoreClock >> clk_exp; +} + +#ifdef __FIRMWARE_VERSION_DEFINE +/*! + \brief get firmware version + \param[in] none + \param[out] none + \retval firmware version +*/ +uint32_t gd32f5xx_firmware_version_get(void) +{ + return __GD32F5XX_STDPERIPH_VERSION; +} +#endif /* __FIRMWARE_VERSION_DEFINE */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT new file mode 100644 index 00000000000..8dada3edaf5 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h new file mode 100644 index 00000000000..ecf24b14313 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h @@ -0,0 +1,817 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (ARM compiler V5) header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB()do +{\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB()do +{\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB()do +{\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in integer value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in two unsigned short values. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order in signed short value + \details Reverses the byte order in a signed short value with sign extension to integer. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return(result); +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h new file mode 100644 index 00000000000..543ea2c4825 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h @@ -0,0 +1,1803 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler ARMCLANG (ARM compiler V6) header file + * @version V5.0.3 + * @date 27. March 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for ARM Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed))T_UINT32 + { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Process Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Main Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Main Stack Pointer Limit (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +/* #define __get_FPSCR __builtin_arm_get_fpscr */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +/* #define __set_FPSCR __builtin_arm_set_fpscr */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "memory"); +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in integer value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __builtin_bswap32 + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in two unsigned short values. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16 __builtin_bswap16 /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */ +#if 0 +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} +#endif + + +/** + \brief Reverse byte order in signed short value + \details Reverses the byte order in a signed short value with sign extension to integer. + \param [in] value Value to reverse + \return Reversed value + */ + /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ + int32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ + /* ToDo ARMCLANG: check if __builtin_arm_rbit is supported */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return(result); +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h new file mode 100644 index 00000000000..ac54d891ee3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h @@ -0,0 +1,355 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * ARM Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * ARM Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + + #include + + /* CMSIS compiler control architecture macros */ + #if (__CORE__ == __ARM6M__) || (__CORE__ == __ARM6SM__) + #ifndef __ARM_ARCH_6M__ + #define __ARM_ARCH_6M__ 1 + #endif + #elif (__CORE__ == __ARM7M__) + #ifndef __ARM_ARCH_7M__ + #define __ARM_ARCH_7M__ 1 + #endif + #elif (__CORE__ == __ARM7EM__) + #ifndef __ARM_ARCH_7EM__ + #define __ARM_ARCH_7EM__ 1 + #endif + #endif + + #ifndef __NO_RETURN + #define __NO_RETURN __noreturn + #endif + #ifndef __USED + #define __USED __root + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED __packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION __packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + __packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + /* Workaround for missing __CLZ intrinsic in*/ + /* various versions of the IAR compilers.*/ + /* __IAR_FEATURE_CLZ__ should be defined by*/ + /* the compiler that supports __CLZ internally.*/ + #if (defined (__ARM_ARCH_6M__)) && (__ARM_ARCH_6M__ == 1) && (!defined (__IAR_FEATURE_CLZ__)) + __STATIC_INLINE uint32_t __CLZ(uint32_t data) + { + if (data == 0u) + { return 32u; } + + uint32_t count = 0; + uint32_t mask = 0x80000000; + + while ((data & mask) == 0) + { + count += 1u; + mask = mask >> 1u; + } + + return (count); + } + #endif + + +/* + * TI ARM Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed))T_UINT32 + { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + /* NO RETURN is automatically detected hence no warning here*/ + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h new file mode 100644 index 00000000000..f6dd0e8f4b0 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h @@ -0,0 +1,1980 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed))T_UINT32 + { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Process Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Main Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Main Stack Pointer Limit (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +/*__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)*/ +/*{*/ +/* __ASM volatile ("nop");*/ +/*}*/ +#define __NOP() __ASM volatile ("nop") /* This implementation generates debug information */ + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +/*__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)*/ +/*{*/ +/* __ASM volatile ("wfi");*/ +/*}*/ +#define __WFI() __ASM volatile ("wfi") /* This implementation generates debug information */ + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +/*__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)*/ +/*{*/ +/* __ASM volatile ("wfe");*/ +/*}*/ +#define __WFE() __ASM volatile ("wfe") /* This implementation generates debug information */ + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +/*__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)*/ +/*{*/ +/* __ASM volatile ("sev");*/ +/*}*/ +#define __SEV() __ASM volatile ("sev") /* This implementation generates debug information */ + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__attribute__((always_inline)) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in integer value. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in two unsigned short values. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief Reverse byte order in signed short value + \details Reverses the byte order in a signed short value with sign extension to integer. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + int32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return(result); +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (__ARM_FEATURE_DSP == 1) /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */ + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h new file mode 100644 index 00000000000..d458a6c8599 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 0U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h new file mode 100644 index 00000000000..ccb1e3a3d30 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h @@ -0,0 +1,1878 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS ARMv8MBL Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for ARMv8-M Baseline */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for ARMv8-M Baseline */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h new file mode 100644 index 00000000000..80f41527120 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h @@ -0,0 +1,2902 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS ARMv8MML Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS ARMv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h new file mode 100644 index 00000000000..27fdbcfe6d3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h @@ -0,0 +1,888 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h new file mode 100644 index 00000000000..4fbaa918541 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h @@ -0,0 +1,1021 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0+ */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0+ */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; + +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h new file mode 100644 index 00000000000..b97fa9dd3f0 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h @@ -0,0 +1,1878 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h new file mode 100644 index 00000000000..2f4295f120e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h @@ -0,0 +1,1928 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h new file mode 100644 index 00000000000..dee3d65b69c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h @@ -0,0 +1,2898 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h new file mode 100644 index 00000000000..28df20ad310 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h @@ -0,0 +1,2113 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h new file mode 100644 index 00000000000..dd3700c92c2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h @@ -0,0 +1,2658 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_INLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_INLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_INLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_INLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_INLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + register uint32_t ccsidr; + register uint32_t sets; + register uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_INLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_INLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_INLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) + { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) + { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) + { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h new file mode 100644 index 00000000000..bd26eaa0db9 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h @@ -0,0 +1,1016 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h new file mode 100644 index 00000000000..780372a350c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h @@ -0,0 +1,1903 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED1[1U]; +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h new file mode 100644 index 00000000000..168b501345b --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h @@ -0,0 +1,182 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for ARMv7 MPU + * @version V5.0.2 + * @date 09. June 2017 + ******************************************************************************/ +/* + * Copyright (c) 2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) + +#define ARM_MPU_AP_NONE 0u +#define ARM_MPU_AP_PRIV 1u +#define ARM_MPU_AP_URO 2u +#define ARM_MPU_AP_FULL 3u +#define ARM_MPU_AP_PRO 5u +#define ARM_MPU_AP_RO 6u + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) ((BaseAddress & MPU_RBAR_ADDR_Msk) | (Region & MPU_RBAR_REGION_Msk) | (1UL << MPU_RBAR_VALID_Pos)) + +/** +* MPU Region Attribut and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ((DisableExec << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + ((AccessPermission << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + ((TypeExtField << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + ((IsShareable << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + ((IsCacheable << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + ((IsBufferable << MPU_RASR_B_Pos) & MPU_RASR_B_Msk) | \ + ((SubRegionDisable << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + ((Size << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + ((1UL << MPU_RASR_ENABLE_Pos) & MPU_RASR_ENABLE_Msk) + + +/** +* Struct for a single MPU Region +*/ +typedef struct _ARM_MPU_Region_t { + uint32_t RBAR; /*!< The region base address register value (RBAR)*/ + uint32_t RASR; /*!< The region attribute and size register value (RASR) \ref MPU_RASR*/ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable() +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0u; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0u; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*sizeof(ARM_MPU_Region_t)/4u); +} + +#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h new file mode 100644 index 00000000000..5181610d065 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ---------------------------------------------------------------------------- + * + * $Date: 21. September 2016 + * $Revision: V1.0 + * + * Project: TrustZone for ARMv8-M + * Title: Context Management for ARMv8-M TrustZone + * + * Version 1.0 + * Initial Release + *---------------------------------------------------------------------------*/ + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/*/ \details Data type that identifies secure software modules called by a process.*/ +typedef uint32_t TZ_ModuleId_t; +#endif + +/*/ \details TZ Memory ID identifies an allocated memory slot.*/ +typedef uint32_t TZ_MemoryId_t; + +/*/ Initialize secure context memory system*/ +/*/ \return execution status (1: success, 0: error)*/ +uint32_t TZ_InitContextSystem_S (void); + +/*/ Allocate context memory for calling secure software modules in TrustZone*/ +/*/ \param[in] module identifies software modules called from non-secure mode*/ +/*/ \return value != 0 id TrustZone memory slot identifier*/ +/*/ \return value 0 no memory available or internal error*/ +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/*/ Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S*/ +/*/ \param[in] id TrustZone memory slot identifier*/ +/*/ \return execution status (1: success, 0: error)*/ +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/*/ Load secure context (called on RTOS thread context switch)*/ +/*/ \param[in] id TrustZone memory slot identifier*/ +/*/ \return execution status (1: success, 0: error)*/ +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/*/ Store secure context (called on RTOS thread context switch)*/ +/*/ \param[in] id TrustZone memory slot identifier*/ +/*/ \return execution status (1: success, 0: error)*/ +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif /* TZ_CONTEXT_H*/ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h new file mode 100644 index 00000000000..97d4e393aea --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h @@ -0,0 +1,513 @@ +/*! + \file gd32f5xx_adc.h + \brief definitions for the ADC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_ADC_H +#define GD32F5XX_ADC_H + +#include "gd32f5xx.h" + +/* ADC definitions */ +#define ADC0 ADC_BASE +#define ADC1 (ADC_BASE + 0x100U) +#define ADC2 (ADC_BASE + 0x200U) + +/* registers definitions */ +#define ADC_STAT(adcx) REG32((adcx) + 0x00U) /*!< ADC status register */ +#define ADC_CTL0(adcx) REG32((adcx) + 0x04U) /*!< ADC control register 0 */ +#define ADC_CTL1(adcx) REG32((adcx) + 0x08U) /*!< ADC control register 1 */ +#define ADC_SAMPT0(adcx) REG32((adcx) + 0x0CU) /*!< ADC sampling time register 0 */ +#define ADC_SAMPT1(adcx) REG32((adcx) + 0x10U) /*!< ADC sampling time register 1 */ +#define ADC_IOFF0(adcx) REG32((adcx) + 0x14U) /*!< ADC inserted channel data offset register 0 */ +#define ADC_IOFF1(adcx) REG32((adcx) + 0x18U) /*!< ADC inserted channel data offset register 1 */ +#define ADC_IOFF2(adcx) REG32((adcx) + 0x1CU) /*!< ADC inserted channel data offset register 2 */ +#define ADC_IOFF3(adcx) REG32((adcx) + 0x20U) /*!< ADC inserted channel data offset register 3 */ +#define ADC_WDHT(adcx) REG32((adcx) + 0x24U) /*!< ADC watchdog high threshold register */ +#define ADC_WDLT(adcx) REG32((adcx) + 0x28U) /*!< ADC watchdog low threshold register */ +#define ADC_RSQ0(adcx) REG32((adcx) + 0x2CU) /*!< ADC routine sequence register 0 */ +#define ADC_RSQ1(adcx) REG32((adcx) + 0x30U) /*!< ADC routine sequence register 1 */ +#define ADC_RSQ2(adcx) REG32((adcx) + 0x34U) /*!< ADC routine sequence register 2 */ +#define ADC_ISQ(adcx) REG32((adcx) + 0x38U) /*!< ADC inserted sequence register */ +#define ADC_IDATA0(adcx) REG32((adcx) + 0x3CU) /*!< ADC inserted data register 0 */ +#define ADC_IDATA1(adcx) REG32((adcx) + 0x40U) /*!< ADC inserted data register 1 */ +#define ADC_IDATA2(adcx) REG32((adcx) + 0x44U) /*!< ADC inserted data register 2 */ +#define ADC_IDATA3(adcx) REG32((adcx) + 0x48U) /*!< ADC inserted data register 3 */ +#define ADC_RDATA(adcx) REG32((adcx) + 0x4CU) /*!< ADC routine data register */ +#define ADC_OVSAMPCTL(adcx) REG32((adcx) + 0x80U) /*!< ADC oversampling control register */ +#define ADC_SSTAT REG32((ADC_BASE) + 0x300U) /*!< ADC summary status register */ +#define ADC_SYNCCTL REG32((ADC_BASE) + 0x304U) /*!< ADC synchronization control register */ +#define ADC_SYNCDATA REG32((ADC_BASE) + 0x308U) /*!< ADC synchronization routine data register */ + +/* bits definitions */ +/* ADC_STAT */ +#define ADC_STAT_WDE BIT(0) /*!< analog watchdog event flag */ +#define ADC_STAT_EOC BIT(1) /*!< end of conversion */ +#define ADC_STAT_EOIC BIT(2) /*!< inserted channel end of conversion */ +#define ADC_STAT_STIC BIT(3) /*!< inserted channel start flag */ +#define ADC_STAT_STRC BIT(4) /*!< routine channel start flag */ +#define ADC_STAT_ROVF BIT(5) /*!< routine data register overflow */ + +/* ADC_CTL0 */ +#define ADC_CTL0_WDCHSEL BITS(0,4) /*!< analog watchdog channel select bits */ +#define ADC_CTL0_EOCIE BIT(5) /*!< interrupt enable for EOC */ +#define ADC_CTL0_WDEIE BIT(6) /*!< analog watchdog interrupt enable */ +#define ADC_CTL0_EOICIE BIT(7) /*!< interrupt enable for inserted channels */ +#define ADC_CTL0_SM BIT(8) /*!< scan mode */ +#define ADC_CTL0_WDSC BIT(9) /*!< when in scan mode, analog watchdog is effective on a single channel */ +#define ADC_CTL0_ICA BIT(10) /*!< automatic inserted sequence conversion */ +#define ADC_CTL0_DISRC BIT(11) /*!< discontinuous mode on routine channels */ +#define ADC_CTL0_DISIC BIT(12) /*!< discontinuous mode on inserted channels */ +#define ADC_CTL0_DISNUM BITS(13,15) /*!< discontinuous mode channel count */ +#define ADC_CTL0_IWDEN BIT(22) /*!< analog watchdog enable on inserted channels */ +#define ADC_CTL0_RWDEN BIT(23) /*!< analog watchdog enable on routine channels */ +#define ADC_CTL0_DRES BITS(24,25) /*!< ADC data resolution */ +#define ADC_CTL0_ROVFIE BIT(26) /*!< interrupt enable for ROVF */ + +/* ADC_CTL1 */ +#define ADC_CTL1_ADCON BIT(0) /*!< ADC converter on */ +#define ADC_CTL1_CTN BIT(1) /*!< continuous conversion */ +#define ADC_CTL1_CLB BIT(2) /*!< ADC calibration */ +#define ADC_CTL1_RSTCLB BIT(3) /*!< reset calibration */ +#define ADC_CTL1_DMA BIT(8) /*!< direct memory access mode */ +#define ADC_CTL1_DDM BIT(9) /*!< DMA disable mode */ +#define ADC_CTL1_EOCM BIT(10) /*!< end of conversion mode */ +#define ADC_CTL1_DAL BIT(11) /*!< data alignment */ +#define ADC_CTL1_ETSIC BITS(16,19) /*!< external event select for inserted sequence */ +#define ADC_CTL1_ETMIC BITS(20,21) /*!< external trigger conversion mode for inserted channels */ +#define ADC_CTL1_SWICST BIT(22) /*!< start conversion of inserted channels */ +#define ADC_CTL1_ETSRC BITS(24,27) /*!< external event select for routine sequence */ +#define ADC_CTL1_ETMRC BITS(28,29) /*!< external trigger conversion mode for routine channels */ +#define ADC_CTL1_SWRCST BIT(30) /*!< start conversion of routine channels */ + +/* ADC_SAMPTx x=0..1 */ +#define ADC_SAMPTX_SPTN BITS(0,2) /*!< channel x sample time selection */ + +/* ADC_IOFFx x=0..3 */ +#define ADC_IOFFX_IOFF BITS(0,11) /*!< data offset for inserted channel x */ + +/* ADC_WDHT */ +#define ADC_WDHT_WDHT BITS(0,11) /*!< analog watchdog high threshold */ + +/* ADC_WDLT */ +#define ADC_WDLT_WDLT BITS(0,11) /*!< analog watchdog low threshold */ + +/* ADC_RSQx */ +#define ADC_RSQX_RSQN BITS(0,4) /*!< x conversion in routine sequence */ +#define ADC_RSQ0_RL BITS(20,23) /*!< routine channel sequence length */ + +/* ADC_ISQ */ +#define ADC_ISQ_ISQN BITS(0,4) /*!< x conversion in inserted sequence */ +#define ADC_ISQ_IL BITS(20,21) /*!< inserted sequence length */ + +/* ADC_IDATAx x=0..3*/ +#define ADC_IDATAX_IDATAN BITS(0,15) /*!< inserted data x */ + +/* ADC_RDATA */ +#define ADC_RDATA_RDATA BITS(0,15) /*!< routine data */ + +/* ADC_OVSAMPCTL */ +#define ADC_OVSAMPCTL_OVSEN BIT(0) /*!< oversampling enable */ +#define ADC_OVSAMPCTL_OVSR BITS(2,4) /*!< oversampling ratio */ +#define ADC_OVSAMPCTL_OVSS BITS(5,8) /*!< oversampling shift */ +#define ADC_OVSAMPCTL_TOVS BIT(9) /*!< triggered oversampling */ + +/* ADC_SSTAT */ +#define ADC_SSTAT_WDE0 BIT(0) /*!< the mirror image of the WDE bit of ADC0 */ +#define ADC_SSTAT_EOC0 BIT(1) /*!< the mirror image of the EOC bit of ADC0 */ +#define ADC_SSTAT_EOIC0 BIT(2) /*!< the mirror image of the EOIC bit of ADC0 */ +#define ADC_SSTAT_STIC0 BIT(3) /*!< the mirror image of the STIC bit of ADC0 */ +#define ADC_SSTAT_STRC0 BIT(4) /*!< the mirror image of the STRC bit of ADC0 */ +#define ADC_SSTAT_ROVF0 BIT(5) /*!< the mirror image of the ROVF bit of ADC0 */ +#define ADC_SSTAT_WDE1 BIT(8) /*!< the mirror image of the WDE bit of ADC1 */ +#define ADC_SSTAT_EOC1 BIT(9) /*!< the mirror image of the EOC bit of ADC1 */ +#define ADC_SSTAT_EOIC1 BIT(10) /*!< the mirror image of the EOIC bit of ADC1 */ +#define ADC_SSTAT_STIC1 BIT(11) /*!< the mirror image of the STIC bit of ADC1 */ +#define ADC_SSTAT_STRC1 BIT(12) /*!< the mirror image of the STRC bit of ADC1 */ +#define ADC_SSTAT_ROVF1 BIT(13) /*!< the mirror image of the ROVF bit of ADC1 */ +#define ADC_SSTAT_WDE2 BIT(16) /*!< the mirror image of the WDE bit of ADC2 */ +#define ADC_SSTAT_EOC2 BIT(17) /*!< the mirror image of the EOC bit of ADC2 */ +#define ADC_SSTAT_EOIC2 BIT(18) /*!< the mirror image of the EOIC bit of ADC2 */ +#define ADC_SSTAT_STIC2 BIT(19) /*!< the mirror image of the STIC bit of ADC2 */ +#define ADC_SSTAT_STRC2 BIT(20) /*!< the mirror image of the STRC bit of ADC2 */ +#define ADC_SSTAT_ROVF2 BIT(21) /*!< the mirror image of the ROVF bit of ADC2 */ + +/* ADC_SYNCCTL */ +#define ADC_SYNCCTL_SYNCM BITS(0,4) /*!< ADC synchronization mode */ +#define ADC_SYNCCTL_SYNCDLY BITS(8,11) /*!< ADC synchronization delay */ +#define ADC_SYNCCTL_SYNCDDM BIT(13) /*!< ADC synchronization DMA disable mode */ +#define ADC_SYNCCTL_SYNCDMA BITS(14,15) /*!< ADC synchronization DMA mode selection */ +#define ADC_SYNCCTL_ADCCK BITS(16,18) /*!< ADC clock */ +#define ADC_SYNCCTL_VBATEN BIT(22) /*!< channel 18 (1/4 voltate of external battery) enable of ADC0 */ +#define ADC_SYNCCTL_TSVREN BIT(23) /*!< channel 16 (temperature sensor) and 17 (internal reference voltage) enable of ADC0 */ + +/* ADC_SYNCDATA */ +#define ADC_SYNCDATA_SYNCDATA0 BITS(0,15) /*!< routine data1 in ADC synchronization mode */ +#define ADC_SYNCDATA_SYNCDATA1 BITS(16,31) /*!< routine data2 in ADC synchronization mode */ + +/* constants definitions */ +/* ADC status flag */ +#define ADC_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event flag */ +#define ADC_FLAG_EOC ADC_STAT_EOC /*!< end of conversion */ +#define ADC_FLAG_EOIC ADC_STAT_EOIC /*!< inserted channel end of conversion */ +#define ADC_FLAG_STIC ADC_STAT_STIC /*!< inserted channel start flag */ +#define ADC_FLAG_STRC ADC_STAT_STRC /*!< routine channel start flag */ +#define ADC_FLAG_ROVF ADC_STAT_ROVF /*!< routine data register overflow */ + +/* adc_ctl0 register value */ +#define CTL0_DISNUM(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to ADC_CTL0_DISNUM bit field */ + +/* ADC special function definitions */ +#define ADC_SCAN_MODE ADC_CTL0_SM /*!< scan mode */ +#define ADC_INSERTED_CHANNEL_AUTO ADC_CTL0_ICA /*!< inserted sequence convert automatically */ +#define ADC_CONTINUOUS_MODE ADC_CTL1_CTN /*!< continuous mode */ + +/* temperature sensor channel, internal reference voltage channel, VBAT channel */ +#define ADC_VBAT_CHANNEL_SWITCH ADC_SYNCCTL_VBATEN /*!< VBAT channel */ +#define ADC_TEMP_VREF_CHANNEL_SWITCH ADC_SYNCCTL_TSVREN /*!< Vref and Vtemp channel */ + +/* ADC synchronization mode */ +#define SYNCCTL_SYNCM(regval) (BITS(0,4) & ((uint32_t)(regval))) /*!< write value to ADC_CTL0_SYNCM bit field */ +#define ADC_SYNC_MODE_INDEPENDENT SYNCCTL_SYNCM(0) /*!< ADC synchronization mode disabled.All the ADCs work independently */ +#define ADC_DAUL_ROUTINE_PARALLEL_INSERTED_PARALLEL SYNCCTL_SYNCM(1) /*!< ADC0 and ADC1 work in combined routine parallel & inserted parallel mode. ADC2 works independently */ +#define ADC_DAUL_ROUTINE_PARALLEL_INSERTED_ROTATION SYNCCTL_SYNCM(2) /*!< ADC0 and ADC1 work in combined routine parallel & trigger rotation mode. ADC2 works independently */ +#define ADC_DAUL_INSERTED_PARALLEL SYNCCTL_SYNCM(5) /*!< ADC0 and ADC1 work in inserted parallel mode. ADC2 works independently */ +#define ADC_DAUL_ROUTINE_PARALLEL SYNCCTL_SYNCM(6) /*!< ADC0 and ADC1 work in routine parallel mode. ADC2 works independently */ +#define ADC_DAUL_ROUTINE_FOLLOW_UP SYNCCTL_SYNCM(7) /*!< ADC0 and ADC1 work in follow-up mode. ADC2 works independently */ +#define ADC_DAUL_INSERTED_TRRIGGER_ROTATION SYNCCTL_SYNCM(9) /*!< ADC0 and ADC1 work in trigger rotation mode. ADC2 works independently */ +#define ADC_ALL_ROUTINE_PARALLEL_INSERTED_PARALLEL SYNCCTL_SYNCM(17) /*!< all ADCs work in combined routine parallel & inserted parallel mode */ +#define ADC_ALL_ROUTINE_PARALLEL_INSERTED_ROTATION SYNCCTL_SYNCM(18) /*!< all ADCs work in combined routine parallel & trigger rotation mode */ +#define ADC_ALL_INSERTED_PARALLEL SYNCCTL_SYNCM(21) /*!< all ADCs work in inserted parallel mode */ +#define ADC_ALL_ROUTINE_PARALLEL SYNCCTL_SYNCM(22) /*!< all ADCs work in routine parallel mode */ +#define ADC_ALL_ROUTINE_FOLLOW_UP SYNCCTL_SYNCM(23) /*!< all ADCs work in follow-up mode */ +#define ADC_ALL_INSERTED_TRRIGGER_ROTATION SYNCCTL_SYNCM(25) /*!< all ADCs work in trigger rotation mode */ + +/* ADC data alignment */ +#define ADC_DATAALIGN_RIGHT ((uint32_t)0x00000000U) /*!< LSB alignment */ +#define ADC_DATAALIGN_LEFT ADC_CTL1_DAL /*!< MSB alignment */ + +/* external trigger mode for routine and inserted channel */ +#define EXTERNAL_TRIGGER_DISABLE ((uint32_t)0x00000000U) /*!< external trigger disable */ +#define EXTERNAL_TRIGGER_RISING ((uint32_t)0x00000001U) /*!< rising edge of external trigger */ +#define EXTERNAL_TRIGGER_FALLING ((uint32_t)0x00000002U) /*!< falling edge of external trigger */ +#define EXTERNAL_TRIGGER_RISING_FALLING ((uint32_t)0x00000003U) /*!< rising and falling edge of external trigger */ + +/* ADC external trigger select for routine channel */ +#define CTL1_ETSRC(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define ADC_EXTTRIG_ROUTINE_T0_CH0 CTL1_ETSRC(0) /*!< timer 0 CC0 event select */ +#define ADC_EXTTRIG_ROUTINE_T0_CH1 CTL1_ETSRC(1) /*!< timer 0 CC1 event select */ +#define ADC_EXTTRIG_ROUTINE_T0_CH2 CTL1_ETSRC(2) /*!< timer 0 CC2 event select */ +#define ADC_EXTTRIG_ROUTINE_T1_CH1 CTL1_ETSRC(3) /*!< timer 1 CC1 event select */ +#define ADC_EXTTRIG_ROUTINE_T1_CH2 CTL1_ETSRC(4) /*!< timer 1 CC2 event select */ +#define ADC_EXTTRIG_ROUTINE_T1_CH3 CTL1_ETSRC(5) /*!< timer 1 CC3 event select */ +#define ADC_EXTTRIG_ROUTINE_T1_TRGO CTL1_ETSRC(6) /*!< timer 1 TRGO event select */ +#define ADC_EXTTRIG_ROUTINE_T2_CH0 CTL1_ETSRC(7) /*!< timer 2 CC0 event select */ +#define ADC_EXTTRIG_ROUTINE_T2_TRGO CTL1_ETSRC(8) /*!< timer 2 TRGO event select */ +#define ADC_EXTTRIG_ROUTINE_T3_CH3 CTL1_ETSRC(9) /*!< timer 3 CC3 event select */ +#define ADC_EXTTRIG_ROUTINE_T4_CH0 CTL1_ETSRC(10) /*!< timer 4 CC0 event select */ +#define ADC_EXTTRIG_ROUTINE_T4_CH1 CTL1_ETSRC(11) /*!< timer 4 CC1 event select */ +#define ADC_EXTTRIG_ROUTINE_T4_CH2 CTL1_ETSRC(12) /*!< timer 4 CC2 event select */ +#define ADC_EXTTRIG_ROUTINE_T7_CH0 CTL1_ETSRC(13) /*!< timer 7 CC0 event select */ +#define ADC_EXTTRIG_ROUTINE_T7_TRGO CTL1_ETSRC(14) /*!< timer 7 TRGO event select */ +#define ADC_EXTTRIG_ROUTINE_EXTI_11 CTL1_ETSRC(15) /*!< extiline 11 select */ + +/* ADC external trigger select for inserted channel */ +#define CTL1_ETSIC(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) +#define ADC_EXTTRIG_INSERTED_T0_CH3 CTL1_ETSIC(0) /*!< timer0 capture compare 3 */ +#define ADC_EXTTRIG_INSERTED_T0_TRGO CTL1_ETSIC(1) /*!< timer0 TRGO event */ +#define ADC_EXTTRIG_INSERTED_T1_CH0 CTL1_ETSIC(2) /*!< timer1 capture compare 0 */ +#define ADC_EXTTRIG_INSERTED_T1_TRGO CTL1_ETSIC(3) /*!< timer1 TRGO event */ +#define ADC_EXTTRIG_INSERTED_T2_CH1 CTL1_ETSIC(4) /*!< timer2 capture compare 1 */ +#define ADC_EXTTRIG_INSERTED_T2_CH3 CTL1_ETSIC(5) /*!< timer2 capture compare 3 */ +#define ADC_EXTTRIG_INSERTED_T3_CH0 CTL1_ETSIC(6) /*!< timer3 capture compare 0 */ +#define ADC_EXTTRIG_INSERTED_T3_CH1 CTL1_ETSIC(7) /*!< timer3 capture compare 1 */ +#define ADC_EXTTRIG_INSERTED_T3_CH2 CTL1_ETSIC(8) /*!< timer3 capture compare 2 */ +#define ADC_EXTTRIG_INSERTED_T3_TRGO CTL1_ETSIC(9) /*!< timer3 capture compare TRGO */ +#define ADC_EXTTRIG_INSERTED_T4_CH3 CTL1_ETSIC(10) /*!< timer4 capture compare 3 */ +#define ADC_EXTTRIG_INSERTED_T4_TRGO CTL1_ETSIC(11) /*!< timer4 capture compare TRGO */ +#define ADC_EXTTRIG_INSERTED_T7_CH1 CTL1_ETSIC(12) /*!< timer7 capture compare 1 */ +#define ADC_EXTTRIG_INSERTED_T7_CH2 CTL1_ETSIC(13) /*!< timer7 capture compare 2 */ +#define ADC_EXTTRIG_INSERTED_T7_CH3 CTL1_ETSIC(14) /*!< timer7 capture compare 3 */ +#define ADC_EXTTRIG_INSERTED_EXTI_15 CTL1_ETSIC(15) /*!< external interrupt line 15 */ + +/* ADC channel sample time */ +#define SAMPTX_SPT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_SAMPTX_SPT bit field */ +#define ADC_SAMPLETIME_3 SAMPTX_SPT(0) /*!< 3 sampling cycles */ +#define ADC_SAMPLETIME_15 SAMPTX_SPT(1) /*!< 15 sampling cycles */ +#define ADC_SAMPLETIME_28 SAMPTX_SPT(2) /*!< 28 sampling cycles */ +#define ADC_SAMPLETIME_56 SAMPTX_SPT(3) /*!< 56 sampling cycles */ +#define ADC_SAMPLETIME_84 SAMPTX_SPT(4) /*!< 84 sampling cycles */ +#define ADC_SAMPLETIME_112 SAMPTX_SPT(5) /*!< 112 sampling cycles */ +#define ADC_SAMPLETIME_144 SAMPTX_SPT(6) /*!< 144 sampling cycles */ +#define ADC_SAMPLETIME_480 SAMPTX_SPT(7) /*!< 480 sampling cycles */ + +/* adc_ioffx register value */ +#define IOFFX_IOFF(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_IOFFX_IOFF bit field */ + +/* adc_wdht register value */ +#define WDHT_WDHT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDHT_WDHT bit field */ + +/* adc_wdlt register value */ +#define WDLT_WDLT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDLT_WDLT bit field */ + +/* adc_rsqx register value */ +#define RSQ0_RL(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_RSQ0_RL bit field */ + +/* adc_isq register value */ +#define ISQ_IL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_ISQ_IL bit field */ + +/* adc_ovsampctl register value */ +/* ADC resolution */ +#define CTL0_DRES(regval) (BITS(24,25) & ((uint32_t)(regval) << 24)) /*!< write value to ADC_CTL0_DRES bit field */ +#define ADC_RESOLUTION_12B CTL0_DRES(0) /*!< 12-bit ADC resolution */ +#define ADC_RESOLUTION_10B CTL0_DRES(1) /*!< 10-bit ADC resolution */ +#define ADC_RESOLUTION_8B CTL0_DRES(2) /*!< 8-bit ADC resolution */ +#define ADC_RESOLUTION_6B CTL0_DRES(3) /*!< 6-bit ADC resolution */ + +/* oversampling shift */ +#define OVSAMPCTL_OVSS(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) /*!< write value to ADC_OVSAMPCTL_OVSS bit field */ +#define ADC_OVERSAMPLING_SHIFT_NONE OVSAMPCTL_OVSS(0) /*!< no oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_1B OVSAMPCTL_OVSS(1) /*!< 1-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_2B OVSAMPCTL_OVSS(2) /*!< 2-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_3B OVSAMPCTL_OVSS(3) /*!< 3-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_4B OVSAMPCTL_OVSS(4) /*!< 4-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_5B OVSAMPCTL_OVSS(5) /*!< 5-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_6B OVSAMPCTL_OVSS(6) /*!< 6-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_7B OVSAMPCTL_OVSS(7) /*!< 7-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_8B OVSAMPCTL_OVSS(8) /*!< 8-bit oversampling shift */ + +/* oversampling ratio */ +#define OVSAMPCTL_OVSR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ADC_OVSAMPCTL_OVSR bit field */ +#define ADC_OVERSAMPLING_RATIO_MUL2 OVSAMPCTL_OVSR(0) /*!< oversampling ratio multiple 2 */ +#define ADC_OVERSAMPLING_RATIO_MUL4 OVSAMPCTL_OVSR(1) /*!< oversampling ratio multiple 4 */ +#define ADC_OVERSAMPLING_RATIO_MUL8 OVSAMPCTL_OVSR(2) /*!< oversampling ratio multiple 8 */ +#define ADC_OVERSAMPLING_RATIO_MUL16 OVSAMPCTL_OVSR(3) /*!< oversampling ratio multiple 16 */ +#define ADC_OVERSAMPLING_RATIO_MUL32 OVSAMPCTL_OVSR(4) /*!< oversampling ratio multiple 32 */ +#define ADC_OVERSAMPLING_RATIO_MUL64 OVSAMPCTL_OVSR(5) /*!< oversampling ratio multiple 64 */ +#define ADC_OVERSAMPLING_RATIO_MUL128 OVSAMPCTL_OVSR(6) /*!< oversampling ratio multiple 128 */ +#define ADC_OVERSAMPLING_RATIO_MUL256 OVSAMPCTL_OVSR(7) /*!< oversampling ratio multiple 256 */ + +/* triggered oversampling */ +#define ADC_OVERSAMPLING_ALL_CONVERT ((uint32_t)0x00000000U) /*!< all oversampled conversions for a channel are done consecutively after a trigger */ +#define ADC_OVERSAMPLING_ONE_CONVERT ADC_OVSAMPCTL_TOVS /*!< each oversampled conversion for a channel needs a trigger */ + +/* ADC channel sequence definitions */ +#define ADC_ROUTINE_CHANNEL ((uint8_t)0x01U) /*!< adc routine sequence */ +#define ADC_INSERTED_CHANNEL ((uint8_t)0x02U) /*!< adc inserted sequence */ +#define ADC_ROUTINE_INSERTED_CHANNEL ((uint8_t)0x03U) /*!< both routine and inserted sequence */ +#define ADC_CHANNEL_DISCON_DISABLE ((uint8_t)0x04U) /*!< disable discontinuous mode of routine & inserted sequence */ + +/* ADC inserted channel definitions */ +#define ADC_INSERTED_CHANNEL_0 ((uint8_t)0x00U) /*!< adc inserted channel 0 */ +#define ADC_INSERTED_CHANNEL_1 ((uint8_t)0x01U) /*!< adc inserted channel 1 */ +#define ADC_INSERTED_CHANNEL_2 ((uint8_t)0x02U) /*!< adc inserted channel 2 */ +#define ADC_INSERTED_CHANNEL_3 ((uint8_t)0x03U) /*!< adc inserted channel 3 */ + +/* ADC channel definitions */ +#define ADC_CHANNEL_0 ((uint8_t)0x00U) /*!< ADC channel 0 */ +#define ADC_CHANNEL_1 ((uint8_t)0x01U) /*!< ADC channel 1 */ +#define ADC_CHANNEL_2 ((uint8_t)0x02U) /*!< ADC channel 2 */ +#define ADC_CHANNEL_3 ((uint8_t)0x03U) /*!< ADC channel 3 */ +#define ADC_CHANNEL_4 ((uint8_t)0x04U) /*!< ADC channel 4 */ +#define ADC_CHANNEL_5 ((uint8_t)0x05U) /*!< ADC channel 5 */ +#define ADC_CHANNEL_6 ((uint8_t)0x06U) /*!< ADC channel 6 */ +#define ADC_CHANNEL_7 ((uint8_t)0x07U) /*!< ADC channel 7 */ +#define ADC_CHANNEL_8 ((uint8_t)0x08U) /*!< ADC channel 8 */ +#define ADC_CHANNEL_9 ((uint8_t)0x09U) /*!< ADC channel 9 */ +#define ADC_CHANNEL_10 ((uint8_t)0x0AU) /*!< ADC channel 10 */ +#define ADC_CHANNEL_11 ((uint8_t)0x0BU) /*!< ADC channel 11 */ +#define ADC_CHANNEL_12 ((uint8_t)0x0CU) /*!< ADC channel 12 */ +#define ADC_CHANNEL_13 ((uint8_t)0x0DU) /*!< ADC channel 13 */ +#define ADC_CHANNEL_14 ((uint8_t)0x0EU) /*!< ADC channel 14 */ +#define ADC_CHANNEL_15 ((uint8_t)0x0FU) /*!< ADC channel 15 */ +#define ADC_CHANNEL_16 ((uint8_t)0x10U) /*!< ADC channel 16 */ +#define ADC_CHANNEL_17 ((uint8_t)0x11U) /*!< ADC channel 17 */ +#define ADC_CHANNEL_18 ((uint8_t)0x12U) /*!< ADC channel 18 */ + +/* ADC interrupt flag */ +#define ADC_INT_WDE ADC_CTL0_WDEIE /*!< analog watchdog event interrupt */ +#define ADC_INT_EOC ADC_CTL0_EOCIE /*!< end of sequence conversion interrupt */ +#define ADC_INT_EOIC ADC_CTL0_EOICIE /*!< end of inserted sequence conversion interrupt */ +#define ADC_INT_ROVF ADC_CTL0_ROVFIE /*!< routine data register overflow */ + +/* ADC interrupt flag */ +#define ADC_INT_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt */ +#define ADC_INT_FLAG_EOC ADC_STAT_EOC /*!< end of sequence conversion interrupt */ +#define ADC_INT_FLAG_EOIC ADC_STAT_EOIC /*!< end of inserted sequence conversion interrupt */ +#define ADC_INT_FLAG_ROVF ADC_STAT_ROVF /*!< routine data register overflow */ + +/* configure the ADC clock for all the ADCs */ +#define SYNCCTL_ADCCK(regval) (BITS(16,18) & ((uint32_t)(regval) << 16)) +#define ADC_ADCCK_PCLK2_DIV2 SYNCCTL_ADCCK(0) /*!< PCLK2 div2 */ +#define ADC_ADCCK_PCLK2_DIV4 SYNCCTL_ADCCK(1) /*!< PCLK2 div4 */ +#define ADC_ADCCK_PCLK2_DIV6 SYNCCTL_ADCCK(2) /*!< PCLK2 div6 */ +#define ADC_ADCCK_PCLK2_DIV8 SYNCCTL_ADCCK(3) /*!< PCLK2 div8 */ +#define ADC_ADCCK_HCLK_DIV5 SYNCCTL_ADCCK(4) /*!< HCLK div5 */ +#define ADC_ADCCK_HCLK_DIV6 SYNCCTL_ADCCK(5) /*!< HCLK div6 */ +#define ADC_ADCCK_HCLK_DIV10 SYNCCTL_ADCCK(6) /*!< HCLK div10 */ +#define ADC_ADCCK_HCLK_DIV20 SYNCCTL_ADCCK(7) /*!< HCLK div20 */ + +/* ADC synchronization delay */ +#define ADC_SYNC_DELAY_5CYCLE ((uint32_t)0x00000000U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 5 ADC clock cycles. */ +#define ADC_SYNC_DELAY_6CYCLE ((uint32_t)0x00000100U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 6 ADC clock cycles. */ +#define ADC_SYNC_DELAY_7CYCLE ((uint32_t)0x00000200U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 7 ADC clock cycles. */ +#define ADC_SYNC_DELAY_8CYCLE ((uint32_t)0x00000300U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 8 ADC clock cycles. */ +#define ADC_SYNC_DELAY_9CYCLE ((uint32_t)0x00000400U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 9 ADC clock cycles. */ +#define ADC_SYNC_DELAY_10CYCLE ((uint32_t)0x00000500U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 10 ADC clock cycles. */ +#define ADC_SYNC_DELAY_11CYCLE ((uint32_t)0x00000600U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 11 ADC clock cycles. */ +#define ADC_SYNC_DELAY_12CYCLE ((uint32_t)0x00000700U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 12 ADC clock cycles. */ +#define ADC_SYNC_DELAY_13CYCLE ((uint32_t)0x00000800U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 13 ADC clock cycles. */ +#define ADC_SYNC_DELAY_14CYCLE ((uint32_t)0x00000900U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 14 ADC clock cycles. */ +#define ADC_SYNC_DELAY_15CYCLE ((uint32_t)0x00000A00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 15 ADC clock cycles. */ +#define ADC_SYNC_DELAY_16CYCLE ((uint32_t)0x00000B00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 16 ADC clock cycles. */ +#define ADC_SYNC_DELAY_17CYCLE ((uint32_t)0x00000C00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 17 ADC clock cycles. */ +#define ADC_SYNC_DELAY_18CYCLE ((uint32_t)0x00000D00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 18 ADC clock cycles. */ +#define ADC_SYNC_DELAY_19CYCLE ((uint32_t)0x00000E00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 19 ADC clock cycles. */ +#define ADC_SYNC_DELAY_20CYCLE ((uint32_t)0x00000F00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 20 ADC clock cycles. */ + +/* ADC synchronization DMA mode selection */ +#define ADC_SYNC_DMA_DISABLE ((uint32_t)0x00000000U) /*!< ADC synchronization DMA disabled */ +#define ADC_SYNC_DMA_MODE0 ((uint32_t)0x00004000U) /*!< ADC synchronization DMA mode 0 */ +#define ADC_SYNC_DMA_MODE1 ((uint32_t)0x00008000U) /*!< ADC synchronization DMA mode 1 */ + +/* end of conversion mode */ +#define ADC_EOC_SET_SEQUENCE ((uint8_t)0x00U) /*!< only at the end of a sequence of routine conversions, the EOC bit is set */ +#define ADC_EOC_SET_CONVERSION ((uint8_t)0x01U) /*!< at the end of each routine conversion, the EOC bit is set */ + +/* function declarations */ +/* initialization config */ +/* reset ADC */ +void adc_deinit(void); +/* configure the ADC clock for all the ADCs */ +void adc_clock_config(uint32_t prescaler); +/* enable or disable ADC special function */ +void adc_special_function_config(uint32_t adc_periph , uint32_t function , ControlStatus newvalue); +/* configure ADC data alignment */ +void adc_data_alignment_config(uint32_t adc_periph , uint32_t data_alignment); +/* enable ADC interface */ +void adc_enable(uint32_t adc_periph); +/* disable ADC interface */ +void adc_disable(uint32_t adc_periph); +/* ADC calibration and reset calibration */ +void adc_calibration_enable(uint32_t adc_periph); +/* configure temperature sensor and internal reference voltage channel or VBAT channel function */ +void adc_channel_16_to_18(uint32_t function, ControlStatus newvalue); +/* configure ADC resolution */ +void adc_resolution_config(uint32_t adc_periph, uint32_t resolution); +/* configure ADC oversample mode */ +void adc_oversample_mode_config(uint32_t adc_periph, uint32_t mode, uint16_t shift, uint8_t ratio); +/* enable ADC oversample mode */ +void adc_oversample_mode_enable(uint32_t adc_periph); +/* disable ADC oversample mode */ +void adc_oversample_mode_disable(uint32_t adc_periph); + +/* DMA config */ +/* enable DMA request */ +void adc_dma_mode_enable(uint32_t adc_periph); +/* disable DMA request */ +void adc_dma_mode_disable(uint32_t adc_periph); +/* when DMA=1, the DMA engine issues a request at end of each routine conversion */ +void adc_dma_request_after_last_enable(uint32_t adc_periph); +/* the DMA engine is disabled after the end of transfer signal from DMA controller is detected */ +void adc_dma_request_after_last_disable(uint32_t adc_periph); + +/* routine sequence and inserted sequence config */ +/* configure ADC discontinuous mode */ +void adc_discontinuous_mode_config(uint32_t adc_periph , uint8_t adc_sequence , uint8_t length); +/* configure the length of routine sequence or inserted sequence */ +void adc_channel_length_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t length); +/* configure ADC routine channel */ +void adc_routine_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); +/* configure ADC inserted channel */ +void adc_inserted_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); +/* configure ADC inserted channel offset */ +void adc_inserted_channel_offset_config(uint32_t adc_periph , uint8_t inserted_channel , uint16_t offset); +/* configure ADC external trigger source */ +void adc_external_trigger_source_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t external_trigger_source); +/* enable ADC external trigger */ +void adc_external_trigger_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t trigger_mode); +/* enable ADC software trigger */ +void adc_software_trigger_enable(uint32_t adc_periph , uint8_t adc_sequence); +/* configure end of conversion mode */ +void adc_end_of_conversion_config(uint32_t adc_periph , uint8_t end_selection); + +/* get channel data */ +/* read ADC routine data register */ +uint16_t adc_routine_data_read(uint32_t adc_periph); +/* read ADC inserted data register */ +uint16_t adc_inserted_data_read(uint32_t adc_periph , uint8_t inserted_channel); + +/* watchdog config */ +/* disable ADC analog watchdog single channel */ +void adc_watchdog_single_channel_disable(uint32_t adc_periph ); +/* enable ADC analog watchdog single channel */ +void adc_watchdog_single_channel_enable(uint32_t adc_periph , uint8_t adc_channel); +/* configure ADC analog watchdog sequence */ +void adc_watchdog_sequence_channel_enable(uint32_t adc_periph , uint8_t adc_sequence); +/* disable ADC analog watchdog */ +void adc_watchdog_disable(uint32_t adc_periph , uint8_t adc_sequence); +/* configure ADC analog watchdog threshold */ +void adc_watchdog_threshold_config(uint32_t adc_periph , uint16_t low_threshold , uint16_t high_threshold); + +/* ADC synchronization */ +/* configure the ADC sync mode */ +void adc_sync_mode_config(uint32_t sync_mode); +/* configure the delay between 2 sampling phases in ADC sync modes */ +void adc_sync_delay_config(uint32_t sample_delay); +/* configure ADC sync DMA mode selection */ +void adc_sync_dma_config(uint32_t dma_mode ); +/* configure ADC sync DMA engine is disabled after the end of transfer signal from DMA controller is detected */ +void adc_sync_dma_request_after_last_enable(void); +/* configure ADC sync DMA engine issues requests according to the SYNCDMA bits */ +void adc_sync_dma_request_after_last_disable(void); +/* read ADC sync routine data register */ +uint32_t adc_sync_routine_data_read(void); + +/* interrupt & flag functions */ +/* get the bit state of ADCx software start conversion */ +FlagStatus adc_routine_software_startconv_flag_get(uint32_t adc_periph); +/* get the bit state of ADCx software inserted channel start conversion */ +FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph); +/* get the ADC flag bits */ +FlagStatus adc_flag_get(uint32_t adc_periph , uint32_t adc_flag); +/* clear the ADC flag bits */ +void adc_flag_clear(uint32_t adc_periph , uint32_t adc_flag); +/* enable ADC interrupt */ +void adc_interrupt_enable(uint32_t adc_periph , uint32_t adc_interrupt); +/* disable ADC interrupt */ +void adc_interrupt_disable(uint32_t adc_periph , uint32_t adc_interrupt); +/* get the ADC interrupt bits */ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph , uint32_t adc_interrupt); +/* clear the ADC flag */ +void adc_interrupt_flag_clear(uint32_t adc_periph , uint32_t adc_interrupt); + +#endif /* GD32F5XX_ADC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h new file mode 100644 index 00000000000..d5b18a3dc0c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h @@ -0,0 +1,916 @@ +/*! + \file gd32f5xx_can.h + \brief definitions for the CAN + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F5XX_CAN_H +#define GD32F5XX_CAN_H + +#include "gd32f5xx.h" + +/* CAN definitions */ +#define CAN0 CAN_BASE /*!< CAN0 base address */ +#define CAN1 (CAN0 + 0x00000400U) /*!< CAN1 base address */ + +/* registers definitions */ +#define CAN_CTL(canx) REG32((canx) + 0x00000000U) /*!< CAN control register */ +#define CAN_STAT(canx) REG32((canx) + 0x00000004U) /*!< CAN status register */ +#define CAN_TSTAT(canx) REG32((canx) + 0x00000008U) /*!< CAN transmit status register*/ +#define CAN_RFIFO0(canx) REG32((canx) + 0x0000000CU) /*!< CAN receive FIFO0 register */ +#define CAN_RFIFO1(canx) REG32((canx) + 0x00000010U) /*!< CAN receive FIFO1 register */ +#define CAN_INTEN(canx) REG32((canx) + 0x00000014U) /*!< CAN interrupt enable register */ +#define CAN_ERR(canx) REG32((canx) + 0x00000018U) /*!< CAN error register */ +#define CAN_BT(canx) REG32((canx) + 0x0000001CU) /*!< CAN bit timing register */ +#define CAN_FDCTL(canx) REG32((canx) + 0x00000020U) /*!< CAN FD control register */ +#define CAN_FDSTAT(canx) REG32((canx) + 0x00000024U) /*!< CAN FD status register */ +#define CAN_FDTDC(canx) REG32((canx) + 0x00000028U) /*!< CAN FD transmitter delay compensation register */ +#define CAN_DBT(canx) REG32((canx) + 0x0000002CU) /*!< CAN date bit timing register */ +#define CAN_TMI0(canx) REG32((canx) + 0x00000180U) /*!< CAN transmit mailbox0 identifier register */ +#define CAN_TMP0(canx) REG32((canx) + 0x00000184U) /*!< CAN transmit mailbox0 property register */ +#define CAN_TMDATA00(canx) REG32((canx) + 0x00000188U) /*!< CAN transmit mailbox0 data0 register */ +#define CAN_TMDATA10(canx) REG32((canx) + 0x0000018CU) /*!< CAN transmit mailbox0 data1 register */ +#define CAN_TMI1(canx) REG32((canx) + 0x00000190U) /*!< CAN transmit mailbox1 identifier register */ +#define CAN_TMP1(canx) REG32((canx) + 0x00000194U) /*!< CAN transmit mailbox1 property register */ +#define CAN_TMDATA01(canx) REG32((canx) + 0x00000198U) /*!< CAN transmit mailbox1 data0 register */ +#define CAN_TMDATA11(canx) REG32((canx) + 0x0000019CU) /*!< CAN transmit mailbox1 data1 register */ +#define CAN_TMI2(canx) REG32((canx) + 0x000001A0U) /*!< CAN transmit mailbox2 identifier register */ +#define CAN_TMP2(canx) REG32((canx) + 0x000001A4U) /*!< CAN transmit mailbox2 property register */ +#define CAN_TMDATA02(canx) REG32((canx) + 0x000001A8U) /*!< CAN transmit mailbox2 data0 register */ +#define CAN_TMDATA12(canx) REG32((canx) + 0x000001ACU) /*!< CAN transmit mailbox2 data1 register */ +#define CAN_RFIFOMI0(canx) REG32((canx) + 0x000001B0U) /*!< CAN receive FIFO0 mailbox identifier register */ +#define CAN_RFIFOMP0(canx) REG32((canx) + 0x000001B4U) /*!< CAN receive FIFO0 mailbox property register */ +#define CAN_RFIFOMDATA00(canx) REG32((canx) + 0x000001B8U) /*!< CAN receive FIFO0 mailbox data0 register */ +#define CAN_RFIFOMDATA10(canx) REG32((canx) + 0x000001BCU) /*!< CAN receive FIFO0 mailbox data1 register */ +#define CAN_RFIFOMI1(canx) REG32((canx) + 0x000001C0U) /*!< CAN receive FIFO1 mailbox identifier register */ +#define CAN_RFIFOMP1(canx) REG32((canx) + 0x000001C4U) /*!< CAN receive FIFO1 mailbox property register */ +#define CAN_RFIFOMDATA01(canx) REG32((canx) + 0x000001C8U) /*!< CAN receive FIFO1 mailbox data0 register */ +#define CAN_RFIFOMDATA11(canx) REG32((canx) + 0x000001CCU) /*!< CAN receive FIFO1 mailbox data1 register */ +#define CAN_FCTL(canx) REG32((canx) + 0x00000200U) /*!< CAN filter control register */ +#define CAN_FMCFG(canx) REG32((canx) + 0x00000204U) /*!< CAN filter mode register */ +#define CAN_FSCFG(canx) REG32((canx) + 0x0000020CU) /*!< CAN filter scale register */ +#define CAN_FAFIFO(canx) REG32((canx) + 0x00000214U) /*!< CAN filter associated FIFO register */ +#define CAN_FW(canx) REG32((canx) + 0x0000021CU) /*!< CAN filter working register */ +#define CAN_F0DATA0(canx) REG32((canx) + 0x00000240U) /*!< CAN filter 0 data 0 register */ +#define CAN_F1DATA0(canx) REG32((canx) + 0x00000248U) /*!< CAN filter 1 data 0 register */ +#define CAN_F2DATA0(canx) REG32((canx) + 0x00000250U) /*!< CAN filter 2 data 0 register */ +#define CAN_F3DATA0(canx) REG32((canx) + 0x00000258U) /*!< CAN filter 3 data 0 register */ +#define CAN_F4DATA0(canx) REG32((canx) + 0x00000260U) /*!< CAN filter 4 data 0 register */ +#define CAN_F5DATA0(canx) REG32((canx) + 0x00000268U) /*!< CAN filter 5 data 0 register */ +#define CAN_F6DATA0(canx) REG32((canx) + 0x00000270U) /*!< CAN filter 6 data 0 register */ +#define CAN_F7DATA0(canx) REG32((canx) + 0x00000278U) /*!< CAN filter 7 data 0 register */ +#define CAN_F8DATA0(canx) REG32((canx) + 0x00000280U) /*!< CAN filter 8 data 0 register */ +#define CAN_F9DATA0(canx) REG32((canx) + 0x00000288U) /*!< CAN filter 9 data 0 register */ +#define CAN_F10DATA0(canx) REG32((canx) + 0x00000290U) /*!< CAN filter 10 data 0 register */ +#define CAN_F11DATA0(canx) REG32((canx) + 0x00000298U) /*!< CAN filter 11 data 0 register */ +#define CAN_F12DATA0(canx) REG32((canx) + 0x000002A0U) /*!< CAN filter 12 data 0 register */ +#define CAN_F13DATA0(canx) REG32((canx) + 0x000002A8U) /*!< CAN filter 13 data 0 register */ +#define CAN_F14DATA0(canx) REG32((canx) + 0x000002B0U) /*!< CAN filter 14 data 0 register */ +#define CAN_F15DATA0(canx) REG32((canx) + 0x000002B8U) /*!< CAN filter 15 data 0 register */ +#define CAN_F16DATA0(canx) REG32((canx) + 0x000002C0U) /*!< CAN filter 16 data 0 register */ +#define CAN_F17DATA0(canx) REG32((canx) + 0x000002C8U) /*!< CAN filter 17 data 0 register */ +#define CAN_F18DATA0(canx) REG32((canx) + 0x000002D0U) /*!< CAN filter 18 data 0 register */ +#define CAN_F19DATA0(canx) REG32((canx) + 0x000002D8U) /*!< CAN filter 19 data 0 register */ +#define CAN_F20DATA0(canx) REG32((canx) + 0x000002E0U) /*!< CAN filter 20 data 0 register */ +#define CAN_F21DATA0(canx) REG32((canx) + 0x000002E8U) /*!< CAN filter 21 data 0 register */ +#define CAN_F22DATA0(canx) REG32((canx) + 0x000002F0U) /*!< CAN filter 22 data 0 register */ +#define CAN_F23DATA0(canx) REG32((canx) + 0x000003F8U) /*!< CAN filter 23 data 0 register */ +#define CAN_F24DATA0(canx) REG32((canx) + 0x00000300U) /*!< CAN filter 24 data 0 register */ +#define CAN_F25DATA0(canx) REG32((canx) + 0x00000308U) /*!< CAN filter 25 data 0 register */ +#define CAN_F26DATA0(canx) REG32((canx) + 0x00000310U) /*!< CAN filter 26 data 0 register */ +#define CAN_F27DATA0(canx) REG32((canx) + 0x00000318U) /*!< CAN filter 27 data 0 register */ +#define CAN_F0DATA1(canx) REG32((canx) + 0x00000244U) /*!< CAN filter 0 data 1 register */ +#define CAN_F1DATA1(canx) REG32((canx) + 0x0000024CU) /*!< CAN filter 1 data 1 register */ +#define CAN_F2DATA1(canx) REG32((canx) + 0x00000254U) /*!< CAN filter 2 data 1 register */ +#define CAN_F3DATA1(canx) REG32((canx) + 0x0000025CU) /*!< CAN filter 3 data 1 register */ +#define CAN_F4DATA1(canx) REG32((canx) + 0x00000264U) /*!< CAN filter 4 data 1 register */ +#define CAN_F5DATA1(canx) REG32((canx) + 0x0000026CU) /*!< CAN filter 5 data 1 register */ +#define CAN_F6DATA1(canx) REG32((canx) + 0x00000274U) /*!< CAN filter 6 data 1 register */ +#define CAN_F7DATA1(canx) REG32((canx) + 0x0000027CU) /*!< CAN filter 7 data 1 register */ +#define CAN_F8DATA1(canx) REG32((canx) + 0x00000284U) /*!< CAN filter 8 data 1 register */ +#define CAN_F9DATA1(canx) REG32((canx) + 0x0000028CU) /*!< CAN filter 9 data 1 register */ +#define CAN_F10DATA1(canx) REG32((canx) + 0x00000294U) /*!< CAN filter 10 data 1 register */ +#define CAN_F11DATA1(canx) REG32((canx) + 0x0000029CU) /*!< CAN filter 11 data 1 register */ +#define CAN_F12DATA1(canx) REG32((canx) + 0x000002A4U) /*!< CAN filter 12 data 1 register */ +#define CAN_F13DATA1(canx) REG32((canx) + 0x000002ACU) /*!< CAN filter 13 data 1 register */ +#define CAN_F14DATA1(canx) REG32((canx) + 0x000002B4U) /*!< CAN filter 14 data 1 register */ +#define CAN_F15DATA1(canx) REG32((canx) + 0x000002BCU) /*!< CAN filter 15 data 1 register */ +#define CAN_F16DATA1(canx) REG32((canx) + 0x000002C4U) /*!< CAN filter 16 data 1 register */ +#define CAN_F17DATA1(canx) REG32((canx) + 0x0000024CU) /*!< CAN filter 17 data 1 register */ +#define CAN_F18DATA1(canx) REG32((canx) + 0x000002D4U) /*!< CAN filter 18 data 1 register */ +#define CAN_F19DATA1(canx) REG32((canx) + 0x000002DCU) /*!< CAN filter 19 data 1 register */ +#define CAN_F20DATA1(canx) REG32((canx) + 0x000002E4U) /*!< CAN filter 20 data 1 register */ +#define CAN_F21DATA1(canx) REG32((canx) + 0x000002ECU) /*!< CAN filter 21 data 1 register */ +#define CAN_F22DATA1(canx) REG32((canx) + 0x000002F4U) /*!< CAN filter 22 data 1 register */ +#define CAN_F23DATA1(canx) REG32((canx) + 0x000002FCU) /*!< CAN filter 23 data 1 register */ +#define CAN_F24DATA1(canx) REG32((canx) + 0x00000304U) /*!< CAN filter 24 data 1 register */ +#define CAN_F25DATA1(canx) REG32((canx) + 0x0000030CU) /*!< CAN filter 25 data 1 register */ +#define CAN_F26DATA1(canx) REG32((canx) + 0x00000314U) /*!< CAN filter 26 data 1 register */ +#define CAN_F27DATA1(canx) REG32((canx) + 0x0000031CU) /*!< CAN filter 27 data 1 register */ + +/* CAN transmit mailbox bank */ +#define CAN_TMI(canx, bank) REG32((canx) + 0x180U + ((bank) * 0x10U)) /*!< CAN transmit mailbox identifier register */ +#define CAN_TMP(canx, bank) REG32((canx) + 0x184U + ((bank) * 0x10U)) /*!< CAN transmit mailbox property register */ +#define CAN_TMDATA0(canx, bank) REG32((canx) + 0x188U + ((bank) * 0x10U)) /*!< CAN transmit mailbox data0 register */ +#define CAN_TMDATA1(canx, bank) REG32((canx) + 0x18CU + ((bank) * 0x10U)) /*!< CAN transmit mailbox data1 register */ + +/* CAN filter bank */ +#define CAN_FDATA0(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x0U) /*!< CAN filter data 0 register */ +#define CAN_FDATA1(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x4U) /*!< CAN filter data 1 register */ + +/* CAN receive FIFO mailbox bank */ +#define CAN_RFIFOMI(canx, bank) REG32((canx) + 0x1B0U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox identifier register */ +#define CAN_RFIFOMP(canx, bank) REG32((canx) + 0x1B4U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox property register */ +#define CAN_RFIFOMDATA0(canx, bank) REG32((canx) + 0x1B8U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data0 register */ +#define CAN_RFIFOMDATA1(canx, bank) REG32((canx) + 0x1BCU + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data1 register */ + +/* bits definitions */ +/* CAN_CTL */ +#define CAN_CTL_IWMOD BIT(0) /*!< initial working mode */ +#define CAN_CTL_SLPWMOD BIT(1) /*!< sleep working mode */ +#define CAN_CTL_TFO BIT(2) /*!< transmit FIFO order */ +#define CAN_CTL_RFOD BIT(3) /*!< receive FIFO overwrite disable */ +#define CAN_CTL_ARD BIT(4) /*!< automatic retransmission disable */ +#define CAN_CTL_AWU BIT(5) /*!< automatic wakeup */ +#define CAN_CTL_ABOR BIT(6) /*!< automatic bus-off recovery */ +#define CAN_CTL_TTC BIT(7) /*!< time triggered communication */ +#define CAN_CTL_SWRST BIT(15) /*!< CAN software reset */ +#define CAN_CTL_DFZ BIT(16) /*!< CAN debug freeze */ + +/* CAN_STAT */ +#define CAN_STAT_IWS BIT(0) /*!< initial working state */ +#define CAN_STAT_SLPWS BIT(1) /*!< sleep working state */ +#define CAN_STAT_ERRIF BIT(2) /*!< error interrupt flag*/ +#define CAN_STAT_WUIF BIT(3) /*!< status change interrupt flag of wakeup from sleep working mode */ +#define CAN_STAT_SLPIF BIT(4) /*!< status change interrupt flag of sleep working mode entering */ +#define CAN_STAT_TS BIT(8) /*!< transmitting state */ +#define CAN_STAT_RS BIT(9) /*!< receiving state */ +#define CAN_STAT_LASTRX BIT(10) /*!< last sample value of rx pin */ +#define CAN_STAT_RXL BIT(11) /*!< CAN rx signal */ + +/* CAN_TSTAT */ +#define CAN_TSTAT_MTF0 BIT(0) /*!< mailbox0 transmit finished */ +#define CAN_TSTAT_MTFNERR0 BIT(1) /*!< mailbox0 transmit finished and no error */ +#define CAN_TSTAT_MAL0 BIT(2) /*!< mailbox0 arbitration lost */ +#define CAN_TSTAT_MTE0 BIT(3) /*!< mailbox0 transmit error */ +#define CAN_TSTAT_MST0 BIT(7) /*!< mailbox0 stop transmitting */ +#define CAN_TSTAT_MTF1 BIT(8) /*!< mailbox1 transmit finished */ +#define CAN_TSTAT_MTFNERR1 BIT(9) /*!< mailbox1 transmit finished and no error */ +#define CAN_TSTAT_MAL1 BIT(10) /*!< mailbox1 arbitration lost */ +#define CAN_TSTAT_MTE1 BIT(11) /*!< mailbox1 transmit error */ +#define CAN_TSTAT_MST1 BIT(15) /*!< mailbox1 stop transmitting */ +#define CAN_TSTAT_MTF2 BIT(16) /*!< mailbox2 transmit finished */ +#define CAN_TSTAT_MTFNERR2 BIT(17) /*!< mailbox2 transmit finished and no error */ +#define CAN_TSTAT_MAL2 BIT(18) /*!< mailbox2 arbitration lost */ +#define CAN_TSTAT_MTE2 BIT(19) /*!< mailbox2 transmit error */ +#define CAN_TSTAT_MST2 BIT(23) /*!< mailbox2 stop transmitting */ +#define CAN_TSTAT_NUM BITS(24,25) /*!< mailbox number */ +#define CAN_TSTAT_TME0 BIT(26) /*!< transmit mailbox0 empty */ +#define CAN_TSTAT_TME1 BIT(27) /*!< transmit mailbox1 empty */ +#define CAN_TSTAT_TME2 BIT(28) /*!< transmit mailbox2 empty */ +#define CAN_TSTAT_TMLS0 BIT(29) /*!< last sending priority flag for mailbox0 */ +#define CAN_TSTAT_TMLS1 BIT(30) /*!< last sending priority flag for mailbox1 */ +#define CAN_TSTAT_TMLS2 BIT(31) /*!< last sending priority flag for mailbox2 */ + +/* CAN_RFIFO0 */ +#define CAN_RFIFO0_RFL0 BITS(0,1) /*!< receive FIFO0 length */ +#define CAN_RFIFO0_RFF0 BIT(3) /*!< receive FIFO0 full */ +#define CAN_RFIFO0_RFO0 BIT(4) /*!< receive FIFO0 overfull */ +#define CAN_RFIFO0_RFD0 BIT(5) /*!< receive FIFO0 dequeue */ + +/* CAN_RFIFO1 */ +#define CAN_RFIFO1_RFL1 BITS(0,1) /*!< receive FIFO1 length */ +#define CAN_RFIFO1_RFF1 BIT(3) /*!< receive FIFO1 full */ +#define CAN_RFIFO1_RFO1 BIT(4) /*!< receive FIFO1 overfull */ +#define CAN_RFIFO1_RFD1 BIT(5) /*!< receive FIFO1 dequeue */ + +/* CAN_INTEN */ +#define CAN_INTEN_TMEIE BIT(0) /*!< transmit mailbox empty interrupt enable */ +#define CAN_INTEN_RFNEIE0 BIT(1) /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INTEN_RFFIE0 BIT(2) /*!< receive FIFO0 full interrupt enable */ +#define CAN_INTEN_RFOIE0 BIT(3) /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INTEN_RFNEIE1 BIT(4) /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INTEN_RFFIE1 BIT(5) /*!< receive FIFO1 full interrupt enable */ +#define CAN_INTEN_RFOIE1 BIT(6) /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INTEN_WERRIE BIT(8) /*!< warning error interrupt enable */ +#define CAN_INTEN_PERRIE BIT(9) /*!< passive error interrupt enable */ +#define CAN_INTEN_BOIE BIT(10) /*!< bus-off interrupt enable */ +#define CAN_INTEN_ERRNIE BIT(11) /*!< error number interrupt enable */ +#define CAN_INTEN_ERRIE BIT(15) /*!< error interrupt enable */ +#define CAN_INTEN_WIE BIT(16) /*!< wakeup interrupt enable */ +#define CAN_INTEN_SLPWIE BIT(17) /*!< sleep working interrupt enable */ + +/* CAN_ERR */ +#define CAN_ERR_WERR BIT(0) /*!< warning error */ +#define CAN_ERR_PERR BIT(1) /*!< passive error */ +#define CAN_ERR_BOERR BIT(2) /*!< bus-off error */ +#define CAN_ERR_ERRN BITS(4,6) /*!< error number */ +#define CAN_ERR_TECNT BITS(16,23) /*!< transmit error count */ +#define CAN_ERR_RECNT BITS(24,31) /*!< receive error count */ + +/* CAN_BT */ +#define CAN_BT_BAUDPSC BITS(0,9) /*!< baudrate prescaler */ +#define CAN_BT_BS1_6_4 BITS(10,12) /*!< bit segment 1 [6:4] */ +#define CAN_BT_BS2_4_3 BITS(13,14) /*!< bit segment 2 [4:3] */ +#define CAN_BT_BS1_3_0 BITS(16,19) /*!< bit segment 1 [3:0] */ +#define CAN_BT_BS2_2_0 BITS(20,22) /*!< bit segment 2 [2:0]*/ +#define CAN_BT_SJW BITS(24,28) /*!< resynchronization jump width */ +#define CAN_BT_LCMOD BIT(30) /*!< loopback communication mode */ +#define CAN_BT_SCMOD BIT(31) /*!< silent communication mode */ + +/* CAN_FDCTL */ +#define CAN_FDCTL_FDEN BIT(0) /*!< FD operation enable */ +#define CAN_FDCTL_PRED BIT(2) /*!< protocol exception event detection disable */ +#define CAN_FDCTL_NISO BIT(3) /*!< ISO/Bosch */ +#define CAN_FDCTL_TDCEN BIT(4) /*!< transmitter delay compensation enable */ +#define CAN_FDCTL_TDCMOD BIT(5) /*!< transmitter delay compensation mode */ +#define CAN_FDCTL_ESIMOD BIT(6) /*!< error state indicator mode */ + +/* CAN_FDSTAT */ +#define CAN_FDSTAT_TDCV BITS(0,6) /*!< transmitter delay compensation value */ +#define CAN_FDSTAT_PRE BIT(16) /*!< protocol exception event */ + +/* CAN_FDTDC */ +#define CAN_FDTDC_TDCF BITS(0,6) /*!< transmitter delay compensation filter */ +#define CAN_FDTDC_TDCO BITS(8,14) /*!< transmitter delay compensation offset */ + +/* CAN_DBT */ +#define CAN_DBT_DBAUDPSC BITS(0,9) /*!< baud rate prescaler */ +#define CAN_DBT_DBS1 BITS(16,19) /*!< bit segment 1 */ +#define CAN_DBT_DBS2 BITS(20,22) /*!< bit segment 2 */ +#define CAN_DBT_DSJW BITS(24,26) /*!< resynchronization jump width */ + +/* CAN_TMIx */ +#define CAN_TMI_TEN BIT(0) /*!< transmit enable */ +#define CAN_TMI_FT BIT(1) /*!< frame type */ +#define CAN_TMI_FF BIT(2) /*!< frame format */ +#define CAN_TMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_TMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_TMPx */ +#define CAN_TMP_DLENC BITS(0,3) /*!< data length code */ +#define CAN_TMP_ESI BIT(4) /*!< error status indicator */ +#define CAN_TMP_BRS BIT(5) /*!< bit rate of data switch */ +#define CAN_TMP_FDF BIT(7) /*!< CAN FD frame flag */ +#define CAN_TMP_TSEN BIT(8) /*!< time stamp enable */ +#define CAN_TMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_TMDATA0x */ +#define CAN_TMDATA0_DB0 BITS(0,7) /*!< transmit data byte 0 */ +#define CAN_TMDATA0_DB1 BITS(8,15) /*!< transmit data byte 1 */ +#define CAN_TMDATA0_DB2 BITS(16,23) /*!< transmit data byte 2 */ +#define CAN_TMDATA0_DB3 BITS(24,31) /*!< transmit data byte 3 */ + +/* CAN_TMDATA1x */ +#define CAN_TMDATA1_DB4 BITS(0,7) /*!< transmit data byte 4 */ +#define CAN_TMDATA1_DB5 BITS(8,15) /*!< transmit data byte 5 */ +#define CAN_TMDATA1_DB6 BITS(16,23) /*!< transmit data byte 6 */ +#define CAN_TMDATA1_DB7 BITS(24,31) /*!< transmit data byte 7 */ + +/* CAN_RFIFOMIx */ +#define CAN_RFIFOMI_FT BIT(1) /*!< frame type */ +#define CAN_RFIFOMI_FF BIT(2) /*!< frame format */ +#define CAN_RFIFOMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_RFIFOMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_RFIFOMPx */ +#define CAN_RFIFOMP_DLENC BITS(0,3) /*!< receive data length code */ +#define CAN_RFIFOMP_ESI BIT(4) /*!< error status indicator */ +#define CAN_RFIFOMP_BRS BIT(5) /*!< bit rate of data switch */ +#define CAN_RFIFOMP_FDF BIT(7) /*!< CAN FD frame flag */ +#define CAN_RFIFOMP_FI BITS(8,15) /*!< filter index */ +#define CAN_RFIFOMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_RFIFOMDATA0x */ +#define CAN_RFIFOMDATA0_DB0 BITS(0,7) /*!< receive data byte 0 */ +#define CAN_RFIFOMDATA0_DB1 BITS(8,15) /*!< receive data byte 1 */ +#define CAN_RFIFOMDATA0_DB2 BITS(16,23) /*!< receive data byte 2 */ +#define CAN_RFIFOMDATA0_DB3 BITS(24,31) /*!< receive data byte 3 */ + +/* CAN_RFIFOMDATA1x */ +#define CAN_RFIFOMDATA1_DB4 BITS(0,7) /*!< receive data byte 4 */ +#define CAN_RFIFOMDATA1_DB5 BITS(8,15) /*!< receive data byte 5 */ +#define CAN_RFIFOMDATA1_DB6 BITS(16,23) /*!< receive data byte 6 */ +#define CAN_RFIFOMDATA1_DB7 BITS(24,31) /*!< receive data byte 7 */ + +/* CAN_FCTL */ +#define CAN_FCTL_FLD BIT(0) /*!< filter lock disable */ +#define CAN_FCTL_HBC1F BITS(8,13) /*!< header bank of CAN1 filter */ + +/* CAN_FMCFG */ +#define CAN_FMCFG_FMOD(regval) BIT(regval) /*!< filter mode, list or mask */ + +/* CAN_FSCFG */ +#define CAN_FSCFG_FS(regval) BIT(regval) /*!< filter scale, 32 bits or 16 bits */ + +/* CAN_FAFIFO */ +#define CAN_FAFIFOR_FAF(regval) BIT(regval) /*!< filter associated with FIFO */ + +/* CAN_FW */ +#define CAN_FW_FW(regval) BIT(regval) /*!< filter working */ + +/* CAN_FxDATAy */ +#define CAN_FDATA_FD(regval) BIT(regval) /*!< filter data */ + +/* constants definitions */ +/* define the CAN bit position and its register index offset */ +#define CAN_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define CAN_REG_VAL(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 6))) +#define CAN_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +#define CAN_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) +#define CAN_REG_VALS(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 12))) +#define CAN_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) +#define CAN_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +#define STAT_REG_OFFSET ((uint8_t)0x04U) /*!< STAT register offset */ +#define TSTAT_REG_OFFSET ((uint8_t)0x08U) /*!< TSTAT register offset */ +#define RFIFO0_REG_OFFSET ((uint8_t)0x0CU) /*!< RFIFO0 register offset */ +#define RFIFO1_REG_OFFSET ((uint8_t)0x10U) /*!< RFIFO1 register offset */ +#define ERR_REG_OFFSET ((uint8_t)0x18U) /*!< ERR register offset */ + +/* CAN flags */ +typedef enum { + /* flags in STAT register */ + CAN_FLAG_RXL = CAN_REGIDX_BIT(STAT_REG_OFFSET, 11U), /*!< RX level */ + CAN_FLAG_LASTRX = CAN_REGIDX_BIT(STAT_REG_OFFSET, 10U), /*!< last sample value of RX pin */ + CAN_FLAG_RS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 9U), /*!< receiving state */ + CAN_FLAG_TS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 8U), /*!< transmitting state */ + CAN_FLAG_SLPIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 4U), /*!< status change flag of entering sleep working mode */ + CAN_FLAG_WUIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 3U), /*!< status change flag of wakeup from sleep working mode */ + CAN_FLAG_ERRIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 2U), /*!< error flag */ + CAN_FLAG_SLPWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 1U), /*!< sleep working state */ + CAN_FLAG_IWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 0U), /*!< initial working state */ + /* flags in TSTAT register */ + CAN_FLAG_TMLS2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 31U), /*!< transmit mailbox 2 last sending in TX FIFO */ + CAN_FLAG_TMLS1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 30U), /*!< transmit mailbox 1 last sending in TX FIFO */ + CAN_FLAG_TMLS0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 29U), /*!< transmit mailbox 0 last sending in TX FIFO */ + CAN_FLAG_TME2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 28U), /*!< transmit mailbox 2 empty */ + CAN_FLAG_TME1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 27U), /*!< transmit mailbox 1 empty */ + CAN_FLAG_TME0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 26U), /*!< transmit mailbox 0 empty */ + CAN_FLAG_MTE2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 19U), /*!< mailbox 2 transmit error */ + CAN_FLAG_MTE1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 11U), /*!< mailbox 1 transmit error */ + CAN_FLAG_MTE0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 3U), /*!< mailbox 0 transmit error */ + CAN_FLAG_MAL2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 18U), /*!< mailbox 2 arbitration lost */ + CAN_FLAG_MAL1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 10U), /*!< mailbox 1 arbitration lost */ + CAN_FLAG_MAL0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 2U), /*!< mailbox 0 arbitration lost */ + CAN_FLAG_MTFNERR2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 17U), /*!< mailbox 2 transmit finished with no error */ + CAN_FLAG_MTFNERR1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 9U), /*!< mailbox 1 transmit finished with no error */ + CAN_FLAG_MTFNERR0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 1U), /*!< mailbox 0 transmit finished with no error */ + CAN_FLAG_MTF2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 16U), /*!< mailbox 2 transmit finished */ + CAN_FLAG_MTF1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 8U), /*!< mailbox 1 transmit finished */ + CAN_FLAG_MTF0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 0U), /*!< mailbox 0 transmit finished */ + /* flags in RFIFO0 register */ + CAN_FLAG_RFO0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 4U), /*!< receive FIFO0 overfull */ + CAN_FLAG_RFF0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 3U), /*!< receive FIFO0 full */ + /* flags in RFIFO1 register */ + CAN_FLAG_RFO1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 4U), /*!< receive FIFO1 overfull */ + CAN_FLAG_RFF1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 3U), /*!< receive FIFO1 full */ + /* flags in ERR register */ + CAN_FLAG_BOERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 2U), /*!< bus-off error */ + CAN_FLAG_PERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 1U), /*!< passive error */ + CAN_FLAG_WERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 0U), /*!< warning error */ +} can_flag_enum; + +/* CAN interrupt flags */ +typedef enum { + /* interrupt flags in STAT register */ + CAN_INT_FLAG_SLPIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 4U, 17U), /*!< status change interrupt flag of sleep working mode entering */ + CAN_INT_FLAG_WUIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 3U, 16), /*!< status change interrupt flag of wakeup from sleep working mode */ + CAN_INT_FLAG_ERRIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 2U, 15), /*!< error interrupt flag */ + /* interrupt flags in TSTAT register */ + CAN_INT_FLAG_MTF2 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 16U, 0U), /*!< mailbox 2 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF1 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 8U, 0U), /*!< mailbox 1 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF0 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 0U, 0U), /*!< mailbox 0 transmit finished interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 4U, 3U), /*!< receive FIFO0 overfull interrupt flag */ + CAN_INT_FLAG_RFF0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 3U, 2U), /*!< receive FIFO0 full interrupt flag */ + CAN_INT_FLAG_RFL0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 2U, 1U), /*!< receive FIFO0 not empty interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 4U, 6U), /*!< receive FIFO1 overfull interrupt flag */ + CAN_INT_FLAG_RFF1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 3U, 5U), /*!< receive FIFO1 full interrupt flag */ + CAN_INT_FLAG_RFL1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 2U, 4U), /*!< receive FIFO1 not empty interrupt flag */ + /* interrupt flags in ERR register */ + CAN_INT_FLAG_ERRN = CAN_REGIDX_BITS(ERR_REG_OFFSET, 3U, 11U), /*!< error number interrupt flag */ + CAN_INT_FLAG_BOERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 2U, 10U), /*!< bus-off error interrupt flag */ + CAN_INT_FLAG_PERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 1U, 9U), /*!< passive error interrupt flag */ + CAN_INT_FLAG_WERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 0U, 8U), /*!< warning error interrupt flag */ +} can_interrupt_flag_enum; + +/* CAN FD transmitter delay compensation parameters struct */ +typedef struct { + uint32_t tdc_mode; /*!< transmitter delay compensation mode */ + uint8_t tdc_filter; /*!< transmitter delay compensation filter */ + uint8_t tdc_offset; /*!< transmitter delay compensation offset */ +} can_fd_tdc_struct; + +/* CAN initialize FD frame parameters struct */ +typedef struct { + ControlStatus fd_frame; /*!< FD operation function */ + ControlStatus excp_event_detect; /*!< protocol exception event detection function*/ + ControlStatus delay_compensation; /*!< transmitter delay compensation mode */ + can_fd_tdc_struct + *p_delay_compensation; /*!< pointer to the struct of the transmitter delay compensation */ + uint32_t iso_bosch; /*!< ISO/Bosch mode choice */ + uint32_t esi_mode; /*!< error state indicator mode */ + uint8_t data_resync_jump_width; /*!< CAN resynchronization jump width */ + uint8_t data_time_segment_1; /*!< time segment 1 */ + uint8_t data_time_segment_2; /*!< time segment 2 */ + uint16_t data_prescaler; /*!< baudrate prescaler */ +} can_fdframe_struct; + +/* CAN initialize parameters structure */ +typedef struct { + uint8_t working_mode; /*!< CAN working mode */ + uint8_t resync_jump_width; /*!< CAN resynchronization jump width */ + uint8_t time_segment_1; /*!< time segment 1 */ + uint8_t time_segment_2; /*!< time segment 2 */ + ControlStatus time_triggered; /*!< time triggered communication mode */ + ControlStatus auto_bus_off_recovery; /*!< automatic bus-off recovery */ + ControlStatus auto_wake_up; /*!< automatic wake-up mode */ + ControlStatus auto_retrans; /*!< automatic retransmission mode */ + ControlStatus rec_fifo_overwrite; /*!< receive FIFO overwrite mode */ + ControlStatus trans_fifo_order; /*!< transmit FIFO order */ + uint16_t prescaler; /*!< baudrate prescaler */ +} can_parameter_struct; + +/* CAN transmit message structure */ +typedef struct { + uint32_t tx_sfid; /*!< standard format frame identifier */ + uint32_t tx_efid; /*!< extended format frame identifier */ + uint8_t tx_ff; /*!< format of frame, standard or extended format */ + uint8_t tx_ft; /*!< type of frame, data or remote */ + uint8_t tx_dlen; /*!< data length */ + uint8_t tx_data[64]; /*!< transmit data */ + uint8_t fd_flag; /*!< CAN FD frame flag */ + uint8_t fd_brs; /*!< bit rate of data switch */ + uint8_t fd_esi; /*!< error status indicator */ +} can_trasnmit_message_struct; + +/* CAN receive message structure */ +typedef struct { + uint32_t rx_sfid; /*!< standard format frame identifier */ + uint32_t rx_efid; /*!< extended format frame identifier */ + uint8_t rx_ff; /*!< format of frame, standard or extended format */ + uint8_t rx_ft; /*!< type of frame, data or remote */ + uint8_t rx_dlen; /*!< data length */ + uint8_t rx_data[64]; /*!< receive data */ + uint8_t rx_fi; /*!< filtering index */ + uint8_t fd_flag; /*!< CAN FD frame flag */ + uint8_t fd_brs; /*!< bit rate of data switch */ + uint8_t fd_esi; /*!< error status indicator */ + +} can_receive_message_struct; + +/* CAN filter parameters structure */ +typedef struct { + uint16_t filter_list_high; /*!< filter list number high bits */ + uint16_t filter_list_low; /*!< filter list number low bits */ + uint16_t filter_mask_high; /*!< filter mask number high bits */ + uint16_t filter_mask_low; /*!< filter mask number low bits */ + uint16_t filter_fifo_number; /*!< receive FIFO associated with the filter */ + uint16_t filter_number; /*!< filter number */ + uint16_t filter_mode; /*!< filter mode, list or mask */ + uint16_t filter_bits; /*!< filter scale */ + ControlStatus filter_enable; /*!< filter work or not */ +} can_filter_parameter_struct; + +/* CAN errors */ +typedef enum { + CAN_ERROR_NONE = 0, /*!< no error */ + CAN_ERROR_FILL, /*!< fill error */ + CAN_ERROR_FORMATE, /*!< format error */ + CAN_ERROR_ACK, /*!< ACK error */ + CAN_ERROR_BITRECESSIVE, /*!< bit recessive error */ + CAN_ERROR_BITDOMINANTER, /*!< bit dominant error */ + CAN_ERROR_CRC, /*!< CRC error */ + CAN_ERROR_SOFTWARECFG, /*!< software configure */ +} can_error_enum; + +/* transmit states */ +typedef enum { + CAN_TRANSMIT_FAILED = 0U, /*!< CAN transmitted failure */ + CAN_TRANSMIT_OK = 1U, /*!< CAN transmitted success */ + CAN_TRANSMIT_PENDING = 2U, /*!< CAN transmitted pending */ + CAN_TRANSMIT_NOMAILBOX = 4U, /*!< no empty mailbox to be used for CAN */ +} can_transmit_state_enum; + +/* format and fifo states */ +typedef enum { + CAN_STANDARD_FIFO0 = 0U, /*!< standard frame and used FIFO0 */ + CAN_STANDARD_FIFO1, /*!< standard frame and used FIFO1 */ + CAN_EXTENDED_FIFO0, /*!< extended frame and used FIFO0 */ + CAN_EXTENDED_FIFO1, /*!< extended frame and used FIFO1 */ +} can_format_fifo_enum; + +typedef enum { + CAN_INIT_STRUCT = 0U, /* CAN initiliaze parameters struct */ + CAN_FILTER_STRUCT, /* CAN filter parameters struct */ + CAN_FD_FRAME_STRUCT, /* CAN initiliaze FD frame parameters struct */ + CAN_TX_MESSAGE_STRUCT, /* CAN transmit message struct */ + CAN_RX_MESSAGE_STRUCT, /* CAN receive message struct */ +} can_struct_type_enum; + +/* CAN baudrate prescaler */ +#define BT_BAUDPSC(regval) (BITS(0,9) & ((uint32_t)(regval) << 0)) + +/* CAN bit segment 1*/ +#define BT_BS1(regval) ((BITS(16,19) & ((uint32_t)(regval) << 16)) | (BITS(10,12) & ((uint32_t)(regval) << 6))) +#define BT_DBS1(regval) ((BITS(16,19) & ((uint32_t)(regval) << 16))) + +/* CAN bit segment 2*/ +#define BT_BS2(regval) ((BITS(20,22) & ((uint32_t)(regval) << 20)) | (BITS(13,14) & ((uint32_t)(regval) << 10))) +#define BT_DBS2(regval) ((BITS(20,22)) & ((uint32_t)(regval) << 20)) + +/* CAN resynchronization jump width*/ +#define BT_SJW(regval) (BITS(24,28) & ((uint32_t)(regval) << 24)) +#define BT_DSJW(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) + +#define FDTDC_TDCF(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) +#define FDTDC_TDCO(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) + +/* CAN communication mode*/ +#define BT_MODE(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) + +/* CAN FDATA high 16 bits */ +#define FDATA_MASK_HIGH(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) + +/* CAN FDATA low 16 bits */ +#define FDATA_MASK_LOW(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) + +/* CAN1 filter start bank_number */ +#define FCTL_HBC1F(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) + +/* CAN transmit mailbox extended identifier */ +#define TMI_EFID(regval) (BITS(3,31) & ((uint32_t)(regval) << 3)) + +/* CAN transmit mailbox standard identifier */ +#define TMI_SFID(regval) (BITS(21,31) & ((uint32_t)(regval) << 21)) + +/* transmit data byte 0 */ +#define TMDATA0_DB0(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 1 */ +#define TMDATA0_DB1(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 2 */ +#define TMDATA0_DB2(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 3 */ +#define TMDATA0_DB3(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* transmit data byte 4 */ +#define TMDATA1_DB4(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 5 */ +#define TMDATA1_DB5(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 6 */ +#define TMDATA1_DB6(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 7 */ +#define TMDATA1_DB7(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* receive mailbox extended identifier */ +#define GET_RFIFOMI_EFID(regval) GET_BITS((uint32_t)(regval), 3U, 31U) + +/* receive mailbox standard identifier */ +#define GET_RFIFOMI_SFID(regval) GET_BITS((uint32_t)(regval), 21U, 31U) + +/* receive data length */ +#define GET_RFIFOMP_DLENC(regval) GET_BITS((uint32_t)(regval), 0U, 3U) + +/* the index of the filter by which the frame is passed */ +#define GET_RFIFOMP_FI(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 0 */ +#define GET_RFIFOMDATA0_DB0(regval) GET_BITS((uint32_t)(regval), 0U, 7U) + +/* receive data byte 1 */ +#define GET_RFIFOMDATA0_DB1(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 2 */ +#define GET_RFIFOMDATA0_DB2(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive data byte 3 */ +#define GET_RFIFOMDATA0_DB3(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* receive data byte 4 */ +#define GET_RFIFOMDATA1_DB4(regval) GET_BITS((uint32_t)(regval), 0U, 7U) + +/* receive data byte 5 */ +#define GET_RFIFOMDATA1_DB5(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 6 */ +#define GET_RFIFOMDATA1_DB6(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive data byte 7 */ +#define GET_RFIFOMDATA1_DB7(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* error number */ +#define GET_ERR_ERRN(regval) GET_BITS((uint32_t)(regval), 4U, 6U) + +/* transmit error count */ +#define GET_ERR_TECNT(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive error count */ +#define GET_ERR_RECNT(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* CAN errors */ +#define ERR_ERRN(regval) (BITS(4,6) & ((uint32_t)(regval) << 4)) +#define CAN_ERRN_0 ERR_ERRN(0U) /*!< no error */ +#define CAN_ERRN_1 ERR_ERRN(1U) /*!< fill error */ +#define CAN_ERRN_2 ERR_ERRN(2U) /*!< format error */ +#define CAN_ERRN_3 ERR_ERRN(3U) /*!< ACK error */ +#define CAN_ERRN_4 ERR_ERRN(4U) /*!< bit recessive error */ +#define CAN_ERRN_5 ERR_ERRN(5U) /*!< bit dominant error */ +#define CAN_ERRN_6 ERR_ERRN(6U) /*!< CRC error */ +#define CAN_ERRN_7 ERR_ERRN(7U) /*!< software error */ + +#define CAN_STATE_PENDING ((uint32_t)0x00000000U) /*!< CAN pending */ + +/* CAN communication mode */ +#define CAN_NORMAL_MODE ((uint8_t)0x00U) /*!< normal communication mode */ +#define CAN_LOOPBACK_MODE ((uint8_t)0x01U) /*!< loopback communication mode */ +#define CAN_SILENT_MODE ((uint8_t)0x02U) /*!< silent communication mode */ +#define CAN_SILENT_LOOPBACK_MODE ((uint8_t)0x03U) /*!< loopback and silent communication mode */ + +/* CAN resynchronisation jump width */ +#define CAN_BT_SJW_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_SJW_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_SJW_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_SJW_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_SJW_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_SJW_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_SJW_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_SJW_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ +#define CAN_BT_SJW_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ +#define CAN_BT_SJW_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ +#define CAN_BT_SJW_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ +#define CAN_BT_SJW_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ +#define CAN_BT_SJW_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ +#define CAN_BT_SJW_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ +#define CAN_BT_SJW_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ +#define CAN_BT_SJW_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ +#define CAN_BT_SJW_17TQ ((uint8_t)0x10U) /*!< 17 time quanta */ +#define CAN_BT_SJW_18TQ ((uint8_t)0x11U) /*!< 18 time quanta */ +#define CAN_BT_SJW_19TQ ((uint8_t)0x12U) /*!< 19 time quanta */ +#define CAN_BT_SJW_20TQ ((uint8_t)0x13U) /*!< 20 time quanta */ +#define CAN_BT_SJW_21TQ ((uint8_t)0x14U) /*!< 21 time quanta */ +#define CAN_BT_SJW_22TQ ((uint8_t)0x15U) /*!< 22 time quanta */ +#define CAN_BT_SJW_23TQ ((uint8_t)0x16U) /*!< 23 time quanta */ +#define CAN_BT_SJW_24TQ ((uint8_t)0x17U) /*!< 24 time quanta */ +#define CAN_BT_SJW_25TQ ((uint8_t)0x18U) /*!< 25 time quanta */ +#define CAN_BT_SJW_26TQ ((uint8_t)0x19U) /*!< 26 time quanta */ +#define CAN_BT_SJW_27TQ ((uint8_t)0x1AU) /*!< 27 time quanta */ +#define CAN_BT_SJW_28TQ ((uint8_t)0x1BU) /*!< 28 time quanta */ +#define CAN_BT_SJW_29TQ ((uint8_t)0x1CU) /*!< 29 time quanta */ +#define CAN_BT_SJW_30TQ ((uint8_t)0x1DU) /*!< 30 time quanta */ +#define CAN_BT_SJW_31TQ ((uint8_t)0x1EU) /*!< 31 time quanta */ +#define CAN_BT_SJW_32TQ ((uint8_t)0x1FU) /*!< 32 time quanta */ + +/* CAN time segment 1 */ +#define CAN_BT_BS1_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS1_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS1_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS1_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS1_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS1_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS1_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS1_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ +#define CAN_BT_BS1_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ +#define CAN_BT_BS1_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ +#define CAN_BT_BS1_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ +#define CAN_BT_BS1_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ +#define CAN_BT_BS1_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ +#define CAN_BT_BS1_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ +#define CAN_BT_BS1_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ +#define CAN_BT_BS1_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ + +/* CAN time segment 2 */ +#define CAN_BT_BS2_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS2_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS2_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS2_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS2_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS2_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS2_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS2_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ +#define CAN_BT_BS2_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ +#define CAN_BT_BS2_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ +#define CAN_BT_BS2_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ +#define CAN_BT_BS2_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ +#define CAN_BT_BS2_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ +#define CAN_BT_BS2_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ +#define CAN_BT_BS2_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ +#define CAN_BT_BS2_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ +#define CAN_BT_BS2_17TQ ((uint8_t)0x10U) /*!< 17 time quanta */ +#define CAN_BT_BS2_18TQ ((uint8_t)0x11U) /*!< 18 time quanta */ +#define CAN_BT_BS2_19TQ ((uint8_t)0x12U) /*!< 19 time quanta */ +#define CAN_BT_BS2_20TQ ((uint8_t)0x13U) /*!< 20 time quanta */ +#define CAN_BT_BS2_21TQ ((uint8_t)0x14U) /*!< 21 time quanta */ +#define CAN_BT_BS2_22TQ ((uint8_t)0x15U) /*!< 22 time quanta */ +#define CAN_BT_BS2_23TQ ((uint8_t)0x16U) /*!< 23 time quanta */ +#define CAN_BT_BS2_24TQ ((uint8_t)0x17U) /*!< 24 time quanta */ +#define CAN_BT_BS2_25TQ ((uint8_t)0x18U) /*!< 25 time quanta */ +#define CAN_BT_BS2_26TQ ((uint8_t)0x19U) /*!< 26 time quanta */ +#define CAN_BT_BS2_27TQ ((uint8_t)0x1AU) /*!< 27 time quanta */ +#define CAN_BT_BS2_28TQ ((uint8_t)0x1BU) /*!< 28 time quanta */ +#define CAN_BT_BS2_29TQ ((uint8_t)0x1CU) /*!< 29 time quanta */ +#define CAN_BT_BS2_30TQ ((uint8_t)0x1DU) /*!< 30 time quanta */ +#define CAN_BT_BS2_31TQ ((uint8_t)0x1EU) /*!< 31 time quanta */ +#define CAN_BT_BS2_32TQ ((uint8_t)0x1FU) /*!< 32 time quanta */ + +/* CAN resynchronisation jump width */ +#define CAN_DBT_SWJ_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_DBT_SWJ_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_DBT_SWJ_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_DBT_SWJ_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_DBT_SWJ_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_DBT_SWJ_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_DBT_SWJ_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_DBT_SWJ_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ + +/* CAN mailbox number */ +#define CAN_MAILBOX0 ((uint8_t)0x00U) /*!< mailbox0 */ +#define CAN_MAILBOX1 ((uint8_t)0x01U) /*!< mailbox1 */ +#define CAN_MAILBOX2 ((uint8_t)0x02U) /*!< mailbox2 */ +#define CAN_NOMAILBOX ((uint8_t)0x03U) /*!< no mailbox empty */ + +/* CAN frame format */ +#define CAN_FF_STANDARD ((uint32_t)0x00000000U) /*!< standard frame */ +#define CAN_FF_EXTENDED ((uint32_t)0x00000004U) /*!< extended frame */ + +/* CAN receive FIFO */ +#define CAN_FIFO0 ((uint8_t)0x00U) /*!< receive FIFO0 */ +#define CAN_FIFO1 ((uint8_t)0x01U) /*!< receive FIFO1 */ + +/* frame number of receive FIFO */ +#define CAN_RFIF_RFL_MASK ((uint32_t)0x00000003U) /*!< mask for frame number in receive FIFOx */ + +#define CAN_SFID_MASK ((uint32_t)0x000007FFU) /*!< mask of standard identifier */ +#define CAN_EFID_MASK ((uint32_t)0x1FFFFFFFU) /*!< mask of extended identifier */ + +/* CAN working mode */ +#define CAN_MODE_INITIALIZE ((uint8_t)0x01U) /*!< CAN initialize mode */ +#define CAN_MODE_NORMAL ((uint8_t)0x02U) /*!< CAN normal mode */ +#define CAN_MODE_SLEEP ((uint8_t)0x04U) /*!< CAN sleep mode */ + +/* filter bits */ +#define CAN_FILTERBITS_16BIT ((uint8_t)0x00U) /*!< CAN filter 16 bits */ +#define CAN_FILTERBITS_32BIT ((uint8_t)0x01U) /*!< CAN filter 32 bits */ + +/* filter mode */ +#define CAN_FILTERMODE_MASK ((uint8_t)0x00U) /*!< mask mode */ +#define CAN_FILTERMODE_LIST ((uint8_t)0x01U) /*!< list mode */ + +/* filter 16 bits mask */ +#define CAN_FILTER_MASK_16BITS ((uint32_t)0x0000FFFFU) /*!< can filter 16 bits mask */ + +/* frame type */ +#define CAN_FT_DATA ((uint32_t)0x00000000U) /*!< data frame */ +#define CAN_FT_REMOTE ((uint32_t)0x00000002U) /*!< remote frame */ + +#define CAN_ESIMOD_HARDWARE ((uint32_t)0x00000000U) /*!< displays the node error state by hardware */ +#define CAN_ESIMOD_SOFTWARE CAN_FDCTL_ESIMOD /*!< displays the node error state by software */ + +#define CAN_TDCMOD_CALC_AND_OFFSET ((uint32_t)0x00000000U) /*!< measurement and offset */ +#define CAN_TDCMOD_OFFSET CAN_FDCTL_TDCMOD /*!< only offset */ + +#define CAN_FDMOD_ISO ((uint32_t)0x00000000U) /*!< ISO mode */ +#define CAN_FDMOD_BOSCH CAN_FDCTL_NISO /*!< BOSCH mode */ + +/* CAN FD frame flag */ +#define CAN_FDF_CLASSIC (0U) /*!< classical frames */ +#define CAN_FDF_FDFRAME (1U) /*!< FD frames */ + +/* bit rate of data switch */ +#define CAN_BRS_DISABLE (0U) /*!< bit rate not switch */ +#define CAN_BRS_ENABLE (1U) /*!< the bit rate shall be switched */ + +/* error status indicator */ +#define CAN_ESI_DOMINANT (0U) /*!< transmit the dominant bit in ESI phase */ +#define CAN_ESI_RECESSIVE (1U) /*!< transmit the recessive bit in ESI phase */ + +/* CAN timeout */ +#define CAN_TIMEOUT ((uint32_t)0x0000FFFFU) /*!< timeout value */ + +/* interrupt enable bits */ +#define CAN_INT_TME CAN_INTEN_TMEIE /*!< transmit mailbox empty interrupt enable */ +#define CAN_INT_RFNE0 CAN_INTEN_RFNEIE0 /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INT_RFF0 CAN_INTEN_RFFIE0 /*!< receive FIFO0 full interrupt enable */ +#define CAN_INT_RFO0 CAN_INTEN_RFOIE0 /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INT_RFNE1 CAN_INTEN_RFNEIE1 /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INT_RFF1 CAN_INTEN_RFFIE1 /*!< receive FIFO1 full interrupt enable */ +#define CAN_INT_RFO1 CAN_INTEN_RFOIE1 /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INT_WERR CAN_INTEN_WERRIE /*!< warning error interrupt enable */ +#define CAN_INT_PERR CAN_INTEN_PERRIE /*!< passive error interrupt enable */ +#define CAN_INT_BO CAN_INTEN_BOIE /*!< bus-off interrupt enable */ +#define CAN_INT_ERRN CAN_INTEN_ERRNIE /*!< error number interrupt enable */ +#define CAN_INT_ERR CAN_INTEN_ERRIE /*!< error interrupt enable */ +#define CAN_INT_WAKEUP CAN_INTEN_WIE /*!< wakeup interrupt enable */ +#define CAN_INT_SLPW CAN_INTEN_SLPWIE /*!< sleep working interrupt enable */ + +/* function declarations */ +/* initialization functions */ +/* deinitialize CAN */ +void can_deinit(uint32_t can_periph); +/* initialize CAN structure */ +void can_struct_para_init(can_struct_type_enum type, void *p_struct); +/* initialize CAN */ +ErrStatus can_init(uint32_t can_periph, can_parameter_struct *can_parameter_init); +/* initialize CAN FD function */ +ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init); +/* CAN filter init */ +void can_filter_init(can_filter_parameter_struct *can_filter_parameter_init); +/* CAN filter mask mode initialization */ +void can_filter_mask_mode_init(uint32_t id, uint32_t mask, can_format_fifo_enum format_fifo, uint16_t filter_number); +/* CAN communication mode configure */ +ErrStatus can_monitor_mode_set(uint32_t can_periph, uint8_t mode); +/* CAN FD frame function enable */ +void can_fd_function_enable(uint32_t can_periph); +/* CAN FD frame function disable */ +void can_fd_function_disable(uint32_t can_periph); + +/* set can1 filter start bank number */ +void can1_filter_start_bank(uint8_t start_bank); +/* enable functions */ +/* CAN debug freeze enable */ +void can_debug_freeze_enable(uint32_t can_periph); +/* CAN debug freeze disable */ +void can_debug_freeze_disable(uint32_t can_periph); +/* CAN time trigger mode enable */ +void can_time_trigger_mode_enable(uint32_t can_periph); +/* CAN time trigger mode disable */ +void can_time_trigger_mode_disable(uint32_t can_periph); + +/* transmit functions */ +/* transmit CAN message */ +uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct *transmit_message); +/* get CAN transmit state */ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number); +/* stop CAN transmission */ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number); +/* CAN receive message */ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct *receive_message); +/* CAN release FIFO */ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number); +/* CAN receive message length */ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number); +/* CAN working mode */ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode); +/* CAN wakeup from sleep mode */ +ErrStatus can_wakeup(uint32_t can_periph); + +/* CAN get error type */ +can_error_enum can_error_get(uint32_t can_periph); +/* get CAN receive error number */ +uint8_t can_receive_error_number_get(uint32_t can_periph); +/* get CAN transmit error number */ +uint8_t can_transmit_error_number_get(uint32_t can_periph); + +/* interrupt & flag functions */ +/* CAN get flag state */ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag); +/* CAN clear flag state */ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag); +/* CAN interrupt enable */ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt); +/* CAN interrupt disable */ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt); +/* CAN get interrupt flag state */ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag); +/* CAN clear interrupt flag state */ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag); + +#endif /* GD32F5XX_CAN_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h new file mode 100644 index 00000000000..86614f25158 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h @@ -0,0 +1,317 @@ +/*! + \file gd32f5xx_cau.h + \brief definitions for the CAU + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_CAU_H +#define GD32F5XX_CAU_H + +#include "gd32f5xx.h" + + +/* CAU definitions */ +#define CAU CAU_BASE /*!< CAU base address */ + +/* registers definitions */ +#define CAU_CTL REG32(CAU + 0x00000000U) /*!< control register */ +#define CAU_STAT0 REG32(CAU + 0x00000004U) /*!< status register 0 */ +#define CAU_DI REG32(CAU + 0x00000008U) /*!< data input register */ +#define CAU_DO REG32(CAU + 0x0000000CU) /*!< data output register */ +#define CAU_DMAEN REG32(CAU + 0x00000010U) /*!< DMA enable register */ +#define CAU_INTEN REG32(CAU + 0x00000014U) /*!< interrupt enable register */ +#define CAU_STAT1 REG32(CAU + 0x00000018U) /*!< status register 1 */ +#define CAU_INTF REG32(CAU + 0x0000001CU) /*!< interrupt flag register */ +#define CAU_KEY0H REG32(CAU + 0x00000020U) /*!< key 0 high register */ +#define CAU_KEY0L REG32(CAU + 0x00000024U) /*!< key 0 low register */ +#define CAU_KEY1H REG32(CAU + 0x00000028U) /*!< key 1 high register */ +#define CAU_KEY1L REG32(CAU + 0x0000002CU) /*!< key 1 low register */ +#define CAU_KEY2H REG32(CAU + 0x00000030U) /*!< key 2 high register */ +#define CAU_KEY2L REG32(CAU + 0x00000034U) /*!< key 2 low register */ +#define CAU_KEY3H REG32(CAU + 0x00000038U) /*!< key 3 high register */ +#define CAU_KEY3L REG32(CAU + 0x0000003CU) /*!< key 3 low register */ +#define CAU_IV0H REG32(CAU + 0x00000040U) /*!< initial vector 0 high register */ +#define CAU_IV0L REG32(CAU + 0x00000044U) /*!< initial vector 0 low register */ +#define CAU_IV1H REG32(CAU + 0x00000048U) /*!< initial vector 1 high register */ +#define CAU_IV1L REG32(CAU + 0x0000004CU) /*!< initial vector 1 low register */ +#define CAU_GCMCCMCTXSx(x) REG32(CAU + 0x00000050U + (uint32_t)(4U * (x))) /*!< GCM or CCM mode context switch register, x = 0...7 */ +#define CAU_GCMCTXSx(x) REG32(CAU + 0x00000070U + (uint32_t)(4U * (x))) /*!< GCM mode context switch register, x = 0...7 */ + +/* bits definitions */ +/* CAU_CTL */ +#define CAU_CTL_CAUDIR BIT(2) /*!< algorithm direction */ +#define CAU_CTL_ALGM (BITS(3,5) | BIT(19)) /*!< cryptographic algorithm mode */ +#define CAU_CTL_DATAM BITS(6,7) /*!< data swapping selection */ +#define CAU_CTL_KEYM BITS(8,9) /*!< key length selection when aes mode */ +#define CAU_CTL_FFLUSH BIT(14) /*!< FIFO flush */ +#define CAU_CTL_CAUEN BIT(15) /*!< cryptographic module enable */ +#define CAU_CTL_GCM_CCMPH BITS(16,17) /*!< GCM CCM phase */ +#define CAU_CTL_NBPILB BITS(20,23) /*!< number of bytes padding in last block */ + +/* CAU_STAT0 */ +#define CAU_STAT0_IEM BIT(0) /*!< IN FIFO empty flag */ +#define CAU_STAT0_INF BIT(1) /*!< IN FIFO not full flag */ +#define CAU_STAT0_ONE BIT(2) /*!< OUT FIFO not empty flag */ +#define CAU_STAT0_OFU BIT(3) /*!< OUT FIFO full flag */ +#define CAU_STAT0_BUSY BIT(4) /*!< busy flag */ + +/* CAU_DI */ +#define CAU_DI_DI BITS(0,31) /*!< data input */ + +/* CAU_DO */ +#define CAU_DO_DO BITS(0,31) /*!< data output */ + +/* CAU_DMAEN */ +#define CAU_DMAEN_DMAIEN BIT(0) /*!< IN FIFO DMA enable */ +#define CAU_DMAEN_DMAOEN BIT(1) /*!< OUT FIFO DMA enable */ + +/* CAU_INTEN */ +#define CAU_INTEN_IINTEN BIT(0) /*!< IN FIFO interrupt enable */ +#define CAU_INTEN_OINTEN BIT(1) /*!< OUT FIFO interrupt enable */ + +/* CAU_STAT1 */ +#define CAU_STAT1_ISTA BIT(0) /*!< flag set when there is less than 4 words in IN FIFO */ +#define CAU_STAT1_OSTA BIT(1) /*!< flag set when there is one or more word in OUT FIFO */ + +/* CAU_INTF */ +#define CAU_INTF_IINTF BIT(0) /*!< IN FIFO interrupt flag */ +#define CAU_INTF_OINTF BIT(1) /*!< OUT FIFO interrupt flag */ + +/* CAU_KEYxH x=0..3 */ +#define CAU_KEYXH_KEYXH BITS(0,31) /*!< the key for des, tdes, aes */ + +/* CAU_KEYxL x=0..3 */ +#define CAU_KEYXL_KEYXL BITS(0,31) /*!< the key for des, tdes, aes */ + +/* CAU_IVxH x=0..1 */ +#define CAU_IVXH_IVXH BITS(0,31) /*!< the initialization vector for des, tdes, aes */ + +/* CAU_IVxL x=0..1 */ +#define CAU_IVXL_IVXL BITS(0,31) /*!< the initialization vector for des, tdes, aes */ + +/* constants definitions */ +/* structure for keys initialization of the cau */ +typedef struct { + uint32_t key_0_high; /*!< key 0 high */ + uint32_t key_0_low; /*!< key 0 low */ + uint32_t key_1_high; /*!< key 1 high */ + uint32_t key_1_low; /*!< key 1 low */ + uint32_t key_2_high; /*!< key 2 high */ + uint32_t key_2_low; /*!< key 2 low */ + uint32_t key_3_high; /*!< key 3 high */ + uint32_t key_3_low; /*!< key 3 low */ +} cau_key_parameter_struct; + +/* structure for vectors initialization of the cau */ +typedef struct { + uint32_t iv_0_high; /*!< init vector 0 high */ + uint32_t iv_0_low; /*!< init vector 0 low */ + uint32_t iv_1_high; /*!< init vector 1 high */ + uint32_t iv_1_low; /*!< init vector 1 low */ +} cau_iv_parameter_struct; + +/* structure for cau context swapping */ +typedef struct { + uint32_t ctl_config; /*!< current configuration */ + uint32_t iv_0_high; /*!< init vector 0 high */ + uint32_t iv_0_low; /*!< init vector 0 low */ + uint32_t iv_1_high; /*!< init vector 1 high */ + uint32_t iv_1_low; /*!< init vector 1 low */ + uint32_t key_0_high; /*!< key 0 high */ + uint32_t key_0_low; /*!< key 0 low */ + uint32_t key_1_high; /*!< key 1 high */ + uint32_t key_1_low; /*!< key 1 low */ + uint32_t key_2_high; /*!< key 2 high */ + uint32_t key_2_low; /*!< key 2 low */ + uint32_t key_3_high; /*!< key 3 high */ + uint32_t key_3_low; /*!< key 3 low */ + uint32_t gcmccmctxs[8]; /*!< GCM or CCM mode context switch */ + uint32_t gcmctxs[8]; /*!< GCM mode context switch */ +} cau_context_parameter_struct; + +/* structure for encrypt and decrypt parameters */ +typedef struct { + uint32_t alg_dir; /*!< algorithm direction */ + uint8_t *key; /*!< key */ + uint32_t key_size; /*!< key size in bytes */ + uint8_t *iv; /*!< initialization vector */ + uint32_t iv_size; /*!< iv size in bytes */ + uint8_t *input; /*!< input data */ + uint32_t in_length; /*!< input data length in bytes */ + uint8_t *aad; /*!< additional authentication data */ + uint32_t aad_size; /*!< aad size */ +} cau_parameter_struct; + +/* cau_ctl register value */ +#define CAU_ENCRYPT ((uint32_t)0x00000000U) /*!< encrypt */ +#define CAU_DECRYPT CAU_CTL_CAUDIR /*!< decrypt */ + +#define CTL_ALGM(regval) ((BITS(3,5) & ((uint32_t)(regval) << 3U)) | \ + (BIT(19) & ((uint32_t)(regval) << 16U))) /*!< write value to CAU_CTL_ALGM bit field */ +#define CAU_MODE_TDES_ECB CTL_ALGM(0) /*!< TDES-ECB (3DES Electronic codebook) */ +#define CAU_MODE_TDES_CBC CTL_ALGM(1) /*!< TDES-CBC (3DES Cipher block chaining) */ +#define CAU_MODE_DES_ECB CTL_ALGM(2) /*!< DES-ECB (simple DES Electronic codebook) */ +#define CAU_MODE_DES_CBC CTL_ALGM(3) /*!< DES-CBC (simple DES Cipher block chaining) */ +#define CAU_MODE_AES_ECB CTL_ALGM(4) /*!< AES-ECB (AES Electronic codebook) */ +#define CAU_MODE_AES_CBC CTL_ALGM(5) /*!< AES-CBC (AES Cipher block chaining) */ +#define CAU_MODE_AES_CTR CTL_ALGM(6) /*!< AES-CTR (AES counter mode) */ +#define CAU_MODE_AES_KEY CTL_ALGM(7) /*!< AES decryption key preparation mode */ +#define CAU_MODE_AES_GCM CTL_ALGM(8) /*!< AES-GCM (AES Galois/counter mode) */ +#define CAU_MODE_AES_CCM CTL_ALGM(9) /*!< AES-CCM (AES combined cipher machine mode) */ +#define CAU_MODE_AES_CFB CTL_ALGM(10) /*!< AES-CFB (cipher feedback mode) */ +#define CAU_MODE_AES_OFB CTL_ALGM(11) /*!< AES-OFB (output feedback mode) */ + +#define CTL_DATAM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6U)) /*!< write value to CAU_CTL_DATAM bit field */ +#define CAU_SWAPPING_32BIT CTL_DATAM(0) /*!< no swapping */ +#define CAU_SWAPPING_16BIT CTL_DATAM(1) /*!< half-word swapping */ +#define CAU_SWAPPING_8BIT CTL_DATAM(2) /*!< bytes swapping */ +#define CAU_SWAPPING_1BIT CTL_DATAM(3) /*!< bit swapping */ + +#define CTL_KEYM(regval) (BITS(8,9) & ((uint32_t)(regval) << 8U)) /*!< write value to CAU_CTL_KEYM bit field */ +#define CAU_KEYSIZE_128BIT CTL_KEYM(0) /*!< 128 bit key length */ +#define CAU_KEYSIZE_192BIT CTL_KEYM(1) /*!< 192 bit key length */ +#define CAU_KEYSIZE_256BIT CTL_KEYM(2) /*!< 256 bit key length */ + +#define CTL_GCM_CCMPH(regval) (BITS(16,17) & ((uint32_t)(regval) << 16U)) /*!< write value to CAU_CTL_GCM_CCMPH bit field */ +#define CAU_PREPARE_PHASE CTL_GCM_CCMPH(0) /*!< prepare phase */ +#define CAU_AAD_PHASE CTL_GCM_CCMPH(1) /*!< AAD phase */ +#define CAU_ENCRYPT_DECRYPT_PHASE CTL_GCM_CCMPH(2) /*!< encryption/decryption phase */ +#define CAU_TAG_PHASE CTL_GCM_CCMPH(3) /*!< tag phase */ + +#define CAU_PADDING_BYTES(regval) (BITS(20, 23) & ((uint32_t)(regval) << 20U)) + +/* cau_stat0 register value */ +#define CAU_FLAG_INFIFO_EMPTY CAU_STAT0_IEM /*!< IN FIFO empty */ +#define CAU_FLAG_INFIFO_NO_FULL CAU_STAT0_INF /*!< IN FIFO is not full */ +#define CAU_FLAG_OUTFIFO_NO_EMPTY CAU_STAT0_ONE /*!< OUT FIFO not empty */ +#define CAU_FLAG_OUTFIFO_FULL CAU_STAT0_OFU /*!< OUT FIFO is full */ +#define CAU_FLAG_BUSY CAU_STAT0_BUSY /*!< the CAU core is busy */ + +/* cau_dmaen register value */ +#define CAU_DMA_INFIFO CAU_DMAEN_DMAIEN /*!< DMA input enable */ +#define CAU_DMA_OUTFIFO CAU_DMAEN_DMAOEN /*!< DMA output enable */ + +/* cau_inten register value */ +#define CAU_INT_INFIFO CAU_INTEN_IINTEN /*!< IN FIFO Interrupt */ +#define CAU_INT_OUTFIFO CAU_INTEN_OINTEN /*!< OUT FIFO Interrupt */ + +/* cau_stat1 register value */ +#define CAU_FLAG_INFIFO (CAU_STAT1_ISTA | BIT(31)) /*!< IN FIFO flag status */ +#define CAU_FLAG_OUTFIFO (CAU_STAT1_OSTA | BIT(31)) /*!< OUT FIFO flag status */ + +/* cau_intf register value */ +#define CAU_INT_FLAG_INFIFO CAU_INTF_IINTF /*!< IN FIFO interrupt status */ +#define CAU_INT_FLAG_OUTFIFO CAU_INTF_OINTF /*!< OUT FIFO interrupt status */ + +/* function declarations */ +/* initialization functions */ +/* reset the CAU peripheral */ +void cau_deinit(void); +/* initialize the CAU encrypt and decrypt parameter struct with the default values */ +void cau_struct_para_init(cau_parameter_struct *cau_parameter); +/* initialize the key parameter struct with the default values */ +void cau_key_struct_para_init(cau_key_parameter_struct *key_initpara); +/* initialize the vectors parameter struct with the default values */ +void cau_iv_struct_para_init(cau_iv_parameter_struct *iv_initpara); +/* initialize the context parameter struct with the default values */ +void cau_context_struct_para_init(cau_context_parameter_struct *cau_context); + +/* configuration functions */ +/* enable the CAU peripheral */ +void cau_enable(void); +/* disable the CAU peripheral */ +void cau_disable(void); +/* enable the CAU DMA interface */ +void cau_dma_enable(uint32_t dma_req); +/* disable the CAU DMA interface */ +void cau_dma_disable(uint32_t dma_req); +/* initialize the CAU peripheral */ +void cau_init(uint32_t alg_dir, uint32_t algo_mode, uint32_t swapping); +/* configure key size if use AES algorithm */ +void cau_aes_keysize_config(uint32_t key_size); +/* initialize the key parameters */ +void cau_key_init(cau_key_parameter_struct *key_initpara); +/* initialize the vectors parameters */ +void cau_iv_init(cau_iv_parameter_struct *iv_initpara); +/* configure phase */ +void cau_phase_config(uint32_t phase); +/* flush the IN and OUT FIFOs */ +void cau_fifo_flush(void); +/* return whether CAU peripheral is enabled or disabled */ +ControlStatus cau_enable_state_get(void); + +/* read and write functions */ +/* write data to the IN FIFO */ +void cau_data_write(uint32_t data); +/* return the last data entered into the output FIFO */ +uint32_t cau_data_read(void); + +/* context switch functions */ +/* save context before context switching */ +void cau_context_save(cau_context_parameter_struct *cau_context, cau_key_parameter_struct *key_initpara); +/* restore context after context switching */ +void cau_context_restore(cau_context_parameter_struct *cau_context); + +/* encrypt and decrypt functions */ +/* encrypt and decrypt using AES in ECB mode */ +ErrStatus cau_aes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using AES in CBC mode */ +ErrStatus cau_aes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using AES in CTR mode */ +ErrStatus cau_aes_ctr(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using AES in CFB mode */ +ErrStatus cau_aes_cfb(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using AES in OFB mode */ +ErrStatus cau_aes_ofb(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using AES in GCM mode */ +ErrStatus cau_aes_gcm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t *tag); +/* encrypt and decrypt using AES in CCM mode */ +ErrStatus cau_aes_ccm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t tag[], uint32_t tag_size, uint8_t aad_buf[]); +/* encrypt and decrypt using TDES in ECB mode */ +ErrStatus cau_tdes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using TDES in CBC mode */ +ErrStatus cau_tdes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using DES in ECB mode */ +ErrStatus cau_des_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); +/* encrypt and decrypt using DES in CBC mode */ +ErrStatus cau_des_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); + +/* interrupt & flag functions */ +/* get the CAU flag status */ +FlagStatus cau_flag_get(uint32_t flag); +/* enable the CAU interrupts */ +void cau_interrupt_enable(uint32_t interrupt); +/* disable the CAU interrupts */ +void cau_interrupt_disable(uint32_t interrupt); +/* get the interrupt flag */ +FlagStatus cau_interrupt_flag_get(uint32_t interrupt); + +#endif /* GD32F5XX_CAU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h new file mode 100644 index 00000000000..45a42cc350f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h @@ -0,0 +1,78 @@ +/*! + \file gd32f5xx_crc.h + \brief definitions for the CRC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_CRC_H +#define GD32F5XX_CRC_H + +#include "gd32f5xx.h" + +/* CRC definitions */ +#define CRC CRC_BASE /*!< CRC base address */ + +/* registers definitions */ +#define CRC_DATA REG32(CRC + 0x00000000U) /*!< CRC data register */ +#define CRC_FDATA REG32(CRC + 0x00000004U) /*!< CRC free data register */ +#define CRC_CTL REG32(CRC + 0x00000008U) /*!< CRC control register */ + +/* bits definitions */ +/* CRC_DATA */ +#define CRC_DATA_DATA BITS(0,31) /*!< CRC calculation result bits */ + +/* CRC_FDATA */ +#define CRC_FDATA_FDATA BITS(0,7) /*!< CRC free data bits */ + +/* CRC_CTL */ +#define CRC_CTL_RST BIT(0) /*!< CRC reset CRC_DATA register bit */ + + +/* function declarations */ +/* deinit CRC calculation unit */ +void crc_deinit(void); + +/* reset data register(CRC_DATA) to the value of 0xFFFFFFFF */ +void crc_data_register_reset(void); +/* read the value of the data register */ +uint32_t crc_data_register_read(void); + +/* read the value of the free data register */ +uint8_t crc_free_data_register_read(void); +/* write data to the free data register */ +void crc_free_data_register_write(uint8_t free_data); + +/* calculate the CRC value of a 32-bit data */ +uint32_t crc_single_data_calculate(uint32_t sdata); +/* calculate the CRC value of an array of 32-bit values */ +uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size); + +#endif /* GD32F5XX_CRC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h new file mode 100644 index 00000000000..b708c960eb1 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h @@ -0,0 +1,182 @@ +/*! + \file gd32f5xx_ctc.h + \brief definitions for the CTC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_CTC_H +#define GD32F5XX_CTC_H + +#include "gd32f5xx.h" + +/* CTC definitions */ +#define CTC CTC_BASE + +/* registers definitions */ +#define CTC_CTL0 REG32((CTC) + 0x00U) /*!< CTC control register 0 */ +#define CTC_CTL1 REG32((CTC) + 0x04U) /*!< CTC control register 1 */ +#define CTC_STAT REG32((CTC) + 0x08U) /*!< CTC status register */ +#define CTC_INTC REG32((CTC) + 0x0CU) /*!< CTC interrupt clear register */ + +/* bits definitions */ +/* CTC_CTL0 */ +#define CTC_CTL0_CKOKIE BIT(0) /*!< clock trim OK(CKOKIF) interrupt enable */ +#define CTC_CTL0_CKWARNIE BIT(1) /*!< clock trim warning(CKWARNIF) interrupt enable */ +#define CTC_CTL0_ERRIE BIT(2) /*!< error(ERRIF) interrupt enable */ +#define CTC_CTL0_EREFIE BIT(3) /*!< EREFIF interrupt enable */ +#define CTC_CTL0_CNTEN BIT(5) /*!< CTC counter enable */ +#define CTC_CTL0_AUTOTRIM BIT(6) /*!< hardware automatically trim mode */ +#define CTC_CTL0_SWREFPUL BIT(7) /*!< software reference source sync pulse */ +#define CTC_CTL0_TRIMVALUE BITS(8,13) /*!< IRC48M trim value */ + +/* CTC_CTL1 */ +#define CTC_CTL1_RLVALUE BITS(0,15) /*!< CTC counter reload value */ +#define CTC_CTL1_CKLIM BITS(16,23) /*!< clock trim base limit value */ +#define CTC_CTL1_REFPSC BITS(24,26) /*!< reference signal source prescaler */ +#define CTC_CTL1_REFSEL BITS(28,29) /*!< reference signal source selection */ +#define CTC_CTL1_REFPOL BIT(31) /*!< reference signal source polarity */ + +/* CTC_STAT */ +#define CTC_STAT_CKOKIF BIT(0) /*!< clock trim OK interrupt flag */ +#define CTC_STAT_CKWARNIF BIT(1) /*!< clock trim warning interrupt flag */ +#define CTC_STAT_ERRIF BIT(2) /*!< error interrupt flag */ +#define CTC_STAT_EREFIF BIT(3) /*!< expect reference interrupt flag */ +#define CTC_STAT_CKERR BIT(8) /*!< clock trim error bit */ +#define CTC_STAT_REFMISS BIT(9) /*!< reference sync pulse miss */ +#define CTC_STAT_TRIMERR BIT(10) /*!< trim value error bit */ +#define CTC_STAT_REFDIR BIT(15) /*!< CTC trim counter direction when reference sync pulse occurred */ +#define CTC_STAT_REFCAP BITS(16,31) /*!< CTC counter capture when reference sync pulse occurred */ + +/* CTC_INTC */ +#define CTC_INTC_CKOKIC BIT(0) /*!< CKOKIF interrupt clear bit */ +#define CTC_INTC_CKWARNIC BIT(1) /*!< CKWARNIF interrupt clear bit */ +#define CTC_INTC_ERRIC BIT(2) /*!< ERRIF interrupt clear bit */ +#define CTC_INTC_EREFIC BIT(3) /*!< EREFIF interrupt clear bit */ + +/* constants definitions */ +/* hardware automatically trim mode definitions */ +#define CTC_HARDWARE_TRIM_MODE_ENABLE CTC_CTL0_AUTOTRIM /*!< hardware automatically trim mode enable*/ +#define CTC_HARDWARE_TRIM_MODE_DISABLE ((uint32_t)0x00000000U) /*!< hardware automatically trim mode disable*/ + +/* reference signal source polarity definitions */ +#define CTC_REFSOURCE_POLARITY_FALLING CTC_CTL1_REFPOL /*!< reference signal source polarity is falling edge*/ +#define CTC_REFSOURCE_POLARITY_RISING ((uint32_t)0x00000000U) /*!< reference signal source polarity is rising edge*/ + +/* reference signal source selection definitions */ +#define CTL1_REFSEL(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) +#define CTC_REFSOURCE_GPIO CTL1_REFSEL(0) /*!< GPIO is selected */ +#define CTC_REFSOURCE_LXTAL CTL1_REFSEL(1) /*!< LXTAL is clock selected */ + +/* reference signal source prescaler definitions */ +#define CTL1_REFPSC(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) +#define CTC_REFSOURCE_PSC_OFF CTL1_REFPSC(0) /*!< reference signal not divided */ +#define CTC_REFSOURCE_PSC_DIV2 CTL1_REFPSC(1) /*!< reference signal divided by 2 */ +#define CTC_REFSOURCE_PSC_DIV4 CTL1_REFPSC(2) /*!< reference signal divided by 4 */ +#define CTC_REFSOURCE_PSC_DIV8 CTL1_REFPSC(3) /*!< reference signal divided by 8 */ +#define CTC_REFSOURCE_PSC_DIV16 CTL1_REFPSC(4) /*!< reference signal divided by 16 */ +#define CTC_REFSOURCE_PSC_DIV32 CTL1_REFPSC(5) /*!< reference signal divided by 32 */ +#define CTC_REFSOURCE_PSC_DIV64 CTL1_REFPSC(6) /*!< reference signal divided by 64 */ +#define CTC_REFSOURCE_PSC_DIV128 CTL1_REFPSC(7) /*!< reference signal divided by 128 */ + +/* CTC interrupt enable definitions */ +#define CTC_INT_CKOK CTC_CTL0_CKOKIE /*!< clock trim OK interrupt enable */ +#define CTC_INT_CKWARN CTC_CTL0_CKWARNIE /*!< clock trim warning interrupt enable */ +#define CTC_INT_ERR CTC_CTL0_ERRIE /*!< error interrupt enable */ +#define CTC_INT_EREF CTC_CTL0_EREFIE /*!< expect reference interrupt enable */ + +/* CTC interrupt source definitions */ +#define CTC_INT_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK interrupt flag */ +#define CTC_INT_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning interrupt flag */ +#define CTC_INT_FLAG_ERR CTC_STAT_ERRIF /*!< error interrupt flag */ +#define CTC_INT_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference interrupt flag */ +#define CTC_INT_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ +#define CTC_INT_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ +#define CTC_INT_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error */ + +/* CTC flag definitions */ +#define CTC_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK flag */ +#define CTC_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning flag */ +#define CTC_FLAG_ERR CTC_STAT_ERRIF /*!< error flag */ +#define CTC_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference flag */ +#define CTC_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ +#define CTC_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ +#define CTC_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error bit */ + +/* function declarations */ +/* reset ctc clock trim controller */ +void ctc_deinit(void); +/* enable CTC trim counter */ +void ctc_counter_enable(void); +/* disable CTC trim counter */ +void ctc_counter_disable(void); + +/* configure the IRC48M trim value */ +void ctc_irc48m_trim_value_config(uint8_t trim_value); +/* generate software reference source sync pulse */ +void ctc_software_refsource_pulse_generate(void); +/* configure hardware automatically trim mode */ +void ctc_hardware_trim_mode_config(uint32_t hardmode); + +/* configure reference signal source polarity */ +void ctc_refsource_polarity_config(uint32_t polarity); +/* select reference signal source */ +void ctc_refsource_signal_select(uint32_t refs); +/* configure reference signal source prescaler */ +void ctc_refsource_prescaler_config(uint32_t prescaler); +/* configure clock trim base limit value */ +void ctc_clock_limit_value_config(uint8_t limit_value); +/* configure CTC counter reload value */ +void ctc_counter_reload_value_config(uint16_t reload_value); + +/* read CTC counter capture value when reference sync pulse occurred */ +uint16_t ctc_counter_capture_value_read(void); +/* read CTC trim counter direction when reference sync pulse occurred */ +FlagStatus ctc_counter_direction_read(void); +/* read CTC counter reload value */ +uint16_t ctc_counter_reload_value_read(void); +/* read the IRC48M trim value */ +uint8_t ctc_irc48m_trim_value_read(void); + +/* interrupt & flag functions */ +/* enable the CTC interrupt */ +void ctc_interrupt_enable(uint32_t interrupt); +/* disable the CTC interrupt */ +void ctc_interrupt_disable(uint32_t interrupt); +/* get CTC interrupt flag */ +FlagStatus ctc_interrupt_flag_get(uint32_t int_flag); +/* clear CTC interrupt flag */ +void ctc_interrupt_flag_clear(uint32_t int_flag); +/* get CTC flag */ +FlagStatus ctc_flag_get(uint32_t flag); +/* clear CTC flag */ +void ctc_flag_clear(uint32_t flag); + +#endif /* GD32F5XX_CTC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h new file mode 100644 index 00000000000..705e265dd93 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h @@ -0,0 +1,277 @@ +/*! + \file gd32f5xx_dac.h + \brief definitions for the DAC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_DAC_H +#define GD32F5XX_DAC_H + +#include "gd32f5xx.h" + +/* DACx(x=0) definitions */ +#define DAC0 (DAC_BASE) + +/* registers definitions */ +#define DAC_CTL0(dacx) REG32((dacx) + 0x00000000U) /*!< DACx control register 0 */ +#define DAC_SWT(dacx) REG32((dacx) + 0x00000004U) /*!< DACx software trigger register */ +#define DAC_OUT0_R12DH(dacx) REG32((dacx) + 0x00000008U) /*!< DACx_OUT0 12-bit right-aligned data holding register */ +#define DAC_OUT0_L12DH(dacx) REG32((dacx) + 0x0000000CU) /*!< DACx_OUT0 12-bit left-aligned data holding register */ +#define DAC_OUT0_R8DH(dacx) REG32((dacx) + 0x00000010U) /*!< DACx_OUT0 8-bit right-aligned data holding register */ +#define DAC_OUT1_R12DH(dacx) REG32((dacx) + 0x00000014U) /*!< DACx_OUT1 12-bit right-aligned data holding register */ +#define DAC_OUT1_L12DH(dacx) REG32((dacx) + 0x00000018U) /*!< DACx_OUT1 12-bit left-aligned data holding register */ +#define DAC_OUT1_R8DH(dacx) REG32((dacx) + 0x0000001CU) /*!< DACx_OUT1 8-bit right-aligned data holding register */ +#define DACC_R12DH(dacx) REG32((dacx) + 0x00000020U) /*!< DACx concurrent mode 12-bit right-aligned data holding register */ +#define DACC_L12DH(dacx) REG32((dacx) + 0x00000024U) /*!< DACx concurrent mode 12-bit left-aligned data holding register */ +#define DACC_R8DH(dacx) REG32((dacx) + 0x00000028U) /*!< DACx concurrent mode 8-bit right-aligned data holding register */ +#define DAC_OUT0_DO(dacx) REG32((dacx) + 0x0000002CU) /*!< DACx_OUT0 data output register */ +#define DAC_OUT1_DO(dacx) REG32((dacx) + 0x00000030U) /*!< DACx_OUT1 data output register */ +#define DAC_STAT0(dacx) REG32((dacx) + 0x00000034U) /*!< DACx status register 0 */ + +/* bits definitions */ +/* DAC_CTL0 */ +#define DAC_CTL0_DEN0 BIT(0) /*!< DACx_OUT0 enable */ +#define DAC_CTL0_DBOFF0 BIT(1) /*!< DACx_OUT0 output buffer turn off */ +#define DAC_CTL0_DTEN0 BIT(2) /*!< DACx_OUT0 trigger enable */ +#define DAC_CTL0_DTSEL0 BITS(3,5) /*!< DACx_OUT0 trigger selection */ +#define DAC_CTL0_DWM0 BITS(6,7) /*!< DACx_OUT0 noise wave mode */ +#define DAC_CTL0_DWBW0 BITS(8,11) /*!< DACx_OUT0 noise wave bit width */ +#define DAC_CTL0_DDMAEN0 BIT(12) /*!< DACx_OUT0 DMA enable */ +#define DAC_CTL0_DDUDRIE0 BIT(13) /*!< DACx_OUT0 DMA underrun interrupt enable */ + +#define DAC_CTL0_DEN1 BIT(16) /*!< DACx_OUT1 enable */ +#define DAC_CTL0_DBOFF1 BIT(17) /*!< DACx_OUT1 output buffer turn off */ +#define DAC_CTL0_DTEN1 BIT(18) /*!< DACx_OUT1 trigger enable */ +#define DAC_CTL0_DTSEL1 BITS(19,21) /*!< DACx_OUT1 trigger selection */ +#define DAC_CTL0_DWM1 BITS(22,23) /*!< DACx_OUT1 noise wave mode */ +#define DAC_CTL0_DWBW1 BITS(24,27) /*!< DACx_OUT1 noise wave bit width */ +#define DAC_CTL0_DDMAEN1 BIT(28) /*!< DACx_OUT1 DMA enable */ +#define DAC_CTL0_DDUDRIE1 BIT(29) /*!< DACx_OUT1 DMA underrun interrupt enable */ + +/* DAC_SWT */ +#define DAC_SWT_SWTR0 BIT(0) /*!< DACx_OUT0 software trigger */ +#define DAC_SWT_SWTR1 BIT(1) /*!< DACx_OUT1 software trigger */ + +/* DAC0_OUT0_R12DH */ +#define DAC_OUT0_DH_R12 BITS(0,11) /*!< DACx_OUT0 12-bit right-aligned data */ + +/* DAC0_OUT0_L12DH */ +#define DAC_OUT0_DH_L12 BITS(4,15) /*!< DACx_OUT0 12-bit left-aligned data */ + +/* DAC0_OUT0_R8DH */ +#define DAC_OUT0_DH_R8 BITS(0,7) /*!< DACx_OUT0 8-bit right-aligned data */ + +/* DAC1_OUT1_R12DH */ +#define DAC_OUT1_DH_R12 BITS(0,11) /*!< DACx_OUT1 12-bit right-aligned data */ + +/* DAC1_OUT1_L12DH */ +#define DAC_OUT1_DH_L12 BITS(4,15) /*!< DACx_OUT1 12-bit left-aligned data */ + +/* DAC1_OUT1_R8DH */ +#define DAC_OUT1_DH_R8 BITS(0,7) /*!< DACx_OUT1 8-bit right-aligned data */ + +/* DACC_R12DH */ +#define DACC_OUT0_DH_R12 BITS(0,11) /*!< DAC concurrent mode DACx_OUT0 12-bit right-aligned data */ +#define DACC_OUT1_DH_R12 BITS(16,27) /*!< DAC concurrent mode DACx_OUT1 12-bit right-aligned data */ + +/* DACC_L12DH */ +#define DACC_OUT0_DH_L12 BITS(4,15) /*!< DAC concurrent mode DACx_OUT0 12-bit left-aligned data */ +#define DACC_OUT1_DH_L12 BITS(20,31) /*!< DAC concurrent mode DACx_OUT1 12-bit left-aligned data */ + +/* DACC_R8DH */ +#define DACC_OUT0_DH_R8 BITS(0,7) /*!< DAC concurrent mode DACx_OUT0 8-bit right-aligned data */ +#define DACC_OUT1_DH_R8 BITS(8,15) /*!< DAC concurrent mode DACx_OUT1 8-bit right-aligned data */ + +/* DAC0_OUT0_DO */ +#define DAC_OUT0_DO_BITS BITS(0,11) /*!< DACx_OUT0 12-bit output data */ + +/* DAC1_OUT1_DO */ +#define DAC_OUT1_DO_BITS BITS(0,11) /*!< DACx_OUT1 12-bit output data */ + +/* DAC_STAT0 */ +#define DAC_STAT0_DDUDR0 BIT(13) /*!< DACx_OUT0 DMA underrun flag */ +#define DAC_STAT0_DDUDR1 BIT(29) /*!< DACx_OUT1 DMA underrun flag */ + +/* constants definitions */ +/* DAC trigger source */ +#define CTL0_DTSEL(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) +#define DAC_TRIGGER_T5_TRGO CTL0_DTSEL(0) /*!< TIMER5 TRGO */ +#define DAC_TRIGGER_T7_TRGO CTL0_DTSEL(1) /*!< TIMER7 TRGO */ +#define DAC_TRIGGER_T6_TRGO CTL0_DTSEL(2) /*!< TIMER6 TRGO */ +#define DAC_TRIGGER_T4_TRGO CTL0_DTSEL(3) /*!< TIMER4 TRGO */ +#define DAC_TRIGGER_T1_TRGO CTL0_DTSEL(4) /*!< TIMER1 TRGO */ +#define DAC_TRIGGER_T3_TRGO CTL0_DTSEL(5) /*!< TIMER3 TRGO */ +#define DAC_TRIGGER_EXTI_9 CTL0_DTSEL(6) /*!< EXTI interrupt line9 event */ +#define DAC_TRIGGER_SOFTWARE CTL0_DTSEL(7) /*!< software trigger */ + +/* DAC noise wave mode */ +#define CTL0_DWM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define DAC_WAVE_DISABLE CTL0_DWM(0) /*!< wave disabled */ +#define DAC_WAVE_MODE_LFSR CTL0_DWM(1) /*!< LFSR noise mode */ +#define DAC_WAVE_MODE_TRIANGLE CTL0_DWM(2) /*!< triangle noise mode */ + +/* DAC noise wave bit width */ +#define DWBW(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define DAC_WAVE_BIT_WIDTH_1 DWBW(0) /*!< bit width of the wave signal is 1 */ +#define DAC_WAVE_BIT_WIDTH_2 DWBW(1) /*!< bit width of the wave signal is 2 */ +#define DAC_WAVE_BIT_WIDTH_3 DWBW(2) /*!< bit width of the wave signal is 3 */ +#define DAC_WAVE_BIT_WIDTH_4 DWBW(3) /*!< bit width of the wave signal is 4 */ +#define DAC_WAVE_BIT_WIDTH_5 DWBW(4) /*!< bit width of the wave signal is 5 */ +#define DAC_WAVE_BIT_WIDTH_6 DWBW(5) /*!< bit width of the wave signal is 6 */ +#define DAC_WAVE_BIT_WIDTH_7 DWBW(6) /*!< bit width of the wave signal is 7 */ +#define DAC_WAVE_BIT_WIDTH_8 DWBW(7) /*!< bit width of the wave signal is 8 */ +#define DAC_WAVE_BIT_WIDTH_9 DWBW(8) /*!< bit width of the wave signal is 9 */ +#define DAC_WAVE_BIT_WIDTH_10 DWBW(9) /*!< bit width of the wave signal is 10 */ +#define DAC_WAVE_BIT_WIDTH_11 DWBW(10) /*!< bit width of the wave signal is 11 */ +#define DAC_WAVE_BIT_WIDTH_12 DWBW(11) /*!< bit width of the wave signal is 12 */ + +/* unmask LFSR bits in DAC LFSR noise mode */ +#define DAC_LFSR_BIT0 DAC_WAVE_BIT_WIDTH_1 /*!< unmask the LFSR bit0 */ +#define DAC_LFSR_BITS1_0 DAC_WAVE_BIT_WIDTH_2 /*!< unmask the LFSR bits[1:0] */ +#define DAC_LFSR_BITS2_0 DAC_WAVE_BIT_WIDTH_3 /*!< unmask the LFSR bits[2:0] */ +#define DAC_LFSR_BITS3_0 DAC_WAVE_BIT_WIDTH_4 /*!< unmask the LFSR bits[3:0] */ +#define DAC_LFSR_BITS4_0 DAC_WAVE_BIT_WIDTH_5 /*!< unmask the LFSR bits[4:0] */ +#define DAC_LFSR_BITS5_0 DAC_WAVE_BIT_WIDTH_6 /*!< unmask the LFSR bits[5:0] */ +#define DAC_LFSR_BITS6_0 DAC_WAVE_BIT_WIDTH_7 /*!< unmask the LFSR bits[6:0] */ +#define DAC_LFSR_BITS7_0 DAC_WAVE_BIT_WIDTH_8 /*!< unmask the LFSR bits[7:0] */ +#define DAC_LFSR_BITS8_0 DAC_WAVE_BIT_WIDTH_9 /*!< unmask the LFSR bits[8:0] */ +#define DAC_LFSR_BITS9_0 DAC_WAVE_BIT_WIDTH_10 /*!< unmask the LFSR bits[9:0] */ +#define DAC_LFSR_BITS10_0 DAC_WAVE_BIT_WIDTH_11 /*!< unmask the LFSR bits[10:0] */ +#define DAC_LFSR_BITS11_0 DAC_WAVE_BIT_WIDTH_12 /*!< unmask the LFSR bits[11:0] */ + +/* triangle amplitude in DAC triangle noise mode */ +#define DAC_TRIANGLE_AMPLITUDE_1 DAC_WAVE_BIT_WIDTH_1 /*!< triangle amplitude is 1 */ +#define DAC_TRIANGLE_AMPLITUDE_3 DAC_WAVE_BIT_WIDTH_2 /*!< triangle amplitude is 3 */ +#define DAC_TRIANGLE_AMPLITUDE_7 DAC_WAVE_BIT_WIDTH_3 /*!< triangle amplitude is 7 */ +#define DAC_TRIANGLE_AMPLITUDE_15 DAC_WAVE_BIT_WIDTH_4 /*!< triangle amplitude is 15 */ +#define DAC_TRIANGLE_AMPLITUDE_31 DAC_WAVE_BIT_WIDTH_5 /*!< triangle amplitude is 31 */ +#define DAC_TRIANGLE_AMPLITUDE_63 DAC_WAVE_BIT_WIDTH_6 /*!< triangle amplitude is 63 */ +#define DAC_TRIANGLE_AMPLITUDE_127 DAC_WAVE_BIT_WIDTH_7 /*!< triangle amplitude is 127 */ +#define DAC_TRIANGLE_AMPLITUDE_255 DAC_WAVE_BIT_WIDTH_8 /*!< triangle amplitude is 255 */ +#define DAC_TRIANGLE_AMPLITUDE_511 DAC_WAVE_BIT_WIDTH_9 /*!< triangle amplitude is 511 */ +#define DAC_TRIANGLE_AMPLITUDE_1023 DAC_WAVE_BIT_WIDTH_10 /*!< triangle amplitude is 1023 */ +#define DAC_TRIANGLE_AMPLITUDE_2047 DAC_WAVE_BIT_WIDTH_11 /*!< triangle amplitude is 2047 */ +#define DAC_TRIANGLE_AMPLITUDE_4095 DAC_WAVE_BIT_WIDTH_12 /*!< triangle amplitude is 4095 */ + +/* DAC data alignment */ +#define DATA_ALIGN(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define DAC_ALIGN_12B_R DATA_ALIGN(0) /*!< 12-bit right-aligned data */ +#define DAC_ALIGN_12B_L DATA_ALIGN(1) /*!< 12-bit left-aligned data */ +#define DAC_ALIGN_8B_R DATA_ALIGN(2) /*!< 8-bit right-aligned data */ + +/* DAC output channel definitions */ +#define DAC_OUT0 ((uint8_t)0x00U) /*!< DACx_OUT0 channel */ +#define DAC_OUT1 ((uint8_t)0x01U) /*!< DACx_OUT1 channel */ + +/* DAC interrupt */ +#define DAC_INT_DDUDR0 DAC_CTL0_DDUDRIE0 /*!< DACx_OUT0 DMA underrun interrupt */ +#define DAC_INT_DDUDR1 DAC_CTL0_DDUDRIE1 /*!< DACx_OUT1 DMA underrun interrupt */ + +/* DAC interrupt flag */ +#define DAC_INT_FLAG_DDUDR0 DAC_STAT0_DDUDR0 /*!< DACx_OUT0 DMA underrun interrupt flag */ +#define DAC_INT_FLAG_DDUDR1 DAC_STAT0_DDUDR1 /*!< DACx_OUT1 DMA underrun interrupt flag */ + +/* DAC flags */ +#define DAC_FLAG_DDUDR0 DAC_STAT0_DDUDR0 /*!< DACx_OUT0 DMA underrun flag */ +#define DAC_FLAG_DDUDR1 DAC_STAT0_DDUDR1 /*!< DACx_OUT1 DMA underrun flag */ + +/* function declarations */ +/* DAC initialization functions */ +/* deinitialize DAC */ +void dac_deinit(uint32_t dac_periph); +/* enable DAC */ +void dac_enable(uint32_t dac_periph, uint8_t dac_out); +/* disable DAC */ +void dac_disable(uint32_t dac_periph, uint8_t dac_out); +/* enable DAC DMA function */ +void dac_dma_enable(uint32_t dac_periph, uint8_t dac_out); +/* disable DAC DMA function */ +void dac_dma_disable(uint32_t dac_periph, uint8_t dac_out); + +/* DAC buffer functions */ +/* enable DAC output buffer */ +void dac_output_buffer_enable(uint32_t dac_periph, uint8_t dac_out); +/* disable DAC output buffer */ +void dac_output_buffer_disable(uint32_t dac_periph, uint8_t dac_out); + +/* read and write operation functions */ +/* get DAC output value */ +uint16_t dac_output_value_get(uint32_t dac_periph, uint8_t dac_out); +/* set DAC data holding register value */ +void dac_data_set(uint32_t dac_periph, uint8_t dac_out, uint32_t dac_align, uint16_t data); + +/* DAC trigger configuration */ +/* enable DAC trigger */ +void dac_trigger_enable(uint32_t dac_periph, uint8_t dac_out); +/* disable DAC trigger */ +void dac_trigger_disable(uint32_t dac_periph, uint8_t dac_out); +/* configure DAC trigger source */ +void dac_trigger_source_config(uint32_t dac_periph, uint8_t dac_out, uint32_t triggersource); +/* enable DAC software trigger */ +void dac_software_trigger_enable(uint32_t dac_periph, uint8_t dac_out); + +/* DAC wave mode configuration */ +/* configure DAC wave mode */ +void dac_wave_mode_config(uint32_t dac_periph, uint8_t dac_out, uint32_t wave_mode); +/* configure DAC LFSR noise mode */ +void dac_lfsr_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t unmask_bits); +/* configure DAC triangle noise mode */ +void dac_triangle_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t amplitude); + +/* DAC concurrent mode configuration */ +/* enable DAC concurrent mode */ +void dac_concurrent_enable(uint32_t dac_periph); +/* disable DAC concurrent mode */ +void dac_concurrent_disable(uint32_t dac_periph); +/* enable DAC concurrent software trigger */ +void dac_concurrent_software_trigger_enable(uint32_t dac_periph); +/* enable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_enable(uint32_t dac_periph); +/* disable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_disable(uint32_t dac_periph); +/* set DAC concurrent mode data holding register value */ +void dac_concurrent_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data0, uint16_t data1); + +/* DAC interrupt and flag functions */ +/* get DAC flag */ +FlagStatus dac_flag_get(uint32_t dac_periph, uint32_t flag); +/* clear DAC flag */ +void dac_flag_clear(uint32_t dac_periph, uint32_t flag); +/* enable DAC interrupt */ +void dac_interrupt_enable(uint32_t dac_periph, uint32_t interrupt); +/* disable DAC interrupt */ +void dac_interrupt_disable(uint32_t dac_periph, uint32_t interrupt); +/* get DAC interrupt flag */ +FlagStatus dac_interrupt_flag_get(uint32_t dac_periph, uint32_t int_flag); +/* clear DAC interrupt flag */ +void dac_interrupt_flag_clear(uint32_t dac_periph, uint32_t int_flag); + +#endif /* GD32F5XX_DAC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h new file mode 100644 index 00000000000..a1b1319dec3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h @@ -0,0 +1,165 @@ +/*! + \file gd32f5xx_dbg.h + \brief definitions for the DBG + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_DBG_H +#define GD32F5XX_DBG_H + +#include "gd32f5xx.h" + +/* DBG definitions */ +#define DBG DBG_BASE + +/* registers definitions */ +#define DBG_ID REG32(DBG + 0x00U) /*!< DBG_ID code register */ +#define DBG_CTL0 REG32(DBG + 0x04U) /*!< DBG control register 0 */ +#define DBG_CTL1 REG32(DBG + 0x08U) /*!< DBG control register 1 */ +#define DBG_CTL2 REG32(DBG + 0x0CU) /*!< DBG control register 2 */ +#define DBG_CTL3 REG32(DBG + 0x10U) /*!< DBG control register 3 */ + +/* bits definitions */ +/* DBG_ID */ +#define DBG_ID_ID_CODE BITS(0,31) /*!< DBG ID code values */ + +/* DBG_CTL0 */ +#define DBG_CTL0_SLP_HOLD BIT(0) /*!< keep debugger connection during sleep mode */ +#define DBG_CTL0_DSLP_HOLD BIT(1) /*!< keep debugger connection during deepsleep mode */ +#define DBG_CTL0_STB_HOLD BIT(2) /*!< keep debugger connection during standby mode */ +#define DBG_CTL0_TRACE_IOEN BIT(5) /*!< enable trace pin assignment */ + +/* DBG_CTL1 */ +#define DBG_CTL1_TIMER1_HOLD BIT(0) /*!< hold TIMER1 counter when core is halted */ +#define DBG_CTL1_TIMER2_HOLD BIT(1) /*!< hold TIMER2 counter when core is halted */ +#define DBG_CTL1_TIMER3_HOLD BIT(2) /*!< hold TIMER3 counter when core is halted */ +#define DBG_CTL1_TIMER4_HOLD BIT(3) /*!< hold TIMER4 counter when core is halted */ +#define DBG_CTL1_TIMER5_HOLD BIT(4) /*!< hold TIMER5 counter when core is halted */ +#define DBG_CTL1_TIMER6_HOLD BIT(5) /*!< hold TIMER6 counter when core is halted */ +#define DBG_CTL1_TIMER11_HOLD BIT(6) /*!< hold TIMER11 counter when core is halted */ +#define DBG_CTL1_TIMER12_HOLD BIT(7) /*!< hold TIMER12 counter when core is halted */ +#define DBG_CTL1_TIMER13_HOLD BIT(8) /*!< hold TIMER13 counter when core is halted */ +#define DBG_CTL1_RTC_HOLD BIT(10) /*!< hold RTC calendar and wakeup counter when core is halted */ +#define DBG_CTL1_WWDGT_HOLD BIT(11) /*!< debug WWDGT kept when core is halted */ +#define DBG_CTL1_FWDGT_HOLD BIT(12) /*!< debug FWDGT kept when core is halted */ +#define DBG_CTL1_I2C3_HOLD BIT(18) /*!< hold I2C3 smbus when core is halted */ +#define DBG_CTL1_I2C4_HOLD BIT(19) /*!< hold I2C4 smbus when core is halted */ +#define DBG_CTL1_I2C5_HOLD BIT(20) /*!< hold I2C5 smbus when core is halted */ +#define DBG_CTL1_I2C0_HOLD BIT(21) /*!< hold I2C0 smbus when core is halted */ +#define DBG_CTL1_I2C1_HOLD BIT(22) /*!< hold I2C1 smbus when core is halted */ +#define DBG_CTL1_I2C2_HOLD BIT(23) /*!< hold I2C2 smbus when core is halted */ +#define DBG_CTL1_CAN0_HOLD BIT(25) /*!< debug CAN0 kept when core is halted */ +#define DBG_CTL1_CAN1_HOLD BIT(26) /*!< debug CAN1 kept when core is halted */ + +/* DBG_CTL2 */ +#define DBG_CTL2_TIMER0_HOLD BIT(0) /*!< hold TIMER0 counter when core is halted */ +#define DBG_CTL2_TIMER7_HOLD BIT(1) /*!< hold TIMER7 counter when core is halted */ +#define DBG_CTL2_TIMER8_HOLD BIT(16) /*!< hold TIMER8 counter when core is halted */ +#define DBG_CTL2_TIMER9_HOLD BIT(17) /*!< hold TIMER9 counter when core is halted */ +#define DBG_CTL2_TIMER10_HOLD BIT(18) /*!< hold TIMER10 counter when core is halted */ + +/* DBG_CTL3 */ +#define DBG_CTL3_DEVICEID BITS(0,3) /*!< device ID */ + +/* constants definitions */ +#define DBG_LOW_POWER_SLEEP DBG_CTL0_SLP_HOLD /*!< keep debugger connection during sleep mode */ +#define DBG_LOW_POWER_DEEPSLEEP DBG_CTL0_DSLP_HOLD /*!< keep debugger connection during deepsleep mode */ +#define DBG_LOW_POWER_STANDBY DBG_CTL0_STB_HOLD /*!< keep debugger connection during standby mode */ + +/* define the peripheral debug hold bit position and its register index offset */ +#define DBG_REGIDX_BIT(regidx, bitpos) (((regidx) << 6) | (bitpos)) +#define DBG_REG_VAL(periph) (REG32(DBG + ((uint32_t)(periph) >> 6))) +#define DBG_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* register index */ +enum dbg_reg_idx +{ + DBG_IDX_CTL0 = 0x04U, + DBG_IDX_CTL1 = 0x08U, + DBG_IDX_CTL2 = 0x0CU +}; + +typedef enum +{ + DBG_TIMER1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 0U), /*!< hold TIMER1 counter when core is halted */ + DBG_TIMER2_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 1U), /*!< hold TIMER2 counter when core is halted */ + DBG_TIMER3_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 2U), /*!< hold TIMER3 counter when core is halted */ + DBG_TIMER4_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 3U), /*!< hold TIMER4 counter when core is halted */ + DBG_TIMER5_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 4U), /*!< hold TIMER5 counter when core is halted */ + DBG_TIMER6_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 5U), /*!< hold TIMER6 counter when core is halted */ + DBG_TIMER11_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 6U), /*!< hold TIMER11 counter when core is halted */ + DBG_TIMER12_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 7U), /*!< hold TIMER12 counter when core is halted */ + DBG_TIMER13_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 8U), /*!< hold TIMER13 counter when core is halted */ + DBG_RTC_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 10U), /*!< hold RTC calendar and wakeup counter when core is halted */ + DBG_WWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 11U), /*!< debug WWDGT kept when core is halted */ + DBG_FWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 12U), /*!< debug FWDGT kept when core is halted */ + DBG_I2C3_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 18U), /*!< hold I2C3 smbus when core is halted */ + DBG_I2C4_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 19U), /*!< hold I2C4 smbus when core is halted */ + DBG_I2C5_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 20U), /*!< hold I2C5 smbus when core is halted */ + DBG_I2C0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 21U), /*!< hold I2C0 smbus when core is halted */ + DBG_I2C1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 22U), /*!< hold I2C1 smbus when core is halted */ + DBG_I2C2_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 23U), /*!< hold I2C2 smbus when core is halted */ + DBG_CAN0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 25U), /*!< debug CAN0 kept when core is halted */ + DBG_CAN1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 26U), /*!< debug CAN1 kept when core is halted */ + DBG_TIMER0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 0U), /*!< hold TIMER0 counter when core is halted */ + DBG_TIMER7_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 1U), /*!< hold TIMER7 counter when core is halted */ + DBG_TIMER8_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 16U), /*!< hold TIMER8 counter when core is halted */ + DBG_TIMER9_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 17U), /*!< hold TIMER9 counter when core is halted */ + DBG_TIMER10_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 18U) /*!< hold TIMER10 counter when core is halted */ +}dbg_periph_enum; + +/* function declarations */ +/* deinitialize the DBG */ +void dbg_deinit(void); +/* read DBG_ID code register */ +uint32_t dbg_id_get(void); + +/* enable low power behavior when the MCU is in debug mode */ +void dbg_low_power_enable(uint32_t dbg_low_power); +/* disable low power behavior when the MCU is in debug mode */ +void dbg_low_power_disable(uint32_t dbg_low_power); + +/* enable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_enable(dbg_periph_enum dbg_periph); +/* disable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_disable(dbg_periph_enum dbg_periph); + +/* enable trace pin assignment */ +void dbg_trace_pin_enable(void); +/* disable trace pin assignment */ +void dbg_trace_pin_disable(void); + +/* read DBG DEVICE ID */ +uint32_t dbg_deviceid_get(void); +/* write DBG DEVICEID */ +void dbg_deviceid_set(uint32_t deviceid); + +#endif /* GD32F5XX_DBG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h new file mode 100644 index 00000000000..50cca432315 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h @@ -0,0 +1,236 @@ +/*! + \file gd32f5xx_dci.h + \brief definitions for the DCI + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_DCI_H +#define GD32F5XX_DCI_H + +#include "gd32f5xx.h" + +/* DCI definitions */ +#define DCI DCI_BASE + +/* registers definitions */ +#define DCI_CTL REG32(DCI + 0x00U) /*!< DCI control register */ +#define DCI_STAT0 REG32(DCI + 0x04U) /*!< DCI status register 0 */ +#define DCI_STAT1 REG32(DCI + 0x08U) /*!< DCI status register 1 */ +#define DCI_INTEN REG32(DCI + 0x0CU) /*!< DCI interrupt enable register */ +#define DCI_INTF REG32(DCI + 0x10U) /*!< DCI interrupt flag register */ +#define DCI_INTC REG32(DCI + 0x14U) /*!< DCI interrupt clear register */ +#define DCI_SC REG32(DCI + 0x18U) /*!< DCI synchronization codes register */ +#define DCI_SCUMSK REG32(DCI + 0x1CU) /*!< DCI synchronization codes unmask register */ +#define DCI_CWSPOS REG32(DCI + 0x20U) /*!< DCI cropping window start position register */ +#define DCI_CWSZ REG32(DCI + 0x24U) /*!< DCI cropping window size register */ +#define DCI_DATA REG32(DCI + 0x28U) /*!< DCI data register */ + +/* bits definitions */ +/* DCI_CTL */ +#define DCI_CTL_CAP BIT(0) /*!< capture enable */ +#define DCI_CTL_SNAP BIT(1) /*!< snapshot mode */ +#define DCI_CTL_WDEN BIT(2) /*!< window enable */ +#define DCI_CTL_JM BIT(3) /*!< JPEG mode */ +#define DCI_CTL_ESM BIT(4) /*!< embedded synchronous mode */ +#define DCI_CTL_CKS BIT(5) /*!< clock polarity selection */ +#define DCI_CTL_HPS BIT(6) /*!< horizontal polarity selection */ +#define DCI_CTL_VPS BIT(7) /*!< vertical polarity selection */ +#define DCI_CTL_FR BITS(8,9) /*!< frame rate */ +#define DCI_CTL_DCIF BITS(10,11) /*!< digital camera interface format */ +#define DCI_CTL_DCIEN BIT(14) /*!< DCI enable */ + +/* DCI_STAT0 */ +#define DCI_STAT0_HS BIT(0) /*!< HS line status */ +#define DCI_STAT0_VS BIT(1) /*!< VS line status */ +#define DCI_STAT0_FV BIT(2) /*!< FIFO valid */ + +/* DCI_STAT1 */ +#define DCI_STAT1_EFF BIT(0) /*!< end of frame flag */ +#define DCI_STAT1_OVRF BIT(1) /*!< FIFO overrun flag */ +#define DCI_STAT1_ESEF BIT(2) /*!< embedded synchronous error flag */ +#define DCI_STAT1_VSF BIT(3) /*!< vsync flag */ +#define DCI_STAT1_ELF BIT(4) /*!< end of line flag */ + +/* DCI_INTEN */ +#define DCI_INTEN_EFIE BIT(0) /*!< end of frame interrupt enable */ +#define DCI_INTEN_OVRIE BIT(1) /*!< FIFO overrun interrupt enable */ +#define DCI_INTEN_ESEIE BIT(2) /*!< embedded synchronous error interrupt enable */ +#define DCI_INTEN_VSIE BIT(3) /*!< vsync interrupt enable */ +#define DCI_INTEN_ELIE BIT(4) /*!< end of line interrupt enable */ + +/* DCI_INTF */ +#define DCI_INTF_EFIF BIT(0) /*!< end of frame interrupt flag */ +#define DCI_INTF_OVRIF BIT(1) /*!< FIFO overrun interrupt flag */ +#define DCI_INTF_ESEIF BIT(2) /*!< embedded synchronous error interrupt flag */ +#define DCI_INTF_VSIF BIT(3) /*!< vsync interrupt flag */ +#define DCI_INTF_ELIF BIT(4) /*!< end of line interrupt flag */ + +/* DCI_INTC */ +#define DCI_INTC_EFFC BIT(0) /*!< clear end of frame flag */ +#define DCI_INTC_OVRFC BIT(1) /*!< clear FIFO overrun flag */ +#define DCI_INTC_ESEFC BIT(2) /*!< clear embedded synchronous error flag */ +#define DCI_INTC_VSFC BIT(3) /*!< vsync flag clear */ +#define DCI_INTC_ELFC BIT(4) /*!< end of line flag clear */ + +/* DCI_SC */ +#define DCI_SC_FS BITS(0,7) /*!< frame start code in embedded synchronous mode */ +#define DCI_SC_LS BITS(8,15) /*!< line start code in embedded synchronous mode */ +#define DCI_SC_LE BITS(16,23) /*!< line end code in embedded synchronous mode */ +#define DCI_SC_FE BITS(24,31) /*!< frame end code in embedded synchronous mode */ + +/* DCI_SCUNMSK */ +#define DCI_SCUMSK_FSM BITS(0,7) /*!< frame start code unmask bits in embedded synchronous mode */ +#define DCI_SCUMSK_LSM BITS(8,15) /*!< line start code unmask bits in embedded synchronous mode */ +#define DCI_SCUMSK_LEM BITS(16,23) /*!< line end code unmask bits in embedded synchronous mode */ +#define DCI_SCUMSK_FEM BITS(24,31) /*!< frame end code unmask bits in embedded synchronous mode */ + +/* DCI_CWSPOS */ +#define DCI_CWSPOS_WHSP BITS(0,13) /*!< window horizontal start position */ +#define DCI_CWSPOS_WVSP BITS(16,28) /*!< window vertical start position */ + +/* DCI_CWSZ */ +#define DCI_CWSZ_WHSZ BITS(0,13) /*!< window horizontal size */ +#define DCI_CWSZ_WVSZ BITS(16,29) /*!< window vertical size */ + +/* constants definitions */ +/* DCI parameter structure definitions */ +typedef struct +{ + uint32_t capture_mode; /*!< DCI capture mode: continuous or snapshot */ + uint32_t clock_polarity; /*!< clock polarity selection */ + uint32_t hsync_polarity; /*!< horizontal polarity selection */ + uint32_t vsync_polarity; /*!< vertical polarity selection */ + uint32_t frame_rate; /*!< frame capture rate */ + uint32_t interface_format; /*!< digital camera interface format */ +}dci_parameter_struct; + +#define DCI_CAPTURE_MODE_CONTINUOUS ((uint32_t)0x00000000U) /*!< continuous capture mode */ +#define DCI_CAPTURE_MODE_SNAPSHOT DCI_CTL_SNAP /*!< snapshot capture mode */ + +#define DCI_CK_POLARITY_FALLING ((uint32_t)0x00000000U) /*!< capture at falling edge */ +#define DCI_CK_POLARITY_RISING DCI_CTL_CKS /*!< capture at rising edge */ + +#define DCI_HSYNC_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level during blanking period */ +#define DCI_HSYNC_POLARITY_HIGH DCI_CTL_HPS /*!< high level during blanking period */ + +#define DCI_VSYNC_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level during blanking period */ +#define DCI_VSYNC_POLARITY_HIGH DCI_CTL_VPS /*!< high level during blanking period*/ + +#define CTL_FR(regval) (BITS(8,9)&((uint32_t)(regval) << 8U)) +#define DCI_FRAME_RATE_ALL CTL_FR(0) /*!< capture all frames */ +#define DCI_FRAME_RATE_1_2 CTL_FR(1) /*!< capture one in 2 frames */ +#define DCI_FRAME_RATE_1_4 CTL_FR(2) /*!< capture one in 4 frames */ + +#define CTL_DCIF(regval) (BITS(10,11)&((uint32_t)(regval) << 10U)) +#define DCI_INTERFACE_FORMAT_8BITS CTL_DCIF(0) /*!< 8-bit data on every pixel clock */ +#define DCI_INTERFACE_FORMAT_10BITS CTL_DCIF(1) /*!< 10-bit data on every pixel clock */ +#define DCI_INTERFACE_FORMAT_12BITS CTL_DCIF(2) /*!< 12-bit data on every pixel clock */ +#define DCI_INTERFACE_FORMAT_14BITS CTL_DCIF(3) /*!< 14-bit data on every pixel clock */ + +/* DCI interrupt constants definitions */ +#define DCI_INT_EF BIT(0) /*!< end of frame interrupt */ +#define DCI_INT_OVR BIT(1) /*!< FIFO overrun interrupt */ +#define DCI_INT_ESE BIT(2) /*!< embedded synchronous error interrupt */ +#define DCI_INT_VSYNC BIT(3) /*!< vsync interrupt */ +#define DCI_INT_EL BIT(4) /*!< end of line interrupt */ + +/* DCI interrupt flag definitions */ +#define DCI_INT_FLAG_EF BIT(0) /*!< end of frame interrupt flag */ +#define DCI_INT_FLAG_OVR BIT(1) /*!< FIFO overrun interrupt flag */ +#define DCI_INT_FLAG_ESE BIT(2) /*!< embedded synchronous error interrupt flag */ +#define DCI_INT_FLAG_VSYNC BIT(3) /*!< vsync interrupt flag */ +#define DCI_INT_FLAG_EL BIT(4) /*!< end of line interrupt flag */ + +/* DCI flag definitions */ +#define DCI_FLAG_HS DCI_STAT0_HS /*!< HS line status */ +#define DCI_FLAG_VS DCI_STAT0_VS /*!< VS line status */ +#define DCI_FLAG_FV DCI_STAT0_FV /*!< FIFO valid */ +#define DCI_FLAG_EF (DCI_STAT1_EFF | BIT(31)) /*!< end of frame flag */ +#define DCI_FLAG_OVR (DCI_STAT1_OVRF | BIT(31)) /*!< FIFO overrun flag */ +#define DCI_FLAG_ESE (DCI_STAT1_ESEF | BIT(31)) /*!< embedded synchronous error flag */ +#define DCI_FLAG_VSYNC (DCI_STAT1_VSF | BIT(31)) /*!< vsync flag */ +#define DCI_FLAG_EL (DCI_STAT1_ELF | BIT(31)) /*!< end of line flag */ + +/* function declarations */ +/* initialization functions */ +/* DCI deinit */ +void dci_deinit(void); +/* initialize DCI registers */ +void dci_init(dci_parameter_struct* dci_struct); + +/* enable DCI function */ +void dci_enable(void); +/* disable DCI function */ +void dci_disable(void); +/* enable DCI capture */ +void dci_capture_enable(void); +/* disable DCI capture */ +void dci_capture_disable(void); +/* enable DCI jpeg mode */ +void dci_jpeg_enable(void); +/* disable DCI jpeg mode */ +void dci_jpeg_disable(void); + +/* function configuration */ +/* enable cropping window function */ +void dci_crop_window_enable(void); +/* disable cropping window function */ +void dci_crop_window_disable(void); +/* configure DCI cropping window */ +void dci_crop_window_config(uint16_t start_x, uint16_t start_y, uint16_t size_width, uint16_t size_height); + +/* enable embedded synchronous mode */ +void dci_embedded_sync_enable(void); +/* disable embedded synchronous mode */ +void dci_embedded_sync_disable(void); +/* configure synchronous codes in embedded synchronous mode */ +void dci_sync_codes_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end); +/* configure synchronous codes unmask in embedded synchronous mode */ +void dci_sync_codes_unmask_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end); + +/* read DCI data register */ +uint32_t dci_data_read(void); + +/* interrupt & flag functions */ +/* get specified flag */ +FlagStatus dci_flag_get(uint32_t flag); +/* enable specified DCI interrupt */ +void dci_interrupt_enable(uint32_t interrupt); +/* disable specified DCI interrupt */ +void dci_interrupt_disable(uint32_t interrupt); + + +/* get specified interrupt flag */ +FlagStatus dci_interrupt_flag_get(uint32_t int_flag); +/* clear specified interrupt flag */ +void dci_interrupt_flag_clear(uint32_t int_flag); + +#endif /* GD32F5XX_DCI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h new file mode 100644 index 00000000000..988d5d959cf --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h @@ -0,0 +1,433 @@ +/*! + \file gd32f5xx_dma.h + \brief definitions for the DMA + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_DMA_H +#define GD32F5XX_DMA_H + +#include "gd32f5xx.h" + +/* DMA definitions */ +#define DMA0 (DMA_BASE) /*!< DMA0 base address */ +#define DMA1 (DMA_BASE + 0x00000400U) /*!< DMA1 base address */ + +/* registers definitions */ +#define DMA_INTF0(dmax) REG32((dmax) + 0x00000000U) /*!< DMA interrupt flag register 0 */ +#define DMA_INTF1(dmax) REG32((dmax) + 0x00000004U) /*!< DMA interrupt flag register 1 */ +#define DMA_INTC0(dmax) REG32((dmax) + 0x00000008U) /*!< DMA interrupt flag clear register 0 */ +#define DMA_INTC1(dmax) REG32((dmax) + 0x0000000CU) /*!< DMA interrupt flag clear register 1 */ + +#define DMA_CH0CTL(dmax) REG32((dmax) + 0x00000010U) /*!< DMA channel 0 control register */ +#define DMA_CH0CNT(dmax) REG32((dmax) + 0x00000014U) /*!< DMA channel 0 counter register */ +#define DMA_CH0PADDR(dmax) REG32((dmax) + 0x00000018U) /*!< DMA channel 0 peripheral base address register */ +#define DMA_CH0M0ADDR(dmax) REG32((dmax) + 0x0000001CU) /*!< DMA channel 0 memory 0 base address register */ +#define DMA_CH0M1ADDR(dmax) REG32((dmax) + 0x00000020U) /*!< DMA channel 0 memory 1 base address register */ +#define DMA_CH0FCTL(dmax) REG32((dmax) + 0x00000024U) /*!< DMA channel 0 FIFO control register */ + +#define DMA_CH1CTL(dmax) REG32((dmax) + 0x00000028U) /*!< DMA channel 1 control register */ +#define DMA_CH1CNT(dmax) REG32((dmax) + 0x0000002CU) /*!< DMA channel 1 counter register */ +#define DMA_CH1PADDR(dmax) REG32((dmax) + 0x00000030U) /*!< DMA channel 1 peripheral base address register */ +#define DMA_CH1M0ADDR(dmax) REG32((dmax) + 0x00000034U) /*!< DMA channel 1 memory 0 base address register */ +#define DMA_CH1M1ADDR(dmax) REG32((dmax) + 0x00000038U) /*!< DMA channel 1 memory 1 base address register */ +#define DMA_CH1FCTL(dmax) REG32((dmax) + 0x0000003CU) /*!< DMA channel 1 FIFO control register */ + +#define DMA_CH2CTL(dmax) REG32((dmax) + 0x00000040U) /*!< DMA channel 2 control register */ +#define DMA_CH2CNT(dmax) REG32((dmax) + 0x00000044U) /*!< DMA channel 2 counter register */ +#define DMA_CH2PADDR(dmax) REG32((dmax) + 0x00000048U) /*!< DMA channel 2 peripheral base address register */ +#define DMA_CH2M0ADDR(dmax) REG32((dmax) + 0x0000004CU) /*!< DMA channel 2 memory 0 base address register */ +#define DMA_CH2M1ADDR(dmax) REG32((dmax) + 0x00000050U) /*!< DMA channel 2 memory 1 base address register */ +#define DMA_CH2FCTL(dmax) REG32((dmax) + 0x00000054U) /*!< DMA channel 2 FIFO control register */ + +#define DMA_CH3CTL(dmax) REG32((dmax) + 0x00000058U) /*!< DMA channel 3 control register */ +#define DMA_CH3CNT(dmax) REG32((dmax) + 0x0000005CU) /*!< DMA channel 3 counter register */ +#define DMA_CH3PADDR(dmax) REG32((dmax) + 0x00000060U) /*!< DMA channel 3 peripheral base address register */ +#define DMA_CH3M0ADDR(dmax) REG32((dmax) + 0x00000064U) /*!< DMA channel 3 memory 0 base address register */ +#define DMA_CH3M1ADDR(dmax) REG32((dmax) + 0x00000068U) /*!< DMA channel 3 memory 1 base address register */ +#define DMA_CH3FCTL(dmax) REG32((dmax) + 0x0000006CU) /*!< DMA channel 3 FIFO control register */ + +#define DMA_CH4CTL(dmax) REG32((dmax) + 0x00000070U) /*!< DMA channel 4 control register */ +#define DMA_CH4CNT(dmax) REG32((dmax) + 0x00000074U) /*!< DMA channel 4 counter register */ +#define DMA_CH4PADDR(dmax) REG32((dmax) + 0x00000078U) /*!< DMA channel 4 peripheral base address register */ +#define DMA_CH4M0ADDR(dmax) REG32((dmax) + 0x0000007CU) /*!< DMA channel 4 memory 0 base address register */ +#define DMA_CH4M1ADDR(dmax) REG32((dmax) + 0x00000080U) /*!< DMA channel 4 memory 1 base address register */ +#define DMA_CH4FCTL(dmax) REG32((dmax) + 0x00000084U) /*!< DMA channel 4 FIFO control register */ + +#define DMA_CH5CTL(dmax) REG32((dmax) + 0x00000088U) /*!< DMA channel 5 control register */ +#define DMA_CH5CNT(dmax) REG32((dmax) + 0x0000008CU) /*!< DMA channel 5 counter register */ +#define DMA_CH5PADDR(dmax) REG32((dmax) + 0x00000090U) /*!< DMA channel 5 peripheral base address register */ +#define DMA_CH5M0ADDR(dmax) REG32((dmax) + 0x00000094U) /*!< DMA channel 5 memory 0 base address register */ +#define DMA_CH5M1ADDR(dmax) REG32((dmax) + 0x00000098U) /*!< DMA channel 5 memory 1 base address register */ +#define DMA_CH5FCTL(dmax) REG32((dmax) + 0x0000009CU) /*!< DMA channel 5 FIFO control register */ + +#define DMA_CH6CTL(dmax) REG32((dmax) + 0x000000A0U) /*!< DMA channel 6 control register */ +#define DMA_CH6CNT(dmax) REG32((dmax) + 0x000000A4U) /*!< DMA channel 6 counter register */ +#define DMA_CH6PADDR(dmax) REG32((dmax) + 0x000000A8U) /*!< DMA channel 6 peripheral base address register */ +#define DMA_CH6M0ADDR(dmax) REG32((dmax) + 0x000000ACU) /*!< DMA channel 6 memory 0 base address register */ +#define DMA_CH6M1ADDR(dmax) REG32((dmax) + 0x000000B0U) /*!< DMA channel 6 memory 1 base address register */ +#define DMA_CH6FCTL(dmax) REG32((dmax) + 0x000000B4U) /*!< DMA channel 6 FIFO control register */ + +#define DMA_CH7CTL(dmax) REG32((dmax) + 0x000000B8U) /*!< DMA channel 7 control register */ +#define DMA_CH7CNT(dmax) REG32((dmax) + 0x000000BCU) /*!< DMA channel 7 counter register */ +#define DMA_CH7PADDR(dmax) REG32((dmax) + 0x000000C0U) /*!< DMA channel 7 peripheral base address register */ +#define DMA_CH7M0ADDR(dmax) REG32((dmax) + 0x000000C4U) /*!< DMA channel 7 memory 0 base address register */ +#define DMA_CH7M1ADDR(dmax) REG32((dmax) + 0x000000C8U) /*!< DMA channel 7 memory 1 base address register */ +#define DMA_CH7FCTL(dmax) REG32((dmax) + 0x000000CCU) /*!< DMA channel 7 FIFO control register */ + +/* bits definitions */ +/* DMA_INTF */ +#define DMA_INTF_FEEIF BIT(0) /*!< FIFO error and exception flag */ +#define DMA_INTF_SDEIF BIT(2) /*!< single data mode exception flag */ +#define DMA_INTF_TAEIF BIT(3) /*!< transfer access error flag */ +#define DMA_INTF_HTFIF BIT(4) /*!< half transfer finish flag */ +#define DMA_INTF_FTFIF BIT(5) /*!< full transger finish flag */ + +/* DMA_INTC */ +#define DMA_INTC_FEEIFC BIT(0) /*!< clear FIFO error and exception flag */ +#define DMA_INTC_SDEIFC BIT(2) /*!< clear single data mode exception flag */ +#define DMA_INTC_TAEIFC BIT(3) /*!< clear single data mode exception flag */ +#define DMA_INTC_HTFIFC BIT(4) /*!< clear half transfer finish flag */ +#define DMA_INTC_FTFIFC BIT(5) /*!< clear full transger finish flag */ + +/* DMA_CHxCTL,x=0..7 */ +#define DMA_CHXCTL_CHEN BIT(0) /*!< channel x enable */ +#define DMA_CHXCTL_SDEIE BIT(1) /*!< enable bit for channel x single data mode exception interrupt */ +#define DMA_CHXCTL_TAEIE BIT(2) /*!< enable bit for channel x tranfer access error interrupt */ +#define DMA_CHXCTL_HTFIE BIT(3) /*!< enable bit for channel x half transfer finish interrupt */ +#define DMA_CHXCTL_FTFIE BIT(4) /*!< enable bit for channel x full transfer finish interrupt */ +#define DMA_CHXCTL_TFCS BIT(5) /*!< transfer flow controller select */ +#define DMA_CHXCTL_TM BITS(6,7) /*!< transfer mode */ +#define DMA_CHXCTL_CMEN BIT(8) /*!< circulation mode */ +#define DMA_CHXCTL_PNAGA BIT(9) /*!< next address generation algorithm of peripheral */ +#define DMA_CHXCTL_MNAGA BIT(10) /*!< next address generation algorithm of memory */ +#define DMA_CHXCTL_PWIDTH BITS(11,12) /*!< transfer width of peipheral */ +#define DMA_CHXCTL_MWIDTH BITS(13,14) /*!< transfer width of memory */ +#define DMA_CHXCTL_PAIF BIT(15) /*!< peripheral address increment fixed */ +#define DMA_CHXCTL_PRIO BITS(16,17) /*!< priority level */ +#define DMA_CHXCTL_SBMEN BIT(18) /*!< switch-buffer mode enable */ +#define DMA_CHXCTL_MBS BIT(19) /*!< memory buffer select */ +#define DMA_CHXCTL_PBURST BITS(21,22) /*!< transfer burst type of peripheral */ +#define DMA_CHXCTL_MBURST BITS(23,24) /*!< transfer burst type of memory */ +#define DMA_CHXCTL_PERIEN BITS(25,27) /*!< peripheral enable */ + +/* DMA_CHxCNT,x=0..7 */ +#define DMA_CHXCNT_CNT BITS(0,15) /*!< transfer counter */ + +/* DMA_CHxPADDR,x=0..7 */ +#define DMA_CHXPADDR_PADDR BITS(0,31) /*!< peripheral base address */ + +/* DMA_CHxM0ADDR,x=0..7 */ +#define DMA_CHXM0ADDR_M0ADDR BITS(0,31) /*!< memory 0 base address */ + +/* DMA_CHxM1ADDR,x=0..7 */ +#define DMA_CHXM1ADDR_M0ADDR BITS(0,31) /*!< memory 1 base address */ + +/* DMA_CHxFCTL,x=0..7 */ +#define DMA_CHXFCTL_FCCV BITS(0,1) /*!< FIFO counter critical value */ +#define DMA_CHXFCTL_MDMEN BIT(2) /*!< multi-data mode enable */ +#define DMA_CHXFCTL_FCNT BITS(3,5) /*!< FIFO counter */ +#define DMA_CHXFCTL_FEEIE BIT(7) /*!< FIFO exception interrupt enable */ + +/* constants definitions */ +/* DMA channel select */ +typedef enum +{ + DMA_CH0 = 0, /*!< DMA Channel 0 */ + DMA_CH1, /*!< DMA Channel 1 */ + DMA_CH2, /*!< DMA Channel 2 */ + DMA_CH3, /*!< DMA Channel 3 */ + DMA_CH4, /*!< DMA Channel 4 */ + DMA_CH5, /*!< DMA Channel 5 */ + DMA_CH6, /*!< DMA Channel 6 */ + DMA_CH7 /*!< DMA Channel 7 */ +} dma_channel_enum; + +/* DMA peripheral select */ +typedef enum +{ + DMA_SUBPERI0 = 0, /*!< DMA Peripheral 0 */ + DMA_SUBPERI1, /*!< DMA Peripheral 1 */ + DMA_SUBPERI2, /*!< DMA Peripheral 2 */ + DMA_SUBPERI3, /*!< DMA Peripheral 3 */ + DMA_SUBPERI4, /*!< DMA Peripheral 4 */ + DMA_SUBPERI5, /*!< DMA Peripheral 5 */ + DMA_SUBPERI6, /*!< DMA Peripheral 6 */ + DMA_SUBPERI7 /*!< DMA Peripheral 7 */ +} dma_subperipheral_enum; + +/* DMA multidata mode initialize struct */ +typedef struct +{ + uint32_t periph_addr; /*!< peripheral base address */ + uint32_t periph_width; /*!< transfer data size of peripheral */ + uint32_t periph_inc; /*!< peripheral increasing mode */ + + uint32_t memory0_addr; /*!< memory 0 base address */ + uint32_t memory_width; /*!< transfer data size of memory */ + uint32_t memory_inc; /*!< memory increasing mode */ + + uint32_t memory_burst_width; /*!< multi data mode enable */ + uint32_t periph_burst_width; /*!< multi data mode enable */ + uint32_t critical_value; /*!< FIFO critical */ + + uint32_t circular_mode; /*!< DMA circular mode */ + uint32_t direction; /*!< channel data transfer direction */ + uint32_t number; /*!< channel transfer number */ + uint32_t priority; /*!< channel priority level */ +}dma_multi_data_parameter_struct; + +/* DMA singledata mode initialize struct */ +typedef struct +{ + uint32_t periph_addr; /*!< peripheral base address */ + uint32_t periph_inc; /*!< peripheral increasing mode */ + + uint32_t memory0_addr; /*!< memory 0 base address */ + uint32_t memory_inc; /*!< memory increasing mode */ + + uint32_t periph_memory_width; /*!< transfer data size of peripheral */ + + uint32_t circular_mode; /*!< DMA circular mode */ + uint32_t direction; /*!< channel data transfer direction */ + uint32_t number; /*!< channel transfer number */ + uint32_t priority; /*!< channel priority level */ +} dma_single_data_parameter_struct; + +#define DMA_FLAG_ADD(flag,channel) ((uint32_t)((flag)<<((((uint32_t)(channel)*6U))+((uint32_t)(((uint32_t)(channel)) >> 1U)&0x01U)*4U))) /*!< DMA channel flag shift */ + +/* DMA_register address */ +#define DMA_CHCTL(dma,channel) REG32(((dma) + 0x10U) + 0x18U*(channel)) /*!< the address of DMA channel CHXCTL register */ +#define DMA_CHCNT(dma,channel) REG32(((dma) + 0x14U) + 0x18U*(channel)) /*!< the address of DMA channel CHXCNT register */ +#define DMA_CHPADDR(dma,channel) REG32(((dma) + 0x18U) + 0x18U*(channel)) /*!< the address of DMA channel CHXPADDR register */ +#define DMA_CHM0ADDR(dma,channel) REG32(((dma) + 0x1CU) + 0x18U*(channel)) /*!< the address of DMA channel CHXM0ADDR register */ +#define DMA_CHM1ADDR(dma,channel) REG32(((dma) + 0x20U) + 0x18U*(channel)) /*!< the address of DMA channel CHXM1ADDR register */ +#define DMA_CHFCTL(dma,channel) REG32(((dma) + 0x24U) + 0x18U*(channel)) /*!< the address of DMA channel CHXMADDR register */ + +/* peripheral select */ +#define CHCTL_PERIEN(regval) (BITS(25,27) & ((uint32_t)(regval) << 25)) +#define DMA_PERIPH_0_SELECT CHCTL_PERIEN(0) /*!< peripheral 0 select */ +#define DMA_PERIPH_1_SELECT CHCTL_PERIEN(1) /*!< peripheral 1 select */ +#define DMA_PERIPH_2_SELECT CHCTL_PERIEN(2) /*!< peripheral 2 select */ +#define DMA_PERIPH_3_SELECT CHCTL_PERIEN(3) /*!< peripheral 3 select */ +#define DMA_PERIPH_4_SELECT CHCTL_PERIEN(4) /*!< peripheral 4 select */ +#define DMA_PERIPH_5_SELECT CHCTL_PERIEN(5) /*!< peripheral 5 select */ +#define DMA_PERIPH_6_SELECT CHCTL_PERIEN(6) /*!< peripheral 6 select */ +#define DMA_PERIPH_7_SELECT CHCTL_PERIEN(7) /*!< peripheral 7 select */ + +/* burst type of memory */ +#define CHCTL_MBURST(regval) (BITS(23,24) & ((uint32_t)(regval) << 23)) +#define DMA_MEMORY_BURST_SINGLE CHCTL_MBURST(0) /*!< single burst */ +#define DMA_MEMORY_BURST_4_BEAT CHCTL_MBURST(1) /*!< 4-beat burst */ +#define DMA_MEMORY_BURST_8_BEAT CHCTL_MBURST(2) /*!< 8-beat burst */ +#define DMA_MEMORY_BURST_16_BEAT CHCTL_MBURST(3) /*!< 16-beat burst */ + +/* burst type of peripheral */ +#define CHCTL_PBURST(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) +#define DMA_PERIPH_BURST_SINGLE CHCTL_PBURST(0) /*!< single burst */ +#define DMA_PERIPH_BURST_4_BEAT CHCTL_PBURST(1) /*!< 4-beat burst */ +#define DMA_PERIPH_BURST_8_BEAT CHCTL_PBURST(2) /*!< 8-beat burst */ +#define DMA_PERIPH_BURST_16_BEAT CHCTL_PBURST(3) /*!< 16-beat burst */ + +/* channel priority level */ +#define CHCTL_PRIO(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define DMA_PRIORITY_LOW CHCTL_PRIO(0) /*!< low priority */ +#define DMA_PRIORITY_MEDIUM CHCTL_PRIO(1) /*!< medium priority */ +#define DMA_PRIORITY_HIGH CHCTL_PRIO(2) /*!< high priority */ +#define DMA_PRIORITY_ULTRA_HIGH CHCTL_PRIO(3) /*!< ultra high priority */ + +/* transfer data width of memory */ +#define CHCTL_MWIDTH(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) +#define DMA_MEMORY_WIDTH_8BIT CHCTL_MWIDTH(0) /*!< transfer data width of memory is 8-bit */ +#define DMA_MEMORY_WIDTH_16BIT CHCTL_MWIDTH(1) /*!< transfer data width of memory is 16-bit */ +#define DMA_MEMORY_WIDTH_32BIT CHCTL_MWIDTH(2) /*!< transfer data width of memory is 32-bit */ + +/* transfer data width of peripheral */ +#define CHCTL_PWIDTH(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) +#define DMA_PERIPH_WIDTH_8BIT CHCTL_PWIDTH(0) /*!< transfer data width of peripheral is 8-bit */ +#define DMA_PERIPH_WIDTH_16BIT CHCTL_PWIDTH(1) /*!< transfer data width of peripheral is 16-bit */ +#define DMA_PERIPH_WIDTH_32BIT CHCTL_PWIDTH(2) /*!< transfer data width of peripheral is 32-bit */ + +/* channel transfer mode */ +#define CHCTL_TM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define DMA_PERIPH_TO_MEMORY CHCTL_TM(0) /*!< read from peripheral and write to memory */ +#define DMA_MEMORY_TO_PERIPH CHCTL_TM(1) /*!< read from memory and write to peripheral */ +#define DMA_MEMORY_TO_MEMORY CHCTL_TM(2) /*!< read from memory and write to memory */ + +/* FIFO counter critical value */ +#define CHFCTL_FCCV(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define DMA_FIFO_1_WORD CHFCTL_FCCV(0) /*!< critical value 1 word */ +#define DMA_FIFO_2_WORD CHFCTL_FCCV(1) /*!< critical value 2 word */ +#define DMA_FIFO_3_WORD CHFCTL_FCCV(2) /*!< critical value 3 word */ +#define DMA_FIFO_4_WORD CHFCTL_FCCV(3) /*!< critical value 4 word */ + +/* memory select */ +#define DMA_MEMORY_0 ((uint32_t)0x00000000U) /*!< select memory 0 */ +#define DMA_MEMORY_1 ((uint32_t)0x00000001U) /*!< select memory 1 */ + +/* DMA circular mode */ +#define DMA_CIRCULAR_MODE_ENABLE ((uint32_t)0x00000000U) /*!< circular mode enable */ +#define DMA_CIRCULAR_MODE_DISABLE ((uint32_t)0x00000001U) /*!< circular mode disable */ + +/* DMA flow controller select */ +#define DMA_FLOW_CONTROLLER_DMA ((uint32_t)0x00000000U) /*!< DMA is the flow controler */ +#define DMA_FLOW_CONTROLLER_PERI ((uint32_t)0x00000001U) /*!< peripheral is the flow controler */ + +/* peripheral increasing mode */ +#define DMA_PERIPH_INCREASE_ENABLE ((uint32_t)0x00000000U) /*!< next address of peripheral is increasing address mode */ +#define DMA_PERIPH_INCREASE_DISABLE ((uint32_t)0x00000001U) /*!< next address of peripheral is fixed address mode */ +#define DMA_PERIPH_INCREASE_FIX ((uint32_t)0x00000002U) /*!< next address of peripheral is increasing fixed */ + +/* memory increasing mode */ +#define DMA_MEMORY_INCREASE_ENABLE ((uint32_t)0x00000000U) /*!< next address of memory is increasing address mode */ +#define DMA_MEMORY_INCREASE_DISABLE ((uint32_t)0x00000001U) /*!< next address of memory is fixed address mode */ + +/* FIFO status */ +#define DMA_FIFO_STATUS_NODATA ((uint32_t)0x00000000U) /*!< the data in the FIFO less than 1 word */ +#define DMA_FIFO_STATUS_1_WORD ((uint32_t)0x00000001U) /*!< the data in the FIFO more than 1 word, less than 2 words */ +#define DMA_FIFO_STATUS_2_WORD ((uint32_t)0x00000002U) /*!< the data in the FIFO more than 2 word, less than 3 words */ +#define DMA_FIFO_STATUS_3_WORD ((uint32_t)0x00000003U) /*!< the data in the FIFO more than 3 word, less than 4 words */ +#define DMA_FIFO_STATUS_EMPTY ((uint32_t)0x00000004U) /*!< the data in the FIFO is empty */ +#define DMA_FIFO_STATUS_FULL ((uint32_t)0x00000005U) /*!< the data in the FIFO is full */ + +/* DMA reset value */ +#define DMA_CHCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCTL register */ +#define DMA_CHCNT_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCNT register */ +#define DMA_CHPADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXPADDR register */ +#define DMA_CHMADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXMADDR register */ +#define DMA_CHINTF_RESET_VALUE ((uint32_t)0x0000003DU) /*!< clear DMA channel CHXINTFS register */ +#define DMA_CHFCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXFCTL register */ + +/* DMA_INTF register */ +/* interrupt flag bits */ +#define DMA_INT_FLAG_FEE DMA_INTF_FEEIF /*!< FIFO error and exception flag */ +#define DMA_INT_FLAG_SDE DMA_INTF_SDEIF /*!< single data mode exception flag */ +#define DMA_INT_FLAG_TAE DMA_INTF_TAEIF /*!< transfer access error flag */ +#define DMA_INT_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag */ +#define DMA_INT_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag */ + +/* flag bits */ +#define DMA_FLAG_FEE DMA_INTF_FEEIF /*!< FIFO error and exception flag */ +#define DMA_FLAG_SDE DMA_INTF_SDEIF /*!< single data mode exception flag */ +#define DMA_FLAG_TAE DMA_INTF_TAEIF /*!< transfer access error flag */ +#define DMA_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag */ +#define DMA_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag */ + +/* DMA_CHxCTL register */ +/* interrupt enable bits */ +#define DMA_INT_SDE DMA_CHXCTL_SDEIE /*!< enable bit for channel x single data mode exception interrupt */ +#define DMA_INT_TAE DMA_CHXCTL_TAEIE /*!< enable bit for channel x tranfer access error interrupt */ +#define DMA_INT_HTF DMA_CHXCTL_HTFIE /*!< enable bit for channel x half transfer finish interrupt */ +#define DMA_INT_FTF DMA_CHXCTL_FTFIE /*!< enable bit for channel x full transfer finish interrupt */ +#define DMA_INT_FEE DMA_CHXFCTL_FEEIE /*!< FIFO exception interrupt enable */ + +/* function declarations */ +/* DMA deinitialization and initialization functions */ +/* deinitialize DMA a channel registers */ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx); +/* initialize the DMA single data mode parameters struct with the default values */ +void dma_single_data_para_struct_init(dma_single_data_parameter_struct* init_struct); +/* initialize the DMA multi data mode parameters struct with the default values */ +void dma_multi_data_para_struct_init(dma_multi_data_parameter_struct* init_struct); +/* DMA single data mode initialize */ +void dma_single_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_single_data_parameter_struct* init_struct); +/* DMA multi data mode initialize */ +void dma_multi_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_multi_data_parameter_struct* init_struct); + +/* DMA configuration functions */ +/* set DMA peripheral base address */ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); +/* set DMA Memory base address */ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t memory_flag, uint32_t address); + +/* set the number of remaining data to be transferred by the DMA */ +void dma_transfer_number_config(uint32_t dma_periph,dma_channel_enum channelx, uint32_t number); +/* get the number of remaining data to be transferred by the DMA */ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx); + +/* configure priority level of DMA channel */ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority); + +/* configure transfer burst beats of memory */ +void dma_memory_burst_beats_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t mbeat); +/* configure transfer burst beats of peripheral */ +void dma_periph_burst_beats_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t pbeat); +/* configure transfer data size of memory */ +void dma_memory_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t msize); +/* configure transfer data size of peripheral */ +void dma_periph_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t psize); + +/* configure next address increasement algorithm of memory */ +void dma_memory_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm); +/* configure next address increasement algorithm of peripheral */ +void dma_peripheral_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm); + +/* enable DMA circulation mode */ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA circulation mode */ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable DMA channel */ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA channel */ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx); + +/* configure the direction of data transfer on the channel */ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t direction); + +/* DMA switch buffer mode config */ +void dma_switch_buffer_mode_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t memory1_addr, uint32_t memory_select); +/* DMA using memory get */ +uint32_t dma_using_memory_get(uint32_t dma_periph, dma_channel_enum channelx); + +/* DMA channel peripheral select */ +void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph); +/* DMA flow controller configure */ +void dma_flow_controller_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t controller); +/* DMA switch buffer mode enable */ +void dma_switch_buffer_mode_enable(uint32_t dma_periph, dma_channel_enum channelx, ControlStatus newvalue); +/* DMA FIFO status get */ +uint32_t dma_fifo_status_get(uint32_t dma_periph, dma_channel_enum channelx); + +/* flag and interrupt functions */ +/* check DMA flag is set or not */ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* clear DMA a channel flag */ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* enable DMA interrupt */ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); +/* disable DMA interrupt */ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); +/* get DMA interrupt flag is set or not */ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); +/* clear DMA a channel interrupt flag */ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); + +#endif /* GD32F5XX_DMA_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h new file mode 100644 index 00000000000..2b86046283b --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h @@ -0,0 +1,1697 @@ +/*! + \file gd32f5xx_enet.h + \brief definitions for the ENET + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_ENET_H +#define GD32F5XX_ENET_H + +#include "gd32f5xx.h" +#include + +#define IF_USE_EXTERNPHY_LIB 0 +#if (1 == IF_USE_EXTERNPHY_LIB) +#include "phy.h" +#endif + +#ifndef ENET_RXBUF_NUM +#define ENET_RXBUF_NUM 5U /*!< ethernet Rx DMA descriptor number */ +#endif + +#ifndef ENET_TXBUF_NUM +#define ENET_TXBUF_NUM 5U /*!< ethernet Tx DMA descriptor number */ +#endif + +#ifndef ENET_RXBUF_SIZE +#define ENET_RXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet receive buffer size */ +#endif + +#ifndef ENET_TXBUF_SIZE +#define ENET_TXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet transmit buffer size */ +#endif + +//#define SELECT_DESCRIPTORS_ENHANCED_MODE + +//#define USE_DELAY + +#ifndef _PHY_H_ +#define DP83848 0 +#define LAN8700 1 +#define PHY_TYPE DP83848 + +#define PHY_ADDRESS ((uint16_t)1U) /*!< phy address determined by the hardware */ + +/* PHY read write timeouts */ +#define PHY_READ_TO ((uint32_t)0x0004FFFFU) /*!< PHY read timeout */ +#define PHY_WRITE_TO ((uint32_t)0x0004FFFFU) /*!< PHY write timeout */ + +/* PHY delay */ +#define PHY_RESETDELAY ((uint32_t)0x008FFFFFU) /*!< PHY reset delay */ +#define PHY_CONFIGDELAY ((uint32_t)0x00FFFFFFU) /*!< PHY configure delay */ + +/* PHY register address */ +#define PHY_REG_BCR 0U /*!< tranceiver basic control register */ +#define PHY_REG_BSR 1U /*!< tranceiver basic status register */ + +/* PHY basic control register */ +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< enable phy loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< configure speed to 100 Mbit/s and the full-duplex mode */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< configure speed to 100 Mbit/s and the half-duplex mode */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< configure speed to 10 Mbit/s and the full-duplex mode */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< configure speed to 10 Mbit/s and the half-duplex mode */ +#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) /*!< enable the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< isolate PHY from MII */ + +/* 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 */ + +#if(PHY_TYPE == LAN8700) +#define PHY_SR 31U /*!< tranceiver status register */ +#define PHY_SPEED_STATUS ((uint16_t)0x0004) /*!< configured information of speed: 10Mbit/s */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0010) /*!< configured information of duplex: full-duplex */ +#elif(PHY_TYPE == DP83848) +#define PHY_SR 16U /*!< tranceiver status register */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< configured information of speed: 10Mbit/s */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< configured information of duplex: full-duplex */ +#endif /* PHY_TYPE */ + +#endif /* _PHY_H_ */ + + +/* ENET definitions */ +#define ENET ENET_BASE + +/* registers definitions */ +#define ENET_MAC_CFG REG32((ENET) + 0x00U) /*!< ethernet MAC configuration register */ +#define ENET_MAC_FRMF REG32((ENET) + 0x04U) /*!< ethernet MAC frame filter register */ +#define ENET_MAC_HLH REG32((ENET) + 0x08U) /*!< ethernet MAC hash list high register */ +#define ENET_MAC_HLL REG32((ENET) + 0x0CU) /*!< ethernet MAC hash list low register */ +#define ENET_MAC_PHY_CTL REG32((ENET) + 0x10U) /*!< ethernet MAC PHY control register */ +#define ENET_MAC_PHY_DATA REG32((ENET) + 0x14U) /*!< ethernet MAC PHY data register */ +#define ENET_MAC_FCTL REG32((ENET) + 0x18U) /*!< ethernet MAC flow control register */ +#define ENET_MAC_VLT REG32((ENET) + 0x1CU) /*!< ethernet MAC VLAN tag register */ +#define ENET_MAC_RWFF REG32((ENET) + 0x28U) /*!< ethernet MAC remote wakeup frame filter register */ +#define ENET_MAC_WUM REG32((ENET) + 0x2CU) /*!< ethernet MAC wakeup management register */ +#define ENET_MAC_DBG REG32((ENET) + 0x34U) /*!< ethernet MAC debug register */ +#define ENET_MAC_INTF REG32((ENET) + 0x38U) /*!< ethernet MAC interrupt flag register */ +#define ENET_MAC_INTMSK REG32((ENET) + 0x3CU) /*!< ethernet MAC interrupt mask register */ +#define ENET_MAC_ADDR0H REG32((ENET) + 0x40U) /*!< ethernet MAC address 0 high register */ +#define ENET_MAC_ADDR0L REG32((ENET) + 0x44U) /*!< ethernet MAC address 0 low register */ +#define ENET_MAC_ADDR1H REG32((ENET) + 0x48U) /*!< ethernet MAC address 1 high register */ +#define ENET_MAC_ADDR1L REG32((ENET) + 0x4CU) /*!< ethernet MAC address 1 low register */ +#define ENET_MAC_ADDT2H REG32((ENET) + 0x50U) /*!< ethernet MAC address 2 high register */ +#define ENET_MAC_ADDR2L REG32((ENET) + 0x54U) /*!< ethernet MAC address 2 low register */ +#define ENET_MAC_ADDR3H REG32((ENET) + 0x58U) /*!< ethernet MAC address 3 high register */ +#define ENET_MAC_ADDR3L REG32((ENET) + 0x5CU) /*!< ethernet MAC address 3 low register */ +#define ENET_MAC_FCTH REG32((ENET) + 0x1080U) /*!< ethernet MAC flow control threshold register */ + +#define ENET_MSC_CTL REG32((ENET) + 0x100U) /*!< ethernet MSC control register */ +#define ENET_MSC_RINTF REG32((ENET) + 0x104U) /*!< ethernet MSC receive interrupt flag register */ +#define ENET_MSC_TINTF REG32((ENET) + 0x108U) /*!< ethernet MSC transmit interrupt flag register */ +#define ENET_MSC_RINTMSK REG32((ENET) + 0x10CU) /*!< ethernet MSC receive interrupt mask register */ +#define ENET_MSC_TINTMSK REG32((ENET) + 0x110U) /*!< ethernet MSC transmit interrupt mask register */ +#define ENET_MSC_SCCNT REG32((ENET) + 0x14CU) /*!< ethernet MSC transmitted good frames after a single collision counter register */ +#define ENET_MSC_MSCCNT REG32((ENET) + 0x150U) /*!< ethernet MSC transmitted good frames after more than a single collision counter register */ +#define ENET_MSC_TGFCNT REG32((ENET) + 0x168U) /*!< ethernet MSC transmitted good frames counter register */ +#define ENET_MSC_RFCECNT REG32((ENET) + 0x194U) /*!< ethernet MSC received frames with CRC error counter register */ +#define ENET_MSC_RFAECNT REG32((ENET) + 0x198U) /*!< ethernet MSC received frames with alignment error counter register */ +#define ENET_MSC_RGUFCNT REG32((ENET) + 0x1C4U) /*!< ethernet MSC received good unicast frames counter register */ + +#define ENET_PTP_TSCTL REG32((ENET) + 0x700U) /*!< ethernet PTP time stamp control register */ +#define ENET_PTP_SSINC REG32((ENET) + 0x704U) /*!< ethernet PTP subsecond increment register */ +#define ENET_PTP_TSH REG32((ENET) + 0x708U) /*!< ethernet PTP time stamp high register */ +#define ENET_PTP_TSL REG32((ENET) + 0x70CU) /*!< ethernet PTP time stamp low register */ +#define ENET_PTP_TSUH REG32((ENET) + 0x710U) /*!< ethernet PTP time stamp update high register */ +#define ENET_PTP_TSUL REG32((ENET) + 0x714U) /*!< ethernet PTP time stamp update low register */ +#define ENET_PTP_TSADDEND REG32((ENET) + 0x718U) /*!< ethernet PTP time stamp addend register */ +#define ENET_PTP_ETH REG32((ENET) + 0x71CU) /*!< ethernet PTP expected time high register */ +#define ENET_PTP_ETL REG32((ENET) + 0x720U) /*!< ethernet PTP expected time low register */ +#define ENET_PTP_TSF REG32((ENET) + 0x728U) /*!< ethernet PTP time stamp flag register */ +#define ENET_PTP_PPSCTL REG32((ENET) + 0x72CU) /*!< ethernet PTP PPS control register */ + +#define ENET_DMA_BCTL REG32((ENET) + 0x1000U) /*!< ethernet DMA bus control register */ +#define ENET_DMA_TPEN REG32((ENET) + 0x1004U) /*!< ethernet DMA transmit poll enable register */ +#define ENET_DMA_RPEN REG32((ENET) + 0x1008U) /*!< ethernet DMA receive poll enable register */ +#define ENET_DMA_RDTADDR REG32((ENET) + 0x100CU) /*!< ethernet DMA receive descriptor table address register */ +#define ENET_DMA_TDTADDR REG32((ENET) + 0x1010U) /*!< ethernet DMA transmit descriptor table address register */ +#define ENET_DMA_STAT REG32((ENET) + 0x1014U) /*!< ethernet DMA status register */ +#define ENET_DMA_CTL REG32((ENET) + 0x1018U) /*!< ethernet DMA control register */ +#define ENET_DMA_INTEN REG32((ENET) + 0x101CU) /*!< ethernet DMA interrupt enable register */ +#define ENET_DMA_MFBOCNT REG32((ENET) + 0x1020U) /*!< ethernet DMA missed frame and buffer overflow counter register */ +#define ENET_DMA_RSWDC REG32((ENET) + 0x1024U) /*!< ethernet DMA receive state watchdog counter register */ +#define ENET_DMA_CTDADDR REG32((ENET) + 0x1048U) /*!< ethernet DMA current transmit descriptor address register */ +#define ENET_DMA_CRDADDR REG32((ENET) + 0x104CU) /*!< ethernet DMA current receive descriptor address register */ +#define ENET_DMA_CTBADDR REG32((ENET) + 0x1050U) /*!< ethernet DMA current transmit buffer address register */ +#define ENET_DMA_CRBADDR REG32((ENET) + 0x1054U) /*!< ethernet DMA current receive buffer address register */ + +/* bits definitions */ +/* ENET_MAC_CFG */ +#define ENET_MAC_CFG_REN BIT(2) /*!< receiver enable */ +#define ENET_MAC_CFG_TEN BIT(3) /*!< transmitter enable */ +#define ENET_MAC_CFG_DFC BIT(4) /*!< defferal check */ +#define ENET_MAC_CFG_BOL BITS(5,6) /*!< back-off limit */ +#define ENET_MAC_CFG_APCD BIT(7) /*!< automatic pad/CRC drop */ +#define ENET_MAC_CFG_RTD BIT(9) /*!< retry disable */ +#define ENET_MAC_CFG_IPFCO BIT(10) /*!< IP frame checksum offload */ +#define ENET_MAC_CFG_DPM BIT(11) /*!< duplex mode */ +#define ENET_MAC_CFG_LBM BIT(12) /*!< loopback mode */ +#define ENET_MAC_CFG_ROD BIT(13) /*!< receive own disable */ +#define ENET_MAC_CFG_SPD BIT(14) /*!< fast eneternet speed */ +#define ENET_MAC_CFG_CSD BIT(16) /*!< carrier sense disable */ +#define ENET_MAC_CFG_IGBS BITS(17,19) /*!< inter-frame gap bit selection */ +#define ENET_MAC_CFG_JBD BIT(22) /*!< jabber disable */ +#define ENET_MAC_CFG_WDD BIT(23) /*!< watchdog disable */ +#define ENET_MAC_CFG_TFCD BIT(25) /*!< type frame CRC dropping */ + +/* ENET_MAC_FRMF */ +#define ENET_MAC_FRMF_PM BIT(0) /*!< promiscuous mode */ +#define ENET_MAC_FRMF_HUF BIT(1) /*!< hash unicast filter */ +#define ENET_MAC_FRMF_HMF BIT(2) /*!< hash multicast filter */ +#define ENET_MAC_FRMF_DAIFLT BIT(3) /*!< destination address inverse filtering enable */ +#define ENET_MAC_FRMF_MFD BIT(4) /*!< multicast filter disable */ +#define ENET_MAC_FRMF_BFRMD BIT(5) /*!< broadcast frame disable */ +#define ENET_MAC_FRMF_PCFRM BITS(6,7) /*!< pass control frames */ +#define ENET_MAC_FRMF_SAIFLT BIT(8) /*!< source address inverse filtering */ +#define ENET_MAC_FRMF_SAFLT BIT(9) /*!< source address filter */ +#define ENET_MAC_FRMF_HPFLT BIT(10) /*!< hash or perfect filter */ +#define ENET_MAC_FRMF_FAR BIT(31) /*!< frames all receive */ + +/* ENET_MAC_HLH */ +#define ENET_MAC_HLH_HLH BITS(0,31) /*!< hash list high */ + +/* ENET_MAC_HLL */ +#define ENET_MAC_HLL_HLL BITS(0,31) /*!< hash list low */ + +/* ENET_MAC_PHY_CTL */ +#define ENET_MAC_PHY_CTL_PB BIT(0) /*!< PHY busy */ +#define ENET_MAC_PHY_CTL_PW BIT(1) /*!< PHY write */ +#define ENET_MAC_PHY_CTL_CLR BITS(2,4) /*!< clock range */ +#define ENET_MAC_PHY_CTL_PR BITS(6,10) /*!< PHY register */ +#define ENET_MAC_PHY_CTL_PA BITS(11,15) /*!< PHY address */ + +/* ENET_MAC_PHY_DATA */ +#define ENET_MAC_PHY_DATA_PD BITS(0,15) /*!< PHY data */ + +/* ENET_MAC_FCTL */ +#define ENET_MAC_FCTL_FLCBBKPA BIT(0) /*!< flow control busy(in full duplex mode)/backpressure activate(in half duplex mode) */ +#define ENET_MAC_FCTL_TFCEN BIT(1) /*!< transmit flow control enable */ +#define ENET_MAC_FCTL_RFCEN BIT(2) /*!< receive flow control enable */ +#define ENET_MAC_FCTL_UPFDT BIT(3) /*!< unicast pause frame detect */ +#define ENET_MAC_FCTL_PLTS BITS(4,5) /*!< pause low threshold */ +#define ENET_MAC_FCTL_DZQP BIT(7) /*!< disable zero-quanta pause */ +#define ENET_MAC_FCTL_PTM BITS(16,31) /*!< pause time */ + +/* ENET_MAC_VLT */ +#define ENET_MAC_VLT_VLTI BITS(0,15) /*!< VLAN tag identifier(for receive frames) */ +#define ENET_MAC_VLT_VLTC BIT(16) /*!< 12-bit VLAN tag comparison */ + +/* ENET_MAC_RWFF */ +#define ENET_MAC_RWFF_DATA BITS(0,31) /*!< wakeup frame filter register data */ + +/* ENET_MAC_WUM */ +#define ENET_MAC_WUM_PWD BIT(0) /*!< power down */ +#define ENET_MAC_WUM_MPEN BIT(1) /*!< magic packet enable */ +#define ENET_MAC_WUM_WFEN BIT(2) /*!< wakeup frame enable */ +#define ENET_MAC_WUM_MPKR BIT(5) /*!< magic packet received */ +#define ENET_MAC_WUM_WUFR BIT(6) /*!< wakeup frame received */ +#define ENET_MAC_WUM_GU BIT(9) /*!< global unicast */ +#define ENET_MAC_WUM_WUFFRPR BIT(31) /*!< wakeup frame filter register pointer reset */ + +/* ENET_MAC_DBG */ +#define ENET_MAC_DBG_MRNI BIT(0) /*!< MAC receive state not idle */ +#define ENET_MAC_DBG_RXAFS BITS(1,2) /*!< Rx asynchronous FIFO status */ +#define ENET_MAC_DBG_RXFW BIT(4) /*!< RxFIFO is writing */ +#define ENET_MAC_DBG_RXFRS BITS(5,6) /*!< RxFIFO read operation status */ +#define ENET_MAC_DBG_RXFS BITS(8,9) /*!< RxFIFO state */ +#define ENET_MAC_DBG_MTNI BIT(16) /*!< MAC transmit state not idle */ +#define ENET_MAC_DBG_SOMT BITS(17,18) /*!< status of mac transmitter */ +#define ENET_MAC_DBG_PCS BIT(19) /*!< pause condition status */ +#define ENET_MAC_DBG_TXFRS BITS(20,21) /*!< TxFIFO read operation status */ +#define ENET_MAC_DBG_TXFW BIT(22) /*!< TxFIFO is writing */ +#define ENET_MAC_DBG_TXFNE BIT(24) /*!< TxFIFO not empty flag */ +#define ENET_MAC_DBG_TXFF BIT(25) /*!< TxFIFO full flag */ + +/* ENET_MAC_INTF */ +#define ENET_MAC_INTF_WUM BIT(3) /*!< WUM status */ +#define ENET_MAC_INTF_MSC BIT(4) /*!< MSC status */ +#define ENET_MAC_INTF_MSCR BIT(5) /*!< MSC receive status */ +#define ENET_MAC_INTF_MSCT BIT(6) /*!< MSC transmit status */ +#define ENET_MAC_INTF_TMST BIT(9) /*!< timestamp trigger status */ + +/* ENET_MAC_INTMSK */ +#define ENET_MAC_INTMSK_WUMIM BIT(3) /*!< WUM interrupt mask */ +#define ENET_MAC_INTMSK_TMSTIM BIT(9) /*!< timestamp trigger interrupt mask */ + +/* ENET_MAC_ADDR0H */ +#define ENET_MAC_ADDR0H_ADDR0H BITS(0,15) /*!< MAC address0 high */ +#define ENET_MAC_ADDR0H_MO BIT(31) /*!< always read 1 and must be kept */ + +/* ENET_MAC_ADDR0L */ +#define ENET_MAC_ADDR0L_ADDR0L BITS(0,31) /*!< MAC address0 low */ + +/* ENET_MAC_ADDR1H */ +#define ENET_MAC_ADDR1H_ADDR1H BITS(0,15) /*!< MAC address1 high */ +#define ENET_MAC_ADDR1H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR1H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR1H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR1L */ +#define ENET_MAC_ADDR1L_ADDR1L BITS(0,31) /*!< MAC address1 low */ + +/* ENET_MAC_ADDR2H */ +#define ENET_MAC_ADDR2H_ADDR2H BITS(0,15) /*!< MAC address2 high */ +#define ENET_MAC_ADDR2H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR2H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR2H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR2L */ +#define ENET_MAC_ADDR2L_ADDR2L BITS(0,31) /*!< MAC address2 low */ + +/* ENET_MAC_ADDR3H */ +#define ENET_MAC_ADDR3H_ADDR3H BITS(0,15) /*!< MAC address3 high */ +#define ENET_MAC_ADDR3H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR3H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR3H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR3L */ +#define ENET_MAC_ADDR3L_ADDR3L BITS(0,31) /*!< MAC address3 low */ + +/* ENET_MAC_FCTH */ +#define ENET_MAC_FCTH_RFA BITS(0,2) /*!< threshold of active flow control */ +#define ENET_MAC_FCTH_RFD BITS(4,6) /*!< threshold of deactive flow control */ + +/* ENET_MSC_CTL */ +#define ENET_MSC_CTL_CTR BIT(0) /*!< counter reset */ +#define ENET_MSC_CTL_CTSR BIT(1) /*!< counter stop rollover */ +#define ENET_MSC_CTL_RTOR BIT(2) /*!< reset on read */ +#define ENET_MSC_CTL_MCFZ BIT(3) /*!< MSC counter freeze */ +#define ENET_MSC_CTL_PMC BIT(4) /*!< preset MSC counter */ +#define ENET_MSC_CTL_AFHPM BIT(5) /*!< almost full or half preset mode */ + +/* ENET_MSC_RINTF */ +#define ENET_MSC_RINTF_RFCE BIT(5) /*!< received frames CRC error */ +#define ENET_MSC_RINTF_RFAE BIT(6) /*!< received frames alignment error */ +#define ENET_MSC_RINTF_RGUF BIT(17) /*!< receive good unicast frames */ + +/* ENET_MSC_TINTF */ +#define ENET_MSC_TINTF_TGFSC BIT(14) /*!< transmitted good frames single collision */ +#define ENET_MSC_TINTF_TGFMSC BIT(15) /*!< transmitted good frames more single collision */ +#define ENET_MSC_TINTF_TGF BIT(21) /*!< transmitted good frames */ + +/* ENET_MSC_RINTMSK */ +#define ENET_MSC_RINTMSK_RFCEIM BIT(5) /*!< received frame CRC error interrupt mask */ +#define ENET_MSC_RINTMSK_RFAEIM BIT(6) /*!< received frames alignment error interrupt mask */ +#define ENET_MSC_RINTMSK_RGUFIM BIT(17) /*!< received good unicast frames interrupt mask */ + +/* ENET_MSC_TINTMSK */ +#define ENET_MSC_TINTMSK_TGFSCIM BIT(14) /*!< transmitted good frames single collision interrupt mask */ +#define ENET_MSC_TINTMSK_TGFMSCIM BIT(15) /*!< transmitted good frames more single collision interrupt mask */ +#define ENET_MSC_TINTMSK_TGFIM BIT(21) /*!< transmitted good frames interrupt mask */ + +/* ENET_MSC_SCCNT */ +#define ENET_MSC_SCCNT_SCC BITS(0,31) /*!< transmitted good frames single collision counter */ + +/* ENET_MSC_MSCCNT */ +#define ENET_MSC_MSCCNT_MSCC BITS(0,31) /*!< transmitted good frames more one single collision counter */ + +/* ENET_MSC_TGFCNT */ +#define ENET_MSC_TGFCNT_TGF BITS(0,31) /*!< transmitted good frames counter */ + +/* ENET_MSC_RFCECNT */ +#define ENET_MSC_RFCECNT_RFCER BITS(0,31) /*!< received frames with CRC error counter */ + +/* ENET_MSC_RFAECNT */ +#define ENET_MSC_RFAECNT_RFAER BITS(0,31) /*!< received frames alignment error counter */ + +/* ENET_MSC_RGUFCNT */ +#define ENET_MSC_RGUFCNT_RGUF BITS(0,31) /*!< received good unicast frames counter */ + +/* ENET_PTP_TSCTL */ +#define PTP_TSCTL_CKNT(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_PTP_TSCTL_CKNT bit field */ + +#define ENET_PTP_TSCTL_TMSEN BIT(0) /*!< timestamp enable */ +#define ENET_PTP_TSCTL_TMSFCU BIT(1) /*!< timestamp fine or coarse update */ +#define ENET_PTP_TSCTL_TMSSTI BIT(2) /*!< timestamp system time initialize */ +#define ENET_PTP_TSCTL_TMSSTU BIT(3) /*!< timestamp system time update */ +#define ENET_PTP_TSCTL_TMSITEN BIT(4) /*!< timestamp interrupt trigger enable */ +#define ENET_PTP_TSCTL_TMSARU BIT(5) /*!< timestamp addend register update */ +#define ENET_PTP_TSCTL_ARFSEN BIT(8) /*!< all received frames snapshot enable */ +#define ENET_PTP_TSCTL_SCROM BIT(9) /*!< subsecond counter rollover mode */ +#define ENET_PTP_TSCTL_PFSV BIT(10) /*!< PTP frame snooping version */ +#define ENET_PTP_TSCTL_ESEN BIT(11) /*!< received Ethernet snapshot enable */ +#define ENET_PTP_TSCTL_IP6SEN BIT(12) /*!< received IPv6 snapshot enable */ +#define ENET_PTP_TSCTL_IP4SEN BIT(13) /*!< received IPv4 snapshot enable */ +#define ENET_PTP_TSCTL_ETMSEN BIT(14) /*!< received event type message snapshot enable */ +#define ENET_PTP_TSCTL_MNMSEN BIT(15) /*!< received master node message snapshot enable */ +#define ENET_PTP_TSCTL_CKNT BITS(16,17) /*!< clock node type for time stamp */ +#define ENET_PTP_TSCTL_MAFEN BIT(18) /*!< MAC address filter enable for PTP frame */ + +/* ENET_PTP_SSINC */ +#define ENET_PTP_SSINC_STMSSI BITS(0,7) /*!< system time subsecond increment */ + +/* ENET_PTP_TSH */ +#define ENET_PTP_TSH_STMS BITS(0,31) /*!< system time second */ + +/* ENET_PTP_TSL */ +#define ENET_PTP_TSL_STMSS BITS(0,30) /*!< system time subseconds */ +#define ENET_PTP_TSL_STS BIT(31) /*!< system time sign */ + +/* ENET_PTP_TSUH */ +#define ENET_PTP_TSUH_TMSUS BITS(0,31) /*!< timestamp update seconds */ + +/* ENET_PTP_TSUL */ +#define ENET_PTP_TSUL_TMSUSS BITS(0,30) /*!< timestamp update subseconds */ +#define ENET_PTP_TSUL_TMSUPNS BIT(31) /*!< timestamp update positive or negative sign */ + +/* ENET_PTP_TSADDEND */ +#define ENET_PTP_TSADDEND_TMSA BITS(0,31) /*!< timestamp addend */ + +/* ENET_PTP_ETH */ +#define ENET_PTP_ETH_ETSH BITS(0,31) /*!< expected time high */ + +/* ENET_PTP_ETL */ +#define ENET_PTP_ETL_ETSL BITS(0,31) /*!< expected time low */ + +/* ENET_PTP_TSF */ +#define ENET_PTP_TSF_TSSCO BIT(0) /*!< timestamp second counter overflow */ +#define ENET_PTP_TSF_TTM BIT(1) /*!< target time match */ + +/* ENET_PTP_PPSCTL */ +#define ENET_PTP_PPSCTL_PPSOFC BITS(0,3) /*!< PPS output frequency configure */ + +/* ENET_DMA_BCTL */ +#define ENET_DMA_BCTL_SWR BIT(0) /*!< software reset */ +#define ENET_DMA_BCTL_DAB BIT(1) /*!< DMA arbitration */ +#define ENET_DMA_BCTL_DPSL BITS(2,6) /*!< descriptor skip length */ +#define ENET_DMA_BCTL_DFM BIT(7) /*!< descriptor format mode */ +#define ENET_DMA_BCTL_PGBL BITS(8,13) /*!< programmable burst length */ +#define ENET_DMA_BCTL_RTPR BITS(14,15) /*!< RxDMA and TxDMA transfer priority ratio */ +#define ENET_DMA_BCTL_FB BIT(16) /*!< fixed Burst */ +#define ENET_DMA_BCTL_RXDP BITS(17,22) /*!< RxDMA PGBL */ +#define ENET_DMA_BCTL_UIP BIT(23) /*!< use independent PGBL */ +#define ENET_DMA_BCTL_FPBL BIT(24) /*!< four times PGBL mode */ +#define ENET_DMA_BCTL_AA BIT(25) /*!< address-aligned */ +#define ENET_DMA_BCTL_MB BIT(26) /*!< mixed burst */ + +/* ENET_DMA_TPEN */ +#define ENET_DMA_TPEN_TPE BITS(0,31) /*!< transmit poll enable */ + +/* ENET_DMA_RPEN */ +#define ENET_DMA_RPEN_RPE BITS(0,31) /*!< receive poll enable */ + +/* ENET_DMA_RDTADDR */ +#define ENET_DMA_RDTADDR_SRT BITS(0,31) /*!< start address of receive table */ + +/* ENET_DMA_TDTADDR */ +#define ENET_DMA_TDTADDR_STT BITS(0,31) /*!< start address of transmit table */ + +/* ENET_DMA_STAT */ +#define ENET_DMA_STAT_TS BIT(0) /*!< transmit status */ +#define ENET_DMA_STAT_TPS BIT(1) /*!< transmit process stopped status */ +#define ENET_DMA_STAT_TBU BIT(2) /*!< transmit buffer unavailable status */ +#define ENET_DMA_STAT_TJT BIT(3) /*!< transmit jabber timeout status */ +#define ENET_DMA_STAT_RO BIT(4) /*!< receive overflow status */ +#define ENET_DMA_STAT_TU BIT(5) /*!< transmit underflow status */ +#define ENET_DMA_STAT_RS BIT(6) /*!< receive status */ +#define ENET_DMA_STAT_RBU BIT(7) /*!< receive buffer unavailable status */ +#define ENET_DMA_STAT_RPS BIT(8) /*!< receive process stopped status */ +#define ENET_DMA_STAT_RWT BIT(9) /*!< receive watchdog timeout status */ +#define ENET_DMA_STAT_ET BIT(10) /*!< early transmit status */ +#define ENET_DMA_STAT_FBE BIT(13) /*!< fatal bus error status */ +#define ENET_DMA_STAT_ER BIT(14) /*!< early receive status */ +#define ENET_DMA_STAT_AI BIT(15) /*!< abnormal interrupt summary */ +#define ENET_DMA_STAT_NI BIT(16) /*!< normal interrupt summary */ +#define ENET_DMA_STAT_RP BITS(17,19) /*!< receive process state */ +#define ENET_DMA_STAT_TP BITS(20,22) /*!< transmit process state */ +#define ENET_DMA_STAT_EB BITS(23,25) /*!< error bits status */ +#define ENET_DMA_STAT_MSC BIT(27) /*!< MSC status */ +#define ENET_DMA_STAT_WUM BIT(28) /*!< WUM status */ +#define ENET_DMA_STAT_TST BIT(29) /*!< timestamp trigger status */ + +/* ENET_DMA_CTL */ +#define ENET_DMA_CTL_SRE BIT(1) /*!< start/stop receive enable */ +#define ENET_DMA_CTL_OSF BIT(2) /*!< operate on second frame */ +#define ENET_DMA_CTL_RTHC BITS(3,4) /*!< receive threshold control */ +#define ENET_DMA_CTL_FUF BIT(6) /*!< forward undersized good frames */ +#define ENET_DMA_CTL_FERF BIT(7) /*!< forward error frames */ +#define ENET_DMA_CTL_STE BIT(13) /*!< start/stop transmission enable */ +#define ENET_DMA_CTL_TTHC BITS(14,16) /*!< transmit threshold control */ +#define ENET_DMA_CTL_FTF BIT(20) /*!< flush transmit FIFO */ +#define ENET_DMA_CTL_TSFD BIT(21) /*!< transmit store-and-forward */ +#define ENET_DMA_CTL_DAFRF BIT(24) /*!< disable flushing of received frames */ +#define ENET_DMA_CTL_RSFD BIT(25) /*!< receive store-and-forward */ +#define ENET_DMA_CTL_DTCERFD BIT(26) /*!< dropping of TCP/IP checksum error frames disable */ + +/* ENET_DMA_INTEN */ +#define ENET_DMA_INTEN_TIE BIT(0) /*!< transmit interrupt enable */ +#define ENET_DMA_INTEN_TPSIE BIT(1) /*!< transmit process stopped interrupt enable */ +#define ENET_DMA_INTEN_TBUIE BIT(2) /*!< transmit buffer unavailable interrupt enable */ +#define ENET_DMA_INTEN_TJTIE BIT(3) /*!< transmit jabber timeout interrupt enable */ +#define ENET_DMA_INTEN_ROIE BIT(4) /*!< receive overflow interrupt enable */ +#define ENET_DMA_INTEN_TUIE BIT(5) /*!< transmit underflow interrupt enable */ +#define ENET_DMA_INTEN_RIE BIT(6) /*!< receive interrupt enable */ +#define ENET_DMA_INTEN_RBUIE BIT(7) /*!< receive buffer unavailable interrupt enable */ +#define ENET_DMA_INTEN_RPSIE BIT(8) /*!< receive process stopped interrupt enable */ +#define ENET_DMA_INTEN_RWTIE BIT(9) /*!< receive watchdog timeout interrupt enable */ +#define ENET_DMA_INTEN_ETIE BIT(10) /*!< early transmit interrupt enable */ +#define ENET_DMA_INTEN_FBEIE BIT(13) /*!< fatal bus error interrupt enable */ +#define ENET_DMA_INTEN_ERIE BIT(14) /*!< early receive interrupt enable */ +#define ENET_DMA_INTEN_AIE BIT(15) /*!< abnormal interrupt summary enable */ +#define ENET_DMA_INTEN_NIE BIT(16) /*!< normal interrupt summary enable */ + +/* ENET_DMA_MFBOCNT */ +#define ENET_DMA_MFBOCNT_MSFC BITS(0,15) /*!< missed frames by the controller */ +#define ENET_DMA_MFBOCNT_MSFA BITS(17,27) /*!< missed frames by the application */ + +/* ENET_DMA_RSWDC */ +#define ENET_DMA_RSWDC_WDCFRS BITS(0,7) /*!< watchdog counter for receive status (RS) */ + +/* ENET_DMA_CTDADDR */ +#define ENET_DMA_CTDADDR_TDAP BITS(0,31) /*!< transmit descriptor address pointer */ + +/* ENET_DMA_CRDADDR */ +#define ENET_DMA_CRDADDR_RDAP BITS(0,31) /*!< receive descriptor address pointer */ + +/* ENET_DMA_CTBADDR */ +#define ENET_DMA_CTBADDR_TBAP BITS(0,31) /*!< transmit buffer address pointer */ + +/* ENET_DMA_CRBADDR */ +#define ENET_DMA_CRBADDR_RBAP BITS(0,31) /*!< receive buffer address pointer */ + +/* ENET DMA Tx descriptor TDES0 */ +#define ENET_TDES0_DB BIT(0) /*!< deferred */ +#define ENET_TDES0_UFE BIT(1) /*!< underflow error */ +#define ENET_TDES0_EXD BIT(2) /*!< excessive deferral */ +#define ENET_TDES0_COCNT BITS(3,6) /*!< collision count */ +#define ENET_TDES0_VFRM BIT(7) /*!< VLAN frame */ +#define ENET_TDES0_ECO BIT(8) /*!< excessive collision */ +#define ENET_TDES0_LCO BIT(9) /*!< late collision */ +#define ENET_TDES0_NCA BIT(10) /*!< no carrier */ +#define ENET_TDES0_LCA BIT(11) /*!< loss of carrier */ +#define ENET_TDES0_IPPE BIT(12) /*!< IP payload error */ +#define ENET_TDES0_FRMF BIT(13) /*!< frame flushed */ +#define ENET_TDES0_JT BIT(14) /*!< jabber timeout */ +#define ENET_TDES0_ES BIT(15) /*!< error summary */ +#define ENET_TDES0_IPHE BIT(16) /*!< IP header error */ +#define ENET_TDES0_TTMSS BIT(17) /*!< transmit timestamp status */ +#define ENET_TDES0_TCHM BIT(20) /*!< the second address chained mode */ +#define ENET_TDES0_TERM BIT(21) /*!< transmit end of ring mode*/ +#define ENET_TDES0_CM BITS(22,23) /*!< checksum mode */ +#define ENET_TDES0_TTSEN BIT(25) /*!< transmit timestamp function enable */ +#define ENET_TDES0_DPAD BIT(26) /*!< disable adding pad */ +#define ENET_TDES0_DCRC BIT(27) /*!< disable CRC */ +#define ENET_TDES0_FSG BIT(28) /*!< first segment */ +#define ENET_TDES0_LSG BIT(29) /*!< last segment */ +#define ENET_TDES0_INTC BIT(30) /*!< interrupt on completion */ +#define ENET_TDES0_DAV BIT(31) /*!< DAV bit */ + +/* ENET DMA Tx descriptor TDES1 */ +#define ENET_TDES1_TB1S BITS(0,12) /*!< transmit buffer 1 size */ +#define ENET_TDES1_TB2S BITS(16,28) /*!< transmit buffer 2 size */ + +/* ENET DMA Tx descriptor TDES2 */ +#define ENET_TDES2_TB1AP BITS(0,31) /*!< transmit buffer 1 address pointer/transmit frame timestamp low 32-bit value */ + +/* ENET DMA Tx descriptor TDES3 */ +#define ENET_TDES3_TB2AP BITS(0,31) /*!< transmit buffer 2 address pointer (or next descriptor address) / transmit frame timestamp high 32-bit value */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* ENET DMA Tx descriptor TDES6 */ +#define ENET_TDES6_TTSL BITS(0,31) /*!< transmit frame timestamp low 32-bit value */ + +/* ENET DMA Tx descriptor TDES7 */ +#define ENET_TDES7_TTSH BITS(0,31) /*!< transmit frame timestamp high 32-bit value */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* ENET DMA Rx descriptor RDES0 */ +#define ENET_RDES0_PCERR BIT(0) /*!< payload checksum error */ +#define ENET_RDES0_EXSV BIT(0) /*!< extended status valid */ +#define ENET_RDES0_CERR BIT(1) /*!< CRC error */ +#define ENET_RDES0_DBERR BIT(2) /*!< dribble bit error */ +#define ENET_RDES0_RERR BIT(3) /*!< receive error */ +#define ENET_RDES0_RWDT BIT(4) /*!< receive watchdog timeout */ +#define ENET_RDES0_FRMT BIT(5) /*!< frame type */ +#define ENET_RDES0_LCO BIT(6) /*!< late collision */ +#define ENET_RDES0_IPHERR BIT(7) /*!< IP frame header error */ +#define ENET_RDES0_TSV BIT(7) /*!< timestamp valid */ +#define ENET_RDES0_LDES BIT(8) /*!< last descriptor */ +#define ENET_RDES0_FDES BIT(9) /*!< first descriptor */ +#define ENET_RDES0_VTAG BIT(10) /*!< VLAN tag */ +#define ENET_RDES0_OERR BIT(11) /*!< overflow Error */ +#define ENET_RDES0_LERR BIT(12) /*!< length error */ +#define ENET_RDES0_SAFF BIT(13) /*!< SA filter fail */ +#define ENET_RDES0_DERR BIT(14) /*!< descriptor error */ +#define ENET_RDES0_ERRS BIT(15) /*!< error summary */ +#define ENET_RDES0_FRML BITS(16,29) /*!< frame length */ +#define ENET_RDES0_DAFF BIT(30) /*!< destination address filter fail */ +#define ENET_RDES0_DAV BIT(31) /*!< descriptor available */ + +/* ENET DMA Rx descriptor RDES1 */ +#define ENET_RDES1_RB1S BITS(0,12) /*!< receive buffer 1 size */ +#define ENET_RDES1_RCHM BIT(14) /*!< receive chained mode for second address */ +#define ENET_RDES1_RERM BIT(15) /*!< receive end of ring mode*/ +#define ENET_RDES1_RB2S BITS(16,28) /*!< receive buffer 2 size */ +#define ENET_RDES1_DINTC BIT(31) /*!< disable interrupt on completion */ + +/* ENET DMA Rx descriptor RDES2 */ +#define ENET_RDES2_RB1AP BITS(0,31) /*!< receive buffer 1 address pointer / receive frame timestamp low 32-bit */ + +/* ENET DMA Rx descriptor RDES3 */ +#define ENET_RDES3_RB2AP BITS(0,31) /*!< receive buffer 2 address pointer (next descriptor address)/receive frame timestamp high 32-bit value */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* ENET DMA Rx descriptor RDES4 */ +#define ENET_RDES4_IPPLDT BITS(0,2) /*!< IP frame payload type */ +#define ENET_RDES4_IPHERR BIT(3) /*!< IP frame header error */ +#define ENET_RDES4_IPPLDERR BIT(4) /*!< IP frame payload error */ +#define ENET_RDES4_IPCKSB BIT(5) /*!< IP frame checksum bypassed */ +#define ENET_RDES4_IPF4 BIT(6) /*!< IP frame in version 4 */ +#define ENET_RDES4_IPF6 BIT(7) /*!< IP frame in version 6 */ +#define ENET_RDES4_PTPMT BITS(8,11) /*!< PTP message type */ +#define ENET_RDES4_PTPOEF BIT(12) /*!< PTP on ethernet frame */ +#define ENET_RDES4_PTPVF BIT(13) /*!< PTP version format */ + +/* ENET DMA Rx descriptor RDES6 */ +#define ENET_RDES6_RTSL BITS(0,31) /*!< receive frame timestamp low 32-bit value */ + +/* ENET DMA Rx descriptor RDES7 */ +#define ENET_RDES7_RTSH BITS(0,31) /*!< receive frame timestamp high 32-bit value */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* constants definitions */ +/* define bit position and its register index offset */ +#define ENET_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define ENET_REG_VAL(periph) (REG32(ENET + ((uint32_t)(periph) >> 6))) +#define ENET_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* ENET clock range judgement */ +#define ENET_RANGE(hclk, n, m) (((hclk) >= (n))&&((hclk) < (m))) + +/* define MAC address configuration and reference address */ +#define ENET_SET_MACADDRH(p) (((uint32_t)(p)[5] << 8) | (uint32_t)(p)[4]) +#define ENET_SET_MACADDRL(p) (((uint32_t)(p)[3] << 24) | ((uint32_t)(p)[2] << 16) | ((uint32_t)(p)[1] << 8) | (uint32_t)(p)[0]) +#define ENET_ADDRH_BASE ((ENET) + 0x40U) +#define ENET_ADDRL_BASE ((ENET) + 0x44U) +#define ENET_GET_MACADDR(offset, n) ((uint8_t)((REG32((ENET_ADDRL_BASE + (offset)) - (((n) / 4U) * 4U)) >> (8U * ((n) % 4U))) & 0xFFU)) + +/* register offset */ +#define MAC_FCTL_REG_OFFSET ((uint16_t)0x0018U) /*!< MAC flow control register offset */ +#define MAC_WUM_REG_OFFSET ((uint16_t)0x002CU) /*!< MAC wakeup management register offset */ +#define MAC_INTF_REG_OFFSET ((uint16_t)0x0038U) /*!< MAC interrupt flag register offset */ +#define MAC_INTMSK_REG_OFFSET ((uint16_t)0x003CU) /*!< MAC interrupt mask register offset */ + +#define MSC_RINTF_REG_OFFSET ((uint16_t)0x0104U) /*!< MSC receive interrupt flag register offset */ +#define MSC_TINTF_REG_OFFSET ((uint16_t)0x0108U) /*!< MSC transmit interrupt flag register offset */ +#define MSC_RINTMSK_REG_OFFSET ((uint16_t)0x010CU) /*!< MSC receive interrupt mask register offset */ +#define MSC_TINTMSK_REG_OFFSET ((uint16_t)0x0110U) /*!< MSC transmit interrupt mask register offset */ +#define MSC_SCCNT_REG_OFFSET ((uint16_t)0x014CU) /*!< MSC transmitted good frames after a single collision counter register offset */ +#define MSC_MSCCNT_REG_OFFSET ((uint16_t)0x0150U) /*!< MSC transmitted good frames after more than a single collision counter register offset */ +#define MSC_TGFCNT_REG_OFFSET ((uint16_t)0x0168U) /*!< MSC transmitted good frames counter register offset */ +#define MSC_RFCECNT_REG_OFFSET ((uint16_t)0x0194U) /*!< MSC received frames with CRC error counter register offset */ +#define MSC_RFAECNT_REG_OFFSET ((uint16_t)0x0198U) /*!< MSC received frames with alignment error counter register offset */ +#define MSC_RGUFCNT_REG_OFFSET ((uint16_t)0x01C4U) /*!< MSC received good unicast frames counter register offset */ + +#define PTP_TSF_REG_OFFSET ((uint16_t)0x0728U) /*!< PTP time stamp flag register offset */ + +#define DMA_STAT_REG_OFFSET ((uint16_t)0x1014U) /*!< DMA status register offset */ +#define DMA_INTEN_REG_OFFSET ((uint16_t)0x101CU) /*!< DMA interrupt enable register offset */ +#define DMA_TDTADDR_REG_OFFSET ((uint16_t)0x1010U) /*!< DMA transmit descriptor table address register offset */ +#define DMA_CTDADDR_REG_OFFSET ((uint16_t)0x1048U) /*!< DMA current transmit descriptor address register */ +#define DMA_CTBADDR_REG_OFFSET ((uint16_t)0x1050U) /*!< DMA current transmit buffer address register */ +#define DMA_RDTADDR_REG_OFFSET ((uint16_t)0x100CU) /*!< DMA receive descriptor table address register */ +#define DMA_CRDADDR_REG_OFFSET ((uint16_t)0x104CU) /*!< DMA current receive descriptor address register */ +#define DMA_CRBADDR_REG_OFFSET ((uint16_t)0x1054U) /*!< DMA current receive buffer address register */ + +/* ENET status flag get */ +typedef enum +{ + /* ENET_MAC_WUM register */ + ENET_MAC_FLAG_MPKR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 5U), /*!< magic packet received flag */ + ENET_MAC_FLAG_WUFR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 6U), /*!< wakeup frame received flag */ + /* ENET_MAC_FCTL register */ + ENET_MAC_FLAG_FLOWCONTROL = ENET_REGIDX_BIT(MAC_FCTL_REG_OFFSET, 0U), /*!< flow control status flag */ + /* ENET_MAC_INTF register */ + ENET_MAC_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ + ENET_MAC_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ + ENET_MAC_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ + ENET_MAC_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ + ENET_MAC_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ + /* ENET_PTP_TSF register */ + ENET_PTP_FLAG_TSSCO = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 0U), /*!< timestamp second counter overflow flag */ + ENET_PTP_FLAG_TTM = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 1U), /*!< target time match flag */ + /* ENET_MSC_RINTF register */ + ENET_MSC_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ + ENET_MSC_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ + ENET_MSC_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ + /* ENET_MSC_TINTF register */ + ENET_MSC_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ + ENET_MSC_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ + ENET_MSC_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ + /* ENET_DMA_STAT register */ + ENET_DMA_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ + ENET_DMA_FLAG_EB_DMA_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 23U), /*!< error during data transfer by RxDMA/TxDMA flag */ + ENET_DMA_FLAG_EB_TRANSFER_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 24U), /*!< error during write/read transfer flag */ + ENET_DMA_FLAG_EB_ACCESS_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 25U), /*!< error during data buffer/descriptor access flag */ + ENET_DMA_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ + ENET_DMA_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ + ENET_DMA_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U) /*!< timestamp trigger status flag */ +}enet_flag_enum; + +/* ENET stutus flag clear */ +typedef enum +{ + /* ENET_DMA_STAT register */ + ENET_DMA_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U) /*!< normal interrupt summary flag */ +}enet_flag_clear_enum; + +/* ENET interrupt enable/disable */ +typedef enum +{ + /* ENET_MAC_INTMSK register */ + ENET_MAC_INT_WUMIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 3U), /*!< WUM interrupt mask */ + ENET_MAC_INT_TMSTIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 9U), /*!< timestamp trigger interrupt mask */ + /* ENET_MSC_RINTMSK register */ + ENET_MSC_INT_RFCEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 5U), /*!< received frame CRC error interrupt mask */ + ENET_MSC_INT_RFAEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 6U), /*!< received frames alignment error interrupt mask */ + ENET_MSC_INT_RGUFIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 17U), /*!< received good unicast frames interrupt mask */ + /* ENET_MSC_TINTMSK register */ + ENET_MSC_INT_TGFSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 14U), /*!< transmitted good frames single collision interrupt mask */ + ENET_MSC_INT_TGFMSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 15U), /*!< transmitted good frames more single collision interrupt mask */ + ENET_MSC_INT_TGFIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 21U), /*!< transmitted good frames interrupt mask */ + /* ENET_DMA_INTEN register */ + ENET_DMA_INT_TIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 0U), /*!< transmit interrupt enable */ + ENET_DMA_INT_TPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 1U), /*!< transmit process stopped interrupt enable */ + ENET_DMA_INT_TBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 2U), /*!< transmit buffer unavailable interrupt enable */ + ENET_DMA_INT_TJTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 3U), /*!< transmit jabber timeout interrupt enable */ + ENET_DMA_INT_ROIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 4U), /*!< receive overflow interrupt enable */ + ENET_DMA_INT_TUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 5U), /*!< transmit underflow interrupt enable */ + ENET_DMA_INT_RIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 6U), /*!< receive interrupt enable */ + ENET_DMA_INT_RBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 7U), /*!< receive buffer unavailable interrupt enable */ + ENET_DMA_INT_RPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 8U), /*!< receive process stopped interrupt enable */ + ENET_DMA_INT_RWTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 9U), /*!< receive watchdog timeout interrupt enable */ + ENET_DMA_INT_ETIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 10U), /*!< early transmit interrupt enable */ + ENET_DMA_INT_FBEIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 13U), /*!< fatal bus error interrupt enable */ + ENET_DMA_INT_ERIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 14U), /*!< early receive interrupt enable */ + ENET_DMA_INT_AIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 15U), /*!< abnormal interrupt summary enable */ + ENET_DMA_INT_NIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 16U) /*!< normal interrupt summary enable */ +}enet_int_enum; + +/* ENET interrupt flag get */ +typedef enum +{ + /* ENET_MAC_INTF register */ + ENET_MAC_INT_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ + ENET_MAC_INT_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ + ENET_MAC_INT_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ + ENET_MAC_INT_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ + ENET_MAC_INT_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ + /* ENET_MSC_RINTF register */ + ENET_MSC_INT_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ + ENET_MSC_INT_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ + ENET_MSC_INT_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ + /* ENET_MSC_TINTF register */ + ENET_MSC_INT_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ + ENET_MSC_INT_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ + ENET_MSC_INT_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ + /* ENET_DMA_STAT register */ + ENET_DMA_INT_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_INT_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_INT_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_INT_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_INT_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_INT_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_INT_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_INT_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_INT_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_INT_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_INT_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_INT_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_INT_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_INT_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_INT_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ + ENET_DMA_INT_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ + ENET_DMA_INT_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ + ENET_DMA_INT_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U) /*!< timestamp trigger status flag */ +}enet_int_flag_enum; + +/* ENET interrupt flag clear */ +typedef enum +{ + /* ENET_DMA_STAT register */ + ENET_DMA_INT_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_INT_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_INT_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_INT_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_INT_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_INT_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_INT_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_INT_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_INT_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_INT_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_INT_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_INT_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_INT_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_INT_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_INT_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U) /*!< normal interrupt summary flag */ +}enet_int_flag_clear_enum; + +/* current RX/TX descriptor/buffer/descriptor table address get */ +typedef enum +{ + ENET_RX_DESC_TABLE = DMA_RDTADDR_REG_OFFSET, /*!< RX descriptor table */ + ENET_RX_CURRENT_DESC = DMA_CRDADDR_REG_OFFSET, /*!< current RX descriptor */ + ENET_RX_CURRENT_BUFFER = DMA_CRBADDR_REG_OFFSET, /*!< current RX buffer */ + ENET_TX_DESC_TABLE = DMA_TDTADDR_REG_OFFSET, /*!< TX descriptor table */ + ENET_TX_CURRENT_DESC = DMA_CTDADDR_REG_OFFSET, /*!< current TX descriptor */ + ENET_TX_CURRENT_BUFFER = DMA_CTBADDR_REG_OFFSET /*!< current TX buffer */ +}enet_desc_reg_enum; + +/* MAC statistics counter get */ +typedef enum +{ + ENET_MSC_TX_SCCNT = MSC_SCCNT_REG_OFFSET, /*!< MSC transmitted good frames after a single collision counter */ + ENET_MSC_TX_MSCCNT = MSC_MSCCNT_REG_OFFSET, /*!< MSC transmitted good frames after more than a single collision counter */ + ENET_MSC_TX_TGFCNT = MSC_TGFCNT_REG_OFFSET, /*!< MSC transmitted good frames counter */ + ENET_MSC_RX_RFCECNT = MSC_RFCECNT_REG_OFFSET, /*!< MSC received frames with CRC error counter */ + ENET_MSC_RX_RFAECNT = MSC_RFAECNT_REG_OFFSET, /*!< MSC received frames with alignment error counter */ + ENET_MSC_RX_RGUFCNT = MSC_RGUFCNT_REG_OFFSET /*!< MSC received good unicast frames counter */ +}enet_msc_counter_enum; + +/* function option, used for ENET initialization */ +typedef enum +{ + FORWARD_OPTION = BIT(0), /*!< configure the frame forward related parameters */ + DMABUS_OPTION = BIT(1), /*!< configure the DMA bus mode related parameters */ + DMA_MAXBURST_OPTION = BIT(2), /*!< configure the DMA max burst related parameters */ + DMA_ARBITRATION_OPTION = BIT(3), /*!< configure the DMA arbitration related parameters */ + STORE_OPTION = BIT(4), /*!< configure the store forward mode related parameters */ + DMA_OPTION = BIT(5), /*!< configure the DMA control related parameters */ + VLAN_OPTION = BIT(6), /*!< configure the VLAN tag related parameters */ + FLOWCTL_OPTION = BIT(7), /*!< configure the flow control related parameters */ + HASHH_OPTION = BIT(8), /*!< configure the hash list high 32-bit related parameters */ + HASHL_OPTION = BIT(9), /*!< configure the hash list low 32-bit related parameters */ + FILTER_OPTION = BIT(10), /*!< configure the frame filter control related parameters */ + HALFDUPLEX_OPTION = BIT(11), /*!< configure the halfduplex related parameters */ + TIMER_OPTION = BIT(12), /*!< configure the frame timer related parameters */ + INTERFRAMEGAP_OPTION = BIT(13) /*!< configure the inter frame gap related parameters */ +}enet_option_enum; + +/* phy mode and mac loopback configurations */ +typedef enum +{ + ENET_AUTO_NEGOTIATION = 0x01U, /*!< PHY auto negotiation */ + ENET_100M_FULLDUPLEX = (ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM), /*!< 100Mbit/s, full-duplex */ + ENET_100M_HALFDUPLEX = ENET_MAC_CFG_SPD , /*!< 100Mbit/s, half-duplex */ + ENET_10M_FULLDUPLEX = ENET_MAC_CFG_DPM, /*!< 10Mbit/s, full-duplex */ + ENET_10M_HALFDUPLEX = (uint32_t)0x00000000U, /*!< 10Mbit/s, half-duplex */ + ENET_LOOPBACKMODE = (ENET_MAC_CFG_LBM | ENET_MAC_CFG_DPM) /*!< MAC in loopback mode at the MII */ +}enet_mediamode_enum; + +/* IP frame checksum function */ +typedef enum +{ + ENET_NO_AUTOCHECKSUM = (uint32_t)0x00000000U, /*!< disable IP frame checksum function */ + ENET_AUTOCHECKSUM_DROP_FAILFRAMES = ENET_MAC_CFG_IPFCO, /*!< enable IP frame checksum function */ + ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES = (ENET_MAC_CFG_IPFCO|ENET_DMA_CTL_DTCERFD) /*!< enable IP frame checksum function, and the received frame + with only payload error but no other errors will not be dropped */ +}enet_chksumconf_enum; + +/* received frame filter function */ +typedef enum +{ + ENET_PROMISCUOUS_MODE = ENET_MAC_FRMF_PM, /*!< promiscuous mode enabled */ + ENET_RECEIVEALL = (int32_t)ENET_MAC_FRMF_FAR, /*!< all received frame are forwarded to application */ + ENET_BROADCAST_FRAMES_PASS = (uint32_t)0x00000000U, /*!< the address filters pass all received broadcast frames */ + ENET_BROADCAST_FRAMES_DROP = ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ +}enet_frmrecept_enum; + +/* register group value get */ +typedef enum +{ + ALL_MAC_REG = 0U, /*!< MAC register group */ + ALL_MSC_REG = 22U, /*!< MSC register group */ + ALL_PTP_REG = 33U, /*!< PTP register group */ + ALL_DMA_REG = 44U /*!< DMA register group */ +}enet_registers_type_enum; + +/* dma direction select */ +typedef enum +{ + ENET_DMA_TX = ENET_DMA_STAT_TP, /*!< DMA transmit direction */ + ENET_DMA_RX = ENET_DMA_STAT_RP /*!< DMA receive direction */ +}enet_dmadirection_enum; + +/* PHY operation direction select */ +typedef enum +{ + ENET_PHY_READ = (uint32_t)0x00000000, /*!< read PHY */ + ENET_PHY_WRITE = ENET_MAC_PHY_CTL_PW /*!< write PHY */ +}enet_phydirection_enum; + +/* register operation direction select */ +typedef enum +{ + ENET_REG_READ, /*!< read register */ + ENET_REG_WRITE /*!< write register */ +}enet_regdirection_enum; + +/* ENET MAC addresses */ +typedef enum +{ + ENET_MAC_ADDRESS0 = ((uint32_t)0x00000000), /*!< MAC address0 */ + ENET_MAC_ADDRESS1 = ((uint32_t)0x00000008), /*!< MAC address1 */ + ENET_MAC_ADDRESS2 = ((uint32_t)0x00000010), /*!< MAC address2 */ + ENET_MAC_ADDRESS3 = ((uint32_t)0x00000018) /*!< MAC address3 */ +}enet_macaddress_enum; + +/* descriptor information */ +typedef enum +{ + TXDESC_COLLISION_COUNT, /*!< the number of collisions occurred before the frame was transmitted */ + TXDESC_BUFFER_1_ADDR, /*!< transmit frame buffer 1 address */ + RXDESC_FRAME_LENGTH, /*!< the byte length of the received frame that was transferred to the buffer */ + RXDESC_BUFFER_1_SIZE, /*!< receive buffer 1 size */ + RXDESC_BUFFER_2_SIZE, /*!< receive buffer 2 size */ + RXDESC_BUFFER_1_ADDR /*!< receive frame buffer 1 address */ +}enet_descstate_enum; + +/* MSC counters preset mode */ +typedef enum +{ + ENET_MSC_PRESET_NONE = 0U, /*!< do not preset MSC counter */ + ENET_MSC_PRESET_HALF = ENET_MSC_CTL_PMC, /*!< preset all MSC counters to almost-half(0x7FFF FFF0) value */ + ENET_MSC_PRESET_FULL = ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM /*!< preset all MSC counters to almost-full(0xFFFF FFF0) value */ +}enet_msc_preset_enum; + +typedef enum{ + ENET_CKNT_ORDINARY = PTP_TSCTL_CKNT(0), /*!< type of ordinary clock node type for timestamp */ + ENET_CKNT_BOUNDARY = PTP_TSCTL_CKNT(1), /*!< type of boundary clock node type for timestamp */ + ENET_CKNT_END_TO_END = PTP_TSCTL_CKNT(2), /*!< type of end-to-end transparent clock node type for timestamp */ + ENET_CKNT_PEER_TO_PEER = PTP_TSCTL_CKNT(3), /*!< type of peer-to-peer transparent clock node type for timestamp */ + ENET_PTP_SYSTIME_INIT = ENET_PTP_TSCTL_TMSSTI, /*!< timestamp initialize */ + ENET_PTP_SYSTIME_UPDATE = ENET_PTP_TSCTL_TMSSTU, /*!< timestamp update */ + ENET_PTP_ADDEND_UPDATE = ENET_PTP_TSCTL_TMSARU, /*!< addend register update */ + ENET_PTP_FINEMODE = (int32_t)(ENET_PTP_TSCTL_TMSFCU| BIT(31)), /*!< the system timestamp uses the fine method for updating */ + ENET_PTP_COARSEMODE = ENET_PTP_TSCTL_TMSFCU, /*!< the system timestamp uses the coarse method for updating */ + ENET_SUBSECOND_DIGITAL_ROLLOVER = (int32_t)(ENET_PTP_TSCTL_SCROM | BIT(31)), /*!< digital rollover mode */ + ENET_SUBSECOND_BINARY_ROLLOVER = ENET_PTP_TSCTL_SCROM, /*!< binary rollover mode */ + ENET_SNOOPING_PTP_VERSION_2 = (int32_t)(ENET_PTP_TSCTL_PFSV| BIT(31)), /*!< version 2 */ + ENET_SNOOPING_PTP_VERSION_1 = ENET_PTP_TSCTL_PFSV, /*!< version 1 */ + ENET_EVENT_TYPE_MESSAGES_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_ETMSEN| BIT(31)), /*!< only event type messages are taken snapshot */ + ENET_ALL_TYPE_MESSAGES_SNAPSHOT = ENET_PTP_TSCTL_ETMSEN, /*!< all type messages are taken snapshot except announce, management and signaling message */ + ENET_MASTER_NODE_MESSAGE_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_MNMSEN| BIT(31)), /*!< snapshot is only take for master node message */ + ENET_SLAVE_NODE_MESSAGE_SNAPSHOT = ENET_PTP_TSCTL_MNMSEN /*!< snapshot is only taken for slave node message */ +}enet_ptp_function_enum; + +/* structure for initialization of the ENET */ +typedef struct +{ + uint32_t option_enable; /*!< select which function to configure */ + uint32_t forward_frame; /*!< frame forward related parameters */ + uint32_t dmabus_mode; /*!< DMA bus mode related parameters */ + uint32_t dma_maxburst; /*!< DMA max burst related parameters */ + uint32_t dma_arbitration; /*!< DMA Tx and Rx arbitration related parameters */ + uint32_t store_forward_mode; /*!< store forward mode related parameters */ + uint32_t dma_function; /*!< DMA control related parameters */ + uint32_t vlan_config; /*!< VLAN tag related parameters */ + uint32_t flow_control; /*!< flow control related parameters */ + uint32_t hashtable_high; /*!< hash list high 32-bit related parameters */ + uint32_t hashtable_low; /*!< hash list low 32-bit related parameters */ + uint32_t framesfilter_mode; /*!< frame filter control related parameters */ + uint32_t halfduplex_param; /*!< halfduplex related parameters */ + uint32_t timer_config; /*!< frame timer related parameters */ + uint32_t interframegap; /*!< inter frame gap related parameters */ +}enet_initpara_struct; + +/* structure for ENET DMA desciptors */ +typedef struct +{ + uint32_t status; /*!< status */ + uint32_t control_buffer_size; /*!< control and buffer1, buffer2 lengths */ + uint32_t buffer1_addr; /*!< buffer1 address pointer/timestamp low */ + uint32_t buffer2_next_desc_addr; /*!< buffer2 or next descriptor address pointer/timestamp high */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + uint32_t extended_status; /*!< extended status */ + uint32_t reserved; /*!< reserved */ + uint32_t timestamp_low; /*!< timestamp low */ + uint32_t timestamp_high; /*!< timestamp high */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +} enet_descriptors_struct; + +/* structure of PTP system time */ +typedef struct +{ + uint32_t second; /*!< second of system time */ + uint32_t nanosecond; /*!< nanosecond of system time */ + uint32_t sign; /*!< sign of system time */ +}enet_ptp_systime_struct; + +/* mac_cfg register value */ +#define MAC_CFG_BOL(regval) (BITS(5,6) & ((uint32_t)(regval) << 5)) /*!< write value to ENET_MAC_CFG_BOL bit field */ +#define ENET_BACKOFFLIMIT_10 MAC_CFG_BOL(0) /*!< min (n, 10) */ +#define ENET_BACKOFFLIMIT_8 MAC_CFG_BOL(1) /*!< min (n, 8) */ +#define ENET_BACKOFFLIMIT_4 MAC_CFG_BOL(2) /*!< min (n, 4) */ +#define ENET_BACKOFFLIMIT_1 MAC_CFG_BOL(3) /*!< min (n, 1) */ + +#define MAC_CFG_IGBS(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_MAC_CFG_IGBS bit field */ +#define ENET_INTERFRAMEGAP_96BIT MAC_CFG_IGBS(0) /*!< minimum 96 bit times */ +#define ENET_INTERFRAMEGAP_88BIT MAC_CFG_IGBS(1) /*!< minimum 88 bit times */ +#define ENET_INTERFRAMEGAP_80BIT MAC_CFG_IGBS(2) /*!< minimum 80 bit times */ +#define ENET_INTERFRAMEGAP_72BIT MAC_CFG_IGBS(3) /*!< minimum 72 bit times */ +#define ENET_INTERFRAMEGAP_64BIT MAC_CFG_IGBS(4) /*!< minimum 64 bit times */ +#define ENET_INTERFRAMEGAP_56BIT MAC_CFG_IGBS(5) /*!< minimum 56 bit times */ +#define ENET_INTERFRAMEGAP_48BIT MAC_CFG_IGBS(6) /*!< minimum 48 bit times */ +#define ENET_INTERFRAMEGAP_40BIT MAC_CFG_IGBS(7) /*!< minimum 40 bit times */ + +#define ENET_TYPEFRAME_CRC_DROP_ENABLE ENET_MAC_CFG_TFCD /*!< FCS field(last 4 bytes) of frame will be dropped before forwarding */ +#define ENET_TYPEFRAME_CRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< FCS field(last 4 bytes) of frame will not be dropped before forwarding */ +#define ENET_TYPEFRAME_CRC_DROP ENET_MAC_CFG_TFCD /*!< the function that FCS field(last 4 bytes) of frame will be dropped before forwarding */ + +#define ENET_WATCHDOG_ENABLE ((uint32_t)0x00000000U) /*!< the MAC allows no more than 2048 bytes of the frame being received */ +#define ENET_WATCHDOG_DISABLE ENET_MAC_CFG_WDD /*!< the MAC disables the watchdog timer on the receiver, and can receive frames of up to 16384 bytes */ + +#define ENET_JABBER_ENABLE ((uint32_t)0x00000000U) /*!< the maximum transmission byte is 2048 */ +#define ENET_JABBER_DISABLE ENET_MAC_CFG_JBD /*!< the maximum transmission byte can be 16384 */ + +#define ENET_CARRIERSENSE_ENABLE ((uint32_t)0x00000000U) /*!< the MAC transmitter generates carrier sense error and aborts the transmission */ +#define ENET_CARRIERSENSE_DISABLE ENET_MAC_CFG_CSD /*!< the MAC transmitter ignores the MII CRS signal during frame transmission in half-duplex mode */ + +#define ENET_SPEEDMODE_10M ((uint32_t)0x00000000U) /*!< 10 Mbit/s */ +#define ENET_SPEEDMODE_100M ENET_MAC_CFG_SPD /*!< 100 Mbit/s */ + +#define ENET_RECEIVEOWN_ENABLE ((uint32_t)0x00000000U) /*!< the MAC receives all packets that are given by the PHY while transmitting */ +#define ENET_RECEIVEOWN_DISABLE ENET_MAC_CFG_ROD /*!< the MAC disables the reception of frames in half-duplex mode */ + +#define ENET_LOOPBACKMODE_ENABLE ENET_MAC_CFG_LBM /*!< the MAC operates in loopback mode at the MII */ +#define ENET_LOOPBACKMODE_DISABLE ((uint32_t)0x00000000U) /*!< the MAC operates in normal mode */ + +#define ENET_MODE_FULLDUPLEX ENET_MAC_CFG_DPM /*!< full-duplex mode enable */ +#define ENET_MODE_HALFDUPLEX ((uint32_t)0x00000000U) /*!< half-duplex mode enable */ + +#define ENET_CHECKSUMOFFLOAD_ENABLE ENET_MAC_CFG_IPFCO /*!< IP frame checksum offload function enabled for received IP frame */ +#define ENET_CHECKSUMOFFLOAD_DISABLE ((uint32_t)0x00000000U) /*!< the checksum offload function in the receiver is disabled */ + +#define ENET_RETRYTRANSMISSION_ENABLE ((uint32_t)0x00000000U) /*!< the MAC attempts retries up to 16 times based on the settings of BOL*/ +#define ENET_RETRYTRANSMISSION_DISABLE ENET_MAC_CFG_RTD /*!< the MAC attempts only 1 transmission */ + +#define ENET_AUTO_PADCRC_DROP_ENABLE ENET_MAC_CFG_APCD /*!< the MAC strips the Pad/FCS field on received frames */ +#define ENET_AUTO_PADCRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< the MAC forwards all received frames without modify it */ +#define ENET_AUTO_PADCRC_DROP ENET_MAC_CFG_APCD /*!< the function of the MAC strips the Pad/FCS field on received frames */ + +#define ENET_DEFERRALCHECK_ENABLE ENET_MAC_CFG_DFC /*!< the deferral check function is enabled in the MAC */ +#define ENET_DEFERRALCHECK_DISABLE ((uint32_t)0x00000000U) /*!< the deferral check function is disabled */ + +/* mac_frmf register value */ +#define MAC_FRMF_PCFRM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_FRMF_PCFRM bit field */ +#define ENET_PCFRM_PREVENT_ALL MAC_FRMF_PCFRM(0) /*!< MAC prevents all control frames from reaching the application */ +#define ENET_PCFRM_PREVENT_PAUSEFRAME MAC_FRMF_PCFRM(1) /*!< MAC only forwards all other control frames except pause control frame */ +#define ENET_PCFRM_FORWARD_ALL MAC_FRMF_PCFRM(2) /*!< MAC forwards all control frames to application even if they fail the address filter */ +#define ENET_PCFRM_FORWARD_FILTERED MAC_FRMF_PCFRM(3) /*!< MAC forwards control frames that only pass the address filter */ + +#define ENET_RX_FILTER_DISABLE ENET_MAC_FRMF_FAR /*!< all received frame are forwarded to application */ +#define ENET_RX_FILTER_ENABLE ((uint32_t)0x00000000U) /*!< only the frame passed the filter can be forwarded to application */ + +#define ENET_SRC_FILTER_NORMAL_ENABLE ENET_MAC_FRMF_SAFLT /*!< filter source address */ +#define ENET_SRC_FILTER_INVERSE_ENABLE (ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT) /*!< inverse source address filtering result */ +#define ENET_SRC_FILTER_DISABLE ((uint32_t)0x00000000U) /*!< source address function in filter disable */ +#define ENET_SRC_FILTER ENET_MAC_FRMF_SAFLT /*!< filter source address function */ +#define ENET_SRC_FILTER_INVERSE ENET_MAC_FRMF_SAIFLT /*!< inverse source address filtering result function */ + +#define ENET_BROADCASTFRAMES_ENABLE ((uint32_t)0x00000000U) /*!< the address filters pass all received broadcast frames */ +#define ENET_BROADCASTFRAMES_DISABLE ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ + +#define ENET_DEST_FILTER_INVERSE_ENABLE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result */ +#define ENET_DEST_FILTER_INVERSE_DISABLE ((uint32_t)0x00000000U) /*!< not inverse DA filtering result */ +#define ENET_DEST_FILTER_INVERSE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result function */ + +#define ENET_PROMISCUOUS_ENABLE ENET_MAC_FRMF_PM /*!< promiscuous mode enabled */ +#define ENET_PROMISCUOUS_DISABLE ((uint32_t)0x00000000U) /*!< promiscuous mode disabled */ + +#define ENET_MULTICAST_FILTER_HASH_OR_PERFECT (ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT) /*!< pass multicast frames that match either the perfect or the hash filtering */ +#define ENET_MULTICAST_FILTER_HASH ENET_MAC_FRMF_HMF /*!< pass multicast frames that match the hash filtering */ +#define ENET_MULTICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass multicast frames that match the perfect filtering */ +#define ENET_MULTICAST_FILTER_NONE ENET_MAC_FRMF_MFD /*!< all multicast frames are passed */ +#define ENET_MULTICAST_FILTER_PASS ENET_MAC_FRMF_MFD /*!< pass all multicast frames function */ +#define ENET_MULTICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HMF /*!< HASH multicast filter function */ +#define ENET_FILTER_MODE_EITHER ENET_MAC_FRMF_HPFLT /*!< HASH or perfect filter function */ + +#define ENET_UNICAST_FILTER_EITHER (ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_HPFLT) /*!< pass unicast frames that match either the perfect or the hash filtering */ +#define ENET_UNICAST_FILTER_HASH ENET_MAC_FRMF_HUF /*!< pass unicast frames that match the hash filtering */ +#define ENET_UNICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass unicast frames that match the perfect filtering */ +#define ENET_UNICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HUF /*!< HASH unicast filter function */ + +/* mac_phy_ctl register value */ +#define MAC_PHY_CTL_CLR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_MAC_PHY_CTL_CLR bit field */ +#define ENET_MDC_HCLK_DIV42 MAC_PHY_CTL_CLR(0) /*!< HCLK:60-100 MHz; MDC clock= HCLK/42 */ +#define ENET_MDC_HCLK_DIV62 MAC_PHY_CTL_CLR(1) /*!< HCLK:100-150 MHz; MDC clock= HCLK/62 */ +#define ENET_MDC_HCLK_DIV16 MAC_PHY_CTL_CLR(2) /*!< HCLK:20-35 MHz; MDC clock= HCLK/16 */ +#define ENET_MDC_HCLK_DIV26 MAC_PHY_CTL_CLR(3) /*!< HCLK:35-60 MHz; MDC clock= HCLK/26 */ +#define ENET_MDC_HCLK_DIV102 MAC_PHY_CTL_CLR(4) /*!< HCLK:150-240 MHz; MDC clock= HCLK/102 */ + +#define MAC_PHY_CTL_PR(regval) (BITS(6,10) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_PHY_CTL_PR bit field */ + +#define MAC_PHY_CTL_PA(regval) (BITS(11,15) & ((uint32_t)(regval) << 11)) /*!< write value to ENET_MAC_PHY_CTL_PA bit field */ + +/* mac_phy_data register value */ +#define MAC_PHY_DATA_PD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_PHY_DATA_PD bit field */ + +/* mac_fctl register value */ +#define MAC_FCTL_PLTS(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) /*!< write value to ENET_MAC_FCTL_PLTS bit field */ +#define ENET_PAUSETIME_MINUS4 MAC_FCTL_PLTS(0) /*!< pause time minus 4 slot times */ +#define ENET_PAUSETIME_MINUS28 MAC_FCTL_PLTS(1) /*!< pause time minus 28 slot times */ +#define ENET_PAUSETIME_MINUS144 MAC_FCTL_PLTS(2) /*!< pause time minus 144 slot times */ +#define ENET_PAUSETIME_MINUS256 MAC_FCTL_PLTS(3) /*!< pause time minus 256 slot times */ + +#define ENET_ZERO_QUANTA_PAUSE_ENABLE ((uint32_t)0x00000000U) /*!< enable the automatic zero-quanta generation function */ +#define ENET_ZERO_QUANTA_PAUSE_DISABLE ENET_MAC_FCTL_DZQP /*!< disable the automatic zero-quanta generation function */ +#define ENET_ZERO_QUANTA_PAUSE ENET_MAC_FCTL_DZQP /*!< the automatic zero-quanta generation function */ + +#define ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT ENET_MAC_FCTL_UPFDT /*!< besides the unique multicast address, MAC also use the MAC0 address to detect pause frame */ +#define ENET_UNIQUE_PAUSEDETECT ((uint32_t)0x00000000U) /*!< only the unique multicast address for pause frame which is specified in IEEE802.3 can be detected */ + +#define ENET_RX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_RFCEN /*!< enable decoding function for the received pause frame and process it */ +#define ENET_RX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< decode function for pause frame is disabled */ +#define ENET_RX_FLOWCONTROL ENET_MAC_FCTL_RFCEN /*!< decoding function for the received pause frame and process it */ + +#define ENET_TX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_TFCEN /*!< enable the flow control operation in the MAC */ +#define ENET_TX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< disable the flow control operation in the MAC */ +#define ENET_TX_FLOWCONTROL ENET_MAC_FCTL_TFCEN /*!< the flow control operation in the MAC */ + +#define ENET_BACK_PRESSURE_ENABLE ENET_MAC_FCTL_FLCBBKPA /*!< enable the back pressure operation in the MAC */ +#define ENET_BACK_PRESSURE_DISABLE ((uint32_t)0x00000000U) /*!< disable the back pressure operation in the MAC */ +#define ENET_BACK_PRESSURE ENET_MAC_FCTL_FLCBBKPA /*!< the back pressure operation in the MAC */ + +#define MAC_FCTL_PTM(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_MAC_FCTL_PTM bit field */ +/* mac_vlt register value */ +#define MAC_VLT_VLTI(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_VLT_VLTI bit field */ + +#define ENET_VLANTAGCOMPARISON_12BIT ENET_MAC_VLT_VLTC /*!< only low 12 bits of the VLAN tag are used for comparison */ +#define ENET_VLANTAGCOMPARISON_16BIT ((uint32_t)0x00000000U) /*!< all 16 bits of the VLAN tag are used for comparison */ + +/* mac_wum register value */ +#define ENET_WUM_FLAG_WUFFRPR ENET_MAC_WUM_WUFFRPR /*!< wakeup frame filter register poniter reset */ +#define ENET_WUM_FLAG_WUFR ENET_MAC_WUM_WUFR /*!< wakeup frame received */ +#define ENET_WUM_FLAG_MPKR ENET_MAC_WUM_MPKR /*!< magic packet received */ +#define ENET_WUM_POWER_DOWN ENET_MAC_WUM_PWD /*!< power down mode */ +#define ENET_WUM_MAGIC_PACKET_FRAME ENET_MAC_WUM_MPEN /*!< enable a wakeup event due to magic packet reception */ +#define ENET_WUM_WAKE_UP_FRAME ENET_MAC_WUM_WFEN /*!< enable a wakeup event due to wakeup frame reception */ +#define ENET_WUM_GLOBAL_UNICAST ENET_MAC_WUM_GU /*!< any received unicast frame passed filter is considered to be a wakeup frame */ + +/* mac_dbg register value */ +#define ENET_MAC_RECEIVER_NOT_IDLE ENET_MAC_DBG_MRNI /*!< MAC receiver is not in idle state */ +#define ENET_RX_ASYNCHRONOUS_FIFO_STATE ENET_MAC_DBG_RXAFS /*!< Rx asynchronous FIFO status */ +#define ENET_RXFIFO_WRITING ENET_MAC_DBG_RXFW /*!< RxFIFO is doing write operation */ +#define ENET_RXFIFO_READ_STATUS ENET_MAC_DBG_RXFRS /*!< RxFIFO read operation status */ +#define ENET_RXFIFO_STATE ENET_MAC_DBG_RXFS /*!< RxFIFO state */ +#define ENET_MAC_TRANSMITTER_NOT_IDLE ENET_MAC_DBG_MTNI /*!< MAC transmitter is not in idle state */ +#define ENET_MAC_TRANSMITTER_STATUS ENET_MAC_DBG_SOMT /*!< status of MAC transmitter */ +#define ENET_PAUSE_CONDITION_STATUS ENET_MAC_DBG_PCS /*!< pause condition status */ +#define ENET_TXFIFO_READ_STATUS ENET_MAC_DBG_TXFRS /*!< TxFIFO read operation status */ +#define ENET_TXFIFO_WRITING ENET_MAC_DBG_TXFW /*!< TxFIFO is doing write operation */ +#define ENET_TXFIFO_NOT_EMPTY ENET_MAC_DBG_TXFNE /*!< TxFIFO is not empty */ +#define ENET_TXFIFO_FULL ENET_MAC_DBG_TXFF /*!< TxFIFO is full */ + +#define GET_MAC_DBG_RXAFS(regval) GET_BITS((regval),1,2) /*!< get value of ENET_MAC_DBG_RXAFS bit field */ + +#define GET_MAC_DBG_RXFRS(regval) GET_BITS((regval),5,6) /*!< get value of ENET_MAC_DBG_RXFRS bit field */ + +#define GET_MAC_DBG_RXFS(regval) GET_BITS((regval),8,9) /*!< get value of ENET_MAC_DBG_RXFS bit field */ + +#define GET_MAC_DBG_SOMT(regval) GET_BITS((regval),17,18) /*!< get value of ENET_MAC_DBG_SOMT bit field */ + +#define GET_MAC_DBG_TXFRS(regval) GET_BITS((regval),20,21) /*!< get value of ENET_MAC_DBG_TXFRS bit field */ + +/* mac_addr0h register value */ +#define MAC_ADDR0H_ADDR0H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDR0H_ADDR0H bit field */ + +/* mac_addrxh register value, x = 1,2,3 */ +#define MAC_ADDR123H_ADDR123H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDRxH_ADDRxH(x=1,2,3) bit field */ + +#define ENET_ADDRESS_MASK_BYTE0 BIT(24) /*!< low register bits [7:0] */ +#define ENET_ADDRESS_MASK_BYTE1 BIT(25) /*!< low register bits [15:8] */ +#define ENET_ADDRESS_MASK_BYTE2 BIT(26) /*!< low register bits [23:16] */ +#define ENET_ADDRESS_MASK_BYTE3 BIT(27) /*!< low register bits [31:24] */ +#define ENET_ADDRESS_MASK_BYTE4 BIT(28) /*!< high register bits [7:0] */ +#define ENET_ADDRESS_MASK_BYTE5 BIT(29) /*!< high register bits [15:8] */ + +#define ENET_ADDRESS_FILTER_SA BIT(30) /*!< use MAC address[47:0] is to compare with the SA fields of the received frame */ +#define ENET_ADDRESS_FILTER_DA ((uint32_t)0x00000000) /*!< use MAC address[47:0] is to compare with the DA fields of the received frame */ + +/* mac_fcth register value */ +#define MAC_FCTH_RFA(regval) ((BITS(0,2) & ((uint32_t)(regval) << 0)) << 8) /*!< write value to ENET_MAC_FCTH_RFA bit field */ +#define ENET_ACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFA(0) /*!< threshold level is 256 bytes */ +#define ENET_ACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFA(1) /*!< threshold level is 512 bytes */ +#define ENET_ACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFA(2) /*!< threshold level is 768 bytes */ +#define ENET_ACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFA(3) /*!< threshold level is 1024 bytes */ +#define ENET_ACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFA(4) /*!< threshold level is 1280 bytes */ +#define ENET_ACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFA(5) /*!< threshold level is 1536 bytes */ +#define ENET_ACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFA(6) /*!< threshold level is 1792 bytes */ + +#define MAC_FCTH_RFD(regval) ((BITS(4,6) & ((uint32_t)(regval) << 4)) << 8) /*!< write value to ENET_MAC_FCTH_RFD bit field */ +#define ENET_DEACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFD(0) /*!< threshold level is 256 bytes */ +#define ENET_DEACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFD(1) /*!< threshold level is 512 bytes */ +#define ENET_DEACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFD(2) /*!< threshold level is 768 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFD(3) /*!< threshold level is 1024 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFD(4) /*!< threshold level is 1280 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFD(5) /*!< threshold level is 1536 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFD(6) /*!< threshold level is 1792 bytes */ + +/* msc_ctl register value */ +#define ENET_MSC_COUNTER_STOP_ROLLOVER ENET_MSC_CTL_CTSR /*!< counter stop rollover */ +#define ENET_MSC_RESET_ON_READ ENET_MSC_CTL_RTOR /*!< reset on read */ +#define ENET_MSC_COUNTERS_FREEZE ENET_MSC_CTL_MCFZ /*!< MSC counter freeze */ + +/* ptp_tsctl register value */ +#define ENET_RXTX_TIMESTAMP ENET_PTP_TSCTL_TMSEN /*!< enable timestamp function for transmit and receive frames */ +#define ENET_PTP_TIMESTAMP_INT ENET_PTP_TSCTL_TMSITEN /*!< timestamp interrupt trigger enable */ +#define ENET_ALL_RX_TIMESTAMP ENET_PTP_TSCTL_ARFSEN /*!< all received frames are taken snapshot */ +#define ENET_NONTYPE_FRAME_SNAPSHOT ENET_PTP_TSCTL_ESEN /*!< take snapshot when received non type frame */ +#define ENET_IPV6_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP6SEN /*!< take snapshot for IPv6 frame */ +#define ENET_IPV4_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP4SEN /*!< take snapshot for IPv4 frame */ +#define ENET_PTP_FRAME_USE_MACADDRESS_FILTER ENET_PTP_TSCTL_MAFEN /*!< enable MAC address1-3 to filter the PTP frame */ + +/* ptp_ssinc register value */ +#define PTP_SSINC_STMSSI(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_SSINC_STMSSI bit field */ + +/* ptp_tsl register value */ +#define GET_PTP_TSL_STMSS(regval) GET_BITS((uint32_t)(regval),0,30) /*!< get value of ENET_PTP_TSL_STMSS bit field */ + +#define ENET_PTP_TIME_POSITIVE ((uint32_t)0x00000000) /*!< time value is positive */ +#define ENET_PTP_TIME_NEGATIVE ENET_PTP_TSL_STS /*!< time value is negative */ + +#define GET_PTP_TSL_STS(regval) (((regval) & BIT(31)) >> (31U)) /*!< get value of ENET_PTP_TSL_STS bit field */ + +/* ptp_tsul register value */ +#define PTP_TSUL_TMSUSS(regval) (BITS(0,30) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_TSUL_TMSUSS bit field */ + +#define ENET_PTP_ADD_TO_TIME ((uint32_t)0x00000000) /*!< timestamp update value is added to system time */ +#define ENET_PTP_SUBSTRACT_FROM_TIME ENET_PTP_TSUL_TMSUPNS /*!< timestamp update value is subtracted from system time */ + +/* ptp_ppsctl register value */ +#define PTP_PPSCTL_PPSOFC(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_PPSCTL_PPSOFC bit field */ +#define ENET_PPSOFC_1HZ PTP_PPSCTL_PPSOFC(0) /*!< PPS output 1Hz frequency */ +#define ENET_PPSOFC_2HZ PTP_PPSCTL_PPSOFC(1) /*!< PPS output 2Hz frequency */ +#define ENET_PPSOFC_4HZ PTP_PPSCTL_PPSOFC(2) /*!< PPS output 4Hz frequency */ +#define ENET_PPSOFC_8HZ PTP_PPSCTL_PPSOFC(3) /*!< PPS output 8Hz frequency */ +#define ENET_PPSOFC_16HZ PTP_PPSCTL_PPSOFC(4) /*!< PPS output 16Hz frequency */ +#define ENET_PPSOFC_32HZ PTP_PPSCTL_PPSOFC(5) /*!< PPS output 32Hz frequency */ +#define ENET_PPSOFC_64HZ PTP_PPSCTL_PPSOFC(6) /*!< PPS output 64Hz frequency */ +#define ENET_PPSOFC_128HZ PTP_PPSCTL_PPSOFC(7) /*!< PPS output 128Hz frequency */ +#define ENET_PPSOFC_256HZ PTP_PPSCTL_PPSOFC(8) /*!< PPS output 256Hz frequency */ +#define ENET_PPSOFC_512HZ PTP_PPSCTL_PPSOFC(9) /*!< PPS output 512Hz frequency */ +#define ENET_PPSOFC_1024HZ PTP_PPSCTL_PPSOFC(10) /*!< PPS output 1024Hz frequency */ +#define ENET_PPSOFC_2048HZ PTP_PPSCTL_PPSOFC(11) /*!< PPS output 2048Hz frequency */ +#define ENET_PPSOFC_4096HZ PTP_PPSCTL_PPSOFC(12) /*!< PPS output 4096Hz frequency */ +#define ENET_PPSOFC_8192HZ PTP_PPSCTL_PPSOFC(13) /*!< PPS output 8192Hz frequency */ +#define ENET_PPSOFC_16384HZ PTP_PPSCTL_PPSOFC(14) /*!< PPS output 16384Hz frequency */ +#define ENET_PPSOFC_32768HZ PTP_PPSCTL_PPSOFC(15) /*!< PPS output 32768Hz frequency */ + +/* dma_bctl register value */ +#define DMA_BCTL_DPSL(regval) (BITS(2,6) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_DMA_BCTL_DPSL bit field */ +#define GET_DMA_BCTL_DPSL(regval) GET_BITS((regval),2,6) /*!< get value of ENET_DMA_BCTL_DPSL bit field */ + +#define ENET_ENHANCED_DESCRIPTOR ENET_DMA_BCTL_DFM /*!< enhanced mode descriptor */ +#define ENET_NORMAL_DESCRIPTOR ((uint32_t)0x00000000) /*!< normal mode descriptor */ + +#define DMA_BCTL_PGBL(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) /*!< write value to ENET_DMA_BCTL_PGBL bit field */ +#define ENET_PGBL_1BEAT DMA_BCTL_PGBL(1) /*!< maximum number of beats is 1 */ +#define ENET_PGBL_2BEAT DMA_BCTL_PGBL(2) /*!< maximum number of beats is 2 */ +#define ENET_PGBL_4BEAT DMA_BCTL_PGBL(4) /*!< maximum number of beats is 4 */ +#define ENET_PGBL_8BEAT DMA_BCTL_PGBL(8) /*!< maximum number of beats is 8 */ +#define ENET_PGBL_16BEAT DMA_BCTL_PGBL(16) /*!< maximum number of beats is 16 */ +#define ENET_PGBL_32BEAT DMA_BCTL_PGBL(32) /*!< maximum number of beats is 32 */ +#define ENET_PGBL_4xPGBL_4BEAT (DMA_BCTL_PGBL(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 4 */ +#define ENET_PGBL_4xPGBL_8BEAT (DMA_BCTL_PGBL(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 8 */ +#define ENET_PGBL_4xPGBL_16BEAT (DMA_BCTL_PGBL(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 16 */ +#define ENET_PGBL_4xPGBL_32BEAT (DMA_BCTL_PGBL(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 32 */ +#define ENET_PGBL_4xPGBL_64BEAT (DMA_BCTL_PGBL(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 64 */ +#define ENET_PGBL_4xPGBL_128BEAT (DMA_BCTL_PGBL(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 128 */ + +#define DMA_BCTL_RTPR(regval) (BITS(14,15) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_BCTL_RTPR bit field */ +#define ENET_ARBITRATION_RXTX_1_1 DMA_BCTL_RTPR(0) /*!< receive and transmit priority ratio is 1:1*/ +#define ENET_ARBITRATION_RXTX_2_1 DMA_BCTL_RTPR(1) /*!< receive and transmit priority ratio is 2:1*/ +#define ENET_ARBITRATION_RXTX_3_1 DMA_BCTL_RTPR(2) /*!< receive and transmit priority ratio is 3:1 */ +#define ENET_ARBITRATION_RXTX_4_1 DMA_BCTL_RTPR(3) /*!< receive and transmit priority ratio is 4:1 */ +#define ENET_ARBITRATION_RXPRIORTX ENET_DMA_BCTL_DAB /*!< RxDMA has higher priority than TxDMA */ + +#define ENET_FIXED_BURST_ENABLE ENET_DMA_BCTL_FB /*!< AHB can only use SINGLE/INCR4/INCR8/INCR16 during start of normal burst transfers */ +#define ENET_FIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB can use SINGLE/INCR burst transfer operations */ + +#define DMA_BCTL_RXDP(regval) (BITS(17,22) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_DMA_BCTL_RXDP bit field */ +#define ENET_RXDP_1BEAT DMA_BCTL_RXDP(1) /*!< maximum number of beats 1 */ +#define ENET_RXDP_2BEAT DMA_BCTL_RXDP(2) /*!< maximum number of beats 2 */ +#define ENET_RXDP_4BEAT DMA_BCTL_RXDP(4) /*!< maximum number of beats 4 */ +#define ENET_RXDP_8BEAT DMA_BCTL_RXDP(8) /*!< maximum number of beats 8 */ +#define ENET_RXDP_16BEAT DMA_BCTL_RXDP(16) /*!< maximum number of beats 16 */ +#define ENET_RXDP_32BEAT DMA_BCTL_RXDP(32) /*!< maximum number of beats 32 */ +#define ENET_RXDP_4xPGBL_4BEAT (DMA_BCTL_RXDP(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 4 */ +#define ENET_RXDP_4xPGBL_8BEAT (DMA_BCTL_RXDP(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 8 */ +#define ENET_RXDP_4xPGBL_16BEAT (DMA_BCTL_RXDP(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 16 */ +#define ENET_RXDP_4xPGBL_32BEAT (DMA_BCTL_RXDP(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 32 */ +#define ENET_RXDP_4xPGBL_64BEAT (DMA_BCTL_RXDP(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 64 */ +#define ENET_RXDP_4xPGBL_128BEAT (DMA_BCTL_RXDP(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 128 */ + +#define ENET_RXTX_DIFFERENT_PGBL ENET_DMA_BCTL_UIP /*!< RxDMA uses the RXDP[5:0], while TxDMA uses the PGBL[5:0] */ +#define ENET_RXTX_SAME_PGBL ((uint32_t)0x00000000) /*!< RxDMA/TxDMA uses PGBL[5:0] */ + +#define ENET_ADDRESS_ALIGN_ENABLE ENET_DMA_BCTL_AA /*!< enabled address-aligned */ +#define ENET_ADDRESS_ALIGN_DISABLE ((uint32_t)0x00000000) /*!< disable address-aligned */ + +#define ENET_MIXED_BURST_ENABLE ENET_DMA_BCTL_MB /*!< AHB master interface transfer burst length greater than 16 with INCR */ +#define ENET_MIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB master interface only transfer fixed burst length with 16 and below */ + +/* dma_stat register value */ +#define GET_DMA_STAT_RP(regval) GET_BITS((uint32_t)(regval),17,19) /*!< get value of ENET_DMA_STAT_RP bit field */ +#define ENET_RX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop rx command issued */ +#define ENET_RX_STATE_FETCHING BIT(17) /*!< fetching the Rx descriptor */ +#define ENET_RX_STATE_WAITING (BIT(17)|BIT(18)) /*!< waiting for receive packet */ +#define ENET_RX_STATE_SUSPENDED BIT(19) /*!< Rx descriptor unavailable */ +#define ENET_RX_STATE_CLOSING (BIT(17)|BIT(19)) /*!< closing receive descriptor */ +#define ENET_RX_STATE_QUEUING ENET_DMA_STAT_RP /*!< transferring the receive packet data from recevie buffer to host memory */ + +#define GET_DMA_STAT_TP(regval) GET_BITS((uint32_t)(regval),20,22) /*!< get value of ENET_DMA_STAT_TP bit field */ +#define ENET_TX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop Tx Command issued */ +#define ENET_TX_STATE_FETCHING BIT(20) /*!< fetching the Tx descriptor */ +#define ENET_TX_STATE_WAITING BIT(21) /*!< waiting for status */ +#define ENET_TX_STATE_READING (BIT(20)|BIT(21)) /*!< reading the data from host memory buffer and queuing it to transmit buffer */ +#define ENET_TX_STATE_SUSPENDED (BIT(21)|BIT(22)) /*!< Tx descriptor unavailabe or transmit buffer underflow */ +#define ENET_TX_STATE_CLOSING ENET_DMA_STAT_TP /*!< closing Tx descriptor */ + +#define GET_DMA_STAT_EB(regval) GET_BITS((uint32_t)(regval),23,25) /*!< get value of ENET_DMA_STAT_EB bit field */ +#define ENET_ERROR_TXDATA_TRANSFER BIT(23) /*!< error during data transfer by TxDMA or RxDMA */ +#define ENET_ERROR_READ_TRANSFER BIT(24) /*!< error during write transfer or read transfer */ +#define ENET_ERROR_DESC_ACCESS BIT(25) /*!< error during descriptor or buffer access */ + +/* dma_ctl register value */ +#define DMA_CTL_RTHC(regval) (BITS(3,4) & ((uint32_t)(regval) << 3)) /*!< write value to ENET_DMA_CTL_RTHC bit field */ +#define ENET_RX_THRESHOLD_64BYTES DMA_CTL_RTHC(0) /*!< threshold level is 64 Bytes */ +#define ENET_RX_THRESHOLD_32BYTES DMA_CTL_RTHC(1) /*!< threshold level is 32 Bytes */ +#define ENET_RX_THRESHOLD_96BYTES DMA_CTL_RTHC(2) /*!< threshold level is 96 Bytes */ +#define ENET_RX_THRESHOLD_128BYTES DMA_CTL_RTHC(3) /*!< threshold level is 128 Bytes */ + +#define DMA_CTL_TTHC(regval) (BITS(14,16) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_CTL_TTHC bit field */ +#define ENET_TX_THRESHOLD_64BYTES DMA_CTL_TTHC(0) /*!< threshold level is 64 Bytes */ +#define ENET_TX_THRESHOLD_128BYTES DMA_CTL_TTHC(1) /*!< threshold level is 128 Bytes */ +#define ENET_TX_THRESHOLD_192BYTES DMA_CTL_TTHC(2) /*!< threshold level is 192 Bytes */ +#define ENET_TX_THRESHOLD_256BYTES DMA_CTL_TTHC(3) /*!< threshold level is 256 Bytes */ +#define ENET_TX_THRESHOLD_40BYTES DMA_CTL_TTHC(4) /*!< threshold level is 40 Bytes */ +#define ENET_TX_THRESHOLD_32BYTES DMA_CTL_TTHC(5) /*!< threshold level is 32 Bytes */ +#define ENET_TX_THRESHOLD_24BYTES DMA_CTL_TTHC(6) /*!< threshold level is 24 Bytes */ +#define ENET_TX_THRESHOLD_16BYTES DMA_CTL_TTHC(7) /*!< threshold level is 16 Bytes */ + +#define ENET_TCPIP_CKSUMERROR_ACCEPT ENET_DMA_CTL_DTCERFD /*!< Rx frame with only payload error but no other errors will not be dropped */ +#define ENET_TCPIP_CKSUMERROR_DROP ((uint32_t)0x00000000) /*!< all error frames will be dropped when FERF = 0 */ + +#define ENET_RX_MODE_STOREFORWARD ENET_DMA_CTL_RSFD /*!< RxFIFO operates in store-and-forward mode */ +#define ENET_RX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< RxFIFO operates in cut-through mode */ + +#define ENET_FLUSH_RXFRAME_ENABLE ((uint32_t)0x00000000) /*!< RxDMA flushes all frames */ +#define ENET_FLUSH_RXFRAME_DISABLE ENET_DMA_CTL_DAFRF /*!< RxDMA does not flush any frames */ +#define ENET_NO_FLUSH_RXFRAME ENET_DMA_CTL_DAFRF /*!< RxDMA flushes frames function */ + +#define ENET_TX_MODE_STOREFORWARD ENET_DMA_CTL_TSFD /*!< TxFIFO operates in store-and-forward mode */ +#define ENET_TX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< TxFIFO operates in cut-through mode */ + +#define ENET_FORWARD_ERRFRAMES_ENABLE (ENET_DMA_CTL_FERF << 2) /*!< all frame received with error except runt error are forwarded to memory */ +#define ENET_FORWARD_ERRFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drop error frame */ +#define ENET_FORWARD_ERRFRAMES (ENET_DMA_CTL_FERF << 2) /*!< the function that all frame received with error except runt error are forwarded to memory */ + +#define ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE (ENET_DMA_CTL_FUF << 2) /*!< forward undersized good frames */ +#define ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drops all frames whose length is less than 64 bytes */ +#define ENET_FORWARD_UNDERSZ_GOODFRAMES (ENET_DMA_CTL_FUF << 2) /*!< the function that forwarding undersized good frames */ + +#define ENET_SECONDFRAME_OPT_ENABLE ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame mode enable*/ +#define ENET_SECONDFRAME_OPT_DISABLE ((uint32_t)0x00000000) /*!< TxDMA controller operate on second frame mode disable */ +#define ENET_SECONDFRAME_OPT ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame function */ +/* dma_mfbocnt register value */ +#define GET_DMA_MFBOCNT_MSFC(regval) GET_BITS((regval),0,15) /*!< get value of ENET_DMA_MFBOCNT_MSFC bit field */ + +#define GET_DMA_MFBOCNT_MSFA(regval) GET_BITS((regval),17,27) /*!< get value of ENET_DMA_MFBOCNT_MSFA bit field */ + +/* dma_rswdc register value */ +#define DMA_RSWDC_WDCFRS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_DMA_RSWDC_WDCFRS bit field */ + +/* dma tx descriptor tdes0 register value */ +#define TDES0_CONT(regval) (BITS(3,6) & ((uint32_t)(regval) << 3)) /*!< write value to ENET DMA TDES0 CONT bit field */ +#define GET_TDES0_COCNT(regval) GET_BITS((regval),3,6) /*!< get value of ENET DMA TDES0 CONT bit field */ + +#define TDES0_CM(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) /*!< write value to ENET DMA TDES0 CM bit field */ +#define ENET_CHECKSUM_DISABLE TDES0_CM(0) /*!< checksum insertion disabled */ +#define ENET_CHECKSUM_IPV4HEADER TDES0_CM(1) /*!< only IP header checksum calculation and insertion are enabled */ +#define ENET_CHECKSUM_TCPUDPICMP_SEGMENT TDES0_CM(2) /*!< TCP/UDP/ICMP checksum insertion calculated but pseudo-header */ +#define ENET_CHECKSUM_TCPUDPICMP_FULL TDES0_CM(3) /*!< TCP/UDP/ICMP checksum insertion fully calculated */ + +/* dma tx descriptor tdes1 register value */ +#define TDES1_TB1S(regval) (BITS(0,12) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA TDES1 TB1S bit field */ + +#define TDES1_TB2S(regval) (BITS(16,28) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA TDES1 TB2S bit field */ + +/* dma rx descriptor rdes0 register value */ +#define RDES0_FRML(regval) (BITS(16,29) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA RDES0 FRML bit field */ +#define GET_RDES0_FRML(regval) GET_BITS((regval),16,29) /*!< get value of ENET DMA RDES0 FRML bit field */ + +/* dma rx descriptor rdes1 register value */ +#define ENET_RECEIVE_COMPLETE_INT_ENABLE ((uint32_t)0x00000000U) /*!< RS bit immediately set after Rx completed */ +#define ENET_RECEIVE_COMPLETE_INT_DISABLE ENET_RDES1_DINTC /*!< RS bit not immediately set after Rx completed */ + +#define GET_RDES1_RB1S(regval) GET_BITS((regval),0,12) /*!< get value of ENET DMA RDES1 RB1S bit field */ + +#define GET_RDES1_RB2S(regval) GET_BITS((regval),16,28) /*!< get value of ENET DMA RDES1 RB2S bit field */ + +/* dma rx descriptor rdes4 register value */ +#define RDES4_IPPLDT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA RDES4 IPPLDT bit field */ +#define GET_RDES4_IPPLDT(regval) GET_BITS((regval),0,2) /*!< get value of ENET DMA RDES4 IPPLDT bit field */ + +#define RDES4_PTPMT(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) /*!< write value to ENET DMA RDES4 PTPMT bit field */ +#define GET_RDES4_PTPMT(regval) GET_BITS((regval),8,11) /*!< get value of ENET DMA RDES4 PTPMT bit field */ + +/* ENET register mask value */ +#define MAC_CFG_MASK ((uint32_t)0xFD30810FU) /*!< ENET_MAC_CFG register mask */ +#define MAC_FCTL_MASK ((uint32_t)0x0000FF41U) /*!< ENET_MAC_FCTL register mask */ +#define DMA_CTL_MASK ((uint32_t)0xF8DE3F23U) /*!< ENET_DMA_CTL register mask */ +#define DMA_BCTL_MASK ((uint32_t)0xF800007DU) /*!< ENET_DMA_BCTL register mask */ +#define ENET_MSC_PRESET_MASK (~(ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM)) /*!< ENET_MSC_CTL preset mask */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +#define ETH_DMATXDESC_SIZE ((uint32_t)0x00000020U) /*!< TxDMA enhanced descriptor size */ +#define ETH_DMARXDESC_SIZE ((uint32_t)0x00000020U) /*!< RxDMA enhanced descriptor size */ +#else +#define ETH_DMATXDESC_SIZE ((uint32_t)0x00000010U) /*!< TxDMA descriptor size */ +#define ETH_DMARXDESC_SIZE ((uint32_t)0x00000010U) /*!< RxDMA descriptor size */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* ENET remote wake-up frame register length */ +#define ETH_WAKEUP_REGISTER_LENGTH 8U /*!< remote wake-up frame register length */ + +/* ENET frame size */ +#define ENET_MAX_FRAME_SIZE 1524U /*!< header + frame_extra + payload + CRC */ + +/* ENET delay timeout */ +#define ENET_DELAY_TO ((uint32_t)0x0004FFFFU) /*!< ENET delay timeout */ +#define ENET_RESET_TO ((uint32_t)0x000004FFU) /*!< ENET reset timeout */ + + + +/* function declarations */ +/* main function */ +/* deinitialize the ENET, and reset structure parameters for ENET initialization */ +void enet_deinit(void); +/* configure the parameters which are usually less cared for initialization */ +void enet_initpara_config(enet_option_enum option, uint32_t para); +/* initialize ENET peripheral with generally concerned parameters and the less cared parameters */ +ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept); +/* reset all core internal registers located in CLK_TX and CLK_RX */ +ErrStatus enet_software_reset(void); +/* check receive frame valid and return frame size */ +uint32_t enet_rxframe_size_get(void); +/* initialize the dma tx/rx descriptors's parameters in chain mode */ +void enet_descriptors_chain_init(enet_dmadirection_enum direction); +/* initialize the dma tx/rx descriptors's parameters in ring mode */ +void enet_descriptors_ring_init(enet_dmadirection_enum direction); +/* handle current received frame data to application buffer */ +ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize); +/* handle current received frame but without data copy to application buffer */ +#define ENET_NOCOPY_FRAME_RECEIVE() enet_frame_receive(NULL, 0U) +/* handle application buffer data to transmit it */ +ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length); +/* handle current transmit frame but without data copy from application buffer */ +#define ENET_NOCOPY_FRAME_TRANSMIT(len) enet_frame_transmit(NULL, (len)) +/* configure the transmit IP frame checksum offload calculation and insertion */ +ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum); +/* ENET Tx and Rx function enable (include MAC and DMA module) */ +void enet_enable(void); +/* ENET Tx and Rx function disable (include MAC and DMA module) */ +void enet_disable(void); +/* configure MAC address */ +void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]); +/* get MAC address */ +ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize); + +/* get the ENET MAC/MSC/PTP/DMA status flag */ +FlagStatus enet_flag_get(enet_flag_enum enet_flag); +/* clear the ENET DMA status flag */ +void enet_flag_clear(enet_flag_clear_enum enet_flag); +/* enable ENET MAC/MSC/DMA interrupt */ +void enet_interrupt_enable(enet_int_enum enet_int); +/* disable ENET MAC/MSC/DMA interrupt */ +void enet_interrupt_disable(enet_int_enum enet_int); +/* get ENET MAC/MSC/DMA interrupt flag */ +FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag); +/* clear ENET DMA interrupt flag */ +void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear); + +/* MAC function */ +/* ENET Tx function enable (include MAC and DMA module) */ +void enet_tx_enable(void); +/* ENET Tx function disable (include MAC and DMA module) */ +void enet_tx_disable(void); +/* ENET Rx function enable (include MAC and DMA module) */ +void enet_rx_enable(void); +/* ENET Rx function disable (include MAC and DMA module) */ +void enet_rx_disable(void); +/* put registers value into the application buffer */ +void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num); +/* get the enet debug status from the debug register */ +uint32_t enet_debug_status_get(uint32_t mac_debug); +/* enable the MAC address filter */ +void enet_address_filter_enable(enet_macaddress_enum mac_addr); +/* disable the MAC address filter */ +void enet_address_filter_disable(enet_macaddress_enum mac_addr); +/* configure the MAC address filter */ +void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type); +/* PHY interface configuration (configure SMI clock and reset PHY chip) */ +ErrStatus enet_phy_config(void); +/* write to/read from a PHY register */ +ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, uint16_t *pvalue); +/* enable the loopback function of phy chip */ +ErrStatus enet_phyloopback_enable(void); +/* disable the loopback function of phy chip */ +ErrStatus enet_phyloopback_disable(void); +/* enable ENET forward feature */ +void enet_forward_feature_enable(uint32_t feature); +/* disable ENET forward feature */ +void enet_forward_feature_disable(uint32_t feature); +/* enable ENET fliter feature */ +void enet_fliter_feature_enable(uint32_t feature); +/* disable ENET fliter feature */ +void enet_fliter_feature_disable(uint32_t feature); + +/* flow control function */ +/* generate the pause frame, ENET will send pause frame after enable transmit flow control */ +ErrStatus enet_pauseframe_generate(void); +/* configure the pause frame detect type */ +void enet_pauseframe_detect_config(uint32_t detect); +/* configure the pause frame parameters */ +void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold); +/* configure the threshold of the flow control(deactive and active threshold) */ +void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active); +/* enable ENET flow control feature */ +void enet_flowcontrol_feature_enable(uint32_t feature); +/* disable ENET flow control feature */ +void enet_flowcontrol_feature_disable(uint32_t feature); + +/* DMA function */ +/* get the dma transmit/receive process state */ +uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction); +/* poll the dma transmission/reception enable */ +void enet_dmaprocess_resume(enet_dmadirection_enum direction); +/* check and recover the Rx process */ +void enet_rxprocess_check_recovery(void); +/* flush the ENET transmit fifo, and wait until the flush operation completes */ +ErrStatus enet_txfifo_flush(void); +/* get the transmit/receive address of current descriptor, or current buffer, or descriptor table */ +uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get); +/* get the Tx or Rx descriptor information */ +uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get); +/* get the number of missed frames during receiving */ +void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop); + +/* descriptor function */ +/* get the bit flag of ENET dma descriptor */ +FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag); +/* set the bit flag of ENET dma tx descriptor */ +void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag); +/* clear the bit flag of ENET dma tx descriptor */ +void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag); +/* when receiving the completed, set RS bit in ENET_DMA_STAT register will immediately set */ +void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc); +/* when receiving the completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time */ +void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time); +/* drop current receive frame */ +void enet_rxframe_drop(void); +/* enable DMA feature */ +void enet_dma_feature_enable(uint32_t feature); +/* disable DMA feature */ +void enet_dma_feature_disable(uint32_t feature); + + +/* special enhanced mode function */ +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* get the bit of extended status flag in ENET DMA descriptor */ +uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status); +/* configure descriptor to work in enhanced mode */ +void enet_desc_select_enhanced_mode(void); +/* initialize the dma Tx/Rx descriptors's parameters in enhanced chain mode with ptp function */ +void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction); +/* initialize the dma Tx/Rx descriptors's parameters in enhanced ring mode with ptp function */ +void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction); +/* receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode */ +ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); +/* handle current received frame but without data copy to application buffer in PTP enhanced mode */ +#define ENET_NOCOPY_PTPFRAME_RECEIVE_ENHANCED_MODE(ptr) enet_ptpframe_receive_enhanced_mode(NULL, 0U, (ptr)) +/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode */ +ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); +/* handle current transmit frame but without data copy from application buffer in PTP enhanced mode */ +#define ENET_NOCOPY_PTPFRAME_TRANSMIT_ENHANCED_MODE(len, ptr) enet_ptpframe_transmit_enhanced_mode(NULL, (len), (ptr)) + +#else + +/* configure descriptor to work in normal mode */ +void enet_desc_select_normal_mode(void); +/* initialize the dma Tx/Rx descriptors's parameters in normal chain mode with ptp function */ +void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); +/* initialize the dma Tx/Rx descriptors's parameters in normal ring mode with ptp function */ +void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); +/* receive a packet data with timestamp values to application buffer, when the DMA is in normal mode */ +ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); +/* handle current received frame but without data copy to application buffer in PTP normal mode */ +#define ENET_NOCOPY_PTPFRAME_RECEIVE_NORMAL_MODE(ptr) enet_ptpframe_receive_normal_mode(NULL, 0U, (ptr)) +/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode */ +ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); +/* handle current transmit frame but without data copy from application buffer in PTP normal mode */ +#define ENET_NOCOPY_PTPFRAME_TRANSMIT_NORMAL_MODE(len, ptr) enet_ptpframe_transmit_normal_mode(NULL, (len), (ptr)) + +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* WUM function */ +/* wakeup frame filter register pointer reset */ +void enet_wum_filter_register_pointer_reset(void); +/* set the remote wakeup frame registers */ +void enet_wum_filter_config(uint32_t pdata[]); +/* enable wakeup management features */ +void enet_wum_feature_enable(uint32_t feature); +/* disable wakeup management features */ +void enet_wum_feature_disable(uint32_t feature); + +/* MSC function */ +/* reset the MAC statistics counters */ +void enet_msc_counters_reset(void); +/* enable the MAC statistics counter features */ +void enet_msc_feature_enable(uint32_t feature); +/* disable the MAC statistics counter features */ +void enet_msc_feature_disable(uint32_t feature); +/* configure MAC statistics counters preset mode */ +void enet_msc_counters_preset_config(enet_msc_preset_enum mode); +/* get MAC statistics counter */ +uint32_t enet_msc_counters_get(enet_msc_counter_enum counter); + +/* PTP function */ +/* change subsecond to nanosecond */ +uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond); +/* change nanosecond to subsecond */ +uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond); +/* enable the PTP features */ +void enet_ptp_feature_enable(uint32_t feature); +/* disable the PTP features */ +void enet_ptp_feature_disable(uint32_t feature); +/* configure the PTP timestamp function */ +ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func); +/* configure the PTP system time subsecond increment value */ +void enet_ptp_subsecond_increment_config(uint32_t subsecond); +/* adjusting the PTP clock frequency only in fine update mode */ +void enet_ptp_timestamp_addend_config(uint32_t add); +/* initializing or adding/subtracting to second of the PTP system time */ +void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond); +/* configure the PTP expected target time */ +void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond); +/* get the PTP current system time */ +void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct); +/* configure the PPS output frequency */ +void enet_ptp_pps_output_frequency_config(uint32_t freq); +/* configure and start PTP timestamp counter */ +void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg); +/* adjust frequency in fine method by configure addend register */ +void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg); +/* update system time in coarse method */ +void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct); +/* set system time in fine method */ +void enet_ptp_finecorrection_settime(enet_ptp_systime_struct * systime_struct); +/* get the ptp flag status */ +FlagStatus enet_ptp_flag_get(uint32_t flag); + +/* internal function */ +/* reset the ENET initpara struct, call it before using enet_initpara_config() */ +void enet_initpara_reset(void); +#ifdef USE_DELAY +/* user can provide more timing precise _ENET_DELAY_ function */ +#define _ENET_DELAY_ delay_ms +#else +/* default _ENET_DELAY_ function with less precise timing */ +#define _ENET_DELAY_ enet_delay +#endif + +#endif /* GD32F5XX_ENET_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h new file mode 100644 index 00000000000..988899456ee --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h @@ -0,0 +1,812 @@ +/*! + \file gd32f5xx_exmc.h + \brief definitions for the EXMC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_EXMC_H +#define GD32F5XX_EXMC_H + +#include "gd32f5xx.h" + +/* EXMC definitions */ +#define EXMC (EXMC_BASE) /*!< EXMC register base address */ +#define EXMC_NOR_PSRAM (EXMC_BASE - 0x40000000U) /*!< EXMC NOR/PSRAM base address */ +#define EXMC_NAND (EXMC_BASE - 0x30000000U) /*!< EXMC NAND base address */ +#define EXMC_PCCARD (EXMC_BASE - 0x10000000U) /*!< EXMC PC card base address */ +#define EXMC_SDRAM (EXMC_BASE + 0x20000000U) /*!< EXMC SDRAM base address */ + +/* registers definitions */ +/* NOR/PSRAM */ +#define EXMC_SNCTL0 REG32(EXMC + 0x00000000U) /*!< EXMC SRAM/NOR flash control register for region0 */ +#define EXMC_SNTCFG0 REG32(EXMC + 0x00000004U) /*!< EXMC SRAM/NOR flash timing configuration register for region0 */ +#define EXMC_SNWTCFG0 REG32(EXMC + 0x00000104U) /*!< EXMC SRAM/NOR flash write timing configuration register for region0 */ + +#define EXMC_SNCTL1 REG32(EXMC + 0x00000008U) /*!< EXMC SRAM/NOR flash control register for region1 */ +#define EXMC_SNTCFG1 REG32(EXMC + 0x0000000CU) /*!< EXMC SRAM/NOR flash timing configuration register for region1 */ +#define EXMC_SNWTCFG1 REG32(EXMC + 0x0000010CU) /*!< EXMC SRAM/NOR flash write timing configuration register for region1 */ + +#define EXMC_SNCTL2 REG32(EXMC + 0x00000010U) /*!< EXMC SRAM/NOR flash control register for region2 */ +#define EXMC_SNTCFG2 REG32(EXMC + 0x00000014U) /*!< EXMC SRAM/NOR flash timing configuration register for region2 */ +#define EXMC_SNWTCFG2 REG32(EXMC + 0x00000114U) /*!< EXMC SRAM/NOR flash write timing configuration register for region2 */ + +#define EXMC_SNCTL3 REG32(EXMC + 0x00000018U) /*!< EXMC SRAM/NOR flash control register for region3 */ +#define EXMC_SNTCFG3 REG32(EXMC + 0x0000001CU) /*!< EXMC SRAM/NOR flash timing configuration register for region3 */ +#define EXMC_SNWTCFG3 REG32(EXMC + 0x0000011CU) /*!< EXMC SRAM/NOR flash write timing configuration register for region3 */ + +#define EXMC_SNLATDEC0 REG32(EXMC + 0x00000300U) /*!< EXMC SRAM/NOR flash data latency decrease register0 */ +#define EXMC_SNLATDEC1 REG32(EXMC + 0x00000304U) /*!< EXMC SRAM/NOR flash data latency decrease register1 */ +#define EXMC_SNLATDEC2 REG32(EXMC + 0x00000308U) /*!< EXMC SRAM/NOR flash data latency decrease register2 */ +#define EXMC_SNLATDEC3 REG32(EXMC + 0x0000030CU) /*!< EXMC SRAM/NOR flash data latency decrease register3 */ + +/* NAND/PC card */ +#define EXMC_NPCTL1 REG32(EXMC + 0x00000060U) /*!< EXMC NAND/PC card control register for bank1 */ +#define EXMC_NPINTEN1 REG32(EXMC + 0x00000064U) /*!< EXMC NAND/PC card interrupt enable register for bank1 */ +#define EXMC_NPCTCFG1 REG32(EXMC + 0x00000068U) /*!< EXMC NAND/PC card common space timing configuration register for bank1 */ +#define EXMC_NPATCFG1 REG32(EXMC + 0x0000006CU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank1 */ +#define EXMC_NECC1 REG32(EXMC + 0x00000074U) /*!< EXMC NAND ECC register */ + +#define EXMC_NPCTL2 REG32(EXMC + 0x00000080U) /*!< EXMC NAND/PC card control register for bank2 */ +#define EXMC_NPINTEN2 REG32(EXMC + 0x00000084U) /*!< EXMC NAND/PC card interrupt enable register for bank2 */ +#define EXMC_NPCTCFG2 REG32(EXMC + 0x00000088U) /*!< EXMC NAND/PC card common space timing configuration register for bank2 */ +#define EXMC_NPATCFG2 REG32(EXMC + 0x0000008CU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank2 */ +#define EXMC_NECC2 REG32(EXMC + 0x00000094U) /*!< EXMC NAND ECC register */ + +#define EXMC_NPCTL3 REG32(EXMC + 0x000000A0U) /*!< EXMC NAND/PC card control register for bank3 */ +#define EXMC_NPINTEN3 REG32(EXMC + 0x000000A4U) /*!< EXMC NAND/PC card interrupt enable register for bank3 */ +#define EXMC_NPCTCFG3 REG32(EXMC + 0x000000A8U) /*!< EXMC NAND/PC card common space timing configuration register for bank3 */ +#define EXMC_NPATCFG3 REG32(EXMC + 0x000000ACU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank3 */ +#define EXMC_PIOTCFG3 REG32(EXMC + 0x000000B0U) /*!< EXMC PC card I/O space timing configuration register for bank3 */ + +/* SDRAM */ +#define EXMC_SDCTL0 REG32(EXMC + 0x00000140U) /*!< EXMC SDRAM control register for device0 */ +#define EXMC_SDTCFG0 REG32(EXMC + 0x00000148U) /*!< EXMC SDRAM timing configuration register register for device0 */ + +#define EXMC_SDCTL1 REG32(EXMC + 0x00000144U) /*!< EXMC SDRAM control register for device1 */ +#define EXMC_SDTCFG1 REG32(EXMC + 0x0000014CU) /*!< EXMC SDRAM timing configuration register register for device1 */ + +#define EXMC_SDCMD REG32(EXMC + 0x00000150U) /*!< EXMC SDRAM command register */ +#define EXMC_SDARI REG32(EXMC + 0x00000154U) /*!< EXMC SDRAM auto-refresh interval register */ +#define EXMC_SDSTAT REG32(EXMC + 0x00000158U) /*!< EXMC SDRAM status register */ +#define EXMC_SDRSCTL REG32(EXMC + 0x00000180U) /*!< EXMC SDRAM read sample control register */ + +/* SQPI PSRAM */ +#define EXMC_SINIT REG32(EXMC + 0x00000310U) /*!< EXMC SPI initialization register */ +#define EXMC_SRCMD REG32(EXMC + 0x00000320U) /*!< EXMC SPI read command register */ +#define EXMC_SWCMD REG32(EXMC + 0x00000330U) /*!< EXMC SPI write command register */ +#define EXMC_SIDL REG32(EXMC + 0x00000340U) /*!< EXMC SPI ID low register */ +#define EXMC_SIDH REG32(EXMC + 0x00000350U) /*!< EXMC SPI ID high register */ + +/* bits definitions */ +/* EXMC_SNCTLx,x=0..3 */ +#define EXMC_SNCTL_NRBKEN BIT(0) /*!< NOR bank enable */ +#define EXMC_SNCTL_NRMUX BIT(1) /*!< NOR bank memory address/data multiplexing enable */ +#define EXMC_SNCTL_NRTP BITS(2,3) /*!< NOR bank memory type */ +#define EXMC_SNCTL_NRW BITS(4,5) /*!< NOR bank memory data bus width */ +#define EXMC_SNCTL_NREN BIT(6) /*!< NOR flash access enable */ +#define EXMC_SNCTL_SBRSTEN BIT(8) /*!< synchronous burst enable */ +#define EXMC_SNCTL_NRWTPOL BIT(9) /*!< NWAIT signal polarity */ +#define EXMC_SNCTL_WRAPEN BIT(10) /*!< wrapped burst mode enable */ +#define EXMC_SNCTL_NRWTCFG BIT(11) /*!< NWAIT signal configuration, only work in synchronous mode */ +#define EXMC_SNCTL_WEN BIT(12) /*!< write enable */ +#define EXMC_SNCTL_NRWTEN BIT(13) /*!< NWAIT signal enable */ +#define EXMC_SNCTL_EXMODEN BIT(14) /*!< extended mode enable */ +#define EXMC_SNCTL_ASYNCWTEN BIT(15) /*!< asynchronous wait enable */ +#define EXMC_SNCTL_CPS BITS(16,18) /*!< CRAM page size */ +#define EXMC_SNCTL_SYNCWR BIT(19) /*!< synchronous write configuration */ +#define EXMC_SNCTL_CCK BIT(20) /*!< consecutive clock configuration */ + +/* EXMC_SNTCFGx,x=0..3 */ +#define EXMC_SNTCFG_ASET BITS(0,3) /*!< asynchronous address setup time */ +#define EXMC_SNTCFG_AHLD BITS(4,7) /*!< asynchronous address hold time */ +#define EXMC_SNTCFG_DSET BITS(8,15) /*!< asynchronous data setup time */ +#define EXMC_SNTCFG_BUSLAT BITS(16,19) /*!< bus latency */ +#define EXMC_SNTCFG_CKDIV BITS(20,23) /*!< synchronous clock divide ratio */ +#define EXMC_SNTCFG_DLAT BITS(24,27) /*!< synchronous data latency for NOR flash */ +#define EXMC_SNTCFG_ASYNCMOD BITS(28,29) /*!< asynchronous access mode */ + +/* EXMC_SNWTCFGx,x=0..3 */ +#define EXMC_SNWTCFG_WASET BITS(0,3) /*!< asynchronous address setup time */ +#define EXMC_SNWTCFG_WAHLD BITS(4,7) /*!< asynchronous address hold time */ +#define EXMC_SNWTCFG_WDSET BITS(8,15) /*!< asynchronous data setup time */ +#define EXMC_SNWTCFG_WBUSLAT BITS(16,19) /*!< bus latency */ +#define EXMC_SNWTCFG_WASYNCMOD BITS(28,29) /*!< asynchronous access mode */ + +/* EXMC_SNLATDECx,x=0..3 */ +#define EXMC_SNLATDEC_LATDEC BITS(0,2) /*!< data latency decrease for NOR Flash and only valid in synchronous read access */ + +/* EXMC_NPCTLx,x=1..3 */ +#define EXMC_NPCTL_NDWTEN BIT(1) /*!< wait feature enable */ +#define EXMC_NPCTL_NDBKEN BIT(2) /*!< NAND bank enable */ +#define EXMC_NPCTL_NDTP BIT(3) /*!< NAND bank memory type */ +#define EXMC_NPCTL_NDW BITS(4,5) /*!< NAND bank memory data bus width */ +#define EXMC_NPCTL_ECCEN BIT(6) /*!< ECC enable */ +#define EXMC_NPCTL_CTR BITS(9,12) /*!< CLE to RE delay */ +#define EXMC_NPCTL_ATR BITS(13,16) /*!< ALE to RE delay */ +#define EXMC_NPCTL_ECCSZ BITS(17,19) /*!< ECC size */ + +/* EXMC_NPINTENx,x=1..3 */ +#define EXMC_NPINTEN_INTRS BIT(0) /*!< interrupt rising edge status */ +#define EXMC_NPINTEN_INTHS BIT(1) /*!< interrupt high-level status */ +#define EXMC_NPINTEN_INTFS BIT(2) /*!< interrupt falling edge status */ +#define EXMC_NPINTEN_INTREN BIT(3) /*!< interrupt rising edge detection enable */ +#define EXMC_NPINTEN_INTHEN BIT(4) /*!< interrupt high-level detection enable */ +#define EXMC_NPINTEN_INTFEN BIT(5) /*!< interrupt falling edge detection enable */ +#define EXMC_NPINTEN_FFEPT BIT(6) /*!< FIFO empty flag */ + +/* EXMC_NPCTCFGx,x=1..3 */ +#define EXMC_NPCTCFG_COMSET BITS(0,7) /*!< common memory setup time */ +#define EXMC_NPCTCFG_COMWAIT BITS(8,15) /*!< common memory wait time */ +#define EXMC_NPCTCFG_COMHLD BITS(16,23) /*!< common memory hold time */ +#define EXMC_NPCTCFG_COMHIZ BITS(24,31) /*!< common memory data bus HiZ time */ + +/* EXMC_NPATCFGx,x=1..3 */ +#define EXMC_NPATCFG_ATTSET BITS(0,7) /*!< attribute memory setup time */ +#define EXMC_NPATCFG_ATTWAIT BITS(8,15) /*!< attribute memory wait time */ +#define EXMC_NPATCFG_ATTHLD BITS(16,23) /*!< attribute memory hold time */ +#define EXMC_NPATCFG_ATTHIZ BITS(24,31) /*!< attribute memory data bus HiZ time */ + +/* EXMC_PIOTCFG3 */ +#define EXMC_PIOTCFG3_IOSET BITS(0,7) /*!< IO space setup time */ +#define EXMC_PIOTCFG3_IOWAIT BITS(8,15) /*!< IO space wait time */ +#define EXMC_PIOTCFG3_IOHLD BITS(16,23) /*!< IO space hold time */ +#define EXMC_PIOTCFG3_IOHIZ BITS(24,31) /*!< IO space data bus HiZ time */ + +/* EXMC_NECCx,x=1..2 */ +#define EXMC_NECC_ECC BITS(0,31) /*!< ECC result */ + +/* EXMC_SDCTLx,x=0..1 */ +#define EXMC_SDCTL_CAW BITS(0,1) /*!< column address bit width */ +#define EXMC_SDCTL_RAW BITS(2,3) /*!< row address bit width */ +#define EXMC_SDCTL_SDW BITS(4,5) /*!< SDRAM data bus width */ +#define EXMC_SDCTL_NBK BIT(6) /*!< number of banks */ +#define EXMC_SDCTL_CL BIT(7,8) /*!< CAS Latency */ +#define EXMC_SDCTL_WPEN BIT(9) /*!< write protection enable */ +#define EXMC_SDCTL_SDCLK BITS(10,11) /*!< SDRAM clock configuration */ +#define EXMC_SDCTL_BRSTRD BIT(12) /*!< burst read enable */ +#define EXMC_SDCTL_PIPED BITS(13,14) /*!< pipeline delay */ + +/* EXMC_SDTCFGx,x=0..1 */ +#define EXMC_SDTCFG_LMRD BITS(0,3) /*!< load mode register delay */ +#define EXMC_SDTCFG_XSRD BITS(4,7) /*!< exit self-refresh delay */ +#define EXMC_SDTCFG_RASD BITS(8,11) /*!< row address select delay */ +#define EXMC_SDTCFG_ARFD BITS(12,15) /*!< auto refresh delay */ +#define EXMC_SDTCFG_WRD BITS(16,19) /*!< write recovery delay */ +#define EXMC_SDTCFG_RPD BITS(20,23) /*!< row precharge delay */ +#define EXMC_SDTCFG_RCD BITS(24,27) /*!< row to column delay */ + +/* EXMC_SDCMD */ +#define EXMC_SDCMD_CMD BITS(0,2) /*!< command */ +#define EXMC_SDCMD_DS1 BIT(3) /*!< select device1 */ +#define EXMC_SDCMD_DS0 BIT(4) /*!< select device0 */ +#define EXMC_SDCMD_NARF BITS(5,8) /*!< number of successive auto-refresh */ +#define EXMC_SDCMD_MRC BITS(9,21) /*!< mode register content */ + +/* EXMC_SDARI */ +#define EXMC_SDARI_REC BIT(0) /*!< refresh error flag clear */ +#define EXMC_SDARI_ARINTV BITS(1,13) /*!< auto-refresh interval */ +#define EXMC_SDARI_REIE BIT(14) /*!< refresh error interrupt enable */ + +/* EXMC_SDSTAT */ +#define EXMC_SDSDAT_REIF BIT(0) /*!< refresh error interrupt flag */ +#define EXMC_SDSDAT_STA0 BITS(1,2) /*!< device0 status */ +#define EXMC_SDSDAT_STA1 BITS(3,4) /*!< device1 status */ +#define EXMC_SDSDAT_NRDY BIT(5) /*!< not ready status */ + +/* EXMC_SDRSCTL */ +#define EXMC_SDRSCTL_RSEN BIT(0) /*!< read sample enable */ +#define EXMC_SDRSCTL_SSCR BIT(1) /*!< select sample cycle of read data */ +#define EXMC_SDRSCTL_SDSC BITS(4,7) /*!< select the delayed sample clock of read data */ + +/* EXMC_SINIT */ +#define EXMC_SINIT_CMDBIT BITS(16,17) /*!< bit number of SPI PSRAM command phase */ +#define EXMC_SINIT_ARDBIT BITS(24,28) /*!< bit number of SPI PSRAM address phase */ +#define EXMC_SINIT_IDL BITS(29,30) /*!< SPI PSRAM ID length */ +#define EXMC_SINIT_POL BIT(31) /*!< read data sample polarity */ + +/* EXMC_SRCMD */ +#define EXMC_SRCMD_RCMD BITS(0,15) /*!< SPI read command for AHB read transfer */ +#define EXMC_SRCMD_RWAITCYCLE BITS(16,19) /*!< SPI read wait cycle number after address phase */ +#define EXMC_SRCMD_RMODE BITS(20,21) /*!< SPI PSRAM read command mode */ +#define EXMC_SRCMD_RDID BIT(31) /*!< send SPI read ID command */ + +/* EXMC_SWCMD */ +#define EXMC_SWCMD_WCMD BITS(0,15) /*!< SPI write command for AHB write transfer */ +#define EXMC_SWCMD_WWAITCYCLE BITS(16,19) /*!< SPI write wait cycle number after address phase */ +#define EXMC_SWCMD_WMODE BITS(20,21) /*!< SPI PSRAM write command mode */ +#define EXMC_SWCMD_SC BIT(31) /*!< send SPI special command */ + +/* EXMC_SIDL */ +#define EXMC_SIDL_SIDL BITS(0,31) /*!< ID low data saved for SPI read ID command */ + +/* EXMC_SIDH */ +#define EXMC_SIDL_SIDH BITS(0,31) /*!< ID high Data saved for SPI read ID command */ + +/* constants definitions */ +/* EXMC NOR/SRAM timing initialize structure */ +typedef struct { + uint32_t asyn_access_mode; /*!< asynchronous access mode */ + uint32_t syn_data_latency; /*!< configure the data latency */ + uint32_t syn_data_latency_dec; /*!< configure the data latency decreasing value */ + uint32_t syn_clk_division; /*!< configure the clock divide ratio */ + uint32_t bus_latency; /*!< configure the bus latency */ + uint32_t asyn_data_setuptime; /*!< configure the data setup time, asynchronous access mode valid */ + uint32_t asyn_address_holdtime; /*!< configure the address hold time, asynchronous access mode valid */ + uint32_t asyn_address_setuptime; /*!< configure the address setup time, asynchronous access mode valid */ +} exmc_norsram_timing_parameter_struct; + +/* EXMC NOR/SRAM initialize structure */ +typedef struct { + uint32_t norsram_region; /*!< select the region of EXMC NOR/SRAM bank */ + uint32_t write_mode; /*!< the write mode, synchronous mode or asynchronous mode */ + uint32_t extended_mode; /*!< enable or disable the extended mode */ + uint32_t asyn_wait; /*!< enable or disable the asynchronous wait function */ + uint32_t nwait_signal; /*!< enable or disable the NWAIT signal while in synchronous bust mode */ + uint32_t memory_write; /*!< enable or disable the write operation */ + uint32_t nwait_config; /*!< NWAIT signal configuration */ + uint32_t wrap_burst_mode; /*!< enable or disable the wrap burst mode */ + uint32_t nwait_polarity; /*!< specifies the polarity of NWAIT signal from memory */ + uint32_t burst_mode; /*!< enable or disable the burst mode */ + uint32_t databus_width; /*!< specifies the databus width of external memory */ + uint32_t memory_type; /*!< specifies the type of external memory */ + uint32_t address_data_mux; /*!< specifies whether the data bus and address bus are multiplexed */ + exmc_norsram_timing_parameter_struct *read_write_timing; /*!< timing parameters for read and write if the extendedmode is not used or the timing + parameters for read if the extendedmode is used. */ + exmc_norsram_timing_parameter_struct *write_timing; /*!< timing parameters for write when the extendedmode is used. */ +} exmc_norsram_parameter_struct; + +/* EXMC NAND/PC card timing initialize structure */ +typedef struct { + uint32_t databus_hiztime; /*!< configure the dadtabus HiZ time for write operation */ + uint32_t holdtime; /*!< configure the address hold time(or the data hold time for write operation) */ + uint32_t waittime; /*!< configure the minimum wait time */ + uint32_t setuptime; /*!< configure the address setup time */ +} exmc_nand_pccard_timing_parameter_struct; + +/* EXMC NAND initialize structure */ +typedef struct { + uint32_t nand_bank; /*!< select the bank of NAND */ + uint32_t ecc_size; /*!< the page size for the ECC calculation */ + uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ + uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ + uint32_t ecc_logic; /*!< enable or disable the ECC calculation logic */ + uint32_t databus_width; /*!< the NAND flash databus width */ + uint32_t wait_feature; /*!< enable or disable the wait feature */ + exmc_nand_pccard_timing_parameter_struct *common_space_timing; /*!< the timing parameters for NAND flash common space */ + exmc_nand_pccard_timing_parameter_struct *attribute_space_timing; /*!< the timing parameters for NAND flash attribute space */ +} exmc_nand_parameter_struct; + +/* EXMC PC card initialize structure */ +typedef struct { + uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ + uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ + uint32_t wait_feature; /*!< enable or disable the wait feature */ + exmc_nand_pccard_timing_parameter_struct *common_space_timing; /*!< the timing parameters for PC card common space */ + exmc_nand_pccard_timing_parameter_struct *attribute_space_timing; /*!< the timing parameters for PC card attribute space */ + exmc_nand_pccard_timing_parameter_struct *io_space_timing; /*!< the timing parameters for PC card IO space */ +} exmc_pccard_parameter_struct; + +/* EXMC SDRAM timing initialize structure */ +typedef struct { + uint32_t row_to_column_delay; /*!< configure the row to column delay */ + uint32_t row_precharge_delay; /*!< configure the row precharge delay */ + uint32_t write_recovery_delay; /*!< configure the write recovery delay */ + uint32_t auto_refresh_delay; /*!< configure the auto refresh delay */ + uint32_t row_address_select_delay; /*!< configure the row address select delay */ + uint32_t exit_selfrefresh_delay; /*!< configure the exit self-refresh delay */ + uint32_t load_mode_register_delay; /*!< configure the load mode register delay */ +} exmc_sdram_timing_parameter_struct; + +/* EXMC SDRAM initialize structure */ +typedef struct { + uint32_t sdram_device; /*!< device of SDRAM */ + uint32_t pipeline_read_delay; /*!< the delay for reading data after CAS latency in HCLK clock cycles */ + uint32_t burst_read_switch; /*!< enable or disable the burst read */ + uint32_t sdclock_config; /*!< the SDCLK memory clock for both SDRAM banks */ + uint32_t write_protection; /*!< enable or disable SDRAM bank write protection function */ + uint32_t cas_latency; /*!< configure the SDRAM CAS latency */ + uint32_t internal_bank_number; /*!< the number of internal bank */ + uint32_t data_width; /*!< the databus width of SDRAM memory */ + uint32_t row_address_width; /*!< the bit width of a row address */ + uint32_t column_address_width; /*!< the bit width of a column address */ + exmc_sdram_timing_parameter_struct *timing; /*!< the timing parameters for write and read SDRAM */ +} exmc_sdram_parameter_struct; + +/* EXMC SDRAM command initialize structure */ +typedef struct { + uint32_t mode_register_content; /*!< the SDRAM mode register content */ + uint32_t auto_refresh_number; /*!< the number of successive auto-refresh cycles will be send when CMD = 011 */ + uint32_t bank_select; /*!< the bank which command will be sent to */ + uint32_t command; /*!< the commands that will be sent to SDRAM */ +} exmc_sdram_command_parameter_struct; + +/* EXMC SQPISRAM initialize structure */ +typedef struct { + uint32_t sample_polarity; /*!< read data sample polarity */ + uint32_t id_length; /*!< SPI PSRAM ID length */ + uint32_t address_bits; /*!< bit number of SPI PSRAM address phase */ + uint32_t command_bits; /*!< bit number of SPI PSRAM command phase */ +} exmc_sqpipsram_parameter_struct; + +/* EXMC register address */ +#define EXMC_SNCTL(region) REG32(EXMC + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash control registers, region = 0,1,2,3 */ +#define EXMC_SNTCFG(region) REG32(EXMC + 0x04U + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash timing configuration registers, region = 0,1,2,3 */ +#define EXMC_SNWTCFG(region) REG32(EXMC + 0x104U + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash write timing configuration registers, region = 0,1,2,3 */ +#define EXMC_SNLATDEC(region) REG32(EXMC + 0x300U + 0x04U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash data latency decrease registers, region = 0,1,2,3 */ + +#define EXMC_NPCTL(bank) REG32(EXMC + 0x40U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card control registers, bank = 1,2,3 */ +#define EXMC_NPINTEN(bank) REG32(EXMC + 0x44U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card interrupt enable registers, bank = 1,2,3 */ +#define EXMC_NPCTCFG(bank) REG32(EXMC + 0x48U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card common space timing configuration registers, bank = 1,2,3 */ +#define EXMC_NPATCFG(bank) REG32(EXMC + 0x4CU + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card attribute space timing configuration registers, bank = 1,2,3 */ +#define EXMC_NECC(bank) REG32(EXMC + 0x54U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND ECC registers, bank = 1,2 */ + +#define EXMC_SDCTL(device) REG32(EXMC + 0x140U + 0x4U*(((uint32_t)(device)) - 0x4U)) /*!< EXMC SDRAM control registers,device = 0,1 */ +#define EXMC_SDTCFG(device) REG32(EXMC + 0x148U + 0x4U*(((uint32_t)(device)) - 0x4U)) /*!< EXMC SDRAM timing configuration registers,device = 0,1 */ + +/* CRAM page size */ +#define SNCTL_CPS(regval) (BITS(16,18) & ((uint32_t)(regval) << 16)) +#define EXMC_CRAM_AUTO_SPLIT SNCTL_CPS(0) /*!< automatic burst split on page boundary crossing */ +#define EXMC_CRAM_PAGE_SIZE_128_BYTES SNCTL_CPS(1) /*!< page size is 128 bytes */ +#define EXMC_CRAM_PAGE_SIZE_256_BYTES SNCTL_CPS(2) /*!< page size is 256 bytes */ +#define EXMC_CRAM_PAGE_SIZE_512_BYTES SNCTL_CPS(3) /*!< page size is 512 bytes */ +#define EXMC_CRAM_PAGE_SIZE_1024_BYTES SNCTL_CPS(4) /*!< page size is 1024 bytes */ + +/* NOR bank memory data bus width */ +#define SNCTL_NRW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_NOR_DATABUS_WIDTH_8B SNCTL_NRW(0) /*!< NOR data width is 8 bits */ +#define EXMC_NOR_DATABUS_WIDTH_16B SNCTL_NRW(1) /*!< NOR data width is 16 bits */ + +/* NOR bank memory type */ +#define SNCTL_NRTP(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define EXMC_MEMORY_TYPE_SRAM SNCTL_NRTP(0) /*!< SRAM,ROM */ +#define EXMC_MEMORY_TYPE_PSRAM SNCTL_NRTP(1) /*!< PSRAM, CRAM */ +#define EXMC_MEMORY_TYPE_NOR SNCTL_NRTP(2) /*!< NOR flash */ + +/* asynchronous access mode */ +#define SNTCFG_ASYNCMOD(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) +#define EXMC_ACCESS_MODE_A SNTCFG_ASYNCMOD(0) /*!< mode A access */ +#define EXMC_ACCESS_MODE_B SNTCFG_ASYNCMOD(1) /*!< mode B access */ +#define EXMC_ACCESS_MODE_C SNTCFG_ASYNCMOD(2) /*!< mode C access */ +#define EXMC_ACCESS_MODE_D SNTCFG_ASYNCMOD(3) /*!< mode D access */ + +/* data latency for NOR flash */ +#define SNTCFG_DLAT(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define EXMC_DATALAT_2_CLK SNTCFG_DLAT(0) /*!< data latency of first burst access is 2 EXMC_CLK */ +#define EXMC_DATALAT_3_CLK SNTCFG_DLAT(1) /*!< data latency of first burst access is 3 EXMC_CLK */ +#define EXMC_DATALAT_4_CLK SNTCFG_DLAT(2) /*!< data latency of first burst access is 4 EXMC_CLK */ +#define EXMC_DATALAT_5_CLK SNTCFG_DLAT(3) /*!< data latency of first burst access is 5 EXMC_CLK */ +#define EXMC_DATALAT_6_CLK SNTCFG_DLAT(4) /*!< data latency of first burst access is 6 EXMC_CLK */ +#define EXMC_DATALAT_7_CLK SNTCFG_DLAT(5) /*!< data latency of first burst access is 7 EXMC_CLK */ +#define EXMC_DATALAT_8_CLK SNTCFG_DLAT(6) /*!< data latency of first burst access is 8 EXMC_CLK */ +#define EXMC_DATALAT_9_CLK SNTCFG_DLAT(7) /*!< data latency of first burst access is 9 EXMC_CLK */ +#define EXMC_DATALAT_10_CLK SNTCFG_DLAT(8) /*!< data latency of first burst access is 10 EXMC_CLK */ +#define EXMC_DATALAT_11_CLK SNTCFG_DLAT(9) /*!< data latency of first burst access is 11 EXMC_CLK */ +#define EXMC_DATALAT_12_CLK SNTCFG_DLAT(10) /*!< data latency of first burst access is 12 EXMC_CLK */ +#define EXMC_DATALAT_13_CLK SNTCFG_DLAT(11) /*!< data latency of first burst access is 13 EXMC_CLK */ +#define EXMC_DATALAT_14_CLK SNTCFG_DLAT(12) /*!< data latency of first burst access is 14 EXMC_CLK */ +#define EXMC_DATALAT_15_CLK SNTCFG_DLAT(13) /*!< data latency of first burst access is 15 EXMC_CLK */ +#define EXMC_DATALAT_16_CLK SNTCFG_DLAT(14) /*!< data latency of first burst access is 16 EXMC_CLK */ +#define EXMC_DATALAT_17_CLK SNTCFG_DLAT(15) /*!< data latency of first burst access is 17 EXMC_CLK */ + +/* synchronous clock divide ratio */ +#define SNTCFG_CKDIV(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) +#define EXMC_SYN_CLOCK_RATIO_DISABLE SNTCFG_CKDIV(0) /*!< EXMC_CLK disable */ +#define EXMC_SYN_CLOCK_RATIO_2_CLK SNTCFG_CKDIV(1) /*!< EXMC_CLK = 2*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_3_CLK SNTCFG_CKDIV(2) /*!< EXMC_CLK = 3*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_4_CLK SNTCFG_CKDIV(3) /*!< EXMC_CLK = 4*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_5_CLK SNTCFG_CKDIV(4) /*!< EXMC_CLK = 5*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_6_CLK SNTCFG_CKDIV(5) /*!< EXMC_CLK = 6*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_7_CLK SNTCFG_CKDIV(6) /*!< EXMC_CLK = 7*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_8_CLK SNTCFG_CKDIV(7) /*!< EXMC_CLK = 8*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_9_CLK SNTCFG_CKDIV(8) /*!< EXMC_CLK = 9*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_10_CLK SNTCFG_CKDIV(9) /*!< EXMC_CLK = 10*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_11_CLK SNTCFG_CKDIV(10) /*!< EXMC_CLK = 11*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_12_CLK SNTCFG_CKDIV(11) /*!< EXMC_CLK = 12*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_13_CLK SNTCFG_CKDIV(12) /*!< EXMC_CLK = 13*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_14_CLK SNTCFG_CKDIV(13) /*!< EXMC_CLK = 14*HCLK*/ +#define EXMC_SYN_CLOCK_RATIO_15_CLK SNTCFG_CKDIV(14) /*!< EXMC_CLK = 15*HCLK */ +#define EXMC_SYN_CLOCK_RATIO_16_CLK SNTCFG_CKDIV(15) /*!< EXMC_CLK = 16*HCLK */ + +/* ECC size */ +#define NPCTL_ECCSZ(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) +#define EXMC_ECC_SIZE_256BYTES NPCTL_ECCSZ(0) /*!< ECC size is 256 bytes */ +#define EXMC_ECC_SIZE_512BYTES NPCTL_ECCSZ(1) /*!< ECC size is 512 bytes */ +#define EXMC_ECC_SIZE_1024BYTES NPCTL_ECCSZ(2) /*!< ECC size is 1024 bytes */ +#define EXMC_ECC_SIZE_2048BYTES NPCTL_ECCSZ(3) /*!< ECC size is 2048 bytes */ +#define EXMC_ECC_SIZE_4096BYTES NPCTL_ECCSZ(4) /*!< ECC size is 4096 bytes */ +#define EXMC_ECC_SIZE_8192BYTES NPCTL_ECCSZ(5) /*!< ECC size is 8192 bytes */ + +/* ALE to RE delay */ +#define NPCTL_ATR(regval) (BITS(13,16) & ((uint32_t)(regval) << 13)) +#define EXMC_ALE_RE_DELAY_1_HCLK NPCTL_ATR(0) /*!< ALE to RE delay = 1*HCLK */ +#define EXMC_ALE_RE_DELAY_2_HCLK NPCTL_ATR(1) /*!< ALE to RE delay = 2*HCLK */ +#define EXMC_ALE_RE_DELAY_3_HCLK NPCTL_ATR(2) /*!< ALE to RE delay = 3*HCLK */ +#define EXMC_ALE_RE_DELAY_4_HCLK NPCTL_ATR(3) /*!< ALE to RE delay = 4*HCLK */ +#define EXMC_ALE_RE_DELAY_5_HCLK NPCTL_ATR(4) /*!< ALE to RE delay = 5*HCLK */ +#define EXMC_ALE_RE_DELAY_6_HCLK NPCTL_ATR(5) /*!< ALE to RE delay = 6*HCLK */ +#define EXMC_ALE_RE_DELAY_7_HCLK NPCTL_ATR(6) /*!< ALE to RE delay = 7*HCLK */ +#define EXMC_ALE_RE_DELAY_8_HCLK NPCTL_ATR(7) /*!< ALE to RE delay = 8*HCLK */ +#define EXMC_ALE_RE_DELAY_9_HCLK NPCTL_ATR(8) /*!< ALE to RE delay = 9*HCLK */ +#define EXMC_ALE_RE_DELAY_10_HCLK NPCTL_ATR(9) /*!< ALE to RE delay = 10*HCLK */ +#define EXMC_ALE_RE_DELAY_11_HCLK NPCTL_ATR(10) /*!< ALE to RE delay = 11*HCLK */ +#define EXMC_ALE_RE_DELAY_12_HCLK NPCTL_ATR(11) /*!< ALE to RE delay = 12*HCLK */ +#define EXMC_ALE_RE_DELAY_13_HCLK NPCTL_ATR(12) /*!< ALE to RE delay = 13*HCLK */ +#define EXMC_ALE_RE_DELAY_14_HCLK NPCTL_ATR(13) /*!< ALE to RE delay = 14*HCLK */ +#define EXMC_ALE_RE_DELAY_15_HCLK NPCTL_ATR(14) /*!< ALE to RE delay = 15*HCLK */ +#define EXMC_ALE_RE_DELAY_16_HCLK NPCTL_ATR(15) /*!< ALE to RE delay = 16*HCLK */ + +/* CLE to RE delay */ +#define NPCTL_CTR(regval) (BITS(9,12) & ((uint32_t)(regval) << 9)) +#define EXMC_CLE_RE_DELAY_1_HCLK NPCTL_CTR(0) /*!< CLE to RE delay = 1*HCLK */ +#define EXMC_CLE_RE_DELAY_2_HCLK NPCTL_CTR(1) /*!< CLE to RE delay = 2*HCLK */ +#define EXMC_CLE_RE_DELAY_3_HCLK NPCTL_CTR(2) /*!< CLE to RE delay = 3*HCLK */ +#define EXMC_CLE_RE_DELAY_4_HCLK NPCTL_CTR(3) /*!< CLE to RE delay = 4*HCLK */ +#define EXMC_CLE_RE_DELAY_5_HCLK NPCTL_CTR(4) /*!< CLE to RE delay = 5*HCLK */ +#define EXMC_CLE_RE_DELAY_6_HCLK NPCTL_CTR(5) /*!< CLE to RE delay = 6*HCLK */ +#define EXMC_CLE_RE_DELAY_7_HCLK NPCTL_CTR(6) /*!< CLE to RE delay = 7*HCLK */ +#define EXMC_CLE_RE_DELAY_8_HCLK NPCTL_CTR(7) /*!< CLE to RE delay = 8*HCLK */ +#define EXMC_CLE_RE_DELAY_9_HCLK NPCTL_CTR(8) /*!< CLE to RE delay = 9*HCLK */ +#define EXMC_CLE_RE_DELAY_10_HCLK NPCTL_CTR(9) /*!< CLE to RE delay = 10*HCLK */ +#define EXMC_CLE_RE_DELAY_11_HCLK NPCTL_CTR(10) /*!< CLE to RE delay = 11*HCLK */ +#define EXMC_CLE_RE_DELAY_12_HCLK NPCTL_CTR(11) /*!< CLE to RE delay = 12*HCLK */ +#define EXMC_CLE_RE_DELAY_13_HCLK NPCTL_CTR(12) /*!< CLE to RE delay = 13*HCLK */ +#define EXMC_CLE_RE_DELAY_14_HCLK NPCTL_CTR(13) /*!< CLE to RE delay = 14*HCLK */ +#define EXMC_CLE_RE_DELAY_15_HCLK NPCTL_CTR(14) /*!< CLE to RE delay = 15*HCLK */ +#define EXMC_CLE_RE_DELAY_16_HCLK NPCTL_CTR(15) /*!< CLE to RE delay = 16*HCLK */ + +/* NAND bank memory data bus width */ +#define NPCTL_NDW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_NAND_DATABUS_WIDTH_8B NPCTL_NDW(0) /*!< NAND data width is 8 bits */ +#define EXMC_NAND_DATABUS_WIDTH_16B NPCTL_NDW(1) /*!< NAND data width is 16 bits */ + +/* SDRAM pipeline delay */ +#define SDCTL_PIPED(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) +#define EXMC_PIPELINE_DELAY_0_HCLK SDCTL_PIPED(0) /*!< 0 HCLK clock cycle delay */ +#define EXMC_PIPELINE_DELAY_1_HCLK SDCTL_PIPED(1) /*!< 1 HCLK clock cycle delay */ +#define EXMC_PIPELINE_DELAY_2_HCLK SDCTL_PIPED(2) /*!< 2 HCLK clock cycle delay */ + +/* SDRAM clock configuration */ +#define SDCTL_SDCLK(regval) (BITS(10,11) & ((uint32_t)(regval) << 10)) +#define EXMC_SDCLK_DISABLE SDCTL_SDCLK(0) /*!< SDCLK memory clock disabled */ +#define EXMC_SDCLK_PERIODS_2_HCLK SDCTL_SDCLK(2) /*!< SDCLK memory period = 2*HCLK */ +#define EXMC_SDCLK_PERIODS_3_HCLK SDCTL_SDCLK(3) /*!< SDCLK memory period = 3*HCLK */ + +/* CAS latency */ +#define SDCTL_CL(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) +#define EXMC_CAS_LATENCY_1_SDCLK SDCTL_CL(1) /*!< CAS latency is 1 memory clock cycle */ +#define EXMC_CAS_LATENCY_2_SDCLK SDCTL_CL(2) /*!< CAS latency is 2 memory clock cycle */ +#define EXMC_CAS_LATENCY_3_SDCLK SDCTL_CL(3) /*!< CAS latency is 3 memory clock cycle */ + +/* SDRAM data bus width */ +#define SDCTL_SDW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_SDRAM_DATABUS_WIDTH_8B SDCTL_SDW(0) /*!< SDRAM data width 8 bits */ +#define EXMC_SDRAM_DATABUS_WIDTH_16B SDCTL_SDW(1) /*!< SDRAM data width 16 bits */ +#define EXMC_SDRAM_DATABUS_WIDTH_32B SDCTL_SDW(2) /*!< SDRAM data width 32 bits */ + +/* SDRAM row address bit width */ +#define SDCTL_RAW(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define EXMC_SDRAM_ROW_ADDRESS_11 SDCTL_RAW(0) /*!< row address bit width is 11 bits */ +#define EXMC_SDRAM_ROW_ADDRESS_12 SDCTL_RAW(1) /*!< row address bit width is 12 bits */ +#define EXMC_SDRAM_ROW_ADDRESS_13 SDCTL_RAW(2) /*!< row address bit width is 13 bits */ + +/* SDRAM column address bit width */ +#define SDCTL_CAW(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define EXMC_SDRAM_COW_ADDRESS_8 SDCTL_CAW(0) /*!< column address bit width is 8 bits */ +#define EXMC_SDRAM_COW_ADDRESS_9 SDCTL_CAW(1) /*!< column address bit width is 9 bits */ +#define EXMC_SDRAM_COW_ADDRESS_10 SDCTL_CAW(2) /*!< column address bit width is 10 bits */ +#define EXMC_SDRAM_COW_ADDRESS_11 SDCTL_CAW(3) /*!< column address bit width is 11 bits */ + +/* SDRAM number of successive auto-refresh */ +#define SDCMD_NARF(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) +#define EXMC_SDRAM_AUTO_REFLESH_1_SDCLK SDCMD_NARF(0) /*!< 1 auto-refresh cycle */ +#define EXMC_SDRAM_AUTO_REFLESH_2_SDCLK SDCMD_NARF(1) /*!< 2 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_3_SDCLK SDCMD_NARF(2) /*!< 3 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_4_SDCLK SDCMD_NARF(3) /*!< 4 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_5_SDCLK SDCMD_NARF(4) /*!< 5 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_6_SDCLK SDCMD_NARF(5) /*!< 6 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_7_SDCLK SDCMD_NARF(6) /*!< 7 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_8_SDCLK SDCMD_NARF(7) /*!< 8 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_9_SDCLK SDCMD_NARF(8) /*!< 9 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_10_SDCLK SDCMD_NARF(9) /*!< 10 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_11_SDCLK SDCMD_NARF(10) /*!< 11 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_12_SDCLK SDCMD_NARF(11) /*!< 12 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_13_SDCLK SDCMD_NARF(12) /*!< 13 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_14_SDCLK SDCMD_NARF(13) /*!< 14 auto-refresh cycles */ +#define EXMC_SDRAM_AUTO_REFLESH_15_SDCLK SDCMD_NARF(14) /*!< 15 auto-refresh cycles */ + +/* SDRAM command selection */ +#define SDCMD_CMD(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) +#define EXMC_SDRAM_NORMAL_OPERATION SDCMD_CMD(0) /*!< normal operation command */ +#define EXMC_SDRAM_CLOCK_ENABLE SDCMD_CMD(1) /*!< clock enable command */ +#define EXMC_SDRAM_PRECHARGE_ALL SDCMD_CMD(2) /*!< precharge all command */ +#define EXMC_SDRAM_AUTO_REFRESH SDCMD_CMD(3) /*!< auto-refresh command */ +#define EXMC_SDRAM_LOAD_MODE_REGISTER SDCMD_CMD(4) /*!< load mode register command */ +#define EXMC_SDRAM_SELF_REFRESH SDCMD_CMD(5) /*!< self-refresh command */ +#define EXMC_SDRAM_POWERDOWN_ENTRY SDCMD_CMD(6) /*!< power-down entry command */ + +/* SDRAM the delayed sample clock of read data */ +#define SDRSCTL_SDSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define EXMC_SDRAM_0_DELAY_CELL SDRSCTL_SDSC(0) /*!< select the clock after 0 delay cell */ +#define EXMC_SDRAM_1_DELAY_CELL SDRSCTL_SDSC(1) /*!< select the clock after 1 delay cell */ +#define EXMC_SDRAM_2_DELAY_CELL SDRSCTL_SDSC(2) /*!< select the clock after 2 delay cell */ +#define EXMC_SDRAM_3_DELAY_CELL SDRSCTL_SDSC(3) /*!< select the clock after 3 delay cell */ +#define EXMC_SDRAM_4_DELAY_CELL SDRSCTL_SDSC(4) /*!< select the clock after 4 delay cell */ +#define EXMC_SDRAM_5_DELAY_CELL SDRSCTL_SDSC(5) /*!< select the clock after 5 delay cell */ +#define EXMC_SDRAM_6_DELAY_CELL SDRSCTL_SDSC(6) /*!< select the clock after 6 delay cell */ +#define EXMC_SDRAM_7_DELAY_CELL SDRSCTL_SDSC(7) /*!< select the clock after 7 delay cell */ +#define EXMC_SDRAM_8_DELAY_CELL SDRSCTL_SDSC(8) /*!< select the clock after 8 delay cell */ +#define EXMC_SDRAM_9_DELAY_CELL SDRSCTL_SDSC(9) /*!< select the clock after 9 delay cell */ +#define EXMC_SDRAM_10_DELAY_CELL SDRSCTL_SDSC(10) /*!< select the clock after 10 delay cell */ +#define EXMC_SDRAM_11_DELAY_CELL SDRSCTL_SDSC(11) /*!< select the clock after 11 delay cell */ +#define EXMC_SDRAM_12_DELAY_CELL SDRSCTL_SDSC(12) /*!< select the clock after 12 delay cell */ +#define EXMC_SDRAM_13_DELAY_CELL SDRSCTL_SDSC(13) /*!< select the clock after 13 delay cell */ +#define EXMC_SDRAM_14_DELAY_CELL SDRSCTL_SDSC(14) /*!< select the clock after 14 delay cell */ +#define EXMC_SDRAM_15_DELAY_CELL SDRSCTL_SDSC(15) /*!< select the clock after 15 delay cell */ + +/* SPI PSRAM ID length */ +#define SINIT_IDL(regval) (BITS(29,30) & ((uint32_t)(regval) << 29)) +#define EXMC_SQPIPSRAM_ID_LENGTH_64B SINIT_IDL(0) /*!< SPI PSRAM ID length is 64 bits */ +#define EXMC_SQPIPSRAM_ID_LENGTH_32B SINIT_IDL(1) /*!< SPI PSRAM ID length is 32 bits */ +#define EXMC_SQPIPSRAM_ID_LENGTH_16B SINIT_IDL(2) /*!< SPI PSRAM ID length is 16 bits */ +#define EXMC_SQPIPSRAM_ID_LENGTH_8B SINIT_IDL(3) /*!< SPI PSRAM ID length is 8 bits */ + +/* SPI PSRAM bit number of address phase */ +#define SINIT_ADRBIT(regval) (BITS(24,28) & ((uint32_t)(regval) << 24)) +#define EXMC_SQPIPSRAM_ADDR_LENGTH_1B SINIT_ADRBIT(1) /*!< SPI PSRAM address is 1 bit */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_2B SINIT_ADRBIT(2) /*!< SPI PSRAM address is 2 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_3B SINIT_ADRBIT(3) /*!< SPI PSRAM address is 3 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_4B SINIT_ADRBIT(4) /*!< SPI PSRAM address is 4 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_5B SINIT_ADRBIT(5) /*!< SPI PSRAM address is 5 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_6B SINIT_ADRBIT(6) /*!< SPI PSRAM address is 6 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_7B SINIT_ADRBIT(7) /*!< SPI PSRAM address is 7 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_8B SINIT_ADRBIT(8) /*!< SPI PSRAM address is 8 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_9B SINIT_ADRBIT(9) /*!< SPI PSRAM address is 9 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_10B SINIT_ADRBIT(10) /*!< SPI PSRAM address is 10 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_11B SINIT_ADRBIT(11) /*!< SPI PSRAM address is 11 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_12B SINIT_ADRBIT(12) /*!< SPI PSRAM address is 12 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_13B SINIT_ADRBIT(13) /*!< SPI PSRAM address is 13 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_14B SINIT_ADRBIT(14) /*!< SPI PSRAM address is 14 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_15B SINIT_ADRBIT(15) /*!< SPI PSRAM address is 15 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_16B SINIT_ADRBIT(16) /*!< SPI PSRAM address is 16 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_17B SINIT_ADRBIT(17) /*!< SPI PSRAM address is 17 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_18B SINIT_ADRBIT(18) /*!< SPI PSRAM address is 18 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_19B SINIT_ADRBIT(19) /*!< SPI PSRAM address is 19 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_20B SINIT_ADRBIT(20) /*!< SPI PSRAM address is 20 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_21B SINIT_ADRBIT(21) /*!< SPI PSRAM address is 21 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_22B SINIT_ADRBIT(22) /*!< SPI PSRAM address is 22 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_23B SINIT_ADRBIT(23) /*!< SPI PSRAM address is 23 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_24B SINIT_ADRBIT(24) /*!< SPI PSRAM address is 24 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_25B SINIT_ADRBIT(25) /*!< SPI PSRAM address is 25 bits */ +#define EXMC_SQPIPSRAM_ADDR_LENGTH_26B SINIT_ADRBIT(26) /*!< SPI PSRAM address is 26 bits */ + +/* SPI PSRAM bit number of command phase */ +#define SINIT_CMDBIT(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define EXMC_SQPIPSRAM_COMMAND_LENGTH_4B SINIT_CMDBIT(0) /*!< SPI PSRAM command is 4 bits */ +#define EXMC_SQPIPSRAM_COMMAND_LENGTH_8B SINIT_CMDBIT(1) /*!< SPI PSRAM command is 8 bits */ +#define EXMC_SQPIPSRAM_COMMAND_LENGTH_16B SINIT_CMDBIT(2) /*!< SPI PSRAM command is 16 bits */ + +/* SPI PSRAM read command mode */ +#define SRCMD_RMODE(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) +#define EXMC_SQPIPSRAM_READ_MODE_DISABLE SRCMD_RMODE(0) /*!< not SPI mode */ +#define EXMC_SQPIPSRAM_READ_MODE_SPI SRCMD_RMODE(1) /*!< SPI mode */ +#define EXMC_SQPIPSRAM_READ_MODE_SQPI SRCMD_RMODE(2) /*!< SQPI mode */ +#define EXMC_SQPIPSRAM_READ_MODE_QPI SRCMD_RMODE(3) /*!< QPI mode */ + +/* SPI PSRAM write command mode */ +#define SRCMD_WMODE(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) +#define EXMC_SQPIPSRAM_WRITE_MODE_DISABLE SRCMD_WMODE(0) /*!< not SPI mode */ +#define EXMC_SQPIPSRAM_WRITE_MODE_SPI SRCMD_WMODE(1) /*!< SPI mode */ +#define EXMC_SQPIPSRAM_WRITE_MODE_SQPI SRCMD_WMODE(2) /*!< SQPI mode */ +#define EXMC_SQPIPSRAM_WRITE_MODE_QPI SRCMD_WMODE(3) /*!< QPI mode */ + +/* EXMC NOR/SRAM bank region definition */ +#define EXMC_BANK0_NORSRAM_REGION0 ((uint32_t)0x00000000U) /*!< bank0 NOR/SRAM region0 */ +#define EXMC_BANK0_NORSRAM_REGION1 ((uint32_t)0x00000001U) /*!< bank0 NOR/SRAM region1 */ +#define EXMC_BANK0_NORSRAM_REGION2 ((uint32_t)0x00000002U) /*!< bank0 NOR/SRAM region2 */ +#define EXMC_BANK0_NORSRAM_REGION3 ((uint32_t)0x00000003U) /*!< bank0 NOR/SRAM region3 */ + +/* EXMC consecutive clock */ +#define EXMC_CLOCK_SYN_MODE ((uint32_t)0x00000000U) /*!< EXMC_CLK is generated only during synchronous access */ +#define EXMC_CLOCK_UNCONDITIONALLY EXMC_SNCTL_CCK /*!< EXMC_CLK is generated unconditionally */ + +/* EXMC NOR/SRAM write mode */ +#define EXMC_ASYN_WRITE ((uint32_t)0x00000000U) /*!< asynchronous write mode */ +#define EXMC_SYN_WRITE EXMC_SNCTL_SYNCWR /*!< synchronous write mode */ + +/* EXMC NWAIT signal configuration */ +#define EXMC_NWAIT_CONFIG_BEFORE ((uint32_t)0x00000000U) /*!< NWAIT signal is active one data cycle before wait state */ +#define EXMC_NWAIT_CONFIG_DURING EXMC_SNCTL_NRWTCFG /*!< NWAIT signal is active during wait state */ + +/* EXMC NWAIT signal polarity configuration */ +#define EXMC_NWAIT_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level is active of NWAIT */ +#define EXMC_NWAIT_POLARITY_HIGH EXMC_SNCTL_NRWTPOL /*!< high level is active of NWAIT */ + +/* EXMC NAND/PC card bank definition */ +#define EXMC_BANK1_NAND ((uint32_t)0x00000001U) /*!< NAND flash bank1 */ +#define EXMC_BANK2_NAND ((uint32_t)0x00000002U) /*!< NAND flash bank2 */ +#define EXMC_BANK3_PCCARD ((uint32_t)0x00000003U) /*!< PC card bank3 */ + +/* EXMC SDRAM bank definition */ +#define EXMC_SDRAM_DEVICE0 ((uint32_t)0x00000004U) /*!< SDRAM device0 */ +#define EXMC_SDRAM_DEVICE1 ((uint32_t)0x00000005U) /*!< SDRAM device1 */ + +/* EXMC SDRAM internal banks */ +#define EXMC_SDRAM_2_INTER_BANK ((uint32_t)0x00000000U) /*!< 2 internal banks */ +#define EXMC_SDRAM_4_INTER_BANK EXMC_SDCTL_NBK /*!< 4 internal banks */ + +/* SDRAM device0 selection */ +#define EXMC_SDRAM_DEVICE0_UNSELECT ((uint32_t)0x00000000U) /*!< unselect SDRAM device0 */ +#define EXMC_SDRAM_DEVICE0_SELECT EXMC_SDCMD_DS0 /*!< select SDRAM device0 */ + +/* SDRAM device1 selection */ +#define EXMC_SDRAM_DEVICE1_UNSELECT ((uint32_t)0x00000000U) /*!< unselect SDRAM device1 */ +#define EXMC_SDRAM_DEVICE1_SELECT EXMC_SDCMD_DS1 /*!< select SDRAM device1 */ + +/* SDRAM device status */ +#define EXMC_SDRAM_DEVICE_NORMAL ((uint32_t)0x00000000U) /*!< normal status */ +#define EXMC_SDRAM_DEVICE_SELF_REFRESH ((uint32_t)0x00000001U) /*!< self refresh status */ +#define EXMC_SDRAM_DEVICE_POWER_DOWN ((uint32_t)0x00000002U) /*!< power down status */ + +/* sample cycle of read data */ +#define EXMC_SDRAM_READSAMPLE_0_EXTRAHCLK ((uint32_t)0x00000000U) /*!< add 0 extra HCLK cycle to the read data sample clock besides the delay chain */ +#define EXMC_SDRAM_READSAMPLE_1_EXTRAHCLK EXMC_SDRSCTL_SSCR /*!< add 1 extra HCLK cycle to the read data sample clock besides the delay chain */ + +/* read data sample polarity */ +#define EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE ((uint32_t)0x00000000U) /*!< sample data at rising edge */ +#define EXMC_SQPIPSRAM_SAMPLE_FALLING_EDGE EXMC_SINIT_POL /*!< sample data at falling edge */ + +/* SQPI SRAM command flag */ +#define EXMC_SEND_COMMAND_FLAG_RDID EXMC_SRCMD_RDID /*!< EXMC_SRCMD_RDID flag bit */ +#define EXMC_SEND_COMMAND_FLAG_SC EXMC_SWCMD_SC /*!< EXMC_SWCMD_SC flag bit */ + +/* EXMC flag bits */ +#define EXMC_NAND_PCCARD_FLAG_RISE EXMC_NPINTEN_INTRS /*!< interrupt rising edge status */ +#define EXMC_NAND_PCCARD_FLAG_LEVEL EXMC_NPINTEN_INTHS /*!< interrupt high-level status */ +#define EXMC_NAND_PCCARD_FLAG_FALL EXMC_NPINTEN_INTFS /*!< interrupt falling edge status */ +#define EXMC_NAND_PCCARD_FLAG_FIFOE EXMC_NPINTEN_FFEPT /*!< FIFO empty flag */ +#define EXMC_SDRAM_FLAG_REFRESH EXMC_SDSDAT_REIF /*!< refresh error interrupt flag */ +#define EXMC_SDRAM_FLAG_NREADY EXMC_SDSDAT_NRDY /*!< not ready status */ + +/* EXMC interrupt flag bits */ +#define EXMC_NAND_PCCARD_INT_FLAG_RISE EXMC_NPINTEN_INTREN /*!< rising edge interrupt and flag */ +#define EXMC_NAND_PCCARD_INT_FLAG_LEVEL EXMC_NPINTEN_INTHEN /*!< high-level interrupt and flag */ +#define EXMC_NAND_PCCARD_INT_FLAG_FALL EXMC_NPINTEN_INTFEN /*!< falling edge interrupt and flag */ +#define EXMC_SDRAM_INT_FLAG_REFRESH EXMC_SDARI_REIE /*!< refresh error interrupt and flag */ + +/* function declarations */ +/* initialization functions */ +/* NOR/SRAM */ +/* deinitialize EXMC NOR/SRAM region */ +void exmc_norsram_deinit(uint32_t exmc_norsram_region); +/* initialize exmc_norsram_parameter_struct with the default values */ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct); +/* initialize EXMC NOR/SRAM region */ +void exmc_norsram_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct); +/* enable EXMC NOR/SRAM region */ +void exmc_norsram_enable(uint32_t exmc_norsram_region); +/* disable EXMC NOR/SRAM region */ +void exmc_norsram_disable(uint32_t exmc_norsram_region); +/* NAND */ +/* deinitialize EXMC NAND bank */ +void exmc_nand_deinit(uint32_t exmc_nand_bank); +/* initialize exmc_nand_parameter_struct with the default values */ +void exmc_nand_struct_para_init(exmc_nand_parameter_struct *exmc_nand_init_struct); +/* initialize EXMC NAND bank */ +void exmc_nand_init(exmc_nand_parameter_struct *exmc_nand_init_struct); +/* enable EXMC NAND bank */ +void exmc_nand_enable(uint32_t exmc_nand_bank); +/* disable EXMC NAND bank */ +void exmc_nand_disable(uint32_t exmc_nand_bank); +/* PC card */ +/* deinitialize EXMC PC card bank */ +void exmc_pccard_deinit(void); +/* initialize exmc_pccard_parameter_struct with the default values */ +void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct); +/* initialize EXMC PC card bank */ +void exmc_pccard_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct); +/* enable EXMC PC card bank */ +void exmc_pccard_enable(void); +/* disable EXMC PC card bank */ +void exmc_pccard_disable(void); +/* SDRAM */ +/* deinitialize EXMC SDRAM device */ +void exmc_sdram_deinit(uint32_t exmc_sdram_device); +/* initialize exmc_sdram_parameter_struct with the default values */ +void exmc_sdram_struct_para_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct); +/* initialize EXMC SDRAM device */ +void exmc_sdram_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct); +/* initialize exmc_sdram_command_parameter_struct with the default values */ +void exmc_sdram_struct_command_para_init(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct); +/* SQPIPSRAM */ +/* deinitialize EXMC SQPIPSRAM */ +void exmc_sqpipsram_deinit(void); +/* initialize exmc_sqpipsram_parameter_struct with the default values */ +void exmc_sqpipsram_struct_para_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct); +/* initialize EXMC SQPIPSRAM */ +void exmc_sqpipsram_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct); + +/* function configuration */ +/* NOR/SRAM */ +/* configure consecutive clock */ +void exmc_norsram_consecutive_clock_config(uint32_t clock_mode); +/* configure CRAM page size */ +void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size); +/* NAND */ +/* enable or disable the EXMC NAND ECC function */ +void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue); +/* get the EXMC ECC value */ +uint32_t exmc_ecc_get(uint32_t exmc_nand_bank); +/* SDRAM */ +/* enable or disable read sample */ +void exmc_sdram_readsample_enable(ControlStatus newvalue); +/* configure the delayed sample clock of read data */ +void exmc_sdram_readsample_config(uint32_t delay_cell, uint32_t extra_hclk); +/* configure the SDRAM memory command */ +void exmc_sdram_command_config(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct); +/* set auto-refresh interval */ +void exmc_sdram_refresh_count_set(uint32_t exmc_count); +/* set the number of successive auto-refresh command */ +void exmc_sdram_autorefresh_number_set(uint32_t exmc_number); +/* configure the write protection function */ +void exmc_sdram_write_protection_config(uint32_t exmc_sdram_device, ControlStatus newvalue); +/* get the status of SDRAM device0 or device1 */ +uint32_t exmc_sdram_bankstatus_get(uint32_t exmc_sdram_device); +/* SQPIPSRAM */ +/* set the read command */ +void exmc_sqpipsram_read_command_set(uint32_t read_command_mode, uint32_t read_wait_cycle, uint32_t read_command_code); +/* set the write command */ +void exmc_sqpipsram_write_command_set(uint32_t write_command_mode, uint32_t write_wait_cycle, uint32_t write_command_code); +/* send SPI read ID command */ +void exmc_sqpipsram_read_id_command_send(void); +/* send SPI special command which does not have address and data phase */ +void exmc_sqpipsram_write_cmd_send(void); +/* get the EXMC SPI ID low data */ +uint32_t exmc_sqpipsram_low_id_get(void); +/* get the EXMC SPI ID high data */ +uint32_t exmc_sqpipsram_high_id_get(void); +/* get the bit value of EXMC send write command bit or read ID command */ +FlagStatus exmc_sqpipsram_send_command_state_get(uint32_t send_command_flag); + +/* interrupt & flag functions */ +/* enable EXMC interrupt */ +void exmc_interrupt_enable(uint32_t exmc_bank, uint32_t interrupt); +/* disable EXMC interrupt */ +void exmc_interrupt_disable(uint32_t exmc_bank, uint32_t interrupt); +/* get EXMC flag status */ +FlagStatus exmc_flag_get(uint32_t exmc_bank, uint32_t flag); +/* clear EXMC flag status */ +void exmc_flag_clear(uint32_t exmc_bank, uint32_t flag); +/* get EXMC interrupt flag */ +FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank, uint32_t int_flag); +/* clear EXMC interrupt flag */ +void exmc_interrupt_flag_clear(uint32_t exmc_bank, uint32_t int_flag); + +#endif /* GD32F5XX_EXMC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h new file mode 100644 index 00000000000..66a667166f6 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h @@ -0,0 +1,293 @@ +/*! + \file gd32f5xx_exti.h + \brief definitions for the EXTI + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_EXTI_H +#define GD32F5XX_EXTI_H + +#include "gd32f5xx.h" + +/* EXTI definitions */ +#define EXTI EXTI_BASE + +/* registers definitions */ +#define EXTI_INTEN REG32(EXTI + 0x00U) /*!< interrupt enable register */ +#define EXTI_EVEN REG32(EXTI + 0x04U) /*!< event enable register */ +#define EXTI_RTEN REG32(EXTI + 0x08U) /*!< rising edge trigger enable register */ +#define EXTI_FTEN REG32(EXTI + 0x0CU) /*!< falling edge trigger enable register */ +#define EXTI_SWIEV REG32(EXTI + 0x10U) /*!< software interrupt event register */ +#define EXTI_PD REG32(EXTI + 0x14U) /*!< pending register */ + +/* bits definitions */ +/* EXTI_INTEN */ +#define EXTI_INTEN_INTEN0 BIT(0) /*!< interrupt from line 0 */ +#define EXTI_INTEN_INTEN1 BIT(1) /*!< interrupt from line 1 */ +#define EXTI_INTEN_INTEN2 BIT(2) /*!< interrupt from line 2 */ +#define EXTI_INTEN_INTEN3 BIT(3) /*!< interrupt from line 3 */ +#define EXTI_INTEN_INTEN4 BIT(4) /*!< interrupt from line 4 */ +#define EXTI_INTEN_INTEN5 BIT(5) /*!< interrupt from line 5 */ +#define EXTI_INTEN_INTEN6 BIT(6) /*!< interrupt from line 6 */ +#define EXTI_INTEN_INTEN7 BIT(7) /*!< interrupt from line 7 */ +#define EXTI_INTEN_INTEN8 BIT(8) /*!< interrupt from line 8 */ +#define EXTI_INTEN_INTEN9 BIT(9) /*!< interrupt from line 9 */ +#define EXTI_INTEN_INTEN10 BIT(10) /*!< interrupt from line 10 */ +#define EXTI_INTEN_INTEN11 BIT(11) /*!< interrupt from line 11 */ +#define EXTI_INTEN_INTEN12 BIT(12) /*!< interrupt from line 12 */ +#define EXTI_INTEN_INTEN13 BIT(13) /*!< interrupt from line 13 */ +#define EXTI_INTEN_INTEN14 BIT(14) /*!< interrupt from line 14 */ +#define EXTI_INTEN_INTEN15 BIT(15) /*!< interrupt from line 15 */ +#define EXTI_INTEN_INTEN16 BIT(16) /*!< interrupt from line 16 */ +#define EXTI_INTEN_INTEN17 BIT(17) /*!< interrupt from line 17 */ +#define EXTI_INTEN_INTEN18 BIT(18) /*!< interrupt from line 18 */ +#define EXTI_INTEN_INTEN19 BIT(19) /*!< interrupt from line 19 */ +#define EXTI_INTEN_INTEN20 BIT(20) /*!< interrupt from line 20 */ +#define EXTI_INTEN_INTEN21 BIT(21) /*!< interrupt from line 21 */ +#define EXTI_INTEN_INTEN22 BIT(22) /*!< interrupt from line 22 */ +#define EXTI_INTEN_INTEN23 BIT(23) /*!< interrupt from line 23 */ +#define EXTI_INTEN_INTEN24 BIT(24) /*!< interrupt from line 24 */ +#define EXTI_INTEN_INTEN25 BIT(25) /*!< interrupt from line 25 */ + +/* EXTI_EVEN */ +#define EXTI_EVEN_EVEN0 BIT(0) /*!< event from line 0 */ +#define EXTI_EVEN_EVEN1 BIT(1) /*!< event from line 1 */ +#define EXTI_EVEN_EVEN2 BIT(2) /*!< event from line 2 */ +#define EXTI_EVEN_EVEN3 BIT(3) /*!< event from line 3 */ +#define EXTI_EVEN_EVEN4 BIT(4) /*!< event from line 4 */ +#define EXTI_EVEN_EVEN5 BIT(5) /*!< event from line 5 */ +#define EXTI_EVEN_EVEN6 BIT(6) /*!< event from line 6 */ +#define EXTI_EVEN_EVEN7 BIT(7) /*!< event from line 7 */ +#define EXTI_EVEN_EVEN8 BIT(8) /*!< event from line 8 */ +#define EXTI_EVEN_EVEN9 BIT(9) /*!< event from line 9 */ +#define EXTI_EVEN_EVEN10 BIT(10) /*!< event from line 10 */ +#define EXTI_EVEN_EVEN11 BIT(11) /*!< event from line 11 */ +#define EXTI_EVEN_EVEN12 BIT(12) /*!< event from line 12 */ +#define EXTI_EVEN_EVEN13 BIT(13) /*!< event from line 13 */ +#define EXTI_EVEN_EVEN14 BIT(14) /*!< event from line 14 */ +#define EXTI_EVEN_EVEN15 BIT(15) /*!< event from line 15 */ +#define EXTI_EVEN_EVEN16 BIT(16) /*!< event from line 16 */ +#define EXTI_EVEN_EVEN17 BIT(17) /*!< event from line 17 */ +#define EXTI_EVEN_EVEN18 BIT(18) /*!< event from line 18 */ +#define EXTI_EVEN_EVEN19 BIT(19) /*!< event from line 19 */ +#define EXTI_EVEN_EVEN20 BIT(20) /*!< event from line 20 */ +#define EXTI_EVEN_EVEN21 BIT(21) /*!< event from line 21 */ +#define EXTI_EVEN_EVEN22 BIT(22) /*!< event from line 22 */ +#define EXTI_EVEN_EVEN23 BIT(23) /*!< event from line 23 */ +#define EXTI_EVEN_EVEN24 BIT(24) /*!< event from line 24 */ +#define EXTI_EVEN_EVEN25 BIT(25) /*!< event from line 25 */ + +/* EXTI_RTEN */ +#define EXTI_RTEN_RTEN0 BIT(0) /*!< rising edge from line 0 */ +#define EXTI_RTEN_RTEN1 BIT(1) /*!< rising edge from line 1 */ +#define EXTI_RTEN_RTEN2 BIT(2) /*!< rising edge from line 2 */ +#define EXTI_RTEN_RTEN3 BIT(3) /*!< rising edge from line 3 */ +#define EXTI_RTEN_RTEN4 BIT(4) /*!< rising edge from line 4 */ +#define EXTI_RTEN_RTEN5 BIT(5) /*!< rising edge from line 5 */ +#define EXTI_RTEN_RTEN6 BIT(6) /*!< rising edge from line 6 */ +#define EXTI_RTEN_RTEN7 BIT(7) /*!< rising edge from line 7 */ +#define EXTI_RTEN_RTEN8 BIT(8) /*!< rising edge from line 8 */ +#define EXTI_RTEN_RTEN9 BIT(9) /*!< rising edge from line 9 */ +#define EXTI_RTEN_RTEN10 BIT(10) /*!< rising edge from line 10 */ +#define EXTI_RTEN_RTEN11 BIT(11) /*!< rising edge from line 11 */ +#define EXTI_RTEN_RTEN12 BIT(12) /*!< rising edge from line 12 */ +#define EXTI_RTEN_RTEN13 BIT(13) /*!< rising edge from line 13 */ +#define EXTI_RTEN_RTEN14 BIT(14) /*!< rising edge from line 14 */ +#define EXTI_RTEN_RTEN15 BIT(15) /*!< rising edge from line 15 */ +#define EXTI_RTEN_RTEN16 BIT(16) /*!< rising edge from line 16 */ +#define EXTI_RTEN_RTEN17 BIT(17) /*!< rising edge from line 17 */ +#define EXTI_RTEN_RTEN18 BIT(18) /*!< rising edge from line 18 */ +#define EXTI_RTEN_RTEN19 BIT(19) /*!< rising edge from line 19 */ +#define EXTI_RTEN_RTEN20 BIT(20) /*!< rising edge from line 20 */ +#define EXTI_RTEN_RTEN21 BIT(21) /*!< rising edge from line 21 */ +#define EXTI_RTEN_RTEN22 BIT(22) /*!< rising edge from line 22 */ +#define EXTI_RTEN_RTEN23 BIT(23) /*!< rising edge from line 23 */ +#define EXTI_RTEN_RTEN24 BIT(24) /*!< rising edge from line 24 */ +#define EXTI_RTEN_RTEN25 BIT(25) /*!< rising edge from line 25 */ + +/* EXTI_FTEN */ +#define EXTI_FTEN_FTEN0 BIT(0) /*!< falling edge from line 0 */ +#define EXTI_FTEN_FTEN1 BIT(1) /*!< falling edge from line 1 */ +#define EXTI_FTEN_FTEN2 BIT(2) /*!< falling edge from line 2 */ +#define EXTI_FTEN_FTEN3 BIT(3) /*!< falling edge from line 3 */ +#define EXTI_FTEN_FTEN4 BIT(4) /*!< falling edge from line 4 */ +#define EXTI_FTEN_FTEN5 BIT(5) /*!< falling edge from line 5 */ +#define EXTI_FTEN_FTEN6 BIT(6) /*!< falling edge from line 6 */ +#define EXTI_FTEN_FTEN7 BIT(7) /*!< falling edge from line 7 */ +#define EXTI_FTEN_FTEN8 BIT(8) /*!< falling edge from line 8 */ +#define EXTI_FTEN_FTEN9 BIT(9) /*!< falling edge from line 9 */ +#define EXTI_FTEN_FTEN10 BIT(10) /*!< falling edge from line 10 */ +#define EXTI_FTEN_FTEN11 BIT(11) /*!< falling edge from line 11 */ +#define EXTI_FTEN_FTEN12 BIT(12) /*!< falling edge from line 12 */ +#define EXTI_FTEN_FTEN13 BIT(13) /*!< falling edge from line 13 */ +#define EXTI_FTEN_FTEN14 BIT(14) /*!< falling edge from line 14 */ +#define EXTI_FTEN_FTEN15 BIT(15) /*!< falling edge from line 15 */ +#define EXTI_FTEN_FTEN16 BIT(16) /*!< falling edge from line 16 */ +#define EXTI_FTEN_FTEN17 BIT(17) /*!< falling edge from line 17 */ +#define EXTI_FTEN_FTEN18 BIT(18) /*!< falling edge from line 18 */ +#define EXTI_FTEN_FTEN19 BIT(19) /*!< falling edge from line 19 */ +#define EXTI_FTEN_FTEN20 BIT(20) /*!< falling edge from line 20 */ +#define EXTI_FTEN_FTEN21 BIT(21) /*!< falling edge from line 21 */ +#define EXTI_FTEN_FTEN22 BIT(22) /*!< falling edge from line 22 */ +#define EXTI_FTEN_FTEN23 BIT(23) /*!< falling edge from line 23 */ +#define EXTI_FTEN_FTEN24 BIT(24) /*!< falling edge from line 24 */ +#define EXTI_FTEN_FTEN25 BIT(25) /*!< falling edge from line 25 */ + +/* EXTI_SWIEV */ +#define EXTI_SWIEV_SWIEV0 BIT(0) /*!< software interrupt/event request from line 0 */ +#define EXTI_SWIEV_SWIEV1 BIT(1) /*!< software interrupt/event request from line 1 */ +#define EXTI_SWIEV_SWIEV2 BIT(2) /*!< software interrupt/event request from line 2 */ +#define EXTI_SWIEV_SWIEV3 BIT(3) /*!< software interrupt/event request from line 3 */ +#define EXTI_SWIEV_SWIEV4 BIT(4) /*!< software interrupt/event request from line 4 */ +#define EXTI_SWIEV_SWIEV5 BIT(5) /*!< software interrupt/event request from line 5 */ +#define EXTI_SWIEV_SWIEV6 BIT(6) /*!< software interrupt/event request from line 6 */ +#define EXTI_SWIEV_SWIEV7 BIT(7) /*!< software interrupt/event request from line 7 */ +#define EXTI_SWIEV_SWIEV8 BIT(8) /*!< software interrupt/event request from line 8 */ +#define EXTI_SWIEV_SWIEV9 BIT(9) /*!< software interrupt/event request from line 9 */ +#define EXTI_SWIEV_SWIEV10 BIT(10) /*!< software interrupt/event request from line 10 */ +#define EXTI_SWIEV_SWIEV11 BIT(11) /*!< software interrupt/event request from line 11 */ +#define EXTI_SWIEV_SWIEV12 BIT(12) /*!< software interrupt/event request from line 12 */ +#define EXTI_SWIEV_SWIEV13 BIT(13) /*!< software interrupt/event request from line 13 */ +#define EXTI_SWIEV_SWIEV14 BIT(14) /*!< software interrupt/event request from line 14 */ +#define EXTI_SWIEV_SWIEV15 BIT(15) /*!< software interrupt/event request from line 15 */ +#define EXTI_SWIEV_SWIEV16 BIT(16) /*!< software interrupt/event request from line 16 */ +#define EXTI_SWIEV_SWIEV17 BIT(17) /*!< software interrupt/event request from line 17 */ +#define EXTI_SWIEV_SWIEV18 BIT(18) /*!< software interrupt/event request from line 18 */ +#define EXTI_SWIEV_SWIEV19 BIT(19) /*!< software interrupt/event request from line 19 */ +#define EXTI_SWIEV_SWIEV20 BIT(20) /*!< software interrupt/event request from line 20 */ +#define EXTI_SWIEV_SWIEV21 BIT(21) /*!< software interrupt/event request from line 21 */ +#define EXTI_SWIEV_SWIEV22 BIT(22) /*!< software interrupt/event request from line 22 */ +#define EXTI_SWIEV_SWIEV23 BIT(23) /*!< software interrupt/event request from line 23 */ +#define EXTI_SWIEV_SWIEV24 BIT(24) /*!< software interrupt/event request from line 24 */ +#define EXTI_SWIEV_SWIEV25 BIT(25) /*!< software interrupt/event request from line 25 */ + +/* EXTI_PD */ +#define EXTI_PD_PD0 BIT(0) /*!< interrupt pending status from line 0 */ +#define EXTI_PD_PD1 BIT(1) /*!< interrupt pending status from line 1 */ +#define EXTI_PD_PD2 BIT(2) /*!< interrupt pending status from line 2 */ +#define EXTI_PD_PD3 BIT(3) /*!< interrupt pending status from line 3 */ +#define EXTI_PD_PD4 BIT(4) /*!< interrupt pending status from line 4 */ +#define EXTI_PD_PD5 BIT(5) /*!< interrupt pending status from line 5 */ +#define EXTI_PD_PD6 BIT(6) /*!< interrupt pending status from line 6 */ +#define EXTI_PD_PD7 BIT(7) /*!< interrupt pending status from line 7 */ +#define EXTI_PD_PD8 BIT(8) /*!< interrupt pending status from line 8 */ +#define EXTI_PD_PD9 BIT(9) /*!< interrupt pending status from line 9 */ +#define EXTI_PD_PD10 BIT(10) /*!< interrupt pending status from line 10 */ +#define EXTI_PD_PD11 BIT(11) /*!< interrupt pending status from line 11 */ +#define EXTI_PD_PD12 BIT(12) /*!< interrupt pending status from line 12 */ +#define EXTI_PD_PD13 BIT(13) /*!< interrupt pending status from line 13 */ +#define EXTI_PD_PD14 BIT(14) /*!< interrupt pending status from line 14 */ +#define EXTI_PD_PD15 BIT(15) /*!< interrupt pending status from line 15 */ +#define EXTI_PD_PD16 BIT(16) /*!< interrupt pending status from line 16 */ +#define EXTI_PD_PD17 BIT(17) /*!< interrupt pending status from line 17 */ +#define EXTI_PD_PD18 BIT(18) /*!< interrupt pending status from line 18 */ +#define EXTI_PD_PD19 BIT(19) /*!< interrupt pending status from line 19 */ +#define EXTI_PD_PD20 BIT(20) /*!< interrupt pending status from line 20 */ +#define EXTI_PD_PD21 BIT(21) /*!< interrupt pending status from line 21 */ +#define EXTI_PD_PD22 BIT(22) /*!< interrupt pending status from line 22 */ +#define EXTI_PD_PD23 BIT(23) /*!< interrupt pending status from line 23 */ +#define EXTI_PD_PD24 BIT(24) /*!< interrupt pending status from line 24 */ +#define EXTI_PD_PD25 BIT(25) /*!< interrupt pending status from line 25 */ + +/* constants definitions */ +/* EXTI line number */ +typedef enum { + EXTI_0 = BIT(0), /*!< EXTI line 0 */ + EXTI_1 = BIT(1), /*!< EXTI line 1 */ + EXTI_2 = BIT(2), /*!< EXTI line 2 */ + EXTI_3 = BIT(3), /*!< EXTI line 3 */ + EXTI_4 = BIT(4), /*!< EXTI line 4 */ + EXTI_5 = BIT(5), /*!< EXTI line 5 */ + EXTI_6 = BIT(6), /*!< EXTI line 6 */ + EXTI_7 = BIT(7), /*!< EXTI line 7 */ + EXTI_8 = BIT(8), /*!< EXTI line 8 */ + EXTI_9 = BIT(9), /*!< EXTI line 9 */ + EXTI_10 = BIT(10), /*!< EXTI line 10 */ + EXTI_11 = BIT(11), /*!< EXTI line 11 */ + EXTI_12 = BIT(12), /*!< EXTI line 12 */ + EXTI_13 = BIT(13), /*!< EXTI line 13 */ + EXTI_14 = BIT(14), /*!< EXTI line 14 */ + EXTI_15 = BIT(15), /*!< EXTI line 15 */ + EXTI_16 = BIT(16), /*!< EXTI line 16 */ + EXTI_17 = BIT(17), /*!< EXTI line 17 */ + EXTI_18 = BIT(18), /*!< EXTI line 18 */ + EXTI_19 = BIT(19), /*!< EXTI line 19 */ + EXTI_20 = BIT(20), /*!< EXTI line 20 */ + EXTI_21 = BIT(21), /*!< EXTI line 21 */ + EXTI_22 = BIT(22), /*!< EXTI line 22 */ + EXTI_23 = BIT(23), /*!< EXTI line 23 */ + EXTI_24 = BIT(24), /*!< EXTI line 24 */ + EXTI_25 = BIT(25) /*!< EXTI line 25 */ +} exti_line_enum; + +/* external interrupt and event */ +typedef enum { + EXTI_INTERRUPT = 0, /*!< EXTI interrupt mode */ + EXTI_EVENT /*!< EXTI event mode */ +} exti_mode_enum; + +/* interrupt trigger mode */ +typedef enum { + EXTI_TRIG_RISING = 0, /*!< EXTI rising edge trigger */ + EXTI_TRIG_FALLING, /*!< EXTI falling edge trigger */ + EXTI_TRIG_BOTH, /*!< EXTI rising and falling edge trigger */ + EXTI_TRIG_NONE /*!< EXTI without rising or falling edge trigger */ +} exti_trig_type_enum; + +/* function declarations */ +/* deinitialize the EXTI */ +void exti_deinit(void); +/* initialize the EXTI line x */ +void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type); +/* enable the interrupts from EXTI line x */ +void exti_interrupt_enable(exti_line_enum linex); +/* disable the interrupts from EXTI line x */ +void exti_interrupt_disable(exti_line_enum linex); +/* enable the events from EXTI line x */ +void exti_event_enable(exti_line_enum linex); +/* disable the events from EXTI line x */ +void exti_event_disable(exti_line_enum linex); +/* enable the software interrupt event from EXTI line x */ +void exti_software_interrupt_enable(exti_line_enum linex); +/* disable the software interrupt event from EXTI line x */ +void exti_software_interrupt_disable(exti_line_enum linex); + +/* interrupt & flag functions */ +/* get EXTI line x interrupt pending flag */ +FlagStatus exti_flag_get(exti_line_enum linex); +/* clear EXTI line x interrupt pending flag */ +void exti_flag_clear(exti_line_enum linex); +/* get EXTI line x interrupt pending flag */ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex); +/* clear EXTI line x interrupt pending flag */ +void exti_interrupt_flag_clear(exti_line_enum linex); + +#endif /* GD32F5XX_EXTI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h new file mode 100644 index 00000000000..d6b13a1df40 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h @@ -0,0 +1,644 @@ +/*! + \file gd32f5xx_fmc.h + \brief definitions for the FMC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F5XX_FMC_H +#define GD32F5XX_FMC_H + +#include "gd32f5xx.h" + +/* FMC and option byte definition */ +#define FMC FMC_BASE /*!< FMC register base address */ +#define OB OB_BASE /*!< option byte base address */ + +/* registers definitions */ +#define FMC_KEY REG32((FMC) + 0x00000004U) /*!< FMC unlock key register */ +#define FMC_OBKEY REG32((FMC) + 0x00000008U) /*!< FMC option byte unlock key register */ +#define FMC_STAT REG32((FMC) + 0x0000000CU) /*!< FMC status register */ +#define FMC_CTL REG32((FMC) + 0x00000010U) /*!< FMC control register */ +#define FMC_OBCTL0 REG32((FMC) + 0x00000014U) /*!< FMC option byte control register 0 */ +#define FMC_OBCTL1 REG32((FMC) + 0x00000018U) /*!< FMC option byte control register 1 */ +#define FMC_PECFG REG32((FMC) + 0x00000020U) /*!< FMC page erase configuration register */ +#define FMC_PEKEY REG32((FMC) + 0x00000024U) /*!< FMC unlock page erase key register */ +#define FMC_OTP1CFG REG32((FMC) + 0x00000028U) /*!< FMC OTP1 configuration register */ +#define FMC_LDECCADDR0 REG32((FMC) + 0x0000002CU) /*!< FMC two bits ECC error address0 when load code from flash/bootloader/OTP1 */ +#define FMC_LDECCADDR1 REG32((FMC) + 0x00000030U) /*!< FMC two bits ECC error address1 when load code from flash/bootloader/OTP1 */ +#define FMC_LDECCADDR2 REG32((FMC) + 0x00000034U) /*!< FMC two bits ECC error address2 when load code from flash/bootloader/OTP1 */ +#define FMC_OBSTAT REG32((FMC) + 0x00000040U) /*!< FMC option bytes status register */ +#define FMC_PID REG32((FMC) + 0x00000100U) /*!< FMC product ID register */ +#define EFUSE_CS REG32((FMC) + 0x00000200U) /*!< EFUSE control and status register */ +#define EFUSE_ADDR REG32((FMC) + 0x00000204U) /*!< EFUSE address register */ +#define EFUSE_CTL REG32((FMC) + 0x00000208U) /*!< EFUSE efuse controlregister */ +#define EFUSE_USER_DATA REG32((FMC) + 0x0000020CU) /*!< EFUSE user data register */ + +#define OB_USER REG8((OB) + 0x00010000U) /*!< option byte user value*/ +#define OB_SPC REG8((OB) + 0x00010001U) /*!< option byte security protection value */ +#define OB_WP0_0 REG8((OB) + 0x00010008U) /*!< option byte write protection 0 */ +#define OB_WP0_1 REG8((OB) + 0x00010009U) /*!< option byte write protection 0 */ +#define OB_WP0_2 REG8((OB) + 0x0001000CU) /*!< option byte write protection 0 */ +#define OB_WP1_0 REG8((OB) + 0x00000008U) /*!< option byte write protection 1 */ +#define OB_WP1_1 REG8((OB) + 0x00000009U) /*!< option byte write protection 1 */ +#define OB_WP1_2 REG8((OB) + 0x0000000CU) /*!< option byte write protection 1 */ + +/* registers offset */ +#define EFUSE_CTL_OFFSET ((uint32_t)0x00000208U) /*!< EFUSE efuse control register offset */ +#define EFUSE_USER_DATA_OFFSET ((uint32_t)0x0000020CU) /*!< EFUSE user data register offset */ + +/* bits definitions */ +/* FMC_KEY */ +#define FMC_KEY_KEY BITS(0,31) /*!< FMC main flash key bits */ + +/* FMC_OBKEY */ +#define FMC_OBKEY_OBKEY BITS(0,31) /*!< option byte key bits */ + +/* FMC_STAT */ +#define FMC_STAT_END BIT(0) /*!< end of operation flag bit */ +#define FMC_STAT_OPERR BIT(1) /*!< flash operation error flag bit */ +#define FMC_STAT_LDECCDET BIT(2) /*!< two bits ECC error when load code from flash/OTP1/bootloader */ +#define FMC_STAT_WPERR BIT(4) /*!< erase/Program protection error flag bit */ +#define FMC_STAT_PGAERR BIT(5) /*!< Program alignment error flag bit */ +#define FMC_STAT_PGMERR BIT(6) /*!< program size not match error flag bit */ +#define FMC_STAT_PGSERR BIT(7) /*!< program sequence error flag bit */ +#define FMC_STAT_RDCERR BIT(8) /*!< CBUS data read protection error flag bit */ +#define FMC_STAT_BUSY BIT(16) /*!< flash busy flag bit */ + +/* FMC_CTL */ +#define FMC_CTL_PG BIT(0) /*!< main flash program command bit */ +#define FMC_CTL_SER BIT(1) /*!< main flash sector erase command bit */ +#define FMC_CTL_MER0 BIT(2) /*!< main flash mass erase for bank0 command bit */ +#define FMC_CTL_SN BITS(3,7) /*!< select which sector number to be erased */ +#define FMC_CTL_PSZ BITS(8,9) /*!< program size bit */ +#define FMC_CTL_DWPGE BIT(10) /*!< double word Program size bit enable bit */ +#define FMC_CTL_SN_5 BIT(11) /*!< bit 5 of SN */ +#define FMC_CTL_MER1 BIT(15) /*!< main flash mass erase for bank1 command bit */ +#define FMC_CTL_START BIT(16) /*!< send erase command to FMC bit */ +#define FMC_CTL_ENDIE BIT(24) /*!< end of operation interrupt enable bit */ +#define FMC_CTL_ERRIE BIT(25) /*!< error interrupt enable bit */ +#define FMC_CTL_LDECCIE BIT(26) /*!< load code ECC error interrupt enable bit */ +#define FMC_CTL_NWLDE BIT(29) /*!< No wait time area load enable when system reset */ +#define FMC_CTL_RLBP BIT(30) /*!< Read lock block protection for OTP2 */ +#define FMC_CTL_LK BIT(31) /*!< FMC_CTL lock bit */ + +/* FMC_OBCTL0 */ +#define FMC_OBCTL0_OB_LK BIT(0) /*!< FMC_OBCTL0 lock bit */ +#define FMC_OBCTL0_OB_START BIT(1) /*!< send option byte change command to FMC bit */ +#define FMC_OBCTL0_BOR_TH BITS(2,3) /*!< option byte BOR threshold value */ +#define FMC_OBCTL0_BB BIT(4) /*!< option byte boot bank value */ +#define FMC_OBCTL0_NWDG_HW BIT(5) /*!< option byte watchdog value */ +#define FMC_OBCTL0_NRST_DPSLP BIT(6) /*!< option byte deepsleep reset value */ +#define FMC_OBCTL0_NRST_STDBY BIT(7) /*!< option byte standby reset value */ +#define FMC_OBCTL0_SPC BITS(8,15) /*!< option byte Security Protection code */ +#define FMC_OBCTL0_WP0 BITS(16,27) /*!< erase/program protection of low 12 sectors of bank0 when DRP is 0 */ +#define FMC_OBCTL0_ECCEN BIT(28) /*!< ECC enable bit */ +#define FMC_OBCTL0_NWA BIT(29) /*!< no waiting time area select bit */ +#define FMC_OBCTL0_DRP BIT(31) /*!< CBUS read protection bit */ + +/* FMC_OBCTL1 */ +#define FMC_OBCTL1_WP0_H BITS(0,7) /*!< erase/program protection of high 8 sectors of bank0 when DRP is 0 */ +#define FMC_OBCTL1_WP1_H BITS(8,15) /*!< erase/program protection of high 8 sectors of bank1 when DRP is 0 */ +#define FMC_OBCTL1_WP1_L BITS(16,27) /*!< erase/program protection of low 12 sectors of bank1 when DRP is 0 */ + +/* FMC_PECFG */ +#define FMC_PECFG_PE_ADDR BITS(0,28) /*!< page address (4KB alignment) */ +#define FMC_PECFG_PE_EN BIT(31) /*!< the enable bit of page erase function */ + +/* FMC_PEKEY */ +#define FMC_PEKEY_PE_KEY BITS(0,31) /*!< FMC_PECFG unlock key value */ + +/* FMC_OTP1CFG */ +#define FMC_OTP1CFG_OTP1REN BITS(0,15) /*!< FMC OTP1 read enable bits */ + +/* FMC_LDECCADDR0 */ +#define FMC_LDECCADDR0_LDECCADDR0 BITS(0,31) /*!< ECC two bits error address0 when load code from flash/bootloader/OTP1 */ + +/* FMC_LDECCADDR1 */ +#define FMC_LDECCADDR1_LDECCADDR1 BITS(0,31) /*!< ECC two bits error address1 when load code from flash/bootloader/OTP1 */ + +/* FMC_LDECCADDR2 */ +#define FMC_LDECCADDR2_LDECCADDR2 BITS(0,31) /*!< ECC two bits error address2 when load code from flash/bootloader/OTP1 */ + +/* FMC_OBSTAT */ +#define FMC_OB_SPCL BIT(1) /*!< security protection is level low */ +#define FMC_OB_SPCH BIT(2) /*!< security protection is level high */ + +/* FMC_PID */ +#define FMC_PID_PID BITS(0,31) /*!< product ID bits */ + +/* EFUSE_CS */ +#define EFUSE_CS_EFSTR BIT(0) /*!< start efuse operation */ +#define EFUSE_CS_EFRW BIT(1) /*!< the selection of efuse operation */ +#define EFUSE_CS_EFBYP BIT(2) /*!< EFUSE program supply selection */ +#define EFUSE_CS_PGIF BIT(16) /*!< program operation complete flag */ +#define EFUSE_CS_RDIF BIT(17) /*!< read operation complete flag */ +#define EFUSE_CS_OVBERIF BIT(18) /*!< overstep boundary error flag */ +#define EFUSE_CS_PGIE BIT(20) /*!< enable bit for program operation completed interrupt */ +#define EFUSE_CS_RDIE BIT(21) /*!< enable bit for read operation completed interrupt */ +#define EFUSE_CS_OVBERIE BIT(22) /*!< enable bit for overstep boundary error interrupt */ +#define EFUSE_CS_PGIC BIT(24) /*!< clear bit for program operation completed interrupt flag */ +#define EFUSE_CS_RDIC BIT(25) /*!< clear bit for read operation completed interrupt flag */ +#define EFUSE_CS_OVBERIC BIT(26) /*!< clear bit for overstep boundary error interrupt flag */ + +/* EFUSE_ADDR */ +#define EFUSE_ADDR_EFADDR BITS(0,4) /*!< read or program efuse data start address */ +#define EFUSE_ADDR_EFSIZE BITS(8,12) /*!< read or program efuse data size */ + +/* EFUSE_CTL */ +#define EFUSE_CTL_EFSPC BIT(0) /*!< EFUSE security protection level */ +#define EFUSE_CTL_NDBG BIT(1) /*!< debugging permission setting */ +#define EFUSE_CTL_NBTSB BIT(2) /*!< not boot from sram or bootloader */ +#define EFUSE_CTL_BTFOSEL BIT(3) /*!< select boot from flash or OTP1 when NBTSB is 1 or BOOT0 is 0 */ +#define EFUSE_CTL_UDLK BIT(6) /*!< EFUSE_USER_DATA register lock bit */ +#define EFUSE_CTL_LK BIT(7) /*!< EFUSE_CTL register lock bit */ + +/* EFUSE_USER_DATA */ +#define EFUSE_USER_DATA_USERDATA BITS(0,7) /*!< EFUSE USER_DATA value */ + +/* unlock key */ +#define UNLOCK_KEY0 ((uint32_t)0x45670123U) /*!< unlock key 0 */ +#define UNLOCK_KEY1 ((uint32_t)0xCDEF89ABU) /*!< unlock key 1 */ +#define UNLOCK_PE_KEY ((uint32_t)0xA9B8C7D6U) /*!< unlock page erase function key */ + +#define OB_UNLOCK_KEY0 ((uint32_t)0x08192A3BU) /*!< ob unlock key 0 */ +#define OB_UNLOCK_KEY1 ((uint32_t)0x4C5D6E7FU) /*!< ob unlock key 1 */ + +/* option byte BOR threshold value */ +#define OBCTL0_BOR_TH(regval) (BITS(2,3) & ((uint32_t)(regval)) << 2U) +#define OB_BOR_TH_VALUE3 OBCTL0_BOR_TH(0) /*!< BOR threshold value 3 */ +#define OB_BOR_TH_VALUE2 OBCTL0_BOR_TH(1) /*!< BOR threshold value 2 */ +#define OB_BOR_TH_VALUE1 OBCTL0_BOR_TH(2) /*!< BOR threshold value 1 */ +#define OB_BOR_TH_OFF OBCTL0_BOR_TH(3) /*!< no BOR function */ + +/* option byte boot bank value */ +#define OBCTL0_BB(regval) (BIT(4) & ((uint32_t)(regval) << 4U)) +#define OB_BB_DISABLE OBCTL0_BB(0) /*!< boot from bank0 */ +#define OB_BB_ENABLE OBCTL0_BB(1) /*!< boot from bank1 or bank0 if bank1 is void */ + +/* option byte software/hardware free watch dog timer */ +#define OBCTL0_NWDG_HW(regval) (BIT(5) & ((uint32_t)(regval)) << 5U) +#define OB_FWDGT_SW OBCTL0_NWDG_HW(1) /*!< software free watchdog */ +#define OB_FWDGT_HW OBCTL0_NWDG_HW(0) /*!< hardware free watchdog */ + +/* option byte reset or not entering deep sleep mode */ +#define OBCTL0_NRST_DPSLP(regval) (BIT(6) & ((uint32_t)(regval)) << 6U) +#define OB_DEEPSLEEP_NRST OBCTL0_NRST_DPSLP(1) /*!< no reset when entering deepsleep mode */ +#define OB_DEEPSLEEP_RST OBCTL0_NRST_DPSLP(0) /*!< generate a reset instead of entering deepsleep mode */ + +/* option byte reset or not entering standby mode */ +#define OBCTL0_NRST_STDBY(regval) (BIT(7) & ((uint32_t)(regval)) << 7U) +#define OB_STDBY_NRST OBCTL0_NRST_STDBY(1) /*!< no reset when entering deepsleep mode */ +#define OB_STDBY_RST OBCTL0_NRST_STDBY(0) /*!< generate a reset instead of entering standby mode */ + +/* option byte sram/flash ECC configure */ +#define OBCTL0_ECCEN(regval) (BIT(28) & ((uint32_t)(regval) << 28U)) +#define OB_ECC_DISABLE OBCTL0_ECCEN(0) /*!< sram/flash ECC disable */ +#define OB_ECC_ENABLE OBCTL0_ECCEN(1) /*!< sram/flash ECC enable */ + +/* option byte no waiting time area select */ +#define OBCTL0_NWA(regval) (BIT(29) & ((uint32_t)(regval) << 29U)) +#define OB_NWA_BANK1 OBCTL0_NWA(0) /*!< bank1 is no waiting time area */ +#define OB_NWA_BANK0 OBCTL0_NWA(1) /*!< bank0 is no waiting time area */ + +/* read protect configure */ +#define FMC_NSPC ((uint8_t)0xAAU) /*!< no security protection */ +#define FMC_LSPC ((uint8_t)0xBBU) /*!< low security protection */ +#define FMC_HSPC ((uint8_t)0xCCU) /*!< high security protection */ + +/* option bytes write protection */ +#define OB_WP_0 ((uint64_t)0x0000000000000001U) /*!< erase/program protection of sector 0 */ +#define OB_WP_1 ((uint64_t)0x0000000000000002U) /*!< erase/program protection of sector 1 */ +#define OB_WP_2 ((uint64_t)0x0000000000000004U) /*!< erase/program protection of sector 2 */ +#define OB_WP_3 ((uint64_t)0x0000000000000008U) /*!< erase/program protection of sector 3 */ +#define OB_WP_4 ((uint64_t)0x0000000000000010U) /*!< erase/program protection of sector 4 */ +#define OB_WP_5 ((uint64_t)0x0000000000000020U) /*!< erase/program protection of sector 5 */ +#define OB_WP_6 ((uint64_t)0x0000000000000040U) /*!< erase/program protection of sector 6 */ +#define OB_WP_7 ((uint64_t)0x0000000000000080U) /*!< erase/program protection of sector 7 */ +#define OB_WP_8 ((uint64_t)0x0000000000000100U) /*!< erase/program protection of sector 8 */ +#define OB_WP_9 ((uint64_t)0x0000000000000200U) /*!< erase/program protection of sector 9 */ +#define OB_WP_10 ((uint64_t)0x0000000000000400U) /*!< erase/program protection of sector 10 */ +#define OB_WP_11 ((uint64_t)0x0000000000000800U) /*!< erase/program protection of sector 11 */ +#define OB_WP_12 ((uint64_t)0x0000000000001000U) /*!< erase/program protection of sector 12 */ +#define OB_WP_13 ((uint64_t)0x0000000000002000U) /*!< erase/program protection of sector 13 */ +#define OB_WP_14 ((uint64_t)0x0000000000004000U) /*!< erase/program protection of sector 14 */ +#define OB_WP_15 ((uint64_t)0x0000000000008000U) /*!< erase/program protection of sector 15 */ +#define OB_WP_16 ((uint64_t)0x0000000000010000U) /*!< erase/program protection of sector 16 */ +#define OB_WP_17 ((uint64_t)0x0000000000020000U) /*!< erase/program protection of sector 17 */ +#define OB_WP_18 ((uint64_t)0x0000000000040000U) /*!< erase/program protection of sector 18 */ +#define OB_WP_19 ((uint64_t)0x0000000000080000U) /*!< erase/program protection of sector 19 */ +#define OB_WP_20 ((uint64_t)0x0000000000100000U) /*!< erase/program protection of sector 20 */ +#define OB_WP_21 ((uint64_t)0x0000000000200000U) /*!< erase/program protection of sector 21 */ +#define OB_WP_22 ((uint64_t)0x0000000000400000U) /*!< erase/program protection of sector 22 */ +#define OB_WP_23 ((uint64_t)0x0000000000800000U) /*!< erase/program protection of sector 23 */ +#define OB_WP_24 ((uint64_t)0x0000000001000000U) /*!< erase/program protection of sector 24 */ +#define OB_WP_25 ((uint64_t)0x0000000002000000U) /*!< erase/program protection of sector 25 */ +#define OB_WP_26 ((uint64_t)0x0000000004000000U) /*!< erase/program protection of sector 26 */ +#define OB_WP_27 ((uint64_t)0x0000000008000000U) /*!< erase/program protection of sector 27 */ +#define OB_WP_28 ((uint64_t)0x0000000010000000U) /*!< erase/program protection of sector 28 */ +#define OB_WP_29 ((uint64_t)0x0000000020000000U) /*!< erase/program protection of sector 29 */ +#define OB_WP_30 ((uint64_t)0x0000000040000000U) /*!< erase/program protection of sector 30 */ +#define OB_WP_31 ((uint64_t)0x0000000080000000U) /*!< erase/program protection of sector 31 */ +#define OB_WP_32 ((uint64_t)0x0000000100000000U) /*!< erase/program protection of sector 32 */ +#define OB_WP_33 ((uint64_t)0x0000000200000000U) /*!< erase/program protection of sector 33 */ +#define OB_WP_34 ((uint64_t)0x0000000400000000U) /*!< erase/program protection of sector 34 */ +#define OB_WP_35 ((uint64_t)0x0000000800000000U) /*!< erase/program protection of sector 35 */ +#define OB_WP_36 ((uint64_t)0x0000001000000000U) /*!< erase/program protection of sector 36 */ +#define OB_WP_37 ((uint64_t)0x0000002000000000U) /*!< erase/program protection of sector 37 */ +#define OB_WP_38 ((uint64_t)0x0000004000000000U) /*!< erase/program protection of sector 38 */ +#define OB_WP_39_53 ((uint64_t)0x0000008000000000U) /*!< erase/program protection of sector 39~53 */ +#define OB_WP_ALL ((uint64_t)0x000000FFFFFFFFFFU) /*!< erase/program protection of all sectors */ + +/* option bytes CBUS read protection */ +#define OB_DRP_0 ((uint64_t)0x0000000000000001U) /*!< CBUS read protection protection of sector 0 */ +#define OB_DRP_1 ((uint64_t)0x0000000000000002U) /*!< CBUS read protection protection of sector 1 */ +#define OB_DRP_2 ((uint64_t)0x0000000000000004U) /*!< CBUS read protection protection of sector 2 */ +#define OB_DRP_3 ((uint64_t)0x0000000000000008U) /*!< CBUS read protection protection of sector 3 */ +#define OB_DRP_4 ((uint64_t)0x0000000000000010U) /*!< CBUS read protection protection of sector 4 */ +#define OB_DRP_5 ((uint64_t)0x0000000000000020U) /*!< CBUS read protection protection of sector 5 */ +#define OB_DRP_6 ((uint64_t)0x0000000000000040U) /*!< CBUS read protection protection of sector 6 */ +#define OB_DRP_7 ((uint64_t)0x0000000000000080U) /*!< CBUS read protection protection of sector 7 */ +#define OB_DRP_8 ((uint64_t)0x0000000000000100U) /*!< CBUS read protection protection of sector 8 */ +#define OB_DRP_9 ((uint64_t)0x0000000000000200U) /*!< CBUS read protection protection of sector 9 */ +#define OB_DRP_10 ((uint64_t)0x0000000000000400U) /*!< CBUS read protection protection of sector 10 */ +#define OB_DRP_11 ((uint64_t)0x0000000000000800U) /*!< CBUS read protection protection of sector 11 */ +#define OB_DRP_12 ((uint64_t)0x0000000000001000U) /*!< CBUS read protection protection of sector 12 */ +#define OB_DRP_13 ((uint64_t)0x0000000000002000U) /*!< CBUS read protection protection of sector 13 */ +#define OB_DRP_14 ((uint64_t)0x0000000000004000U) /*!< CBUS read protection protection of sector 14 */ +#define OB_DRP_15 ((uint64_t)0x0000000000008000U) /*!< CBUS read protection protection of sector 15 */ +#define OB_DRP_16 ((uint64_t)0x0000000000010000U) /*!< CBUS read protection protection of sector 16 */ +#define OB_DRP_17 ((uint64_t)0x0000000000020000U) /*!< CBUS read protection protection of sector 17 */ +#define OB_DRP_18 ((uint64_t)0x0000000000040000U) /*!< CBUS read protection protection of sector 18 */ +#define OB_DRP_19 ((uint64_t)0x0000000000080000U) /*!< CBUS read protection protection of sector 19 */ +#define OB_DRP_20 ((uint64_t)0x0000000000100000U) /*!< CBUS read protection protection of sector 20 */ +#define OB_DRP_21 ((uint64_t)0x0000000000200000U) /*!< CBUS read protection protection of sector 21 */ +#define OB_DRP_22 ((uint64_t)0x0000000000400000U) /*!< CBUS read protection protection of sector 22 */ +#define OB_DRP_23 ((uint64_t)0x0000000000800000U) /*!< CBUS read protection protection of sector 23 */ +#define OB_DRP_24 ((uint64_t)0x0000000001000000U) /*!< CBUS read protection protection of sector 24 */ +#define OB_DRP_25 ((uint64_t)0x0000000002000000U) /*!< CBUS read protection protection of sector 25 */ +#define OB_DRP_26 ((uint64_t)0x0000000004000000U) /*!< CBUS read protection protection of sector 26 */ +#define OB_DRP_27 ((uint64_t)0x0000000008000000U) /*!< CBUS read protection protection of sector 27 */ +#define OB_DRP_28 ((uint64_t)0x0000000010000000U) /*!< CBUS read protection protection of sector 28 */ +#define OB_DRP_29 ((uint64_t)0x0000000020000000U) /*!< CBUS read protection protection of sector 29 */ +#define OB_DRP_30 ((uint64_t)0x0000000040000000U) /*!< CBUS read protection protection of sector 30 */ +#define OB_DRP_31 ((uint64_t)0x0000000080000000U) /*!< CBUS read protection protection of sector 31 */ +#define OB_DRP_32 ((uint64_t)0x0000000100000000U) /*!< CBUS read protection protection of sector 32 */ +#define OB_DRP_33 ((uint64_t)0x0000000200000000U) /*!< CBUS read protection protection of sector 33 */ +#define OB_DRP_34 ((uint64_t)0x0000000400000000U) /*!< CBUS read protection protection of sector 34 */ +#define OB_DRP_35 ((uint64_t)0x0000000800000000U) /*!< CBUS read protection protection of sector 35 */ +#define OB_DRP_36 ((uint64_t)0x0000001000000000U) /*!< CBUS read protection protection of sector 36 */ +#define OB_DRP_37 ((uint64_t)0x0000002000000000U) /*!< CBUS read protection protection of sector 37 */ +#define OB_DRP_38 ((uint64_t)0x0000004000000000U) /*!< CBUS read protection protection of sector 38 */ +#define OB_DRP_39_53 ((uint64_t)0x0000008000000000U) /*!< CBUS read protection protection of sector 39~53 */ +#define OB_DRP_ALL ((uint64_t)0x000000FFFFFFFFFFU) /*!< CBUS read protection protection of all sectors */ + +/* option bytes CBUS read protection mode */ +#define OBCTL0_DRP(regval) (BIT(31) & ((uint32_t)(regval) << 31U)) +#define OB_DRP_DISABLE OBCTL0_DRP(0) /*!< the WPx bits used as erase/program protection of each sector */ +#define OB_DRP_ENABLE OBCTL0_DRP(1) /*!< the WPx bits used as erase/program protection and CBUS read protection of each sector */ + +/* FMC sectors */ +#define SN_5 FMC_CTL_SN_5 /* bit 5 of sector number */ +#define CTL_SN(regval) (BITS(3,7) & ((uint32_t)(regval)) << 3) +#define CTL_SECTOR_NUMBER_0 CTL_SN(0) /*!< sector 0 */ +#define CTL_SECTOR_NUMBER_1 CTL_SN(1) /*!< sector 1 */ +#define CTL_SECTOR_NUMBER_2 CTL_SN(2) /*!< sector 2 */ +#define CTL_SECTOR_NUMBER_3 CTL_SN(3) /*!< sector 3 */ +#define CTL_SECTOR_NUMBER_4 CTL_SN(4) /*!< sector 4 */ +#define CTL_SECTOR_NUMBER_5 CTL_SN(5) /*!< sector 5 */ +#define CTL_SECTOR_NUMBER_6 CTL_SN(6) /*!< sector 6 */ +#define CTL_SECTOR_NUMBER_7 CTL_SN(7) /*!< sector 7 */ +#define CTL_SECTOR_NUMBER_8 CTL_SN(8) /*!< sector 8 */ +#define CTL_SECTOR_NUMBER_9 CTL_SN(9) /*!< sector 9 */ +#define CTL_SECTOR_NUMBER_10 CTL_SN(10) /*!< sector 10 */ +#define CTL_SECTOR_NUMBER_11 CTL_SN(11) /*!< sector 11 */ +#define CTL_SECTOR_NUMBER_12 CTL_SN(12) /*!< sector 12 */ +#define CTL_SECTOR_NUMBER_13 CTL_SN(13) /*!< sector 13 */ +#define CTL_SECTOR_NUMBER_14 CTL_SN(14) /*!< sector 14 */ +#define CTL_SECTOR_NUMBER_15 CTL_SN(15) /*!< sector 15 */ +#define CTL_SECTOR_NUMBER_16 CTL_SN(16) /*!< sector 16 */ +#define CTL_SECTOR_NUMBER_17 CTL_SN(17) /*!< sector 17 */ +#define CTL_SECTOR_NUMBER_18 CTL_SN(18) /*!< sector 18 */ +#define CTL_SECTOR_NUMBER_19 CTL_SN(19) /*!< sector 19 */ +#define CTL_SECTOR_NUMBER_20 CTL_SN(20) /*!< sector 20 */ +#define CTL_SECTOR_NUMBER_21 CTL_SN(21) /*!< sector 21 */ +#define CTL_SECTOR_NUMBER_22 CTL_SN(22) /*!< sector 22 */ +#define CTL_SECTOR_NUMBER_23 CTL_SN(23) /*!< sector 23 */ +#define CTL_SECTOR_NUMBER_24 CTL_SN(24) /*!< sector 24 */ +#define CTL_SECTOR_NUMBER_25 CTL_SN(25) /*!< sector 25 */ +#define CTL_SECTOR_NUMBER_26 CTL_SN(26) /*!< sector 26 */ +#define CTL_SECTOR_NUMBER_27 CTL_SN(27) /*!< sector 27 */ +#define CTL_SECTOR_NUMBER_28 CTL_SN(28) /*!< sector 28 */ +#define CTL_SECTOR_NUMBER_29 CTL_SN(29) /*!< sector 29 */ +#define CTL_SECTOR_NUMBER_30 CTL_SN(30) /*!< sector 30 */ +#define CTL_SECTOR_NUMBER_31 CTL_SN(31) /*!< sector 31 */ +#define CTL_SECTOR_NUMBER_32 (SN_5 | CTL_SN(0)) /*!< sector 32 */ +#define CTL_SECTOR_NUMBER_33 (SN_5 | CTL_SN(1)) /*!< sector 33 */ +#define CTL_SECTOR_NUMBER_34 (SN_5 | CTL_SN(2)) /*!< sector 34 */ +#define CTL_SECTOR_NUMBER_35 (SN_5 | CTL_SN(3)) /*!< sector 35 */ +#define CTL_SECTOR_NUMBER_36 (SN_5 | CTL_SN(4)) /*!< sector 36 */ +#define CTL_SECTOR_NUMBER_37 (SN_5 | CTL_SN(5)) /*!< sector 37 */ +#define CTL_SECTOR_NUMBER_38 (SN_5 | CTL_SN(6)) /*!< sector 38 */ +#define CTL_SECTOR_NUMBER_39 (SN_5 | CTL_SN(7)) /*!< sector 39 */ +#define CTL_SECTOR_NUMBER_40 (SN_5 | CTL_SN(8)) /*!< sector 40 */ +#define CTL_SECTOR_NUMBER_41 (SN_5 | CTL_SN(9)) /*!< sector 41 */ +#define CTL_SECTOR_NUMBER_42 (SN_5 | CTL_SN(10)) /*!< sector 42 */ +#define CTL_SECTOR_NUMBER_43 (SN_5 | CTL_SN(11)) /*!< sector 43 */ +#define CTL_SECTOR_NUMBER_44 (SN_5 | CTL_SN(12)) /*!< sector 44 */ +#define CTL_SECTOR_NUMBER_45 (SN_5 | CTL_SN(13)) /*!< sector 45 */ +#define CTL_SECTOR_NUMBER_46 (SN_5 | CTL_SN(14)) /*!< sector 46 */ +#define CTL_SECTOR_NUMBER_47 (SN_5 | CTL_SN(15)) /*!< sector 47 */ +#define CTL_SECTOR_NUMBER_48 (SN_5 | CTL_SN(16)) /*!< sector 48 */ +#define CTL_SECTOR_NUMBER_49 (SN_5 | CTL_SN(17)) /*!< sector 49 */ +#define CTL_SECTOR_NUMBER_50 (SN_5 | CTL_SN(18)) /*!< sector 50 */ +#define CTL_SECTOR_NUMBER_51 (SN_5 | CTL_SN(19)) /*!< sector 51 */ +#define CTL_SECTOR_NUMBER_52 (SN_5 | CTL_SN(20)) /*!< sector 52 */ +#define CTL_SECTOR_NUMBER_53 (SN_5 | CTL_SN(21)) /*!< sector 53 */ + +/* FMC program size */ +#define CTL_PSZ(regval) (BITS(8,9) & ((uint32_t)(regval)) << 8U) +#define CTL_PSZ_BYTE CTL_PSZ(0) /*!< FMC program by byte access */ +#define CTL_PSZ_HALF_WORD CTL_PSZ(1) /*!< FMC program by half-word access */ +#define CTL_PSZ_WORD CTL_PSZ(2) /*!< FMC program by word access */ + +/* FMC interrupt enable */ +#define FMC_INT_END FMC_CTL_ENDIE /*!< enable FMC end of program interrupt */ +#define FMC_INT_ERR FMC_CTL_ERRIE /*!< enable FMC error interrupt */ +#define FMC_INT_LDECC FMC_CTL_LDECCIE /*!< enable FMC load code ECC error interrupt */ + +/* FMC flags */ +#define FMC_FLAG_END FMC_STAT_END /*!< FMC end of operation flag bit */ +#define FMC_FLAG_OPERR FMC_STAT_OPERR /*!< FMC operation error flag bit */ +#define FMC_FLAG_LDECCDET FMC_STAT_LDECCDET /*!< FMC two bits ECC error when load code from flash/OTP1/bootloader */ +#define FMC_FLAG_WPERR FMC_STAT_WPERR /*!< FMC erase/program protection error flag bit */ +#define FMC_FLAG_PGAERR FMC_STAT_PGAERR /*!< FMC program alignment error flag bit */ +#define FMC_FLAG_PGMERR FMC_STAT_PGMERR /*!< FMC program size not match error flag bit */ +#define FMC_FLAG_PGSERR FMC_STAT_PGSERR /*!< FMC program sequence error flag bit */ +#define FMC_FLAG_RDCERR FMC_STAT_RDCERR /*!< FMC CBUS data read protection error flag bit */ +#define FMC_FLAG_BUSY FMC_STAT_BUSY /*!< FMC busy flag */ + +/* FMC interrupt flags */ +#define FMC_INT_FLAG_END FMC_STAT_END /*!< FMC end of operation interrupt flag */ +#define FMC_INT_FLAG_OPERR FMC_STAT_OPERR /*!< FMC operation error interrupt flag */ +#define FMC_INT_FLAG_LDECCDET FMC_STAT_LDECCDET /*!< FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag */ +#define FMC_INT_FLAG_WPERR FMC_STAT_WPERR /*!< FMC erase/program protection error interrupt flag */ +#define FMC_INT_FLAG_PGAERR FMC_STAT_PGAERR /*!< FMC program alignment error interrupt flag */ +#define FMC_INT_FLAG_PGMERR FMC_STAT_PGMERR /*!< FMC program size not match error interrupt flag */ +#define FMC_INT_FLAG_PGSERR FMC_STAT_PGSERR /*!< FMC program sequence error interrupt flag */ +#define FMC_INT_FLAG_RDCERR FMC_STAT_RDCERR /*!< FMC CBUS data read protection error interrupt flag */ + +/* FMC time out */ +#define FMC_TIMEOUT_COUNT ((uint32_t)0x4FFFFFFFU) /*!< count to judge of FMC timeout */ + +/* EFUSE flags */ +#define EFUSE_PGIF EFUSE_CS_PGIF /*!< programming operation completion flag */ +#define EFUSE_RDIF EFUSE_CS_RDIF /*!< read operation completion flag */ +#define EFUSE_OBERIF EFUSE_CS_OVBERIF /*!< overstep boundary error flag */ + +/* EFUSE flags clear */ +#define EFUSE_PGIC EFUSE_CS_PGIC /*!< clear programming operation completion flag */ +#define EFUSE_RDIC EFUSE_CS_RDIC /*!< clear read operation completion flag */ +#define EFUSE_OBERIC EFUSE_CS_OVBERIC /*!< clear overstep boundary error flag */ + +/* EFUSE interrupt enable */ +#define EFUSE_INT_OBER EFUSE_CS_OVBERIE /*!< overstep boundary error interrupt enable */ +#define EFUSE_INT_PG EFUSE_CS_PGIE /*!< programming operation completion interrupt enable */ +#define EFUSE_INT_RD EFUSE_CS_RDIE /*!< read operation completion interrupt enable */ + +/* EFUSE interrupt flags */ +#define EFUSE_INT_OBERIF EFUSE_CS_OVBERIF /*!< overstep boundary error interrupt flag */ +#define EFUSE_INT_PGIF EFUSE_CS_PGIF /*!< programming operation completion interrupt flag */ +#define EFUSE_INT_RDIF EFUSE_CS_RDIF /*!< read operation completion interrupt flag */ + +/* EFUSE interrupt flags clear */ +#define EFUSE_INT_OBERIC EFUSE_CS_OVBERIC /*!< clear overstep boundary error interrupt flag */ +#define EFUSE_INT_PGIC EFUSE_CS_PGIC /*!< clear programming operation completion interrupt flag */ +#define EFUSE_INT_RDIC EFUSE_CS_RDIC /*!< clear read operation completion interrupt flag */ + +/* EFUSE macro address */ +#define EFUSE_CTL_EFADDR ((uint32_t)0x00000001U) /*!< efuse control address */ +#define USER_DATA_EFADDR ((uint32_t)0x00000002U) /*!< user data address */ + +/* EFUSE time out */ +#define EFUSE_TIMEOUT_COUNT ((uint32_t)0x0000FFFFU) /*!< count to judge of EFUSE timeout */ + +/* OTP0 address */ +#define OTP0_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FFF7800U) /*!< OTP0 data block base address */ +#define OTP0_LOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FFF7840U) /*!< OTP0 lock block base address */ + +/* OTP1 address */ +#define OTP1_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF00000U) /*!< OTP1 data block base address */ +#define OTP1_LOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20200U) /*!< OTP1 lock block base address */ + +/* OTP2 address */ +#define OTP2_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20000U) /*!< OTP2 data block base address */ +#define OTP2_WLOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20210U) /*!< OTP2 write lock block base address */ +#define OTP2_RLOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20220U) /*!< OTP2 read lock block base address */ + +/* OTP1 data blockx read enable */ +#define OTP1_DATA_BLOCK_0 BIT(0) /*!< erase/program protection of sector 0 */ +#define OTP1_DATA_BLOCK_1 BIT(1) /*!< erase/program protection of sector 1 */ +#define OTP1_DATA_BLOCK_2 BIT(2) /*!< erase/program protection of sector 2 */ +#define OTP1_DATA_BLOCK_3 BIT(3) /*!< erase/program protection of sector 3 */ +#define OTP1_DATA_BLOCK_4 BIT(4) /*!< erase/program protection of sector 4 */ +#define OTP1_DATA_BLOCK_5 BIT(5) /*!< erase/program protection of sector 5 */ +#define OTP1_DATA_BLOCK_6 BIT(6) /*!< erase/program protection of sector 6 */ +#define OTP1_DATA_BLOCK_7 BIT(7) /*!< erase/program protection of sector 7 */ +#define OTP1_DATA_BLOCK_8 BIT(8) /*!< erase/program protection of sector 8 */ +#define OTP1_DATA_BLOCK_9 BIT(9) /*!< erase/program protection of sector 9 */ +#define OTP1_DATA_BLOCK_10 BIT(10) /*!< erase/program protection of sector 10 */ +#define OTP1_DATA_BLOCK_11 BIT(11) /*!< erase/program protection of sector 11 */ +#define OTP1_DATA_BLOCK_12 BIT(12) /*!< erase/program protection of sector 12 */ +#define OTP1_DATA_BLOCK_13 BIT(13) /*!< erase/program protection of sector 13 */ +#define OTP1_DATA_BLOCK_14 BIT(14) /*!< erase/program protection of sector 14 */ +#define OTP1_DATA_BLOCK_15 BIT(15) /*!< erase/program protection of sector 15 */ +#define OTP1_DATA_BLOCK_ALL BITS(0,15) /*!< ALL erase/program protection of sector */ + +/* constants definitions */ +/* fmc state */ +typedef enum { + FMC_READY = 0U, /*!< the operation has been completed */ + FMC_BUSY, /*!< the operation is in progress */ + FMC_RDCERR, /*!< CBUS data read protection error */ + FMC_PGSERR, /*!< program sequence error */ + FMC_PGMERR, /*!< program size not match error */ + FMC_PGAERR, /*!< program alignment error */ + FMC_WPERR, /*!< erase/program protection error */ + FMC_OPERR, /*!< operation error */ + FMC_LDECCDET, /*!< two bits ECC error when load code from flash/OTP1/bootloader */ + FMC_TOERR /*!< timeout error */ +} fmc_state_enum; + +/* EFUSE state */ +typedef enum { + EFUSE_READY = 0U, /*!< EFUSE operation has been completed */ + EFUSE_BUSY, /*!< EFUSE operation is in progress */ + EFUSE_OBER, /*!< EFUSE overstep boundary error */ + EFUSE_TOERR /*!< EFUSE timeout error */ +} efuse_state_enum; + +/* function declarations */ +/* FMC main memory programming functions */ +/* unlock the main FMC operation */ +void fmc_unlock(void); +/* lock the main FMC operation */ +void fmc_lock(void); +/* FMC erase page */ +fmc_state_enum fmc_page_erase(uint32_t page_addr); +/* FMC erase sector */ +fmc_state_enum fmc_sector_erase(uint32_t fmc_sector); +/* FMC erase whole chip */ +fmc_state_enum fmc_mass_erase(void); +/* FMC erase whole bank0 */ +fmc_state_enum fmc_bank0_erase(void); +/* FMC erase whole bank1(include bank1_ex) */ +fmc_state_enum fmc_bank1_erase(void); +/* FMC program a double word at the corresponding address */ +fmc_state_enum fmc_doubleword_program(uint32_t address, uint64_t data); +/* FMC program a word at the corresponding address */ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data); +/* FMC program a half word at the corresponding address */ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data); +/* FMC program a byte at the corresponding address */ +fmc_state_enum fmc_byte_program(uint32_t address, uint8_t data); + +/* enable no waitinging time area load after system reset */ +void fmc_nwa_enable(void); +/* disable no waiting time area load after system reset */ +void fmc_nwa_disable(void); +/* set OTP1 data block not be read */ +void otp1_read_disable(uint32_t block); +/* enable read lock block protection for OTP2 */ +void otp2_rlock_enable(void); + +/* FMC option bytes programming functions */ +/* unlock the option byte operation */ +void ob_unlock(void); +/* lock the option byte operation */ +void ob_lock(void); +/* send option byte change command */ +void ob_start(void); +/* erase option byte */ +void ob_erase(void); +/* enable write protect */ +ErrStatus ob_write_protection_enable(uint64_t ob_wp); +/* disable write protect */ +ErrStatus ob_write_protection_disable(uint64_t ob_wp); +/* enable erase/program protection and CBUS read protection */ +void ob_drp_enable(uint64_t ob_drp); +/* disable all erase/program protection and CBUS read protection */ +void ob_drp_disable(void); +/* configure security protection level */ +void ob_security_protection_config(uint8_t ob_spc); +/* program the FMC user option byte */ +void ob_user_write(uint32_t ob_fwdgt, uint32_t ob_deepsleep, uint32_t ob_stdby); +/* program the option byte BOR threshold value */ +void ob_user_bor_threshold(uint32_t ob_bor_th); +/* configure the option byte boot bank value */ +void ob_boot_mode_config(uint32_t boot_mode); +/* configure FMC/SRAM ECC checking, only valid after power reset */ +void ob_ecc_config(uint32_t ecc_config); +/* select no waiting time area, only valid after power reset, only for 4MB dual bank series */ +void ob_nwa_select(uint32_t nwa_select); +/* get the FMC user option byte */ +uint8_t ob_user_get(void); +/* get the FMC option byte write protection of bank0 */ +uint32_t ob_write_protection0_get(void); +/* get the FMC option byte write protection of bank1 */ +uint32_t ob_write_protection1_get(void); +/* get the FMC erase/program protection and CBUS read protection option bytes value of bank0 */ +uint32_t ob_drp0_get(void); +/* get the FMC erase/program protection and CBUS read protection option bytes value of bank1 */ +uint32_t ob_drp1_get(void); +/* get option byte security protection code value */ +FlagStatus ob_spc_get(void); +/* get the FMC option byte BOR threshold value */ +uint32_t ob_user_bor_threshold_get(void); +/* get the boot mode */ +uint32_t ob_boot_mode_get(void); +/* get FMC/SRAM ECC checking */ +uint32_t ob_ecc_get(void); +/* get no waiting time area */ +uint32_t ob_nwa_get(void); + +/* FMC interrupts and flags management functions */ +/* get flag set or reset */ +FlagStatus fmc_flag_get(uint32_t fmc_flag); +/* clear the FMC pending flag */ +void fmc_flag_clear(uint32_t fmc_flag); +/* enable FMC interrupt */ +void fmc_interrupt_enable(uint32_t fmc_int); +/* disable FMC interrupt */ +void fmc_interrupt_disable(uint32_t fmc_int); +/* get FMC interrupt flag set or reset */ +FlagStatus fmc_interrupt_flag_get(uint32_t fmc_int_flag); +/* clear the FMC interrupt flag */ +void fmc_interrupt_flag_clear(uint32_t fmc_int_flag); +/* get the FMC state */ +fmc_state_enum fmc_state_get(void); +/* check whether FMC is ready or not */ +fmc_state_enum fmc_ready_wait(uint32_t timeout); + +/* EFUSE operation functions */ +/* unlock the EFUSE_CTL register */ +void efuse_ctrl_unlock(void); +/* lock the EFUSE_CTL register */ +void efuse_ctrl_lock(void); +/* unlock the EFUSE_USER_DATA register */ +void efuse_user_data_unlock(void); +/* lock the EFUSE_USER_DATA register */ +void efuse_user_data_lock(void); +/* read EFUSE value */ +efuse_state_enum efuse_read(uint32_t ef_addr, uint32_t size, uint32_t buf[]); +/* write EFUSE */ +efuse_state_enum efuse_write(uint32_t ef_addr, uint32_t size, uint8_t ef_data); +/* write efuse control parameter */ +efuse_state_enum efuse_control_write(uint8_t ef_data); +/* write user data parameter */ +efuse_state_enum efuse_user_data_write(uint8_t ef_data); + +/* flag and interrupt functions */ +/* check EFUSE flag is set or not */ +FlagStatus efuse_flag_get(uint32_t efuse_flag); +/* clear EFUSE pending flag */ +void efuse_flag_clear(uint32_t efuse_cflag); +/* enable EFUSE interrupt */ +void efuse_interrupt_enable(uint32_t source); +/* disable EFUSE interrupt */ +void efuse_interrupt_disable(uint32_t source); +/* check EFUSE interrupt flag is set or not */ +FlagStatus efuse_interrupt_flag_get(uint32_t int_flag); +/* clear EFUSE pending interrupt flag */ +void efuse_interrupt_flag_clear(uint32_t int_cflag); +/* check EFUSE operation ready or not */ +efuse_state_enum efuse_ready_wait(uint32_t efuse_flag, uint32_t timeout); + +#endif /* GD32F5XX_FMC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h new file mode 100644 index 00000000000..be3a7accdf9 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h @@ -0,0 +1,118 @@ +/*! + \file gd32f5xx_fwdgt.h + \brief definitions for the FWDGT + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_FWDGT_H +#define GD32F5XX_FWDGT_H + +#include "gd32f5xx.h" + +/* FWDGT definitions */ +#define FWDGT FWDGT_BASE /*!< FWDGT base address */ + +/* registers definitions */ +#define FWDGT_CTL REG32((FWDGT) + 0x00U) /*!< FWDGT control register */ +#define FWDGT_PSC REG32((FWDGT) + 0x04U) /*!< FWDGT prescaler register */ +#define FWDGT_RLD REG32((FWDGT) + 0x08U) /*!< FWDGT reload register */ +#define FWDGT_STAT REG32((FWDGT) + 0x0CU) /*!< FWDGT status register */ + +/* bits definitions */ +/* FWDGT_CTL */ +#define FWDGT_CTL_CMD BITS(0,15) /*!< FWDGT command value */ + +/* FWDGT_PSC */ +#define FWDGT_PSC_PSC BITS(0,3) /*!< FWDGT prescaler divider value */ + +/* FWDGT_RLD */ +#define FWDGT_RLD_RLD BITS(0,11) /*!< FWDGT counter reload value */ + +/* FWDGT_STAT */ +#define FWDGT_STAT_PUD BIT(0) /*!< FWDGT prescaler divider value update */ +#define FWDGT_STAT_RUD BIT(1) /*!< FWDGT counter reload value update */ + +/* constants definitions */ +/* psc register value */ +#define PSC_PSC(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +#define FWDGT_PSC_DIV4 ((uint8_t)PSC_PSC(0)) /*!< FWDGT prescaler set to 4 */ +#define FWDGT_PSC_DIV8 ((uint8_t)PSC_PSC(1)) /*!< FWDGT prescaler set to 8 */ +#define FWDGT_PSC_DIV16 ((uint8_t)PSC_PSC(2)) /*!< FWDGT prescaler set to 16 */ +#define FWDGT_PSC_DIV32 ((uint8_t)PSC_PSC(3)) /*!< FWDGT prescaler set to 32 */ +#define FWDGT_PSC_DIV64 ((uint8_t)PSC_PSC(4)) /*!< FWDGT prescaler set to 64 */ +#define FWDGT_PSC_DIV128 ((uint8_t)PSC_PSC(5)) /*!< FWDGT prescaler set to 128 */ +#define FWDGT_PSC_DIV256 ((uint8_t)PSC_PSC(6)) /*!< FWDGT prescaler set to 256 */ +#define FWDGT_PSC_DIV512 ((uint8_t)PSC_PSC(7)) /*!< FWDGT prescaler set to 512 */ +#define FWDGT_PSC_DIV1024 ((uint8_t)PSC_PSC(8)) /*!< FWDGT prescaler set to 1024 */ +#define FWDGT_PSC_DIV2048 ((uint8_t)PSC_PSC(9)) /*!< FWDGT prescaler set to 2048 */ +#define FWDGT_PSC_DIV4096 ((uint8_t)PSC_PSC(10)) /*!< FWDGT prescaler set to 4096 */ +#define FWDGT_PSC_DIV8192 ((uint8_t)PSC_PSC(11)) /*!< FWDGT prescaler set to 8192 */ +#define FWDGT_PSC_DIV16384 ((uint8_t)PSC_PSC(12)) /*!< FWDGT prescaler set to 16384 */ +#define FWDGT_PSC_DIV32768 ((uint8_t)PSC_PSC(13)) /*!< FWDGT prescaler set to 32768 */ + +/* control value */ +#define FWDGT_WRITEACCESS_ENABLE ((uint16_t)0x5555U) /*!< FWDGT_CTL bits write access enable value */ +#define FWDGT_WRITEACCESS_DISABLE ((uint16_t)0x0000U) /*!< FWDGT_CTL bits write access disable value */ +#define FWDGT_KEY_RELOAD ((uint16_t)0xAAAAU) /*!< FWDGT_CTL bits fwdgt counter reload value */ +#define FWDGT_KEY_ENABLE ((uint16_t)0xCCCCU) /*!< FWDGT_CTL bits fwdgt counter enable value */ + +/* FWDGT timeout value */ +#define FWDGT_PSC_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_PSC register write operation state flag timeout */ +#define FWDGT_RLD_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_RLD register write operation state flag timeout */ + +/* FWDGT flag definitions */ +#define FWDGT_FLAG_PUD FWDGT_STAT_PUD /*!< FWDGT prescaler divider value update flag */ +#define FWDGT_FLAG_RUD FWDGT_STAT_RUD /*!< FWDGT counter reload value update flag */ + +/* write value to FWDGT_RLD_RLD bit field */ +#define RLD_RLD(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) + +/* function declarations */ +/* enable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_enable(void); +/* disable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_disable(void); +/* start the free watchdog timer counter */ +void fwdgt_enable(void); + +/* configure the free watchdog timer counter prescaler value */ +ErrStatus fwdgt_prescaler_value_config(uint16_t prescaler_value); +/* configure the free watchdog timer counter reload value */ +ErrStatus fwdgt_reload_value_config(uint16_t reload_value); +/* reload the counter of FWDGT */ +void fwdgt_counter_reload(void); +/* configure counter reload value, and prescaler divider value */ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div); + +/* get flag state of FWDGT */ +FlagStatus fwdgt_flag_get(uint16_t flag); + +#endif /* GD32F5XX_FWDGT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h new file mode 100644 index 00000000000..5325912526e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h @@ -0,0 +1,406 @@ +/*! + \file gd32f5xx_gpio.h + \brief definitions for the GPIO + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_GPIO_H +#define GD32F5XX_GPIO_H + +#include "gd32f5xx.h" + +/* GPIOx(x=A,B,C,D,E,F,G,H,I) definitions */ +#define GPIOA (GPIO_BASE + 0x00000000U) /*!< GPIOA base address */ +#define GPIOB (GPIO_BASE + 0x00000400U) /*!< GPIOB base address */ +#define GPIOC (GPIO_BASE + 0x00000800U) /*!< GPIOC base address */ +#define GPIOD (GPIO_BASE + 0x00000C00U) /*!< GPIOD base address */ +#define GPIOE (GPIO_BASE + 0x00001000U) /*!< GPIOE base address */ +#define GPIOF (GPIO_BASE + 0x00001400U) /*!< GPIOF base address */ +#define GPIOG (GPIO_BASE + 0x00001800U) /*!< GPIOG base address */ +#define GPIOH (GPIO_BASE + 0x00001C00U) /*!< GPIOH base address */ +#define GPIOI (GPIO_BASE + 0x00002000U) /*!< GPIOI base address */ + +/* registers definitions */ +#define GPIO_CTL(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register */ +#define GPIO_OMODE(gpiox) REG32((gpiox) + 0x04U) /*!< GPIO port output mode register */ +#define GPIO_OSPD(gpiox) REG32((gpiox) + 0x08U) /*!< GPIO port output speed register */ +#define GPIO_PUD(gpiox) REG32((gpiox) + 0x0CU) /*!< GPIO port pull-up/pull-down register */ +#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port input status register */ +#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO port output control register */ +#define GPIO_BOP(gpiox) REG32((gpiox) + 0x18U) /*!< GPIO port bit operate register */ +#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x1CU) /*!< GPIO port configuration lock register */ +#define GPIO_AFSEL0(gpiox) REG32((gpiox) + 0x20U) /*!< GPIO alternate function selected register 0 */ +#define GPIO_AFSEL1(gpiox) REG32((gpiox) + 0x24U) /*!< GPIO alternate function selected register 1 */ +#define GPIO_BC(gpiox) REG32((gpiox) + 0x28U) /*!< GPIO bit clear register */ +#define GPIO_TG(gpiox) REG32((gpiox) + 0x2CU) /*!< GPIO port bit toggle register */ + +/* bits definitions */ +/* GPIO_CTL */ +#define GPIO_CTL_CTL0 BITS(0,1) /*!< pin 0 configuration bits */ +#define GPIO_CTL_CTL1 BITS(2,3) /*!< pin 1 configuration bits */ +#define GPIO_CTL_CTL2 BITS(4,5) /*!< pin 2 configuration bits */ +#define GPIO_CTL_CTL3 BITS(6,7) /*!< pin 3 configuration bits */ +#define GPIO_CTL_CTL4 BITS(8,9) /*!< pin 4 configuration bits */ +#define GPIO_CTL_CTL5 BITS(10,11) /*!< pin 5 configuration bits */ +#define GPIO_CTL_CTL6 BITS(12,13) /*!< pin 6 configuration bits */ +#define GPIO_CTL_CTL7 BITS(14,15) /*!< pin 7 configuration bits */ +#define GPIO_CTL_CTL8 BITS(16,17) /*!< pin 8 configuration bits */ +#define GPIO_CTL_CTL9 BITS(18,19) /*!< pin 9 configuration bits */ +#define GPIO_CTL_CTL10 BITS(20,21) /*!< pin 10 configuration bits */ +#define GPIO_CTL_CTL11 BITS(22,23) /*!< pin 11 configuration bits */ +#define GPIO_CTL_CTL12 BITS(24,25) /*!< pin 12 configuration bits */ +#define GPIO_CTL_CTL13 BITS(26,27) /*!< pin 13 configuration bits */ +#define GPIO_CTL_CTL14 BITS(28,29) /*!< pin 14 configuration bits */ +#define GPIO_CTL_CTL15 BITS(30,31) /*!< pin 15 configuration bits */ + +/* GPIO_OMODE */ +#define GPIO_OMODE_OM0 BIT(0) /*!< pin 0 output mode bit */ +#define GPIO_OMODE_OM1 BIT(1) /*!< pin 1 output mode bit */ +#define GPIO_OMODE_OM2 BIT(2) /*!< pin 2 output mode bit */ +#define GPIO_OMODE_OM3 BIT(3) /*!< pin 3 output mode bit */ +#define GPIO_OMODE_OM4 BIT(4) /*!< pin 4 output mode bit */ +#define GPIO_OMODE_OM5 BIT(5) /*!< pin 5 output mode bit */ +#define GPIO_OMODE_OM6 BIT(6) /*!< pin 6 output mode bit */ +#define GPIO_OMODE_OM7 BIT(7) /*!< pin 7 output mode bit */ +#define GPIO_OMODE_OM8 BIT(8) /*!< pin 8 output mode bit */ +#define GPIO_OMODE_OM9 BIT(9) /*!< pin 9 output mode bit */ +#define GPIO_OMODE_OM10 BIT(10) /*!< pin 10 output mode bit */ +#define GPIO_OMODE_OM11 BIT(11) /*!< pin 11 output mode bit */ +#define GPIO_OMODE_OM12 BIT(12) /*!< pin 12 output mode bit */ +#define GPIO_OMODE_OM13 BIT(13) /*!< pin 13 output mode bit */ +#define GPIO_OMODE_OM14 BIT(14) /*!< pin 14 output mode bit */ +#define GPIO_OMODE_OM15 BIT(15) /*!< pin 15 output mode bit */ + +/* GPIO_OSPD */ +#define GPIO_OSPD_OSPD0 BITS(0,1) /*!< pin 0 output max speed bits */ +#define GPIO_OSPD_OSPD1 BITS(2,3) /*!< pin 1 output max speed bits */ +#define GPIO_OSPD_OSPD2 BITS(4,5) /*!< pin 2 output max speed bits */ +#define GPIO_OSPD_OSPD3 BITS(6,7) /*!< pin 3 output max speed bits */ +#define GPIO_OSPD_OSPD4 BITS(8,9) /*!< pin 4 output max speed bits */ +#define GPIO_OSPD_OSPD5 BITS(10,11) /*!< pin 5 output max speed bits */ +#define GPIO_OSPD_OSPD6 BITS(12,13) /*!< pin 6 output max speed bits */ +#define GPIO_OSPD_OSPD7 BITS(14,15) /*!< pin 7 output max speed bits */ +#define GPIO_OSPD_OSPD8 BITS(16,17) /*!< pin 8 output max speed bits */ +#define GPIO_OSPD_OSPD9 BITS(18,19) /*!< pin 9 output max speed bits */ +#define GPIO_OSPD_OSPD10 BITS(20,21) /*!< pin 10 output max speed bits */ +#define GPIO_OSPD_OSPD11 BITS(22,23) /*!< pin 11 output max speed bits */ +#define GPIO_OSPD_OSPD12 BITS(24,25) /*!< pin 12 output max speed bits */ +#define GPIO_OSPD_OSPD13 BITS(26,27) /*!< pin 13 output max speed bits */ +#define GPIO_OSPD_OSPD14 BITS(28,29) /*!< pin 14 output max speed bits */ +#define GPIO_OSPD_OSPD15 BITS(30,31) /*!< pin 15 output max speed bits */ + +/* GPIO_PUD */ +#define GPIO_PUD_PUD0 BITS(0,1) /*!< pin 0 pull-up or pull-down bits */ +#define GPIO_PUD_PUD1 BITS(2,3) /*!< pin 1 pull-up or pull-down bits */ +#define GPIO_PUD_PUD2 BITS(4,5) /*!< pin 2 pull-up or pull-down bits */ +#define GPIO_PUD_PUD3 BITS(6,7) /*!< pin 3 pull-up or pull-down bits */ +#define GPIO_PUD_PUD4 BITS(8,9) /*!< pin 4 pull-up or pull-down bits */ +#define GPIO_PUD_PUD5 BITS(10,11) /*!< pin 5 pull-up or pull-down bits */ +#define GPIO_PUD_PUD6 BITS(12,13) /*!< pin 6 pull-up or pull-down bits */ +#define GPIO_PUD_PUD7 BITS(14,15) /*!< pin 7 pull-up or pull-down bits */ +#define GPIO_PUD_PUD8 BITS(16,17) /*!< pin 8 pull-up or pull-down bits */ +#define GPIO_PUD_PUD9 BITS(18,19) /*!< pin 9 pull-up or pull-down bits */ +#define GPIO_PUD_PUD10 BITS(20,21) /*!< pin 10 pull-up or pull-down bits */ +#define GPIO_PUD_PUD11 BITS(22,23) /*!< pin 11 pull-up or pull-down bits */ +#define GPIO_PUD_PUD12 BITS(24,25) /*!< pin 12 pull-up or pull-down bits */ +#define GPIO_PUD_PUD13 BITS(26,27) /*!< pin 13 pull-up or pull-down bits */ +#define GPIO_PUD_PUD14 BITS(28,29) /*!< pin 14 pull-up or pull-down bits */ +#define GPIO_PUD_PUD15 BITS(30,31) /*!< pin 15 pull-up or pull-down bits */ + +/* GPIO_ISTAT */ +#define GPIO_ISTAT_ISTAT0 BIT(0) /*!< pin 0 input status */ +#define GPIO_ISTAT_ISTAT1 BIT(1) /*!< pin 1 input status */ +#define GPIO_ISTAT_ISTAT2 BIT(2) /*!< pin 2 input status */ +#define GPIO_ISTAT_ISTAT3 BIT(3) /*!< pin 3 input status */ +#define GPIO_ISTAT_ISTAT4 BIT(4) /*!< pin 4 input status */ +#define GPIO_ISTAT_ISTAT5 BIT(5) /*!< pin 5 input status */ +#define GPIO_ISTAT_ISTAT6 BIT(6) /*!< pin 6 input status */ +#define GPIO_ISTAT_ISTAT7 BIT(7) /*!< pin 7 input status */ +#define GPIO_ISTAT_ISTAT8 BIT(8) /*!< pin 8 input status */ +#define GPIO_ISTAT_ISTAT9 BIT(9) /*!< pin 9 input status */ +#define GPIO_ISTAT_ISTAT10 BIT(10) /*!< pin 10 input status */ +#define GPIO_ISTAT_ISTAT11 BIT(11) /*!< pin 11 input status */ +#define GPIO_ISTAT_ISTAT12 BIT(12) /*!< pin 12 input status */ +#define GPIO_ISTAT_ISTAT13 BIT(13) /*!< pin 13 input status */ +#define GPIO_ISTAT_ISTAT14 BIT(14) /*!< pin 14 input status */ +#define GPIO_ISTAT_ISTAT15 BIT(15) /*!< pin 15 input status */ + +/* GPIO_OCTL */ +#define GPIO_OCTL_OCTL0 BIT(0) /*!< pin 0 output control bit */ +#define GPIO_OCTL_OCTL1 BIT(1) /*!< pin 1 output control bit */ +#define GPIO_OCTL_OCTL2 BIT(2) /*!< pin 2 output control bit */ +#define GPIO_OCTL_OCTL3 BIT(3) /*!< pin 3 output control bit */ +#define GPIO_OCTL_OCTL4 BIT(4) /*!< pin 4 output control bit */ +#define GPIO_OCTL_OCTL5 BIT(5) /*!< pin 5 output control bit */ +#define GPIO_OCTL_OCTL6 BIT(6) /*!< pin 6 output control bit */ +#define GPIO_OCTL_OCTL7 BIT(7) /*!< pin 7 output control bit */ +#define GPIO_OCTL_OCTL8 BIT(8) /*!< pin 8 output control bit */ +#define GPIO_OCTL_OCTL9 BIT(9) /*!< pin 9 output control bit */ +#define GPIO_OCTL_OCTL10 BIT(10) /*!< pin 10 output control bit */ +#define GPIO_OCTL_OCTL11 BIT(11) /*!< pin 11 output control bit */ +#define GPIO_OCTL_OCTL12 BIT(12) /*!< pin 12 output control bit */ +#define GPIO_OCTL_OCTL13 BIT(13) /*!< pin 13 output control bit */ +#define GPIO_OCTL_OCTL14 BIT(14) /*!< pin 14 output control bit */ +#define GPIO_OCTL_OCTL15 BIT(15) /*!< pin 15 output control bit */ + +/* GPIO_BOP */ +#define GPIO_BOP_BOP0 BIT(0) /*!< pin 0 set bit */ +#define GPIO_BOP_BOP1 BIT(1) /*!< pin 1 set bit */ +#define GPIO_BOP_BOP2 BIT(2) /*!< pin 2 set bit */ +#define GPIO_BOP_BOP3 BIT(3) /*!< pin 3 set bit */ +#define GPIO_BOP_BOP4 BIT(4) /*!< pin 4 set bit */ +#define GPIO_BOP_BOP5 BIT(5) /*!< pin 5 set bit */ +#define GPIO_BOP_BOP6 BIT(6) /*!< pin 6 set bit */ +#define GPIO_BOP_BOP7 BIT(7) /*!< pin 7 set bit */ +#define GPIO_BOP_BOP8 BIT(8) /*!< pin 8 set bit */ +#define GPIO_BOP_BOP9 BIT(9) /*!< pin 9 set bit */ +#define GPIO_BOP_BOP10 BIT(10) /*!< pin 10 set bit */ +#define GPIO_BOP_BOP11 BIT(11) /*!< pin 11 set bit */ +#define GPIO_BOP_BOP12 BIT(12) /*!< pin 12 set bit */ +#define GPIO_BOP_BOP13 BIT(13) /*!< pin 13 set bit */ +#define GPIO_BOP_BOP14 BIT(14) /*!< pin 14 set bit */ +#define GPIO_BOP_BOP15 BIT(15) /*!< pin 15 set bit */ +#define GPIO_BOP_CR0 BIT(16) /*!< pin 0 clear bit */ +#define GPIO_BOP_CR1 BIT(17) /*!< pin 1 clear bit */ +#define GPIO_BOP_CR2 BIT(18) /*!< pin 2 clear bit */ +#define GPIO_BOP_CR3 BIT(19) /*!< pin 3 clear bit */ +#define GPIO_BOP_CR4 BIT(20) /*!< pin 4 clear bit */ +#define GPIO_BOP_CR5 BIT(21) /*!< pin 5 clear bit */ +#define GPIO_BOP_CR6 BIT(22) /*!< pin 6 clear bit */ +#define GPIO_BOP_CR7 BIT(23) /*!< pin 7 clear bit */ +#define GPIO_BOP_CR8 BIT(24) /*!< pin 8 clear bit */ +#define GPIO_BOP_CR9 BIT(25) /*!< pin 9 clear bit */ +#define GPIO_BOP_CR10 BIT(26) /*!< pin 10 clear bit */ +#define GPIO_BOP_CR11 BIT(27) /*!< pin 11 clear bit */ +#define GPIO_BOP_CR12 BIT(28) /*!< pin 12 clear bit */ +#define GPIO_BOP_CR13 BIT(29) /*!< pin 13 clear bit */ +#define GPIO_BOP_CR14 BIT(30) /*!< pin 14 clear bit */ +#define GPIO_BOP_CR15 BIT(31) /*!< pin 15 clear bit */ + +/* GPIO_LOCK */ +#define GPIO_LOCK_LK0 BIT(0) /*!< pin 0 lock bit */ +#define GPIO_LOCK_LK1 BIT(1) /*!< pin 1 lock bit */ +#define GPIO_LOCK_LK2 BIT(2) /*!< pin 2 lock bit */ +#define GPIO_LOCK_LK3 BIT(3) /*!< pin 3 lock bit */ +#define GPIO_LOCK_LK4 BIT(4) /*!< pin 4 lock bit */ +#define GPIO_LOCK_LK5 BIT(5) /*!< pin 5 lock bit */ +#define GPIO_LOCK_LK6 BIT(6) /*!< pin 6 lock bit */ +#define GPIO_LOCK_LK7 BIT(7) /*!< pin 7 lock bit */ +#define GPIO_LOCK_LK8 BIT(8) /*!< pin 8 lock bit */ +#define GPIO_LOCK_LK9 BIT(9) /*!< pin 9 lock bit */ +#define GPIO_LOCK_LK10 BIT(10) /*!< pin 10 lock bit */ +#define GPIO_LOCK_LK11 BIT(11) /*!< pin 11 lock bit */ +#define GPIO_LOCK_LK12 BIT(12) /*!< pin 12 lock bit */ +#define GPIO_LOCK_LK13 BIT(13) /*!< pin 13 lock bit */ +#define GPIO_LOCK_LK14 BIT(14) /*!< pin 14 lock bit */ +#define GPIO_LOCK_LK15 BIT(15) /*!< pin 15 lock bit */ +#define GPIO_LOCK_LKK BIT(16) /*!< pin lock sequence key */ + +/* GPIO_AFSEL0 */ +#define GPIO_AFSEL0_SEL0 BITS(0,3) /*!< pin 0 alternate function selected */ +#define GPIO_AFSEL0_SEL1 BITS(4,7) /*!< pin 1 alternate function selected */ +#define GPIO_AFSEL0_SEL2 BITS(8,11) /*!< pin 2 alternate function selected */ +#define GPIO_AFSEL0_SEL3 BITS(12,15) /*!< pin 3 alternate function selected */ +#define GPIO_AFSEL0_SEL4 BITS(16,19) /*!< pin 4 alternate function selected */ +#define GPIO_AFSEL0_SEL5 BITS(20,23) /*!< pin 5 alternate function selected */ +#define GPIO_AFSEL0_SEL6 BITS(24,27) /*!< pin 6 alternate function selected */ +#define GPIO_AFSEL0_SEL7 BITS(28,31) /*!< pin 7 alternate function selected */ + +/* GPIO_AFSEL1 */ +#define GPIO_AFSEL1_SEL8 BITS(0,3) /*!< pin 8 alternate function selected */ +#define GPIO_AFSEL1_SEL9 BITS(4,7) /*!< pin 9 alternate function selected */ +#define GPIO_AFSEL1_SEL10 BITS(8,11) /*!< pin 10 alternate function selected */ +#define GPIO_AFSEL1_SEL11 BITS(12,15) /*!< pin 11 alternate function selected */ +#define GPIO_AFSEL1_SEL12 BITS(16,19) /*!< pin 12 alternate function selected */ +#define GPIO_AFSEL1_SEL13 BITS(20,23) /*!< pin 13 alternate function selected */ +#define GPIO_AFSEL1_SEL14 BITS(24,27) /*!< pin 14 alternate function selected */ +#define GPIO_AFSEL1_SEL15 BITS(28,31) /*!< pin 15 alternate function selected */ + +/* GPIO_BC */ +#define GPIO_BC_CR0 BIT(0) /*!< pin 0 clear bit */ +#define GPIO_BC_CR1 BIT(1) /*!< pin 1 clear bit */ +#define GPIO_BC_CR2 BIT(2) /*!< pin 2 clear bit */ +#define GPIO_BC_CR3 BIT(3) /*!< pin 3 clear bit */ +#define GPIO_BC_CR4 BIT(4) /*!< pin 4 clear bit */ +#define GPIO_BC_CR5 BIT(5) /*!< pin 5 clear bit */ +#define GPIO_BC_CR6 BIT(6) /*!< pin 6 clear bit */ +#define GPIO_BC_CR7 BIT(7) /*!< pin 7 clear bit */ +#define GPIO_BC_CR8 BIT(8) /*!< pin 8 clear bit */ +#define GPIO_BC_CR9 BIT(9) /*!< pin 9 clear bit */ +#define GPIO_BC_CR10 BIT(10) /*!< pin 10 clear bit */ +#define GPIO_BC_CR11 BIT(11) /*!< pin 11 clear bit */ +#define GPIO_BC_CR12 BIT(12) /*!< pin 12 clear bit */ +#define GPIO_BC_CR13 BIT(13) /*!< pin 13 clear bit */ +#define GPIO_BC_CR14 BIT(14) /*!< pin 14 clear bit */ +#define GPIO_BC_CR15 BIT(15) /*!< pin 15 clear bit */ + +/* GPIO_TG */ +#define GPIO_TG_TG0 BIT(0) /*!< pin 0 toggle bit */ +#define GPIO_TG_TG1 BIT(1) /*!< pin 1 toggle bit */ +#define GPIO_TG_TG2 BIT(2) /*!< pin 2 toggle bit */ +#define GPIO_TG_TG3 BIT(3) /*!< pin 3 toggle bit */ +#define GPIO_TG_TG4 BIT(4) /*!< pin 4 toggle bit */ +#define GPIO_TG_TG5 BIT(5) /*!< pin 5 toggle bit */ +#define GPIO_TG_TG6 BIT(6) /*!< pin 6 toggle bit */ +#define GPIO_TG_TG7 BIT(7) /*!< pin 7 toggle bit */ +#define GPIO_TG_TG8 BIT(8) /*!< pin 8 toggle bit */ +#define GPIO_TG_TG9 BIT(9) /*!< pin 9 toggle bit */ +#define GPIO_TG_TG10 BIT(10) /*!< pin 10 toggle bit */ +#define GPIO_TG_TG11 BIT(11) /*!< pin 11 toggle bit */ +#define GPIO_TG_TG12 BIT(12) /*!< pin 12 toggle bit */ +#define GPIO_TG_TG13 BIT(13) /*!< pin 13 toggle bit */ +#define GPIO_TG_TG14 BIT(14) /*!< pin 14 toggle bit */ +#define GPIO_TG_TG15 BIT(15) /*!< pin 15 toggle bit */ + +/* constants definitions */ +typedef FlagStatus bit_status; + +/* output mode definitions */ +#define CTL_CLTR(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define GPIO_MODE_INPUT CTL_CLTR(0) /*!< input mode */ +#define GPIO_MODE_OUTPUT CTL_CLTR(1) /*!< output mode */ +#define GPIO_MODE_AF CTL_CLTR(2) /*!< alternate function mode */ +#define GPIO_MODE_ANALOG CTL_CLTR(3) /*!< analog mode */ + +/* pull-up/ pull-down definitions */ +#define PUD_PUPD(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define GPIO_PUPD_NONE PUD_PUPD(0) /*!< floating mode, no pull-up and pull-down resistors */ +#define GPIO_PUPD_PULLUP PUD_PUPD(1) /*!< with pull-up resistor */ +#define GPIO_PUPD_PULLDOWN PUD_PUPD(2) /*!< with pull-down resistor */ + +/* GPIO pin definitions */ +#define GPIO_PIN_0 BIT(0) /*!< GPIO pin 0 */ +#define GPIO_PIN_1 BIT(1) /*!< GPIO pin 1 */ +#define GPIO_PIN_2 BIT(2) /*!< GPIO pin 2 */ +#define GPIO_PIN_3 BIT(3) /*!< GPIO pin 3 */ +#define GPIO_PIN_4 BIT(4) /*!< GPIO pin 4 */ +#define GPIO_PIN_5 BIT(5) /*!< GPIO pin 5 */ +#define GPIO_PIN_6 BIT(6) /*!< GPIO pin 6 */ +#define GPIO_PIN_7 BIT(7) /*!< GPIO pin 7 */ +#define GPIO_PIN_8 BIT(8) /*!< GPIO pin 8 */ +#define GPIO_PIN_9 BIT(9) /*!< GPIO pin 9 */ +#define GPIO_PIN_10 BIT(10) /*!< GPIO pin 10 */ +#define GPIO_PIN_11 BIT(11) /*!< GPIO pin 11 */ +#define GPIO_PIN_12 BIT(12) /*!< GPIO pin 12 */ +#define GPIO_PIN_13 BIT(13) /*!< GPIO pin 13 */ +#define GPIO_PIN_14 BIT(14) /*!< GPIO pin 14 */ +#define GPIO_PIN_15 BIT(15) /*!< GPIO pin 15 */ +#define GPIO_PIN_ALL BITS(0,15) /*!< GPIO pin all */ + +/* GPIO mode configuration values */ +#define GPIO_MODE_SET(n, mode) ((uint32_t)((uint32_t)(mode) << (2U * (n)))) +#define GPIO_MODE_MASK(n) (0x3U << (2U * (n))) + +/* GPIO pull-up/ pull-down values */ +#define GPIO_PUPD_SET(n, pupd) ((uint32_t)((uint32_t)(pupd) << (2U * (n)))) +#define GPIO_PUPD_MASK(n) (0x3U << (2U * (n))) + +/* GPIO output speed values */ +#define GPIO_OSPEED_SET(n, speed) ((uint32_t)((uint32_t)(speed) << (2U * (n)))) +#define GPIO_OSPEED_MASK(n) (0x3U << (2U * (n))) + +/* GPIO output type */ +#define GPIO_OTYPE_PP ((uint8_t)(0x00U)) /*!< push pull mode */ +#define GPIO_OTYPE_OD ((uint8_t)(0x01U)) /*!< open drain mode */ + +/* GPIO output max speed level */ +#define OSPD_OSPD(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define GPIO_OSPEED_LEVEL0 OSPD_OSPD(0) /*!< output max speed level 0 */ +#define GPIO_OSPEED_LEVEL1 OSPD_OSPD(1) /*!< output max speed level 1 */ +#define GPIO_OSPEED_LEVEL2 OSPD_OSPD(2) /*!< output max speed level 2 */ +#define GPIO_OSPEED_LEVEL3 OSPD_OSPD(3) /*!< output max speed level 3 */ + +/* GPIO output max speed value */ +#define GPIO_OSPEED_2MHZ GPIO_OSPEED_LEVEL0 /*!< output max speed 2MHz */ +#define GPIO_OSPEED_10MHZ GPIO_OSPEED_LEVEL1 /*!< output max speed 10MHz */ +#define GPIO_OSPEED_50MHZ GPIO_OSPEED_LEVEL2 /*!< output max speed 50MHz */ +#define GPIO_OSPEED_MAX GPIO_OSPEED_LEVEL3 /*!< GPIO very high output speed, max speed more than 50MHz */ + +/* GPIO alternate function values */ +#define GPIO_AFR_SET(n, af) ((uint32_t)((uint32_t)(af) << (4U * (n)))) +#define GPIO_AFR_MASK(n) (0xFU << (4U * (n))) + +/* GPIO alternate function */ +#define AF(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +#define GPIO_AF_0 AF(0) /*!< alternate function 0 selected */ +#define GPIO_AF_1 AF(1) /*!< alternate function 1 selected */ +#define GPIO_AF_2 AF(2) /*!< alternate function 2 selected */ +#define GPIO_AF_3 AF(3) /*!< alternate function 3 selected */ +#define GPIO_AF_4 AF(4) /*!< alternate function 4 selected */ +#define GPIO_AF_5 AF(5) /*!< alternate function 5 selected */ +#define GPIO_AF_6 AF(6) /*!< alternate function 6 selected */ +#define GPIO_AF_7 AF(7) /*!< alternate function 7 selected */ +#define GPIO_AF_8 AF(8) /*!< alternate function 8 selected */ +#define GPIO_AF_9 AF(9) /*!< alternate function 9 selected */ +#define GPIO_AF_10 AF(10) /*!< alternate function 10 selected */ +#define GPIO_AF_11 AF(11) /*!< alternate function 11 selected */ +#define GPIO_AF_12 AF(12) /*!< alternate function 12 selected */ +#define GPIO_AF_13 AF(13) /*!< alternate function 13 selected */ +#define GPIO_AF_14 AF(14) /*!< alternate function 14 selected */ +#define GPIO_AF_15 AF(15) /*!< alternate function 15 selected */ + +/* function declarations */ +/* reset GPIO port */ +void gpio_deinit(uint32_t gpio_periph); +/* set GPIO mode */ +void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin); +/* set GPIO output type and speed */ +void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin); + +/* set GPIO pin bit */ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); +/* reset GPIO pin bit */ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin); +/* write data to the specified GPIO pin */ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); +/* write data to the specified GPIO port */ +void gpio_port_write(uint32_t gpio_periph, uint16_t data); + +/* get GPIO pin input status */ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port input status */ +uint16_t gpio_input_port_get(uint32_t gpio_periph); +/* get GPIO pin output status */ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port output status */ +uint16_t gpio_output_port_get(uint32_t gpio_periph); + +/* set GPIO alternate function */ +void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin); +/* lock GPIO pin bit */ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin); + +/* toggle GPIO pin status */ +void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin); +/* toggle GPIO port status */ +void gpio_port_toggle(uint32_t gpio_periph); + +#endif /* GD32F5XX_GPIO_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h new file mode 100644 index 00000000000..651b280bd14 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h @@ -0,0 +1,223 @@ +/*! + \file gd32f5xx_hau.h + \brief definitions for the HAU + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_HAU_H +#define GD32F5XX_HAU_H + +#include "gd32f5xx.h" + +/* HAU definitions */ +#define HAU HAU_BASE /*!< HAU base address */ + +/* registers definitions */ +#define HAU_CTL REG32(HAU + 0x00000000U) /*!< control register */ +#define HAU_DI REG32(HAU + 0x00000004U) /*!< data input register */ +#define HAU_CFG REG32(HAU + 0x00000008U) /*!< configuration register */ +#define HAU_DO0 REG32(HAU + 0x0000000CU) /*!< data output register 0 */ +#define HAU_DO1 REG32(HAU + 0x00000010U) /*!< data output register 1 */ +#define HAU_DO2 REG32(HAU + 0x00000014U) /*!< data output register 2 */ +#define HAU_DO3 REG32(HAU + 0x00000018U) /*!< data output register 3 */ +#define HAU_DO4 REG32(HAU + 0x0000001CU) /*!< data output register 4 */ +#define HAU_DO5 REG32(HAU + 0x00000324U) /*!< data output register 5 */ +#define HAU_DO6 REG32(HAU + 0x00000328U) /*!< data output register 6 */ +#define HAU_DO7 REG32(HAU + 0x0000032CU) /*!< data output register 7 */ +#define HAU_INTEN REG32(HAU + 0x00000020U) /*!< interrupt enable register */ +#define HAU_STAT REG32(HAU + 0x00000024U) /*!< status and interrupt flag register */ +#define HAU_CTXS(regval) REG32(HAU + 0x000000F8U + 0x04U * (regval)) /*!< context switch register, regval<=53 */ + +/* bits definitions */ +/* HAU_CTL */ +#define HAU_CTL_START BIT(2) /*!< set to 1 to reset the HAU processor core, so that it is ready to start the digest calculation */ +#define HAU_CTL_DMAE BIT(3) /*!< DMA enable */ +#define HAU_CTL_DATAM BITS(4,5) /*!< data type mode */ +#define HAU_CTL_HMS BIT(6) /*!< HAU mode selection */ +#define HAU_CTL_ALGM_0 BIT(7) /*!< algorithm selection bit 0 */ +#define HAU_CTL_NWIF BITS(8,11) /*!< number of words in the input FIFO */ +#define HAU_CTL_DINE BIT(12) /*!< DI register not empty */ +#define HAU_CTL_MDS BIT(13) /*!< multiple DMA selection */ +#define HAU_CTL_KLM BIT(16) /*!< key length mode */ +#define HAU_CTL_ALGM_1 BIT(18) /*!< algorithm selection bit 1 */ + +/* HAU_DI */ +#define HAU_DI_DI BITS(0,31) /*!< message data input */ + +/* HAU_CFG */ +#define HAU_CFG_VBL BITS(0,4) /*!< valid bits length in the last word */ +#define HAU_CFG_CALEN BIT(8) /*!< digest calculation enable */ + +/* HAU_DOx x=0..7 */ +#define HAU_DOX_DOX BITS(0,31) /*!< message digest result of hash algorithm */ + +/* HAU_INTEN */ +#define HAU_INTEN_DIIE BIT(0) /*!< data input interrupt enable */ +#define HAU_INTEN_CCIE BIT(1) /*!< calculation completion interrupt enable */ + +/* HAU_STAT */ +#define HAU_STAT_DIF BIT(0) /*!< data input interrupt flag */ +#define HAU_STAT_CCF BIT(1) /*!< digest calculation completion interrupt flag */ +#define HAU_STAT_DMAS BIT(2) /*!< DMA status */ +#define HAU_STAT_BUSY BIT(3) /*!< busy bit */ + +/* constants definitions */ +/* structure for initialization of the hau */ +typedef struct +{ + uint32_t algo; /*!< algorithm selection */ + uint32_t mode; /*!< HAU mode selection */ + uint32_t datatype; /*!< data type mode */ + uint32_t keytype; /*!< key length mode */ +}hau_init_parameter_struct; + +/* structure for message digest result of the hau */ +typedef struct +{ + uint32_t out[8]; /*!< message digest result 0-7 */ +}hau_digest_parameter_struct; + +/* structure for context switch */ +typedef struct +{ + uint32_t hau_ctl_bak; /*!< backup of HAU_CTL register */ + uint32_t hau_cfg_bak; /*!< backup of HAU_CFG register */ + uint32_t hau_inten_bak; /*!< backup of HAU_INTEN register */ + uint32_t hau_ctxs_bak[54];/*!< backup of HAU_CTXSx registers */ +}hau_context_parameter_struct; + +/* hau_ctl register value */ +#define HAU_ALGO_SHA1 ((uint32_t)0x00000000U) /*!< HAU function is SHA1 */ +#define HAU_ALGO_SHA224 HAU_CTL_ALGM_1 /*!< HAU function is SHA224 */ +#define HAU_ALGO_SHA256 (HAU_CTL_ALGM_1 | HAU_CTL_ALGM_0) /*!< HAU function is SHA256 */ +#define HAU_ALGO_MD5 HAU_CTL_ALGM_0 /*!< HAU function is MD5 */ + +#define HAU_MODE_HASH ((uint32_t)0x00000000U) /*!< HAU mode is HASH */ +#define HAU_MODE_HMAC HAU_CTL_HMS /*!< HAU mode is HMAC */ + +#define CTL_DATAM_1(regval) (BITS(4,5) & ((uint32_t)(regval) << 4U)) /*!< write value to HAU_CTL_DATAM bit field */ +#define HAU_SWAPPING_32BIT CTL_DATAM_1(0) /*!< no swapping */ +#define HAU_SWAPPING_16BIT CTL_DATAM_1(1) /*!< half-word swapping */ +#define HAU_SWAPPING_8BIT CTL_DATAM_1(2) /*!< bytes swapping */ +#define HAU_SWAPPING_1BIT CTL_DATAM_1(3) /*!< bit swapping */ + +#define HAU_KEY_SHORTER_64 ((uint32_t)0x00000000U) /*!< HMAC key is <= 64 bytes */ +#define HAU_KEY_LONGGER_64 HAU_CTL_KLM /*!< HMAC key is > 64 bytes */ + +#define GET_CTL_NWIF(regval) GET_BITS((regval),8,11) /*!< get value of HAU_CTL_NWIF bit field */ + +#define SINGLE_DMA_AUTO_DIGEST ((uint32_t)0x00000000U) /*!< message padding and message digest calculation at the end of a DMA transfer */ +#define MULTIPLE_DMA_NO_DIGEST HAU_CTL_MDS /*!< multiple DMA transfers needed and CALEN bit is not automatically set at the end of a DMA transfer */ + +/* hau_cfg register value */ +#define CFG_VBL(regval) (BITS(0,4) & ((regval) << 0U)) /*!< write value to HAU_CFG_VBL bit field */ + +/* hau_inten register value */ +#define HAU_INT_DATA_INPUT HAU_INTEN_DIIE /*!< a new block can be entered into the IN buffer */ +#define HAU_INT_CALCULATION_COMPLETE HAU_INTEN_CCIE /*!< calculation complete */ + +#define HAU_FLAG_DATA_INPUT HAU_STAT_DIF /*!< there is enough space (16 bytes) in the input FIFO */ +#define HAU_FLAG_CALCULATION_COMPLETE HAU_STAT_CCF /*!< digest calculation is completed */ +#define HAU_FLAG_DMA HAU_STAT_DMAS /*!< DMA is enabled (DMAE =1) or a transfer is processing */ +#define HAU_FLAG_BUSY HAU_STAT_BUSY /*!< data block is in process */ +#define HAU_FLAG_INFIFO_NO_EMPTY HAU_CTL_DINE /*!< the input FIFO is not empty */ + +#define HAU_INT_FLAG_DATA_INPUT HAU_STAT_DIF /*!< there is enough space (16 bytes) in the input FIFO */ +#define HAU_INT_FLAG_CALCULATION_COMPLETE HAU_STAT_CCF /*!< digest calculation is completed */ + +/* function declarations */ +/* initialization functions */ +/* reset the HAU peripheral */ +void hau_deinit(void); +/* initialize the HAU peripheral parameters */ +void hau_init(hau_init_parameter_struct* initpara); +/* initialize the structure hau_initpara */ +void hau_init_struct_para_init(hau_init_parameter_struct* initpara); +/* reset the HAU processor core */ +void hau_reset(void); +/* configure the number of valid bits in last word of the message */ +void hau_last_word_validbits_num_config(uint32_t valid_num); +/* write data to the IN FIFO */ +void hau_data_write(uint32_t data); +/* return the number of words already written into the IN FIFO */ +uint32_t hau_infifo_words_num_get(void); +/* read the message digest result */ +void hau_digest_read(hau_digest_parameter_struct* digestpara); +/* enable digest calculation */ +void hau_digest_calculation_enable(void); +/* configure single or multiple DMA is used, and digest calculation at the end of a DMA transfer or not */ +void hau_multiple_single_dma_config(uint32_t multi_single); +/* enable the HAU DMA interface */ +void hau_dma_enable(void); +/* disable the HAU DMA interface */ +void hau_dma_disable(void); + +/* context swapping functions */ +/* initialize the struct context */ +void hau_context_struct_para_init(hau_context_parameter_struct* context); +/* save the HAU peripheral context */ +void hau_context_save(hau_context_parameter_struct* context_save); +/* restore the HAU peripheral context */ +void hau_context_restore(hau_context_parameter_struct* context_restore); + +/* calculate digest in HASH mode */ +/* calculate digest using SHA1 in HASH mode */ +ErrStatus hau_hash_sha_1(uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using SHA1 in HMAC mode */ +ErrStatus hau_hmac_sha_1(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using SHA224 in HASH mode */ +ErrStatus hau_hash_sha_224(uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using SHA224 in HMAC mode */ +ErrStatus hau_hmac_sha_224(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using SHA256 in HASH mode */ +ErrStatus hau_hash_sha_256(uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using SHA256 in HMAC mode */ +ErrStatus hau_hmac_sha_256(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using MD5 in HASH mode */ +ErrStatus hau_hash_md5(uint8_t *input, uint32_t in_length, uint8_t output[]); +/* calculate digest using MD5 in HMAC mode */ +ErrStatus hau_hmac_md5(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); + +/* interrupt & flag functions */ +/* get the HAU flag status */ +FlagStatus hau_flag_get(uint32_t flag); +/* clear the HAU flag status */ +void hau_flag_clear(uint32_t flag); +/* enable the HAU interrupts */ +void hau_interrupt_enable(uint32_t interrupt); +/* disable the HAU interrupts */ +void hau_interrupt_disable(uint32_t interrupt); +/* get the HAU interrupt flag status */ +FlagStatus hau_interrupt_flag_get(uint32_t int_flag); +/* clear the HAU interrupt flag status */ +void hau_interrupt_flag_clear(uint32_t int_flag); + +#endif /* GD32F5XX_HAU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h new file mode 100644 index 00000000000..80e5721da8c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h @@ -0,0 +1,416 @@ +/*! + \file gd32f5xx_i2c.h + \brief definitions for the I2C0-2 + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_I2C_SIMPLE_H +#define GD32F5XX_I2C_SIMPLE_H + +#include "gd32f5xx.h" + +/* I2Cx(x=0,1,2) definitions */ +#define I2C0 I2C_BASE /*!< I2C0 base address */ +#define I2C1 (I2C_BASE + 0x00000400U) /*!< I2C1 base address */ +#define I2C2 (I2C_BASE + 0x00000800U) /*!< I2C2 base address */ + +/* registers definitions */ +#define I2C_CTL0(i2cx) REG32((i2cx) + 0x00000000U) /*!< I2C control register 0 */ +#define I2C_CTL1(i2cx) REG32((i2cx) + 0x00000004U) /*!< I2C control register 1 */ +#define I2C_SADDR0(i2cx) REG32((i2cx) + 0x00000008U) /*!< I2C slave address register 0 */ +#define I2C_SADDR1(i2cx) REG32((i2cx) + 0x0000000CU) /*!< I2C slave address register 1 */ +#define I2C_DATA(i2cx) REG32((i2cx) + 0x00000010U) /*!< I2C transfer buffer register */ +#define I2C_STAT0(i2cx) REG32((i2cx) + 0x00000014U) /*!< I2C transfer status register 0 */ +#define I2C_STAT1(i2cx) REG32((i2cx) + 0x00000018U) /*!< I2C transfer status register */ +#define I2C_CKCFG(i2cx) REG32((i2cx) + 0x0000001CU) /*!< I2C clock configure register */ +#define I2C_RT(i2cx) REG32((i2cx) + 0x00000020U) /*!< I2C rise time register */ +#define I2C_FCTL(i2cx) REG32((i2cx) + 0x00000024U) /*!< I2C filter control register */ +#define I2C_SAMCS(i2cx) REG32((i2cx) + 0x00000080U) /*!< I2C SAM control and status register */ + +/* bits definitions */ +/* I2Cx_CTL0 */ +#define I2C_CTL0_I2CEN BIT(0) /*!< peripheral enable */ +#define I2C_CTL0_SMBEN BIT(1) /*!< SMBus mode */ +#define I2C_CTL0_SMBSEL BIT(3) /*!< SMBus type */ +#define I2C_CTL0_ARPEN BIT(4) /*!< ARP enable */ +#define I2C_CTL0_PECEN BIT(5) /*!< PEC enable */ +#define I2C_CTL0_GCEN BIT(6) /*!< general call enable */ +#define I2C_CTL0_SS BIT(7) /*!< clock stretching disable (slave mode) */ +#define I2C_CTL0_START BIT(8) /*!< start generation */ +#define I2C_CTL0_STOP BIT(9) /*!< stop generation */ +#define I2C_CTL0_ACKEN BIT(10) /*!< acknowledge enable */ +#define I2C_CTL0_POAP BIT(11) /*!< acknowledge/PEC position (for data reception) */ +#define I2C_CTL0_PECTRANS BIT(12) /*!< packet error checking */ +#define I2C_CTL0_SALT BIT(13) /*!< SMBus alert */ +#define I2C_CTL0_SRESET BIT(15) /*!< software reset */ + +/* I2Cx_CTL1 */ +#define I2C_CTL1_I2CCLK BITS(0,5) /*!< I2CCLK[5:0] bits (peripheral clock frequency) */ +#define I2C_CTL1_ERRIE BIT(8) /*!< error interrupt enable */ +#define I2C_CTL1_EVIE BIT(9) /*!< event interrupt enable */ +#define I2C_CTL1_BUFIE BIT(10) /*!< buffer interrupt enable */ +#define I2C_CTL1_DMAON BIT(11) /*!< DMA requests enable */ +#define I2C_CTL1_DMALST BIT(12) /*!< DMA last transfer */ +#define I2C_CTL1_CFGRBNE BIT(15) /*!< RBNE clear condition control */ + +/* I2Cx_SADDR0 */ +#define I2C_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ +#define I2C_SADDR0_ADDFORMAT BIT(15) /*!< address mode for the I2C slave */ + +/* I2Cx_SADDR1 */ +#define I2C_SADDR1_DUADEN BIT(0) /*!< aual-address mode switch */ +#define I2C_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave in dual-address mode */ + +/* I2Cx_DATA */ +#define I2C_DATA_TRB BITS(0,7) /*!< 8-bit data register */ + +/* I2Cx_STAT0 */ +#define I2C_STAT0_SBSEND BIT(0) /*!< start bit (master mode) */ +#define I2C_STAT0_ADDSEND BIT(1) /*!< address sent (master mode)/matched (slave mode) */ +#define I2C_STAT0_BTC BIT(2) /*!< byte transfer finished */ +#define I2C_STAT0_ADD10SEND BIT(3) /*!< 10-bit header sent (master mode) */ +#define I2C_STAT0_STPDET BIT(4) /*!< stop detection (slave mode) */ +#define I2C_STAT0_RBNE BIT(6) /*!< data register not empty (receivers) */ +#define I2C_STAT0_TBE BIT(7) /*!< data register empty (transmitters) */ +#define I2C_STAT0_BERR BIT(8) /*!< bus error */ +#define I2C_STAT0_LOSTARB BIT(9) /*!< arbitration lost (master mode) */ +#define I2C_STAT0_AERR BIT(10) /*!< acknowledge failure */ +#define I2C_STAT0_OUERR BIT(11) /*!< overrun/underrun */ +#define I2C_STAT0_PECERR BIT(12) /*!< PEC error in reception */ +#define I2C_STAT0_SMBTO BIT(14) /*!< timeout signal in SMBus mode */ +#define I2C_STAT0_SMBALT BIT(15) /*!< SMBus alert status */ + +/* I2Cx_STAT1 */ +#define I2C_STAT1_MASTER BIT(0) /*!< master/slave */ +#define I2C_STAT1_I2CBSY BIT(1) /*!< bus busy */ +#define I2C_STAT1_TR BIT(2) /*!< transmitter/receiver */ +#define I2C_STAT1_RXGC BIT(4) /*!< general call address (slave mode) */ +#define I2C_STAT1_DEFSMB BIT(5) /*!< SMBus device default address (slave mode) */ +#define I2C_STAT1_HSTSMB BIT(6) /*!< SMBus host header (slave mode) */ +#define I2C_STAT1_DUMODF BIT(7) /*!< dual flag (slave mode) */ +#define I2C_STAT1_PECV BITS(8,15) /*!< packet error checking value */ + +/* I2Cx_CKCFG */ +#define I2C_CKCFG_CLKC BITS(0,11) /*!< clock control register in fast/standard mode (master mode) */ +#define I2C_CKCFG_DTCY BIT(14) /*!< fast mode duty cycle */ +#define I2C_CKCFG_FAST BIT(15) /*!< I2C speed selection in master mode */ + +/* I2Cx_RT */ +#define I2C_RT_RISETIME BITS(0,5) /*!< maximum rise time in fast/standard mode (Master mode) */ + +/* I2Cx_FCTL */ +#define I2C_FCTL_DF BITS(0,3) /*!< digital noise filter */ +#define I2C_FCTL_AFD BIT(4) /*!< analog noise filter disable */ + +/* I2Cx_SAMCS */ +#define I2C_SAMCS_SAMEN BIT(0) /*!< SAM_V interface enable */ +#define I2C_SAMCS_STOEN BIT(1) /*!< SAM_V interface timeout detect enable */ +#define I2C_SAMCS_TFFIE BIT(4) /*!< txframe fall interrupt enable */ +#define I2C_SAMCS_TFRIE BIT(5) /*!< txframe rise interrupt enable */ +#define I2C_SAMCS_RFFIE BIT(6) /*!< rxframe fall interrupt enable */ +#define I2C_SAMCS_RFRIE BIT(7) /*!< rxframe rise interrupt enable */ +#define I2C_SAMCS_TXF BIT(8) /*!< level of txframe signal */ +#define I2C_SAMCS_RXF BIT(9) /*!< level of rxframe signal */ +#define I2C_SAMCS_TFF BIT(12) /*!< txframe fall flag */ +#define I2C_SAMCS_TFR BIT(13) /*!< txframe rise flag */ +#define I2C_SAMCS_RFF BIT(14) /*!< rxframe fall flag */ +#define I2C_SAMCS_RFR BIT(15) /*!< rxframe rise flag */ + +/* constants definitions */ +/* define the I2C bit position and its register index offset */ +#define I2C_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define I2C_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0x0000FFFFU) >> 6))) +#define I2C_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) +#define I2C_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define I2C_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) +#define I2C_BIT_POS2(val) (((uint32_t)(val) & 0x001F0000U) >> 16) + +/* register offset */ +#define I2C_CTL1_REG_OFFSET ((uint32_t)0x00000004U) /*!< CTL1 register offset */ +#define I2C_STAT0_REG_OFFSET ((uint32_t)0x00000014U) /*!< STAT0 register offset */ +#define I2C_STAT1_REG_OFFSET ((uint32_t)0x00000018U) /*!< STAT1 register offset */ +#define I2C_SAMCS_REG_OFFSET ((uint32_t)0x00000080U) /*!< SAMCS register offset */ + +/* I2C flags */ +typedef enum { + /* flags in STAT0 register */ + I2C_FLAG_SBSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode */ + I2C_FLAG_ADDSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode */ + I2C_FLAG_BTC = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ + I2C_FLAG_ADD10SEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode */ + I2C_FLAG_STPDET = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode */ + I2C_FLAG_RBNE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not empty during receiving */ + I2C_FLAG_TBE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting */ + I2C_FLAG_BERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus */ + I2C_FLAG_LOSTARB = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode */ + I2C_FLAG_AERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error */ + I2C_FLAG_OUERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode */ + I2C_FLAG_PECERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data */ + I2C_FLAG_SMBTO = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode */ + I2C_FLAG_SMBALT = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status */ + /* flags in STAT1 register */ + I2C_FLAG_MASTER = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 0U), /*!< a flag indicating whether I2C block is in master or slave mode */ + I2C_FLAG_I2CBSY = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 1U), /*!< busy flag */ + I2C_FLAG_TR = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 2U), /*!< whether the I2C is a transmitter or a receiver */ + I2C_FLAG_RXGC = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 4U), /*!< general call address (00h) received */ + I2C_FLAG_DEFSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 5U), /*!< default address of SMBus device */ + I2C_FLAG_HSTSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 6U), /*!< SMBus host header detected in slave mode */ + I2C_FLAG_DUMOD = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 7U), /*!< dual flag in slave mode indicating which address is matched in dual-address mode */ + /* flags in SAMCS register */ + I2C_FLAG_TFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 12U), /*!< txframe fall flag */ + I2C_FLAG_TFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 13U), /*!< txframe rise flag */ + I2C_FLAG_RFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 14U), /*!< rxframe fall flag */ + I2C_FLAG_RFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 15U) /*!< rxframe rise flag */ +} i2c_flag_enum; + +/* I2C interrupt flags */ +typedef enum { + /* interrupt flags in CTL1 register */ + I2C_INT_FLAG_SBSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode interrupt flag */ + I2C_INT_FLAG_ADDSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode interrupt flag */ + I2C_INT_FLAG_BTC = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes interrupt flag */ + I2C_INT_FLAG_ADD10SEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode interrupt flag */ + I2C_INT_FLAG_STPDET = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode interrupt flag */ + I2C_INT_FLAG_RBNE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving interrupt flag */ + I2C_INT_FLAG_TBE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting interrupt flag */ + I2C_INT_FLAG_BERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag */ + I2C_INT_FLAG_LOSTARB = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode interrupt flag */ + I2C_INT_FLAG_AERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error interrupt flag */ + I2C_INT_FLAG_OUERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode interrupt flag */ + I2C_INT_FLAG_PECERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data interrupt flag */ + I2C_INT_FLAG_SMBTO = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode interrupt flag */ + I2C_INT_FLAG_SMBALT = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status interrupt flag */ + /* interrupt flags in SAMCS register */ + I2C_INT_FLAG_TFF = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 4U, I2C_SAMCS_REG_OFFSET, 12U), /*!< txframe fall interrupt flag */ + I2C_INT_FLAG_TFR = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 5U, I2C_SAMCS_REG_OFFSET, 13U), /*!< txframe rise interrupt flag */ + I2C_INT_FLAG_RFF = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 6U, I2C_SAMCS_REG_OFFSET, 14U), /*!< rxframe fall interrupt flag */ + I2C_INT_FLAG_RFR = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 7U, I2C_SAMCS_REG_OFFSET, 15U) /*!< rxframe rise interrupt flag */ +} i2c_interrupt_flag_enum; + +/* I2C interrupt */ +typedef enum { + /* interrupt in CTL1 register */ + I2C_INT_ERR = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 8U), /*!< error interrupt */ + I2C_INT_EV = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 9U), /*!< event interrupt */ + I2C_INT_BUF = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 10U), /*!< buffer interrupt */ + /* interrupt in SAMCS register */ + I2C_INT_TFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 4U), /*!< txframe fall interrupt */ + I2C_INT_TFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 5U), /*!< txframe rise interrupt */ + I2C_INT_RFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 6U), /*!< rxframe fall interrupt */ + I2C_INT_RFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 7U) /*!< rxframe rise interrupt */ +} i2c_interrupt_enum; + +/* the digital noise filter can filter spikes's length */ +typedef enum { + I2C_DF_DISABLE = 0, /*!< disable digital noise filter */ + I2C_DF_1PCLK, /*!< enable digital noise filter and the maximum filtered spiker's length 1 PCLK1 */ + I2C_DF_2PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 2 PCLK1 */ + I2C_DF_3PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 3 PCLK1 */ + I2C_DF_4PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 4 PCLK1 */ + I2C_DF_5PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 5 PCLK1 */ + I2C_DF_6PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 6 PCLK1 */ + I2C_DF_7PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 7 PCLK1 */ + I2C_DF_8PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 8 PCLK1 */ + I2C_DF_9PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 9 PCLK1 */ + I2C_DF_10PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 10 PCLK1 */ + I2C_DF_11PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 11 PCLK1 */ + I2C_DF_12PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 12 PCLK1 */ + I2C_DF_13PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 13 PCLK1 */ + I2C_DF_14PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 14 PCLK1 */ + I2C_DF_15PCLKS /*!< enable digital noise filter and the maximum filtered spiker's length 15 PCLK1 */ +} i2c_digital_filter_enum; + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_I2CMODE_ENABLE ((uint32_t)0x00000000U) /*!< I2C mode */ +#define I2C_SMBUSMODE_ENABLE I2C_CTL0_SMBEN /*!< SMBus mode */ + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_SMBUS_DEVICE ((uint32_t)0x00000000U) /*!< SMBus mode device type */ +#define I2C_SMBUS_HOST I2C_CTL0_SMBSEL /*!< SMBus mode host type */ + +/* I2C transfer direction */ +#define I2C_RECEIVER ((uint32_t)0x00000001U) /*!< receiver */ +#define I2C_TRANSMITTER ((uint32_t)0xFFFFFFFEU) /*!< transmitter */ + +/* whether or not to send an ACK */ +#define I2C_ACK_DISABLE ((uint32_t)0x00000000U) /*!< ACK will be not sent */ +#define I2C_ACK_ENABLE I2C_CTL0_ACKEN /*!< ACK will be sent */ + +/* I2C POAP position*/ +#define I2C_ACKPOS_CURRENT ((uint32_t)0x00000000U) /*!< ACKEN bit decides whether or not to send ACK or not for the current byte */ +#define I2C_ACKPOS_NEXT I2C_CTL0_POAP /*!< ACKEN bit decides whether or not to send ACK for the next byte */ + +/* whether or not to stretch SCL low */ +#define I2C_SCLSTRETCH_ENABLE ((uint32_t)0x00000000U) /*!< enable SCL stretching */ +#define I2C_SCLSTRETCH_DISABLE I2C_CTL0_SS /*!< disable SCL stretching */ + +/* whether or not to response to a general call */ +#define I2C_GCEN_ENABLE I2C_CTL0_GCEN /*!< slave will response to a general call */ +#define I2C_GCEN_DISABLE ((uint32_t)0x00000000U) /*!< slave will not response to a general call */ + +/* software reset I2C */ +#define I2C_SRESET_RESET ((uint32_t)0x00000000U) /*!< I2C is not under reset */ +#define I2C_SRESET_SET I2C_CTL0_SRESET /*!< I2C is under reset */ + +/* I2C DMA mode configure */ +/* DMA mode switch */ +#define I2C_DMA_OFF ((uint32_t)0x00000000U) /*!< disable DMA mode */ +#define I2C_DMA_ON I2C_CTL1_DMAON /*!< enable DMA mode */ + +/* flag indicating DMA last transfer */ +#define I2C_DMALST_OFF ((uint32_t)0x00000000U) /*!< next DMA EOT is not the last transfer */ +#define I2C_DMALST_ON I2C_CTL1_DMALST /*!< next DMA EOT is the last transfer */ + +/* RBNE clear condition control */ +#define I2C_CFGRBNE_OFF ((uint32_t)0x00000000U) /*!< RBNE can be cleared when RXDATA is read and BTC is cleared */ +#define I2C_CFGRBNE_ON I2C_CTL1_CFGRBNE /*!< RBNE can be cleared when RXDATA is read */ + +/* I2C PEC configure */ +/* PEC enable */ +#define I2C_PEC_DISABLE ((uint32_t)0x00000000U) /*!< PEC calculation off */ +#define I2C_PEC_ENABLE I2C_CTL0_PECEN /*!< PEC calculation on */ + +/* PEC transfer */ +#define I2C_PECTRANS_DISABLE ((uint32_t)0x00000000U) /*!< not transfer PEC value */ +#define I2C_PECTRANS_ENABLE I2C_CTL0_PECTRANS /*!< transfer PEC value */ + +/* I2C SMBus configure */ +/* issue or not alert through SMBA pin */ +#define I2C_SALTSEND_DISABLE ((uint32_t)0x00000000U) /*!< not issue alert through SMBA */ +#define I2C_SALTSEND_ENABLE I2C_CTL0_SALT /*!< issue alert through SMBA pin */ + +/* ARP protocol in SMBus switch */ +#define I2C_ARP_DISABLE ((uint32_t)0x00000000U) /*!< disable ARP */ +#define I2C_ARP_ENABLE I2C_CTL0_ARPEN /*!< enable ARP */ + +/* transmit I2C data */ +#define DATA_TRANS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* receive I2C data */ +#define DATA_RECV(regval) GET_BITS((uint32_t)(regval), 0, 7) + +/* I2C duty cycle in fast mode */ +#define I2C_DTCY_2 ((uint32_t)0x00000000U) /*!< T_low/T_high = 2 in fast mode */ +#define I2C_DTCY_16_9 I2C_CKCFG_DTCY /*!< T_low/T_high = 16/9 in fast mode */ + +/* address mode for the I2C slave */ +#define I2C_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address format is 7 bits */ +#define I2C_ADDFORMAT_10BITS I2C_SADDR0_ADDFORMAT /*!< address format is 10 bits */ + +/* function declarations */ +/* initialization functions */ +/* reset I2C */ +void i2c_deinit(uint32_t i2c_periph); +/* configure I2C clock */ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc); +/* configure I2C address */ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr); + +/* application function declarations */ +/* select SMBus type */ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type); +/* whether or not to send an ACK */ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack); +/* configure I2C POAP position */ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos); +/* master sends slave address */ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection); +/* enable dual-address mode */ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr); +/* disable dual-address mode */ +void i2c_dualaddr_disable(uint32_t i2c_periph); +/* enable I2C */ +void i2c_enable(uint32_t i2c_periph); +/* disable I2C */ +void i2c_disable(uint32_t i2c_periph); +/* generate a START condition on I2C bus */ +void i2c_start_on_bus(uint32_t i2c_periph); +/* generate a STOP condition on I2C bus */ +void i2c_stop_on_bus(uint32_t i2c_periph); +/* I2C transmit data function */ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data); +/* I2C receive data function */ +uint8_t i2c_data_receive(uint32_t i2c_periph); +/* configure I2C DMA mode */ +void i2c_dma_config(uint32_t i2c_periph, uint32_t dmastate); +/* configure whether next DMA EOT is DMA last transfer or not */ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast); +/* configure RBNE clear condition */ +void i2c_rbne_clear_config(uint32_t i2c_periph, uint32_t rbnecondition); +/* whether to stretch SCL low when data is not ready in slave mode */ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara); +/* whether or not to response to a general call */ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara); +/* configure software reset of I2C */ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset); +/* configure I2C PEC calculation */ +void i2c_pec_config(uint32_t i2c_periph, uint32_t pecstate); +/* configure whether to transfer PEC value */ +void i2c_pec_transfer_config(uint32_t i2c_periph, uint32_t pecpara); +/* get packet error checking value */ +uint8_t i2c_pec_value_get(uint32_t i2c_periph); +/* configure I2C alert through SMBA pin */ +void i2c_smbus_alert_config(uint32_t i2c_periph, uint32_t smbuspara); +/* configure I2C ARP protocol in SMBus */ +void i2c_smbus_arp_config(uint32_t i2c_periph, uint32_t arpstate); +/* disable analog noise filter */ +void i2c_analog_noise_filter_disable(uint32_t i2c_periph); +/* enable analog noise filter */ +void i2c_analog_noise_filter_enable(uint32_t i2c_periph); +/* configure digital noise filter */ +void i2c_digital_noise_filter_config(uint32_t i2c_periph, i2c_digital_filter_enum dfilterpara); +/* enable SAM_V interface */ +void i2c_sam_enable(uint32_t i2c_periph); +/* disable SAM_V interface */ +void i2c_sam_disable(uint32_t i2c_periph); +/* enable SAM_V interface timeout detect */ +void i2c_sam_timeout_enable(uint32_t i2c_periph); +/* disable SAM_V interface timeout detect */ +void i2c_sam_timeout_disable(uint32_t i2c_periph); + +/* interrupt & flag functions */ +/* get I2C flag status */ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag); +/* clear I2C flag status */ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag); +/* enable I2C interrupt */ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* disable I2C interrupt */ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* get I2C interrupt flag status */ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); +/* clear I2C interrupt flag status */ +void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); + +#endif /* GD32F5XX_I2C_SIMPLE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h new file mode 100644 index 00000000000..abeab6008ce --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h @@ -0,0 +1,410 @@ +/*! + \file gd32f5xx_i2c.h + \brief definitions for the I2C3-5 + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_I2C_ADD_H +#define GD32F5XX_I2C_ADD_H + +#include "gd32f5xx.h" + +/* I2Cx(x=3,4,5) definitions */ +#define I2C0 I2C_BASE /*!< I2C0 base address */ + +#define I2C3 (I2C_BASE + 0x00002C00U) /*!< I2C3 base address */ +#define I2C4 (I2C_BASE + 0x00003000U) /*!< I2C4 base address */ +#define I2C5 (I2C_BASE + 0x00003400U) /*!< I2C5 base address */ + +/* registers definitions */ +/* registers of I2Cx(x=3,4,5) */ +#define I2C_ADD_CTL0(i2cx) REG32((i2cx) + 0x00000000U) /*!< I2C control register 0 */ +#define I2C_ADD_CTL1(i2cx) REG32((i2cx) + 0x00000004U) /*!< I2C control register 1 */ +#define I2C_ADD_SADDR0(i2cx) REG32((i2cx) + 0x00000008U) /*!< I2C slave address register 0*/ +#define I2C_ADD_SADDR1(i2cx) REG32((i2cx) + 0x0000000CU) /*!< I2C slave address register 1*/ +#define I2C_ADD_TIMING(i2cx) REG32((i2cx) + 0x00000010U) /*!< I2C timing register */ +#define I2C_ADD_TIMEOUT(i2cx) REG32((i2cx) + 0x00000014U) /*!< I2C timeout register */ +#define I2C_ADD_STAT(i2cx) REG32((i2cx) + 0x00000018U) /*!< I2C status register */ +#define I2C_ADD_STATC(i2cx) REG32((i2cx) + 0x0000001CU) /*!< I2C status clear register */ +#define I2C_ADD_PEC(i2cx) REG32((i2cx) + 0x00000020U) /*!< I2C PEC register */ +#define I2C_ADD_RDATA(i2cx) REG32((i2cx) + 0x00000024U) /*!< I2C receive data register */ +#define I2C_ADD_TDATA(i2cx) REG32((i2cx) + 0x00000028U) /*!< I2C transmit data register */ +#define I2C_ADD_CTL2(i2cx) REG32((i2cx) + 0x00000090U) /*!< I2C control register 2 */ + +/* bits definitions */ +/* I2Cx_CTL0 */ +#define I2C_ADD_CTL0_I2CEN BIT(0) /*!< I2C peripheral enable */ +#define I2C_ADD_CTL0_TIE BIT(1) /*!< transmit interrupt enable */ +#define I2C_ADD_CTL0_RBNEIE BIT(2) /*!< receive interrupt enable */ +#define I2C_ADD_CTL0_ADDMIE BIT(3) /*!< address match interrupt enable in slave mode */ +#define I2C_ADD_CTL0_NACKIE BIT(4) /*!< not acknowledge received interrupt enable */ +#define I2C_ADD_CTL0_STPDETIE BIT(5) /*!< stop detection interrupt enable */ +#define I2C_ADD_CTL0_TCIE BIT(6) /*!< transfer complete interrupt enable */ +#define I2C_ADD_CTL0_ERRIE BIT(7) /*!< error interrupt enable */ +#define I2C_ADD_CTL0_DNF BITS(8,11) /*!< digital noise filter */ +#define I2C_ADD_CTL0_ANOFF BIT(12) /*!< analog noise filter */ +#define I2C_ADD_CTL0_DENT BIT(14) /*!< DMA enable for transmission */ +#define I2C_ADD_CTL0_DENR BIT(15) /*!< DMA enable for reception */ +#define I2C_ADD_CTL0_SBCTL BIT(16) /*!< slave byte control */ +#define I2C_ADD_CTL0_SS BIT(17) /*!< whether to stretch SCL low when data is not ready in slave mode */ +#define I2C_ADD_CTL0_WUEN BIT(18) /*!< wakeup from deep-sleep mode enable */ +#define I2C_ADD_CTL0_GCEN BIT(19) /*!< whether or not to response to a general call (0x00) */ +#define I2C_ADD_CTL0_SMBHAEN BIT(20) /*!< SMBus host address enable */ +#define I2C_ADD_CTL0_SMBDAEN BIT(21) /*!< SMBus device default address enable */ +#define I2C_ADD_CTL0_SMBALTEN BIT(22) /*!< SMBus alert enable */ +#define I2C_ADD_CTL0_PECEN BIT(23) /*!< PEC calculation switch */ + +/* I2Cx_CTL1 */ +#define I2C_ADD_CTL1_SADDRESS BITS(0,9) /*!< received slave address */ +#define I2C_ADD_CTL1_TRDIR BIT(10) /*!< transfer direction in master mode */ +#define I2C_ADD_CTL1_ADD10EN BIT(11) /*!< 10-bit addressing mode enable in master mode */ +#define I2C_ADD_CTL1_HEAD10R BIT(12) /*!< 10-bit address header executes read direction only in master receive mode */ +#define I2C_ADD_CTL1_START BIT(13) /*!< generate a START condition on I2C bus */ +#define I2C_ADD_CTL1_STOP BIT(14) /*!< generate a STOP condition on I2C bus */ +#define I2C_ADD_CTL1_NACKEN BIT(15) /*!< generate NACK in slave mode */ +#define I2C_ADD_CTL1_BYTENUM BITS(16,23) /*!< number of bytes to be transferred */ +#define I2C_ADD_CTL1_RELOAD BIT(24) /*!< reload mode enable */ +#define I2C_ADD_CTL1_AUTOEND BIT(25) /*!< automatic end mode in master mode */ +#define I2C_ADD_CTL1_PECTRANS BIT(26) /*!< PEC transfer */ + +/* I2Cx_SADDR0 */ +#define I2C_ADD_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ +#define I2C_ADD_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ +#define I2C_ADD_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ +#define I2C_ADD_SADDR0_ADDFORMAT BIT(10) /*!< address mode for the I2C slave */ +#define I2C_ADD_SADDR0_ADDRESSEN BIT(15) /*!< I2C address enable */ + +/* I2Cx_SADDR1 */ +#define I2C_ADD_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave */ +#define I2C_ADD_SADDR1_ADDMSK2 BITS(8,10) /*!< ADDRESS2[7:1] mask */ +#define I2C_ADD_SADDR1_ADDRESS2EN BIT(15) /*!< second I2C address enable */ + +/* I2Cx_TIMING */ +#define I2C_ADD_TIMING_SCLL BITS(0,7) /*!< SCL low period */ +#define I2C_ADD_TIMING_SCLH BITS(8,15) /*!< SCL high period */ +#define I2C_ADD_TIMING_SDADELY BITS(16,19) /*!< data hold time */ +#define I2C_ADD_TIMING_SCLDELY BITS(20,23) /*!< data setup time */ +#define I2C_ADD_TIMING_PSC BITS(28,31) /*!< timing prescaler */ + +/* I2Cx_TIMEOUT */ +#define I2C_ADD_TIMEOUT_BUSTOA BITS(0,11) /*!< bus timeout A */ +#define I2C_ADD_TIMEOUT_TOIDLE BIT(12) /*!< idle clock timeout detection */ +#define I2C_ADD_TIMEOUT_TOEN BIT(15) /*!< clock timeout detection enable */ +#define I2C_ADD_TIMEOUT_BUSTOB BITS(16,27) /*!< bus timeout B */ +#define I2C_ADD_TIMEOUT_EXTOEN BIT(31) /*!< extended clock timeout detection enable */ + +/* I2Cx_STAT */ +#define I2C_ADD_STAT_TBE BIT(0) /*!< I2C_ADD_TDATA is empty during transmitting */ +#define I2C_ADD_STAT_TI BIT(1) /*!< transmit interrupt */ +#define I2C_ADD_STAT_RBNE BIT(2) /*!< I2C_ADD_RDATA is not empty during receiving */ +#define I2C_ADD_STAT_ADDSEND BIT(3) /*!< address received matches in slave mode */ +#define I2C_ADD_STAT_NACK BIT(4) /*!< not acknowledge flag */ +#define I2C_ADD_STAT_STPDET BIT(5) /*!< STOP condition detected in slave mode */ +#define I2C_ADD_STAT_TC BIT(6) /*!< transfer complete in master mode */ +#define I2C_ADD_STAT_TCR BIT(7) /*!< transfer complete reload */ +#define I2C_ADD_STAT_BERR BIT(8) /*!< bus error */ +#define I2C_ADD_STAT_LOSTARB BIT(9) /*!< arbitration lost */ +#define I2C_ADD_STAT_OUERR BIT(10) /*!< overrun/underrun error in slave mode */ +#define I2C_ADD_STAT_PECERR BIT(11) /*!< PEC error */ +#define I2C_ADD_STAT_TIMEOUT BIT(12) /*!< timeout flag */ +#define I2C_ADD_STAT_SMBALT BIT(13) /*!< SMBus Alert */ +#define I2C_ADD_STAT_I2CBSY BIT(15) /*!< busy flag */ +#define I2C_ADD_STAT_TR BIT(16) /*!< whether the I2C is a transmitter or a receiver in slave mode */ +#define I2C_ADD_STAT_READDR BITS(17,23) /*!< received match address in slave mode */ + +/* I2Cx_STATC */ +#define I2C_ADD_STATC_ADDSENDC BIT(3) /*!< ADDSEND flag clear */ +#define I2C_ADD_STATC_NACKC BIT(4) /*!< not acknowledge flag clear */ +#define I2C_ADD_STATC_STPDETC BIT(5) /*!< STPDET flag clear */ +#define I2C_ADD_STATC_BERRC BIT(8) /*!< bus error flag clear */ +#define I2C_ADD_STATC_LOSTARBC BIT(9) /*!< arbitration Lost flag clear */ +#define I2C_ADD_STATC_OUERRC BIT(10) /*!< overrun/underrun flag clear */ +#define I2C_ADD_STATC_PECERRC BIT(11) /*!< PEC error flag clear */ +#define I2C_ADD_STATC_TIMEOUTC BIT(12) /*!< TIMEOUT flag clear */ +#define I2C_ADD_STATC_SMBALTC BIT(13) /*!< SMBus Alert flag clear */ + +/* I2Cx_PEC */ +#define I2C_ADD_PEC_PECV BITS(0,7) /*!< Packet Error Checking Value that calculated by hardware when PEC is enabled */ + +/* I2Cx_RDATA */ +#define I2C_ADD_RDATA_RDATA BITS(0,7) /*!< receive data value */ + +/* I2Cx_TDATA */ +#define I2C_ADD_TDATA_TDATA BITS(0,7) /*!< transmit data value */ + +/* I2Cx_CTL2 */ +#define I2C_ADD_CTL2_ADDM BITS(9,15) /*!< address bits compare select */ + +/* constants definitions */ +/* define the I2C bit position and its register index offset */ +#define I2C_ADD_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define I2C_ADD_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0x0000FFFFU) >> 6))) +#define I2C_ADD_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) +#define I2C_ADD_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define I2C_ADD_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) +#define I2C_ADD_BIT_POS2(val) (((uint32_t)(val) & 0x001F0000U) >> 16) + +/* register offset */ +#define I2C_ADD_CTL0_REG_OFFSET ((uint32_t)0x00000000U) /*!< CTL0 register offset */ +#define I2C_ADD_STAT_REG_OFFSET ((uint32_t)0x00000018U) /*!< STAT register offset */ + +/* I2C interrupt flags */ +typedef enum { + I2C_ADD_INT_FLAG_TI = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 1U, I2C_ADD_STAT_REG_OFFSET, 1U), /*!< transmit interrupt flag */ + I2C_ADD_INT_FLAG_RBNE = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 2U, I2C_ADD_STAT_REG_OFFSET, 2U), /*!< I2C_ADD_RDATA is not empty during receiving interrupt flag */ + I2C_ADD_INT_FLAG_ADDSEND = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 3U, I2C_ADD_STAT_REG_OFFSET, 3U), /*!< address received matches in slave mode interrupt flag */ + I2C_ADD_INT_FLAG_NACK = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 4U, I2C_ADD_STAT_REG_OFFSET, 4U), /*!< not acknowledge interrupt flag */ + I2C_ADD_INT_FLAG_STPDET = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 5U, I2C_ADD_STAT_REG_OFFSET, 5U), /*!< stop condition detected in slave mode interrupt flag */ + I2C_ADD_INT_FLAG_TC = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 6U, I2C_ADD_STAT_REG_OFFSET, 6U), /*!< transfer complete in master mode interrupt flag */ + I2C_ADD_INT_FLAG_TCR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 6U, I2C_ADD_STAT_REG_OFFSET, 7U), /*!< transfer complete reload interrupt flag */ + I2C_ADD_INT_FLAG_BERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 8U), /*!< bus error interrupt flag */ + I2C_ADD_INT_FLAG_LOSTARB = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 9U), /*!< arbitration lost interrupt flag */ + I2C_ADD_INT_FLAG_OUERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 10U), /*!< overrun/underrun error in slave mode interrupt flag */ + I2C_ADD_INT_FLAG_PECERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 11U), /*!< PEC error interrupt flag */ + I2C_ADD_INT_FLAG_TIMEOUT = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 12U), /*!< timeout interrupt flag */ + I2C_ADD_INT_FLAG_SMBALT = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 13U) /*!< SMBus Alert interrupt flag */ +} i2c_add_interrupt_flag_enum; + +/* I2C DMA constants definitions */ +#define I2C_ADD_DMA_TRANSMIT ((uint32_t)0x00000000U) /*!< I2C transmit data use DMA */ +#define I2C_ADD_DMA_RECEIVE ((uint32_t)0x00000001U) /*!< I2C receive data use DMA */ + +/* I2C interrupt enable or disable */ +#define I2C_ADD_INT_ERR I2C_ADD_CTL0_ERRIE /*!< error interrupt enable */ +#define I2C_ADD_INT_TC I2C_ADD_CTL0_TCIE /*!< transfer complete interrupt enable */ +#define I2C_ADD_INT_STPDET I2C_ADD_CTL0_STPDETIE /*!< stop detection interrupt enable */ +#define I2C_ADD_INT_NACK I2C_ADD_CTL0_NACKIE /*!< not acknowledge received interrupt enable */ +#define I2C_ADD_INT_ADDM I2C_ADD_CTL0_ADDMIE /*!< address match interrupt enable */ +#define I2C_ADD_INT_RBNE I2C_ADD_CTL0_RBNEIE /*!< receive interrupt enable */ +#define I2C_ADD_INT_TI I2C_ADD_CTL0_TIE /*!< transmit interrupt enable */ + +/* I2C transfer direction in master mode */ +#define I2C_ADD_MASTER_TRANSMIT ((uint32_t)0x00000000U) /*!< I2C master transmit */ +#define I2C_ADD_MASTER_RECEIVE I2C_ADD_CTL1_TRDIR /*!< I2C master receive */ + +/* address mode for the I2C slave */ +#define I2C_ADD_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address:7 bits */ +#define I2C_ADD_ADDFORMAT_10BITS I2C_ADD_SADDR0_ADDFORMAT /*!< address:10 bits */ + +/* the length of filter spikes */ +#define FILTER_DISABLE ((uint32_t)0x00000000U) /*!< digital filter is disabled */ +#define FILTER_LENGTH_1 ((uint32_t)0x00000001U) /*!< digital filter is enabled and filter spikes with a length of up to 1 tI2CCLK */ +#define FILTER_LENGTH_2 ((uint32_t)0x00000002U) /*!< digital filter is enabled and filter spikes with a length of up to 2 tI2CCLK */ +#define FILTER_LENGTH_3 ((uint32_t)0x00000003U) /*!< digital filter is enabled and filter spikes with a length of up to 3 tI2CCLK */ +#define FILTER_LENGTH_4 ((uint32_t)0x00000004U) /*!< digital filter is enabled and filter spikes with a length of up to 4 tI2CCLK */ +#define FILTER_LENGTH_5 ((uint32_t)0x00000005U) /*!< digital filter is enabled and filter spikes with a length of up to 5 tI2CCLK */ +#define FILTER_LENGTH_6 ((uint32_t)0x00000006U) /*!< digital filter is enabled and filter spikes with a length of up to 6 tI2CCLK */ +#define FILTER_LENGTH_7 ((uint32_t)0x00000007U) /*!< digital filter is enabled and filter spikes with a length of up to 7 tI2CCLK */ +#define FILTER_LENGTH_8 ((uint32_t)0x00000008U) /*!< digital filter is enabled and filter spikes with a length of up to 8 tI2CCLK */ +#define FILTER_LENGTH_9 ((uint32_t)0x00000009U) /*!< digital filter is enabled and filter spikes with a length of up to 9 tI2CCLK */ +#define FILTER_LENGTH_10 ((uint32_t)0x0000000AU) /*!< digital filter is enabled and filter spikes with a length of up to 10 tI2CCLK */ +#define FILTER_LENGTH_11 ((uint32_t)0x0000000BU) /*!< digital filter is enabled and filter spikes with a length of up to 11 tI2CCLK */ +#define FILTER_LENGTH_12 ((uint32_t)0x0000000CU) /*!< digital filter is enabled and filter spikes with a length of up to 12 tI2CCLK */ +#define FILTER_LENGTH_13 ((uint32_t)0x0000000DU) /*!< digital filter is enabled and filter spikes with a length of up to 13 tI2CCLK */ +#define FILTER_LENGTH_14 ((uint32_t)0x0000000EU) /*!< digital filter is enabled and filter spikes with a length of up to 14 tI2CCLK */ +#define FILTER_LENGTH_15 ((uint32_t)0x0000000FU) /*!< digital filter is enabled and filter spikes with a length of up to 15 tI2CCLK */ + +/* defines which bits of register ADDRESS[7:1] are compared with an incoming address byte */ +#define ADDRESS_BIT1_COMPARE ((uint32_t)0x00000200U) /*!< address bit1 needs compare */ +#define ADDRESS_BIT2_COMPARE ((uint32_t)0x00000400U) /*!< address bit2 needs compare */ +#define ADDRESS_BIT3_COMPARE ((uint32_t)0x00000800U) /*!< address bit3 needs compare */ +#define ADDRESS_BIT4_COMPARE ((uint32_t)0x00001000U) /*!< address bit4 needs compare */ +#define ADDRESS_BIT5_COMPARE ((uint32_t)0x00002000U) /*!< address bit5 needs compare */ +#define ADDRESS_BIT6_COMPARE ((uint32_t)0x00004000U) /*!< address bit6 needs compare */ +#define ADDRESS_BIT7_COMPARE ((uint32_t)0x00008000U) /*!< address bit7 needs compare */ + +/* defines which bits of ADDRESS2[7:1] are compared with an incoming address byte, and which bits are masked (don??t care) */ +#define ADDRESS2_NO_MASK ((uint32_t)0x00000000U) /*!< no mask, all the bits must be compared */ +#define ADDRESS2_MASK_BIT1 ((uint32_t)0x00000001U) /*!< ADDRESS2[1] is masked, only ADDRESS2[7:2] are compared */ +#define ADDRESS2_MASK_BIT1_2 ((uint32_t)0x00000002U) /*!< ADDRESS2[2:1] is masked, only ADDRESS2[7:3] are compared */ +#define ADDRESS2_MASK_BIT1_3 ((uint32_t)0x00000003U) /*!< ADDRESS2[3:1] is masked, only ADDRESS2[7:4] are compared */ +#define ADDRESS2_MASK_BIT1_4 ((uint32_t)0x00000004U) /*!< ADDRESS2[4:1] is masked, only ADDRESS2[7:5] are compared */ +#define ADDRESS2_MASK_BIT1_5 ((uint32_t)0x00000005U) /*!< ADDRESS2[5:1] is masked, only ADDRESS2[7:6] are compared */ +#define ADDRESS2_MASK_BIT1_6 ((uint32_t)0x00000006U) /*!< ADDRESS2[6:1] is masked, only ADDRESS2[7] are compared */ +#define ADDRESS2_MASK_ALL ((uint32_t)0x00000007U) /*!< all the ADDRESS2[7:1] bits are masked */ + +/* idle clock timeout detection */ +#define BUSTOA_DETECT_SCL_LOW ((uint32_t)0x00000000U) /*!< BUSTOA is used to detect SCL low timeout */ +#define BUSTOA_DETECT_IDLE I2C_ADD_TIMEOUT_TOIDLE /*!< BUSTOA is used to detect both SCL and SDA high timeout when the bus is idle */ + +/* I2C flag definitions */ +#define I2C_ADD_FLAG_TBE I2C_ADD_STAT_TBE /*!< I2C_ADD_TDATA is empty during transmitting */ +#define I2C_ADD_FLAG_TI I2C_ADD_STAT_TI /*!< transmit interrupt */ +#define I2C_ADD_FLAG_RBNE I2C_ADD_STAT_RBNE /*!< I2C_ADD_RDATA is not empty during receiving */ +#define I2C_ADD_FLAG_ADDSEND I2C_ADD_STAT_ADDSEND /*!< address received matches in slave mode */ +#define I2C_ADD_FLAG_NACK I2C_ADD_STAT_NACK /*!< not acknowledge flag */ +#define I2C_ADD_FLAG_STPDET I2C_ADD_STAT_STPDET /*!< STOP condition detected in slave mode */ +#define I2C_ADD_FLAG_TC I2C_ADD_STAT_TC /*!< transfer complete in master mode */ +#define I2C_ADD_FLAG_TCR I2C_ADD_STAT_TCR /*!< transfer complete reload */ +#define I2C_ADD_FLAG_BERR I2C_ADD_STAT_BERR /*!< bus error */ +#define I2C_ADD_FLAG_LOSTARB I2C_ADD_STAT_LOSTARB /*!< arbitration lost */ +#define I2C_ADD_FLAG_OUERR I2C_ADD_STAT_OUERR /*!< overrun/underrun error in slave mode */ +#define I2C_ADD_FLAG_PECERR I2C_ADD_STAT_PECERR /*!< PEC error */ +#define I2C_ADD_FLAG_TIMEOUT I2C_ADD_STAT_TIMEOUT /*!< timeout flag */ +#define I2C_ADD_FLAG_SMBALT I2C_ADD_STAT_SMBALT /*!< SMBus Alert */ +#define I2C_ADD_FLAG_I2CBSY I2C_ADD_STAT_I2CBSY /*!< busy flag */ +#define I2C_ADD_FLAG_TR I2C_ADD_STAT_TR /*!< whether the I2C is a transmitter or a receiver in slave mode */ + +/* function declarations */ +/* initialization functions */ +/* reset I2C */ +void i2c_add_deinit(uint32_t i2c_add_periph); +/* configure the timing parameters */ +void i2c_add_timing_config(uint32_t i2c_add_periph, uint32_t psc, uint32_t scl_dely, uint32_t sda_dely); +/* configure digital noise filter */ +void i2c_add_digital_noise_filter_config(uint32_t i2c_add_periph, uint32_t filter_length); +/* enable analog noise filter */ +void i2c_add_analog_noise_filter_enable(uint32_t i2c_add_periph); +/* disable analog noise filter */ +void i2c_add_analog_noise_filter_disable(uint32_t i2c_add_periph); +/* configure the SCL high and low period of clock in master mode */ +void i2c_add_master_clock_config(uint32_t i2c_add_periph, uint32_t sclh, uint32_t scll); +/* configure i2c slave address and transfer direction in master mode */ +void i2c_add_master_addressing(uint32_t i2c_add_periph, uint32_t address, uint32_t trans_direction); + +/* application function declarations */ +/* 10-bit address header executes read direction only in master receive mode */ +void i2c_add_address10_header_enable(uint32_t i2c_add_periph); +/* 10-bit address header executes complete sequence in master receive mode */ +void i2c_add_address10_header_disable(uint32_t i2c_add_periph); +/* enable 10-bit addressing mode in master mode */ +void i2c_add_address10_enable(uint32_t i2c_add_periph); +/* disable 10-bit addressing mode in master mode */ +void i2c_add_address10_disable(uint32_t i2c_add_periph); +/* enable I2C automatic end mode in master mode */ +void i2c_add_automatic_end_enable(uint32_t i2c_add_periph); +/* disable I2C automatic end mode in master mode */ +void i2c_add_automatic_end_disable(uint32_t i2c_add_periph); +/* enable the response to a general call */ +void i2c_add_slave_response_to_gcall_enable(uint32_t i2c_add_periph); +/* disable the response to a general call */ +void i2c_add_slave_response_to_gcall_disable(uint32_t i2c_add_periph); +/* enable to stretch SCL low when data is not ready in slave mode */ +void i2c_add_stretch_scl_low_enable(uint32_t i2c_add_periph); +/* disable to stretch SCL low when data is not ready in slave mode */ +void i2c_add_stretch_scl_low_disable(uint32_t i2c_add_periph); +/* configure i2c slave address */ +void i2c_add_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_format); +/* define which bits of ADDRESS[7:1] need to compare with the incoming address byte */ +void i2c_add_address_bit_compare_config(uint32_t i2c_add_periph, uint32_t compare_bits); +/* disable i2c address in slave mode */ +void i2c_add_address_disable(uint32_t i2c_add_periph); +/* configure i2c second slave address */ +void i2c_add_second_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_mask); +/* disable i2c second address in slave mode */ +void i2c_add_second_address_disable(uint32_t i2c_add_periph); +/* get received match address in slave mode */ +uint32_t i2c_add_recevied_address_get(uint32_t i2c_add_periph); +/* enable slave byte control */ +void i2c_add_slave_byte_control_enable(uint32_t i2c_add_periph); +/* disable slave byte control */ +void i2c_add_slave_byte_control_disable(uint32_t i2c_add_periph); +/* generate a NACK in slave mode */ +void i2c_add_nack_enable(uint32_t i2c_add_periph); +/* generate an ACK in slave mode */ +void i2c_add_nack_disable(uint32_t i2c_add_periph); +/* enable wakeup from deep-sleep mode */ +void i2c_add_wakeup_from_deepsleep_enable(uint32_t i2c_add_periph); +/* disable wakeup from deep-sleep mode */ +void i2c_add_wakeup_from_deepsleep_disable(uint32_t i2c_add_periph); +/* enable I2C */ +void i2c_add_enable(uint32_t i2c_add_periph); +/* disable I2C */ +void i2c_add_disable(uint32_t i2c_add_periph); +/* generate a START condition on I2C bus */ +void i2c_add_start_on_bus(uint32_t i2c_add_periph); +/* generate a STOP condition on I2C bus */ +void i2c_add_stop_on_bus(uint32_t i2c_add_periph); +/* I2C transmit data */ +void i2c_add_data_transmit(uint32_t i2c_add_periph, uint32_t data); +/* I2C receive data */ +uint32_t i2c_add_data_receive(uint32_t i2c_add_periph); +/* enable I2C reload mode */ +void i2c_add_reload_enable(uint32_t i2c_add_periph); +/* disable I2C reload mode */ +void i2c_add_reload_disable(uint32_t i2c_add_periph); +/* configure number of bytes to be transferred */ +void i2c_add_transfer_byte_number_config(uint32_t i2c_add_periph, uint32_t byte_number); +/* enable I2C DMA for transmission or reception */ +void i2c_add_dma_enable(uint32_t i2c_add_periph, uint8_t dma); +/* disable I2C DMA for transmission or reception */ +void i2c_add_dma_disable(uint32_t i2c_add_periph, uint8_t dma); +/* I2C transfers PEC value */ +void i2c_add_pec_transfer(uint32_t i2c_add_periph); +/* enable I2C PEC calculation */ +void i2c_add_pec_enable(uint32_t i2c_add_periph); +/* disable I2C PEC calculation */ +void i2c_add_pec_disable(uint32_t i2c_add_periph); +/* get packet error checking value */ +uint32_t i2c_add_pec_value_get(uint32_t i2c_add_periph); +/* enable SMBus alert */ +void i2c_add_smbus_alert_enable(uint32_t i2c_add_periph); +/* disable SMBus alert */ +void i2c_add_smbus_alert_disable(uint32_t i2c_add_periph); +/* enable SMBus device default address */ +void i2c_add_smbus_default_addr_enable(uint32_t i2c_add_periph); +/* disable SMBus device default address */ +void i2c_add_smbus_default_addr_disable(uint32_t i2c_add_periph); +/* enable SMBus host address */ +void i2c_add_smbus_host_addr_enable(uint32_t i2c_add_periph); +/* disable SMBus host address */ +void i2c_add_smbus_host_addr_disable(uint32_t i2c_add_periph); +/* enable extended clock timeout detection */ +void i2c_add_extented_clock_timeout_enable(uint32_t i2c_add_periph); +/* disable extended clock timeout detection */ +void i2c_add_extented_clock_timeout_disable(uint32_t i2c_add_periph); +/* enable clock timeout detection */ +void i2c_add_clock_timeout_enable(uint32_t i2c_add_periph); +/* disable clock timeout detection */ +void i2c_add_clock_timeout_disable(uint32_t i2c_add_periph); +/* configure bus timeout B */ +void i2c_add_bus_timeout_b_config(uint32_t i2c_add_periph, uint32_t timeout); +/* configure bus timeout A */ +void i2c_add_bus_timeout_a_config(uint32_t i2c_add_periph, uint32_t timeout); +/* configure idle clock timeout detection */ +void i2c_add_idle_clock_timeout_config(uint32_t i2c_add_periph, uint32_t timeout); + +/* interrupt & flag functions */ +/* get I2C flag status */ +FlagStatus i2c_add_flag_get(uint32_t i2c_add_periph, uint32_t flag); +/* clear I2C flag status */ +void i2c_add_flag_clear(uint32_t i2c_add_periph, uint32_t flag); +/* enable I2C interrupt */ +void i2c_add_interrupt_enable(uint32_t i2c_add_periph, uint32_t interrupt); +/* disable I2C interrupt */ +void i2c_add_interrupt_disable(uint32_t i2c_add_periph, uint32_t interrupt); +/* get I2C interrupt flag status */ +FlagStatus i2c_add_interrupt_flag_get(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag); +/* clear I2C interrupt flag status */ +void i2c_add_interrupt_flag_clear(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag); + +#endif /* GD32F5XX_I2C_ADD_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h new file mode 100644 index 00000000000..0b0378a44bd --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h @@ -0,0 +1,378 @@ +/*! + \file gd32f5xx_ipa.h + \brief definitions for the IPA + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_IPA_H +#define GD32F5XX_IPA_H + +#include "gd32f5xx.h" + +/* IPA definitions */ +#define IPA IPA_BASE /*!< IPA base address */ + +/* bits definitions */ +/* registers definitions */ +#define IPA_CTL REG32(IPA + 0x00000000U) /*!< IPA control register */ +#define IPA_INTF REG32(IPA + 0x00000004U) /*!< IPA interrupt flag register */ +#define IPA_INTC REG32(IPA + 0x00000008U) /*!< IPA interrupt flag clear register */ +#define IPA_FMADDR REG32(IPA + 0x0000000CU) /*!< IPA foreground memory base address register */ +#define IPA_FLOFF REG32(IPA + 0x00000010U) /*!< IPA foreground line offset register */ +#define IPA_BMADDR REG32(IPA + 0x00000014U) /*!< IPA background memory base address register */ +#define IPA_BLOFF REG32(IPA + 0x00000018U) /*!< IPA background line offset register */ +#define IPA_FPCTL REG32(IPA + 0x0000001CU) /*!< IPA foreground pixel control register */ +#define IPA_FPV REG32(IPA + 0x00000020U) /*!< IPA foreground pixel value register */ +#define IPA_BPCTL REG32(IPA + 0x00000024U) /*!< IPA background pixel control register */ +#define IPA_BPV REG32(IPA + 0x00000028U) /*!< IPA background pixel value register */ +#define IPA_FLMADDR REG32(IPA + 0x0000002CU) /*!< IPA foreground LUT memory base address register */ +#define IPA_BLMADDR REG32(IPA + 0x00000030U) /*!< IPA background LUT memory base address register */ +#define IPA_DPCTL REG32(IPA + 0x00000034U) /*!< IPA destination pixel control register */ +#define IPA_DPV REG32(IPA + 0x00000038U) /*!< IPA destination pixel value register */ +#define IPA_DMADDR REG32(IPA + 0x0000003CU) /*!< IPA destination memory base address register */ +#define IPA_DLOFF REG32(IPA + 0x00000040U) /*!< IPA destination line offset register */ +#define IPA_IMS REG32(IPA + 0x00000044U) /*!< IPA image size register */ +#define IPA_LM REG32(IPA + 0x00000048U) /*!< IPA line mark register */ +#define IPA_ITCTL REG32(IPA + 0x0000004CU) /*!< IPA inter-timer control register */ + +/* IPA_CTL */ +#define IPA_CTL_TEN BIT(0) /*!< transfer enable */ +#define IPA_CTL_THU BIT(1) /*!< transfer hang up */ +#define IPA_CTL_TST BIT(2) /*!< transfer stop */ +#define IPA_CTL_TAEIE BIT(8) /*!< enable bit for transfer access error interrupt */ +#define IPA_CTL_FTFIE BIT(9) /*!< enable bit for full transfer finish interrup */ +#define IPA_CTL_TLMIE BIT(10) /*!< enable bit for transfer line mark interrupt */ +#define IPA_CTL_LACIE BIT(11) /*!< enable bit for LUT access conflict interrupt */ +#define IPA_CTL_LLFIE BIT(12) /*!< enable bit for LUT loading finish interrupt */ +#define IPA_CTL_WCFIE BIT(13) /*!< enable bit for wrong configuration interrupt */ +#define IPA_CTL_PFCM BITS(16,17) /*!< pixel format convert mode */ + +/* IPA_INTF */ +#define IPA_INTF_TAEIF BIT(0) /*!< transfer access error interrupt flag */ +#define IPA_INTF_FTFIF BIT(1) /*!< full transfer finish interrupt flag */ +#define IPA_INTF_TLMIF BIT(2) /*!< transfer line mark interrupt flag */ +#define IPA_INTF_LACIF BIT(3) /*!< LUT access conflict interrupt flag */ +#define IPA_INTF_LLFIF BIT(4) /*!< LUT loading finish interrupt flag */ +#define IPA_INTF_WCFIF BIT(5) /*!< wrong configuration interrupt flag */ + +/* IPA_INTC */ +#define IPA_INTC_TAEIFC BIT(0) /*!< clear bit for transfer access error interrupt flag */ +#define IPA_INTC_FTFIFC BIT(1) /*!< clear bit for full transfer finish interrupt flag */ +#define IPA_INTC_TLMIFC BIT(2) /*!< clear bit for transfer line mark interrupt flag */ +#define IPA_INTC_LACIFC BIT(3) /*!< clear bit for LUT access conflict interrupt flag */ +#define IPA_INTC_LLFIFC BIT(4) /*!< clear bit for LUT loading finish interrupt flag */ +#define IPA_INTC_WCFIFC BIT(5) /*!< clear bit for wrong configuration interrupt flag */ + +/* IPA_FMADDR */ +#define IPA_FMADDR_FMADDR BITS(0,31) /*!< foreground memory base address */ + +/* IPA_FLOFF */ +#define IPA_FLOFF_FLOFF BITS(0,13) /*!< foreground line offset */ + +/* IPA_BMADDR */ +#define IPA_BMADDR_BMADDR BITS(0,31) /*!< background memory base address */ + +/* IPA_BLOFF */ +#define IPA_BLOFF_BLOFF BITS(0,13) /*!< background line offset */ + +/* IPA_FPCTL */ +#define IPA_FPCTL_FPF BITS(0,3) /*!< foreground pixel format */ +#define IPA_FPCTL_FLPF BIT(4) /*!< foreground LUT pixel format */ +#define IPA_FPCTL_FLLEN BIT(5) /*!< foreground LUT loading enable */ +#define IPA_FPCTL_FCNP BITS(8,15) /*!< foreground LUT number of pixel */ +#define IPA_FPCTL_FAVCA BITS(16,17) /*!< foreground alpha value calculation algorithm */ +#define IPA_FPCTL_FPDAV BITS(24,31) /*!< foreground pre- defined alpha value */ + +/* IPA_FPV */ +#define IPA_FPV_FPDBV BITS(0,7) /*!< foreground pre-defined red value */ +#define IPA_FPV_FPDGV BITS(8,15) /*!< foreground pre-defined green value */ +#define IPA_FPV_FPDRV BITS(16,23) /*!< foreground pre-defined red value */ + +/* IPA_BPCTL */ +#define IPA_BPCTL_BPF BITS(0,3) /*!< background pixel format */ +#define IPA_BPCTL_BLPF BIT(4) /*!< background LUT pixel format */ +#define IPA_BPCTL_BLLEN BIT(5) /*!< background LUT loading enable */ +#define IPA_BPCTL_BCNP BITS(8,15) /*!< background LUT number of pixel */ +#define IPA_BPCTL_BAVCA BITS(16,17) /*!< background alpha value calculation algorithm */ +#define IPA_BPCTL_BPDAV BITS(24,31) /*!< background pre- defined alpha value */ + +/* IPA_BPV */ +#define IPA_BPV_BPDBV BITS(0,7) /*!< background pre-defined blue value */ +#define IPA_BPV_BPDGV BITS(8,15) /*!< background pre-defined green value */ +#define IPA_BPV_BPDRV BITS(16,23) /*!< background pre-defined red value */ + +/* IPA_FLMADDR */ +#define IPA_FLMADDR_FLMADDR BITS(0,31) /*!< foreground LUT memory base address */ + +/* IPA_BLMADDR */ +#define IPA_BLMADDR_BLMADDR BITS(0,31) /*!< background LUT memory base address */ + +/* IPA_DPCTL */ +#define IPA_DPCTL_DPF BITS(0,2) /*!< destination pixel control register */ + +/* IPA_DPV */ +/* destination pixel format ARGB8888 */ +#define IPA_DPV_DPDBV_0 BITS(0,7) /*!< destination pre-defined blue value */ +#define IPA_DPV_DPDGV_0 BITS(8,15) /*!< destination pre-defined green value */ +#define IPA_DPV_DPDRV_0 BITS(16,23) /*!< destination pre-defined red value */ +#define IPA_DPV_DPDAV_0 BITS(24,31) /*!< destination pre-defined alpha value */ + +/* destination pixel format RGB8888 */ +#define IPA_DPV_DPDBV_1 BITS(0,7) /*!< destination pre-defined blue value */ +#define IPA_DPV_DPDGV_1 BITS(8,15) /*!< destination pre-defined green value */ +#define IPA_DPV_DPDRV_1 BITS(16,23) /*!< destination pre-defined red value */ + +/* destination pixel format RGB565 */ +#define IPA_DPV_DPDBV_2 BITS(0,4) /*!< destination pre-defined blue value */ +#define IPA_DPV_DPDGV_2 BITS(5,10) /*!< destination pre-defined green value */ +#define IPA_DPV_DPDRV_2 BITS(11,15) /*!< destination pre-defined red value */ + +/* destination pixel format ARGB1555 */ +#define IPA_DPV_DPDBV_3 BITS(0,4) /*!< destination pre-defined blue value */ +#define IPA_DPV_DPDGV_3 BITS(5,9) /*!< destination pre-defined green value */ +#define IPA_DPV_DPDRV_3 BITS(10,14) /*!< destination pre-defined red value */ +#define IPA_DPV_DPDAV_3 BIT(15) /*!< destination pre-defined alpha value */ + +/* destination pixel format ARGB4444 */ +#define IPA_DPV_DPDBV_4 BITS(0,3) /*!< destination pre-defined blue value */ +#define IPA_DPV_DPDGV_4 BITS(4,7) /*!< destination pre-defined green value */ +#define IPA_DPV_DPDRV_4 BITS(8,11) /*!< destination pre-defined red value */ +#define IPA_DPV_DPDAV_4 BITS(12,15) /*!< destination pre-defined alpha value */ + +/* IPA_DMADDR */ +#define IPA_DMADDR_DMADDR BITS(0,31) /*!< destination memory base address */ + +/* IPA_DLOFF */ +#define IPA_DLOFF_DLOFF BITS(0,13) /*!< destination line offset */ + +/* IPA_IMS */ +#define IPA_IMS_HEIGHT BITS(0,15) /*!< height of the image to be processed */ +#define IPA_IMS_WIDTH BITS(16,29) /*!< width of the image to be processed */ + +/* IPA_LM */ +#define IPA_LM_LM BITS(0,15) /*!< line mark */ + +/* IPA_ITCTL */ +#define IPA_ITCTL_ITEN BIT(0) /*!< inter-timer enable */ +#define IPA_ITCTL_NCCI BITS(8,15) /*!< number of clock cycles interval */ + + +/* constants definitions */ +/* IPA foreground parameter struct definitions */ +typedef struct { + uint32_t foreground_memaddr; /*!< foreground memory base address */ + uint32_t foreground_lineoff; /*!< foreground line offset */ + uint32_t foreground_prealpha; /*!< foreground pre-defined alpha value */ + uint32_t foreground_alpha_algorithm; /*!< foreground alpha value calculation algorithm */ + uint32_t foreground_pf; /*!< foreground pixel format */ + uint32_t foreground_prered; /*!< foreground pre-defined red value */ + uint32_t foreground_pregreen; /*!< foreground pre-defined green value */ + uint32_t foreground_preblue; /*!< foreground pre-defined blue value */ +} ipa_foreground_parameter_struct; + +/* IPA background parameter struct definitions */ +typedef struct { + uint32_t background_memaddr; /*!< background memory base address */ + uint32_t background_lineoff; /*!< background line offset */ + uint32_t background_prealpha; /*!< background pre-defined alpha value */ + uint32_t background_alpha_algorithm; /*!< background alpha value calculation algorithm */ + uint32_t background_pf; /*!< background pixel format */ + uint32_t background_prered; /*!< background pre-defined red value */ + uint32_t background_pregreen; /*!< background pre-defined green value */ + uint32_t background_preblue; /*!< background pre-defined blue value */ +} ipa_background_parameter_struct; + +/* IPA destination parameter struct definitions */ +typedef struct { + uint32_t destination_memaddr; /*!< destination memory base address */ + uint32_t destination_lineoff; /*!< destination line offset */ + uint32_t destination_prealpha; /*!< destination pre-defined alpha value */ + uint32_t destination_pf; /*!< destination pixel format */ + uint32_t destination_prered; /*!< destination pre-defined red value */ + uint32_t destination_pregreen; /*!< destination pre-defined green value */ + uint32_t destination_preblue; /*!< destination pre-defined blue value */ + uint32_t image_width; /*!< width of the image to be processed */ + uint32_t image_height; /*!< height of the image to be processed */ +} ipa_destination_parameter_struct; + +/* destination pixel format */ +typedef enum { + IPA_DPF_ARGB8888, /*!< destination pixel format ARGB8888 */ + IPA_DPF_RGB888, /*!< destination pixel format RGB888 */ + IPA_DPF_RGB565, /*!< destination pixel format RGB565 */ + IPA_DPF_ARGB1555, /*!< destination pixel format ARGB1555 */ + IPA_DPF_ARGB4444 /*!< destination pixel format ARGB4444 */ +} ipa_dpf_enum; + +/* LUT pixel format */ +#define IPA_LUT_PF_ARGB8888 ((uint8_t)0x00U) /*!< LUT pixel format ARGB8888 */ +#define IPA_LUT_PF_RGB888 ((uint8_t)0x01U) /*!< LUT pixel format RGB888 */ + +/* Inter-timer */ +#define IPA_INTER_TIMER_DISABLE ((uint8_t)0x00U) /*!< inter-timer disable */ +#define IPA_INTER_TIMER_ENABLE ((uint8_t)0x01U) /*!< inter-timer enable */ + +/* IPA pixel format convert mode */ +#define CTL_PFCM(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define IPA_FGTODE CTL_PFCM(0) /*!< foreground memory to destination memory without pixel format convert */ +#define IPA_FGTODE_PF_CONVERT CTL_PFCM(1) /*!< foreground memory to destination memory with pixel format convert */ +#define IPA_FGBGTODE CTL_PFCM(2) /*!< blending foreground and background memory to destination memory */ +#define IPA_FILL_UP_DE CTL_PFCM(3) /*!< fill up destination memory with specific color */ + +/* foreground alpha value calculation algorithm */ +#define FPCTL_FAVCA(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define IPA_FG_ALPHA_MODE_0 FPCTL_FAVCA(0) /*!< no effect */ +#define IPA_FG_ALPHA_MODE_1 FPCTL_FAVCA(1) /*!< FPDAV[7:0] is selected as the foreground alpha value */ +#define IPA_FG_ALPHA_MODE_2 FPCTL_FAVCA(2) /*!< FPDAV[7:0] multiplied by read alpha value */ + +/* background alpha value calculation algorithm */ +#define BPCTL_BAVCA(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define IPA_BG_ALPHA_MODE_0 BPCTL_BAVCA(0) /*!< no effect */ +#define IPA_BG_ALPHA_MODE_1 BPCTL_BAVCA(1) /*!< BPDAV[7:0] is selected as the background alpha value */ +#define IPA_BG_ALPHA_MODE_2 BPCTL_BAVCA(2) /*!< BPDAV[7:0] multiplied by read alpha value */ + +/* foreground pixel format */ +#define FPCTL_PPF(regval) (BITS(0,3) & ((uint32_t)(regval))) +#define FOREGROUND_PPF_ARGB8888 FPCTL_PPF(0) /*!< foreground pixel format ARGB8888 */ +#define FOREGROUND_PPF_RGB888 FPCTL_PPF(1) /*!< foreground pixel format RGB888 */ +#define FOREGROUND_PPF_RGB565 FPCTL_PPF(2) /*!< foreground pixel format RGB565 */ +#define FOREGROUND_PPF_ARG1555 FPCTL_PPF(3) /*!< foreground pixel format ARGB1555 */ +#define FOREGROUND_PPF_ARGB4444 FPCTL_PPF(4) /*!< foreground pixel format ARGB4444 */ +#define FOREGROUND_PPF_L8 FPCTL_PPF(5) /*!< foreground pixel format L8 */ +#define FOREGROUND_PPF_AL44 FPCTL_PPF(6) /*!< foreground pixel format AL44 */ +#define FOREGROUND_PPF_AL88 FPCTL_PPF(7) /*!< foreground pixel format AL88 */ +#define FOREGROUND_PPF_L4 FPCTL_PPF(8) /*!< foreground pixel format L4 */ +#define FOREGROUND_PPF_A8 FPCTL_PPF(9) /*!< foreground pixel format A8 */ +#define FOREGROUND_PPF_A4 FPCTL_PPF(10) /*!< foreground pixel format A4 */ + +/* background pixel format */ +#define BPCTL_PPF(regval) (BITS(0,3) & ((uint32_t)(regval))) +#define BACKGROUND_PPF_ARGB8888 BPCTL_PPF(0) /*!< background pixel format ARGB8888 */ +#define BACKGROUND_PPF_RGB888 BPCTL_PPF(1) /*!< background pixel format RGB888 */ +#define BACKGROUND_PPF_RGB565 BPCTL_PPF(2) /*!< background pixel format RGB565 */ +#define BACKGROUND_PPF_ARG1555 BPCTL_PPF(3) /*!< background pixel format ARGB1555 */ +#define BACKGROUND_PPF_ARGB4444 BPCTL_PPF(4) /*!< background pixel format ARGB4444 */ +#define BACKGROUND_PPF_L8 BPCTL_PPF(5) /*!< background pixel format L8 */ +#define BACKGROUND_PPF_AL44 BPCTL_PPF(6) /*!< background pixel format AL44 */ +#define BACKGROUND_PPF_AL88 BPCTL_PPF(7) /*!< background pixel format AL88 */ +#define BACKGROUND_PPF_L4 BPCTL_PPF(8) /*!< background pixel format L4 */ +#define BACKGROUND_PPF_A8 BPCTL_PPF(9) /*!< background pixel format A8 */ +#define BACKGROUND_PPF_A4 BPCTL_PPF(10) /*!< background pixel format A4 */ + +/* IPA flags */ +#define IPA_FLAG_TAE IPA_INTF_TAEIF /*!< transfer access error interrupt flag */ +#define IPA_FLAG_FTF IPA_INTF_FTFIF /*!< full transfer finish interrupt flag */ +#define IPA_FLAG_TLM IPA_INTF_TLMIF /*!< transfer line mark interrupt flag */ +#define IPA_FLAG_LAC IPA_INTF_LACIF /*!< LUT access conflict interrupt flag */ +#define IPA_FLAG_LLF IPA_INTF_LLFIF /*!< LUT loading finish interrupt flag */ +#define IPA_FLAG_WCF IPA_INTF_WCFIF /*!< wrong configuration interrupt flag */ + +/* IPA interrupt enable or disable */ +#define IPA_INT_TAE IPA_CTL_TAEIE /*!< transfer access error interrupt */ +#define IPA_INT_FTF IPA_CTL_FTFIE /*!< full transfer finish interrupt */ +#define IPA_INT_TLM IPA_CTL_TLMIE /*!< transfer line mark interrupt */ +#define IPA_INT_LAC IPA_CTL_LACIE /*!< LUT access conflict interrupt */ +#define IPA_INT_LLF IPA_CTL_LLFIE /*!< LUT loading finish interrupt */ +#define IPA_INT_WCF IPA_CTL_WCFIE /*!< wrong configuration interrupt */ + +/* IPA interrupt flags */ +#define IPA_INT_FLAG_TAE IPA_INTF_TAEIF /*!< transfer access error interrupt flag */ +#define IPA_INT_FLAG_FTF IPA_INTF_FTFIF /*!< full transfer finish interrupt flag */ +#define IPA_INT_FLAG_TLM IPA_INTF_TLMIF /*!< transfer line mark interrupt flag */ +#define IPA_INT_FLAG_LAC IPA_INTF_LACIF /*!< LUT access conflict interrupt flag */ +#define IPA_INT_FLAG_LLF IPA_INTF_LLFIF /*!< LUT loading finish interrupt flag */ +#define IPA_INT_FLAG_WCF IPA_INTF_WCFIF /*!< wrong configuration interrupt flag */ + +/* function declarations */ +/* functions enable or disable, pixel format convert mode set */ +/* deinitialize IPA */ +void ipa_deinit(void); +/* enable IPA transfer */ +void ipa_transfer_enable(void); +/* enable IPA transfer hang up */ +void ipa_transfer_hangup_enable(void); +/* disable IPA transfer hang up */ +void ipa_transfer_hangup_disable(void); +/* enable IPA transfer stop */ +void ipa_transfer_stop_enable(void); +/* disable IPA transfer stop */ +void ipa_transfer_stop_disable(void); +/* enable IPA foreground LUT loading */ +void ipa_foreground_lut_loading_enable(void); +/* enable IPA background LUT loading */ +void ipa_background_lut_loading_enable(void); +/* set pixel format convert mode, the function is invalid when the IPA transfer is enabled */ +void ipa_pixel_format_convert_mode_set(uint32_t pfcm); + +/* structure initialization, foreground, background, destination and LUT initialization */ +/* initialize the structure of IPA foreground parameter struct with the default values, it is + suggested that call this function after an ipa_foreground_parameter_struct structure is defined */ +void ipa_foreground_struct_para_init(ipa_foreground_parameter_struct *foreground_struct); +/* initialize foreground parameters */ +void ipa_foreground_init(ipa_foreground_parameter_struct *foreground_struct); +/* initialize the structure of IPA background parameter struct with the default values, it is + suggested that call this function after an ipa_background_parameter_struct structure is defined */ +void ipa_background_struct_para_init(ipa_background_parameter_struct *background_struct); +/* initialize background parameters */ +void ipa_background_init(ipa_background_parameter_struct *background_struct); +/* initialize the structure of IPA destination parameter struct with the default values, it is + suggested that call this function after an ipa_destination_parameter_struct structure is defined */ +void ipa_destination_struct_para_init(ipa_destination_parameter_struct *destination_struct); +/* initialize destination parameters */ +void ipa_destination_init(ipa_destination_parameter_struct *destination_struct); +/* initialize IPA foreground LUT parameters */ +void ipa_foreground_lut_init(uint8_t fg_lut_num, uint8_t fg_lut_pf, uint32_t fg_lut_addr); +/* initialize IPA background LUT parameters */ +void ipa_background_lut_init(uint8_t bg_lut_num, uint8_t bg_lut_pf, uint32_t bg_lut_addr); + +/* configuration functions */ +/* configure IPA line mark */ +void ipa_line_mark_config(uint16_t line_num); +/* inter-timer enable or disable */ +void ipa_inter_timer_config(uint8_t timer_cfg); +/* configure the number of clock cycles interval */ +void ipa_interval_clock_num_config(uint8_t clk_num); + +/* flag and interrupt functions */ +/* get IPA flag status in IPA_INTF register */ +FlagStatus ipa_flag_get(uint32_t flag); +/* clear IPA flag in IPA_INTF register */ +void ipa_flag_clear(uint32_t flag); +/* enable IPA interrupt */ +void ipa_interrupt_enable(uint32_t int_flag); +/* disable IPA interrupt */ +void ipa_interrupt_disable(uint32_t int_flag); +/* get IPA interrupt flag */ +FlagStatus ipa_interrupt_flag_get(uint32_t int_flag); +/* clear IPA interrupt flag */ +void ipa_interrupt_flag_clear(uint32_t int_flag); + +#endif /* GD32F5XX_IPA_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h new file mode 100644 index 00000000000..43ae47d0ce3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h @@ -0,0 +1,184 @@ +/*! + \file gd32f5xx_iref.h + \brief definitions for the IREF + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_IREF_H +#define GD32F5XX_IREF_H + +#include "gd32f5xx.h" + +/* IREF definitions */ +#define IREF IREF_BASE /*!< IREF base address */ + +/* registers definitions */ +#define IREF_CTL REG32(IREF + 0x300U) /*!< IREF control register */ + +/* bits definitions */ +/* IREF_CTL */ +#define IREF_CTL_CSDT BITS(0,5) /*!< current step data */ +#define IREF_CTL_SCMOD BIT(7) /*!< sink current mode */ +#define IREF_CTL_CPT BITS(8,12) /*!< current precision trim */ +#define IREF_CTL_SSEL BIT(14) /*!< step selection */ +#define IREF_CTL_CREN BIT(15) /*!< current reference enable */ + +/* constants definitions */ +/* IREF current precision trim */ +#define CTL_CPT(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) +#define IREF_CUR_PRECISION_TRIM_0 CTL_CPT(0) /*!< IREF current precision trim 0 */ +#define IREF_CUR_PRECISION_TRIM_1 CTL_CPT(1) /*!< IREF current precision trim 1 */ +#define IREF_CUR_PRECISION_TRIM_2 CTL_CPT(2) /*!< IREF current precision trim 2 */ +#define IREF_CUR_PRECISION_TRIM_3 CTL_CPT(3) /*!< IREF current precision trim 3 */ +#define IREF_CUR_PRECISION_TRIM_4 CTL_CPT(4) /*!< IREF current precision trim 4 */ +#define IREF_CUR_PRECISION_TRIM_5 CTL_CPT(5) /*!< IREF current precision trim 5 */ +#define IREF_CUR_PRECISION_TRIM_6 CTL_CPT(6) /*!< IREF current precision trim 6 */ +#define IREF_CUR_PRECISION_TRIM_7 CTL_CPT(7) /*!< IREF current precision trim 7 */ +#define IREF_CUR_PRECISION_TRIM_8 CTL_CPT(8) /*!< IREF current precision trim 8 */ +#define IREF_CUR_PRECISION_TRIM_9 CTL_CPT(9) /*!< IREF current precision trim 9 */ +#define IREF_CUR_PRECISION_TRIM_10 CTL_CPT(10) /*!< IREF current precision trim 10 */ +#define IREF_CUR_PRECISION_TRIM_11 CTL_CPT(11) /*!< IREF current precision trim 11 */ +#define IREF_CUR_PRECISION_TRIM_12 CTL_CPT(12) /*!< IREF current precision trim 12 */ +#define IREF_CUR_PRECISION_TRIM_13 CTL_CPT(13) /*!< IREF current precision trim 13 */ +#define IREF_CUR_PRECISION_TRIM_14 CTL_CPT(14) /*!< IREF current precision trim 14 */ +#define IREF_CUR_PRECISION_TRIM_15 CTL_CPT(15) /*!< IREF current precision trim 15 */ +#define IREF_CUR_PRECISION_TRIM_16 CTL_CPT(16) /*!< IREF current precision trim 16 */ +#define IREF_CUR_PRECISION_TRIM_17 CTL_CPT(17) /*!< IREF current precision trim 17 */ +#define IREF_CUR_PRECISION_TRIM_18 CTL_CPT(18) /*!< IREF current precision trim 18 */ +#define IREF_CUR_PRECISION_TRIM_19 CTL_CPT(19) /*!< IREF current precision trim 19 */ +#define IREF_CUR_PRECISION_TRIM_20 CTL_CPT(20) /*!< IREF current precision trim 20 */ +#define IREF_CUR_PRECISION_TRIM_21 CTL_CPT(21) /*!< IREF current precision trim 21 */ +#define IREF_CUR_PRECISION_TRIM_22 CTL_CPT(22) /*!< IREF current precision trim 22 */ +#define IREF_CUR_PRECISION_TRIM_23 CTL_CPT(23) /*!< IREF current precision trim 23 */ +#define IREF_CUR_PRECISION_TRIM_24 CTL_CPT(24) /*!< IREF current precision trim 24 */ +#define IREF_CUR_PRECISION_TRIM_25 CTL_CPT(25) /*!< IREF current precision trim 25 */ +#define IREF_CUR_PRECISION_TRIM_26 CTL_CPT(26) /*!< IREF current precision trim 26 */ +#define IREF_CUR_PRECISION_TRIM_27 CTL_CPT(27) /*!< IREF current precision trim 27 */ +#define IREF_CUR_PRECISION_TRIM_28 CTL_CPT(28) /*!< IREF current precision trim 28 */ +#define IREF_CUR_PRECISION_TRIM_29 CTL_CPT(29) /*!< IREF current precision trim 29 */ +#define IREF_CUR_PRECISION_TRIM_30 CTL_CPT(30) /*!< IREF current precision trim 30 */ +#define IREF_CUR_PRECISION_TRIM_31 CTL_CPT(31) /*!< IREF current precision trim 31 */ + +/* IREF current step */ +#define CTL_CSDT(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) +#define IREF_CUR_STEP_DATA_0 CTL_CSDT(0) /*!< IREF current step data 0 */ +#define IREF_CUR_STEP_DATA_1 CTL_CSDT(1) /*!< IREF current step data 1 */ +#define IREF_CUR_STEP_DATA_2 CTL_CSDT(2) /*!< IREF current step data 2 */ +#define IREF_CUR_STEP_DATA_3 CTL_CSDT(3) /*!< IREF current step data 3 */ +#define IREF_CUR_STEP_DATA_4 CTL_CSDT(4) /*!< IREF current step data 4 */ +#define IREF_CUR_STEP_DATA_5 CTL_CSDT(5) /*!< IREF current step data 5 */ +#define IREF_CUR_STEP_DATA_6 CTL_CSDT(6) /*!< IREF current step data 6 */ +#define IREF_CUR_STEP_DATA_7 CTL_CSDT(7) /*!< IREF current step data 7 */ +#define IREF_CUR_STEP_DATA_8 CTL_CSDT(8) /*!< IREF current step data 8 */ +#define IREF_CUR_STEP_DATA_9 CTL_CSDT(9) /*!< IREF current step data 9 */ +#define IREF_CUR_STEP_DATA_10 CTL_CSDT(10) /*!< IREF current step data 10 */ +#define IREF_CUR_STEP_DATA_11 CTL_CSDT(11) /*!< IREF current step data 11 */ +#define IREF_CUR_STEP_DATA_12 CTL_CSDT(12) /*!< IREF current step data 12 */ +#define IREF_CUR_STEP_DATA_13 CTL_CSDT(13) /*!< IREF current step data 13 */ +#define IREF_CUR_STEP_DATA_14 CTL_CSDT(14) /*!< IREF current step data 14 */ +#define IREF_CUR_STEP_DATA_15 CTL_CSDT(15) /*!< IREF current step data 15 */ +#define IREF_CUR_STEP_DATA_16 CTL_CSDT(16) /*!< IREF current step data 16 */ +#define IREF_CUR_STEP_DATA_17 CTL_CSDT(17) /*!< IREF current step data 17 */ +#define IREF_CUR_STEP_DATA_18 CTL_CSDT(18) /*!< IREF current step data 18 */ +#define IREF_CUR_STEP_DATA_19 CTL_CSDT(19) /*!< IREF current step data 19 */ +#define IREF_CUR_STEP_DATA_20 CTL_CSDT(20) /*!< IREF current step data 20 */ +#define IREF_CUR_STEP_DATA_21 CTL_CSDT(21) /*!< IREF current step data 21 */ +#define IREF_CUR_STEP_DATA_22 CTL_CSDT(22) /*!< IREF current step data 22 */ +#define IREF_CUR_STEP_DATA_23 CTL_CSDT(23) /*!< IREF current step data 23 */ +#define IREF_CUR_STEP_DATA_24 CTL_CSDT(24) /*!< IREF current step data 24 */ +#define IREF_CUR_STEP_DATA_25 CTL_CSDT(25) /*!< IREF current step data 25 */ +#define IREF_CUR_STEP_DATA_26 CTL_CSDT(26) /*!< IREF current step data 26 */ +#define IREF_CUR_STEP_DATA_27 CTL_CSDT(27) /*!< IREF current step data 27 */ +#define IREF_CUR_STEP_DATA_28 CTL_CSDT(28) /*!< IREF current step data 28 */ +#define IREF_CUR_STEP_DATA_29 CTL_CSDT(29) /*!< IREF current step data 29 */ +#define IREF_CUR_STEP_DATA_30 CTL_CSDT(30) /*!< IREF current step data 30 */ +#define IREF_CUR_STEP_DATA_31 CTL_CSDT(31) /*!< IREF current step data 31 */ +#define IREF_CUR_STEP_DATA_32 CTL_CSDT(32) /*!< IREF current step data 32 */ +#define IREF_CUR_STEP_DATA_33 CTL_CSDT(33) /*!< IREF current step data 33 */ +#define IREF_CUR_STEP_DATA_34 CTL_CSDT(34) /*!< IREF current step data 34 */ +#define IREF_CUR_STEP_DATA_35 CTL_CSDT(35) /*!< IREF current step data 35 */ +#define IREF_CUR_STEP_DATA_36 CTL_CSDT(36) /*!< IREF current step data 36 */ +#define IREF_CUR_STEP_DATA_37 CTL_CSDT(37) /*!< IREF current step data 37 */ +#define IREF_CUR_STEP_DATA_38 CTL_CSDT(38) /*!< IREF current step data 38 */ +#define IREF_CUR_STEP_DATA_39 CTL_CSDT(39) /*!< IREF current step data 39 */ +#define IREF_CUR_STEP_DATA_40 CTL_CSDT(40) /*!< IREF current step data 40 */ +#define IREF_CUR_STEP_DATA_41 CTL_CSDT(41) /*!< IREF current step data 41 */ +#define IREF_CUR_STEP_DATA_42 CTL_CSDT(42) /*!< IREF current step data 42 */ +#define IREF_CUR_STEP_DATA_43 CTL_CSDT(43) /*!< IREF current step data 43 */ +#define IREF_CUR_STEP_DATA_44 CTL_CSDT(44) /*!< IREF current step data 44 */ +#define IREF_CUR_STEP_DATA_45 CTL_CSDT(45) /*!< IREF current step data 45 */ +#define IREF_CUR_STEP_DATA_46 CTL_CSDT(46) /*!< IREF current step data 46 */ +#define IREF_CUR_STEP_DATA_47 CTL_CSDT(47) /*!< IREF current step data 47 */ +#define IREF_CUR_STEP_DATA_48 CTL_CSDT(48) /*!< IREF current step data 48 */ +#define IREF_CUR_STEP_DATA_49 CTL_CSDT(49) /*!< IREF current step data 49 */ +#define IREF_CUR_STEP_DATA_50 CTL_CSDT(50) /*!< IREF current step data 50 */ +#define IREF_CUR_STEP_DATA_51 CTL_CSDT(51) /*!< IREF current step data 51 */ +#define IREF_CUR_STEP_DATA_52 CTL_CSDT(52) /*!< IREF current step data 52 */ +#define IREF_CUR_STEP_DATA_53 CTL_CSDT(53) /*!< IREF current step data 53 */ +#define IREF_CUR_STEP_DATA_54 CTL_CSDT(54) /*!< IREF current step data 54 */ +#define IREF_CUR_STEP_DATA_55 CTL_CSDT(55) /*!< IREF current step data 54 */ +#define IREF_CUR_STEP_DATA_56 CTL_CSDT(56) /*!< IREF current step data 54 */ +#define IREF_CUR_STEP_DATA_57 CTL_CSDT(57) /*!< IREF current step data 57 */ +#define IREF_CUR_STEP_DATA_58 CTL_CSDT(58) /*!< IREF current step data 58 */ +#define IREF_CUR_STEP_DATA_59 CTL_CSDT(59) /*!< IREF current step data 59 */ +#define IREF_CUR_STEP_DATA_60 CTL_CSDT(60) /*!< IREF current step data 60 */ +#define IREF_CUR_STEP_DATA_61 CTL_CSDT(61) /*!< IREF current step data 61 */ +#define IREF_CUR_STEP_DATA_62 CTL_CSDT(62) /*!< IREF current step data 62 */ +#define IREF_CUR_STEP_DATA_63 CTL_CSDT(63) /*!< IREF current step data 63 */ + +/* IREF mode selection */ +#define IREF_STEP(regval) (BIT(14) & ((uint32_t)(regval) << 14)) +#define IREF_MODE_LOW_POWER IREF_STEP(0) /*!< low power, 1uA step */ +#define IREF_MODE_HIGH_CURRENT IREF_STEP(1) /*!< high current, 8uA step */ + +/* IREF sink current mode*/ +#define IREF_CURRENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) +#define IREF_SOURCE_CURRENT IREF_CURRENT(0) /*!< IREF source current */ +#define IREF_SINK_CURRENT IREF_CURRENT(1) /*!< IREF sink current */ + +/* function declarations */ +/* deinitialize IREF */ +void iref_deinit(void); +/* enable IREF */ +void iref_enable(void); +/* disable IREF */ +void iref_disable(void); + +/* set IREF mode*/ +void iref_mode_set(uint32_t step); +/* set IREF current precision trim value */ +void iref_precision_trim_value_set(uint32_t precisiontrim); +/* set IREF sink current mode*/ +void iref_sink_set(uint32_t sinkmode); +/* set IREF step data*/ +void iref_step_data_config(uint32_t stepdata); + +#endif /* GD32F5XX_IREF_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h new file mode 100644 index 00000000000..6acf43d21e4 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h @@ -0,0 +1,93 @@ +/*! + \file gd32f5xx_misc.h + \brief definitions for the MISC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_MISC_H +#define GD32F5XX_MISC_H + +#include "gd32f5xx.h" + +/* constants definitions */ +/* set the RAM and FLASH base address */ +#define NVIC_VECTTAB_RAM ((uint32_t)0x20000000) /*!< RAM base address */ +#define NVIC_VECTTAB_FLASH ((uint32_t)0x08000000) /*!< Flash base address */ + +/* set the NVIC vector table offset mask */ +#define NVIC_VECTTAB_OFFSET_MASK ((uint32_t)0x1FFFFF80) + +/* the register key mask, if you want to do the write operation, you should write 0x5FA to VECTKEY bits */ +#define NVIC_AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) + +/* priority group - define the pre-emption priority and the subpriority */ +#define NVIC_PRIGROUP_PRE0_SUB4 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority 4 bits for subpriority */ +#define NVIC_PRIGROUP_PRE1_SUB3 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority 3 bits for subpriority */ +#define NVIC_PRIGROUP_PRE2_SUB2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority 2 bits for subpriority */ +#define NVIC_PRIGROUP_PRE3_SUB1 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority 1 bits for subpriority */ +#define NVIC_PRIGROUP_PRE4_SUB0 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority 0 bits for subpriority */ + +/* choose the method to enter or exit the lowpower mode */ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< choose the the system whether enter low power mode by exiting from ISR */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< choose the the system enter the DEEPSLEEP mode or SLEEP mode */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< choose the interrupt source that can wake up the lowpower mode */ + +#define SCB_LPM_SLEEP_EXIT_ISR SCB_SCR_SLEEPONEXIT +#define SCB_LPM_DEEPSLEEP SCB_SCR_SLEEPDEEP +#define SCB_LPM_WAKE_BY_ALL_INT SCB_SCR_SEVONPEND + +/* choose the systick clock source */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 ((uint32_t)0xFFFFFFFBU) /*!< systick clock source is from HCLK/8 */ +#define SYSTICK_CLKSOURCE_HCLK ((uint32_t)0x00000004U) /*!< systick clock source is from HCLK */ + +/* function declarations */ +/* set the priority group */ +void nvic_priority_group_set(uint32_t nvic_prigroup); + +/* enable NVIC interrupt request */ +void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority); +/* disable NVIC interrupt request */ +void nvic_irq_disable(uint8_t nvic_irq); +/* initiates a system reset request to reset the MCU */ +void nvic_system_reset(void); + +/* set the NVIC vector table base address */ +void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset); + +/* set the state of the low power mode */ +void system_lowpower_set(uint8_t lowpower_mode); +/* reset the state of the low power mode */ +void system_lowpower_reset(uint8_t lowpower_mode); + +/* set the systick clock source */ +void systick_clksource_set(uint32_t systick_clksource); + +#endif /* GD32F5XX_MISC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h new file mode 100644 index 00000000000..19bc45e495e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h @@ -0,0 +1,290 @@ +/*! + \file gd32f5xx_pkcau.h + \brief definitions for the PKCAU + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_PKCAU_H +#define GD32F5XX_PKCAU_H + +#include "gd32f5xx.h" + +/* PKCAU definitions */ +#define PKCAU PKCAU_BASE /*!< PKCAU base address */ + +/* registers definitions */ +#define PKCAU_CTL REG32(PKCAU + 0x00000000U) /*!< PKCAU control register */ +#define PKCAU_STAT REG32(PKCAU + 0x00000004U) /*!< PKCAU status register */ +#define PKCAU_STATC REG32(PKCAU + 0x00000008U) /*!< PKCAU status clear register */ + +/* bits definitions */ +/* PKCAU_CTL */ +#define PKCAU_CTL_PKCAUEN BIT(0) /*!< PKCAU peripheral enable */ +#define PKCAU_CTL_START BIT(1) /*!< start operation */ +#define PKCAU_CTL_MODESEL BITS(8,13) /*!< operation mode selection */ +#define PKCAU_CTL_ENDIE BIT(17) /*!< end of operation interrupt enable */ +#define PKCAU_CTL_RAMERRIE BIT(19) /*!< RAM error interrupt enable */ +#define PKCAU_CTL_ADDRERRIE BIT(20) /*!< address error interrupt enable */ + +/* PKCAU_STAT */ +#define PKCAU_STAT_BUSY BIT(16) /*!< busy flag */ +#define PKCAU_STAT_ENDF BIT(17) /*!< end of PKCAU operation */ +#define PKCAU_STAT_RAMERR BIT(19) /*!< PKCAU RAM error */ +#define PKCAU_STAT_ADDRERR BIT(20) /*!< address error */ + +/* PKCAU_STATC */ +#define PKCAU_STATC_ENDFC BIT(17) /*!< end of PKCAU operation flag clear */ +#define PKCAU_STATC_RAMERRC BIT(19) /*!< PKCAU RAM error flag clear */ +#define PKCAU_STATC_ADDRERRC BIT(20) /*!< address error flag clear */ + +/* constants definitions */ +/* montgomery parameter structure */ +typedef struct{ + const uint8_t* modulus_n; /*!< modulus value n */ + uint32_t modulus_n_len; /*!< modulus length in byte */ +}pkcau_mont_parameter_struct; + +/* modular addition, modular subtraction, montgomery multiplication, modular inversion, modular reduction parameter structure */ +typedef struct{ + const uint8_t* oprd_a; /*!< operand A */ + uint32_t oprd_a_len; /*!< operand A length in byte */ + const uint8_t* oprd_b; /*!< operand B */ + uint32_t oprd_b_len; /*!< operand b length in byte */ + const uint8_t* modulus_n; /*!< modulus value n */ + uint32_t modulus_n_len; /*!< modulus length in byte */ +}pkcau_mod_parameter_struct; + +/* modular exponentiation parameter structure */ +typedef struct{ + const uint8_t* oprd_a; /*!< operand A */ + uint32_t oprd_a_len; /*!< operand A length in byte */ + const uint8_t* exp_e; /*!< exponent e */ + uint32_t e_len; /*!< exponent length in byte */ + const uint8_t* modulus_n; /*!< modulus n */ + uint32_t modulus_n_len; /*!< modulus length in byte */ + uint8_t* mont_para; /*!< montgomery parameter R2 mod n */ + uint32_t mont_para_len; /*!< montgomery parameter length in byte */ +}pkcau_mod_exp_parameter_struct; + +/* arithmetic addition, arithmetic subtraction, arithmetic multiplication and arithmetic comparison parameter structure */ +typedef struct{ + const uint8_t* oprd_a; /*!< operand A */ + uint32_t oprd_a_len; /*!< length of operand in byte */ + const uint8_t* oprd_b; /*!< operand B */ + uint32_t oprd_b_len; /*!< length of operand in byte */ +}pkcau_arithmetic_parameter_struct; + +/* CRT parameter structure */ +typedef struct{ + const uint8_t* oprd_a; /*!< operand A */ + uint32_t oprd_a_len; /*!< length of operand in byte */ + uint8_t* oprd_dp; /*!< operand dp */ + uint32_t oprd_dp_len; /*!< length of operand dp in byte */ + uint8_t* oprd_dq; /*!< operand dq */ + uint32_t oprd_dq_len; /*!< length of operand dq in byte */ + uint8_t* oprd_qinv; /*!< operand qinv */ + uint32_t oprd_qinv_len; /*!< length of operand qinv in byte */ + uint8_t* oprd_p; /*!< prime operand p */ + uint32_t oprd_p_len; /*!< length of operand p in byte */ + uint8_t* oprd_q; /*!< prime operand q */ + uint32_t oprd_q_len; /*!< length of operand q in byte */ +}pkcau_crt_parameter_struct; + +/* ECC curve parameter structure */ +typedef struct{ + uint8_t* modulus_p; /*!< curve modulus p */ + uint32_t modulus_p_len; /*!< curve modulus p length in byte */ + uint8_t* coff_a; /*!< curve coefficient a */ + uint32_t coff_a_len; /*!< curve coefficient a length in byte */ + uint8_t* coff_b; /*!< curve coefficient b */ + uint32_t coff_b_len; /*!< curve coefficient b length in byte */ + uint8_t* base_point_x; /*!< curve base point coordinate x */ + uint32_t base_point_x_len; /*!< curve base point coordinate x length in byte */ + uint8_t* base_point_y; /*!< curve base point coordinate y */ + uint32_t base_point_y_len; /*!< curve base point coordinate y length in byte */ + uint8_t* order_n; /*!< curve prime order n */ + uint32_t order_n_len; /*!< curve prime order n length in byte */ + uint32_t a_sign; /*!< curve coefficient a sign */ + + const uint8_t* multi_k; /*!< scalar multiplier k */ + uint32_t multi_k_len; /*!< scalar multiplier k length in byte */ + + const uint8_t* integer_k; /*!< integer k */ + uint32_t integer_k_len; /*!< integer k length in byte */ + const uint8_t* private_key_d; /*!< private key d */ + uint32_t private_key_d_len; /*!< private key d length in byte */ + uint8_t* mont_para; /*!< montgomery parameter R2 mod n */ + uint32_t mont_para_len; /*!< montgomery parameter R2 mod n length in byte */ +}pkcau_ec_group_parameter_struct; + +/* point structure */ +typedef struct{ + const uint8_t* point_x; /*!< point coordinate x */ + uint32_t point_x_len; /*!< point coordinate x length in byte > */ + const uint8_t* point_y; /*!< point coordinate y */ + uint32_t point_y_len; /*!< point coordinate y length in byte > */ +}pkcau_point_parameter_struct; + +/* signature structure */ +typedef struct{ + const uint8_t* sign_r; /*!< signature part r */ + uint32_t sign_r_len; /*!< signature part r lnegth in byte */ + const uint8_t* sign_s; /*!< signature part s */ + uint32_t sign_s_len; /*!< signature part s lnegth in byte */ +}pkcau_signature_parameter_struct; + +/* hash structure */ +typedef struct { + const uint8_t *hash_z; /*!< hash value z */ + uint32_t hash_z_len; /*!< hash value z length in byte */ +}pkcau_hash_parameter_struct; + + +/* ecdsa signature, ecc scalar multiplication output structure */ +typedef struct{ + uint32_t sign_extra; /*!< flag of extended ECDSA sign (extra outputs) */ + uint8_t* sign_r; /*!< pointer to signature part r */ + uint8_t* sign_s; /*!< pointer to signature part s */ + uint8_t* point_x; /*!< pointer to point kP coordinate x */ + uint8_t* point_y; /*!< pointer to point kP coordinate y */ +}pkcau_ecc_out_struct; + + +/* PKCAU operation code */ +#define CTL_MODE(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) +#define PKCAU_MODE_MOD_EXP CTL_MODE(0) /*!< montgomery parameter computation then modular exponentiation */ +#define PKCAU_MODE_MONT_PARAM CTL_MODE(1) /*!< montgomery parameter computation only */ +#define PKCAU_MODE_MOD_EXP_FAST CTL_MODE(2) /*!< modular exponentiation only */ +#define PKCAU_MODE_CRT_EXP CTL_MODE(7) /*!< RSA CRT exponentiation */ +#define PKCAU_MODE_MOD_INVERSION CTL_MODE(8) /*!< modular inversion */ +#define PKCAU_MODE_ARITHMETIC_ADD CTL_MODE(9) /*!< arithmetic addition */ +#define PKCAU_MODE_ARITHMETIC_SUB CTL_MODE(10) /*!< arithmetic subtraction */ +#define PKCAU_MODE_ARITHMETIC_MUL CTL_MODE(11) /*!< arithmetic multiplication */ +#define PKCAU_MODE_ARITHMETIC_COMP CTL_MODE(12) /*!< arithmetic comparison */ +#define PKCAU_MODE_MOD_REDUCTION CTL_MODE(13) /*!< modular reduction */ +#define PKCAU_MODE_MOD_ADD CTL_MODE(14) /*!< modular addition */ +#define PKCAU_MODE_MOD_SUB CTL_MODE(15) /*!< modular subtraction */ +#define PKCAU_MODE_MONT_MUL CTL_MODE(16) /*!< montgomery multiplication */ +#define PKCAU_MODE_ECC_SCALAR_MUL CTL_MODE(32) /*!< montgomery parameter computation then ECC scalar multiplication */ +#define PKCAU_MODE_ECC_SCALAR_MUL_FAST CTL_MODE(34) /*!< ECC scalar multiplication only */ +#define PKCAU_MODE_ECDSA_SIGN CTL_MODE(36) /*!< ECDSA sign */ +#define PKCAU_MODE_ECDSA_VERIFICATION CTL_MODE(38) /*!< ECDSA verification */ +#define PKCAU_MODE_POINT_CHECK CTL_MODE(40) /*!< point on elliptic curve Fp check */ + +/* PKCAU interrupt */ +#define PKCAU_INT_ADDRERR PKCAU_CTL_ADDRERRIE /*!< address error interrupt enable */ +#define PKCAU_INT_RAMERR PKCAU_CTL_RAMERRIE /*!< RAM error interrupt enable */ +#define PKCAU_INT_END PKCAU_CTL_ENDIE /*!< end of operation interrupt enable */ + +/* PKCAU flag definitions */ +#define PKCAU_FLAG_ADDRERR PKCAU_STAT_ADDRERR /*!< address error flag */ +#define PKCAU_FLAG_RAMERR PKCAU_STAT_RAMERR /*!< PKCAU RAM error flag */ +#define PKCAU_FLAG_END PKCAU_STAT_ENDF /*!< end of PKCAU operation flag */ +#define PKCAU_FLAG_BUSY PKCAU_STAT_BUSY /*!< busy flag */ + +/* PKCAU interrupt flag definitions */ +#define PKCAU_INT_FLAG_ADDRERR PKCAU_STAT_ADDRERR /*!< address error flag */ +#define PKCAU_INT_FLAG_RAMERR PKCAU_STAT_RAMERR /*!< PKCAU RAM error flag */ +#define PKCAU_INT_FLAG_ENDF PKCAU_STAT_ENDF /*!< end of PKCAU operation flag */ + +/* function declarations */ +/* initialization functions */ +/* reset pkcau */ +void pkcau_deinit(void); +/* initialize montgomery parameter structure with a default value */ +void pkcau_mont_struct_para_init(pkcau_mont_parameter_struct* init_para); +/* initialize modular parameter structure with a default value */ +void pkcau_mod_struct_para_init(pkcau_mod_parameter_struct* init_para); +/* initialize modular exponentiation parameter structure with a default value */ +void pkcau_mod_exp_struct_para_init(pkcau_mod_exp_parameter_struct* init_para); +/* initialize arithmetic parameter structure with a default value */ +void pkcau_arithmetic_struct_para_init(pkcau_arithmetic_parameter_struct* init_para); +/* initialize CRT parameter structure with a default value */ +void pkcau_crt_struct_para_init(pkcau_crt_parameter_struct* init_para); +/* initialize ECC curve parameter structure with a default value */ +void pkcau_ec_group_struct_para_init(pkcau_ec_group_parameter_struct* init_para); +/* initialize point parameter structure with a default value */ +void pkcau_point_struct_para_init(pkcau_point_parameter_struct* init_para); +/* initialize signature parameter structure with a default value */ +void pkcau_signature_struct_para_init(pkcau_signature_parameter_struct* init_para); +/* initialize hash parameter structure with a default value */ +void pkcau_hash_struct_para_init(pkcau_hash_parameter_struct* init_para); +/* initialize ecc output parameter structure with a default value */ +void pkcau_ecc_out_struct_para_init(pkcau_ecc_out_struct* init_para); + +/* application function declarations */ +/* enable PKCAU */ +void pkcau_enable(void); +/* disable PKCAU */ +void pkcau_disable(void); +/* start operation */ +void pkcau_start(void); +/* configure the PKCAU operation mode */ +void pkcau_mode_set(uint32_t mode); +/* execute montgomery parameter operation */ +void pkcau_mont_param_operation(pkcau_mont_parameter_struct* mont_para, uint8_t* results); +/* execute modular operation, include modular addition, modular subtraction and montgomery multiplication */ +void pkcau_mod_operation(pkcau_mod_parameter_struct* mod_para, uint32_t mode, uint8_t* results); +/* execute modular exponentiation operation */ +void pkcau_mod_exp_operation(pkcau_mod_exp_parameter_struct* mod_exp_para, uint32_t mode, uint8_t* results); +/* execute modular inversion operation */ +void pkcau_mod_inver_operation(pkcau_mod_parameter_struct* mod_inver_para, uint8_t* results); +/* execute modular reduction operation */ +void pkcau_mod_reduc_operation(pkcau_mod_parameter_struct* mod_reduc_para, uint8_t* results); +/* execute arithmetic addition operation */ +void pkcau_arithmetic_operation(pkcau_arithmetic_parameter_struct* arithmetic_para, uint32_t mode, uint8_t* results); +/* execute RSA CRT exponentiation operation */ +void pkcau_crt_exp_operation(pkcau_crt_parameter_struct* crt_para, uint8_t* results); +/* execute point check operation */ +uint8_t pkcau_point_check_operation(pkcau_point_parameter_struct* point_para, const pkcau_ec_group_parameter_struct* curve_group_para); +/* execute point multiplication operation */ +void pkcau_point_mul_operation(pkcau_point_parameter_struct* point_para, const pkcau_ec_group_parameter_struct* curve_group_para, uint32_t mode, pkcau_ecc_out_struct* result); +/* execute ECDSA sign operation */ +uint8_t pkcau_ecdsa_sign_operation(pkcau_hash_parameter_struct* hash_para, const pkcau_ec_group_parameter_struct* curve_group_para, pkcau_ecc_out_struct* result); +/* execute ECDSA verify operation */ +uint8_t pkcau_ecdsa_verification_operation(pkcau_point_parameter_struct* point_para, pkcau_hash_parameter_struct* hash_para, pkcau_signature_parameter_struct* signature_para, const pkcau_ec_group_parameter_struct* curve_group_para); + +/* interrupt & flag functions */ +/* get PKCAU flag status */ +FlagStatus pkcau_flag_get(uint32_t flag); +/* clear PKCAU flag status */ +void pkcau_flag_clear(uint32_t flag); +/* enable PKCAU interrupt */ +void pkcau_interrupt_enable(uint32_t interrupt); +/* disable PKCAU interrupt */ +void pkcau_interrupt_disable(uint32_t interrupt); +/* get PKCAU interrupt flag status */ +FlagStatus pkcau_interrupt_flag_get(uint32_t int_flag); +/* clear PKCAU interrupt flag status */ +void pkcau_interrupt_flag_clear(uint32_t int_flag); + +#endif /* GD32F5XX_PKCAU_H */ + diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h new file mode 100644 index 00000000000..59ba1f8651e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h @@ -0,0 +1,203 @@ +/*! + \file gd32f5xx_pmu.h + \brief definitions for the PMU + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F5XX_PMU_H +#define GD32F5XX_PMU_H + +#include "gd32f5xx.h" + +/* PMU definitions */ +#define PMU PMU_BASE /*!< PMU base address */ + +/* registers definitions */ +#define PMU_CTL REG32((PMU) + 0x00000000U) /*!< PMU control register */ +#define PMU_CS REG32((PMU) + 0x00000004U) /*!< PMU control and status register */ + +/* bits definitions */ +/* PMU_CTL */ +#define PMU_CTL_LDOLP BIT(0) /*!< LDO low power mode */ +#define PMU_CTL_STBMOD BIT(1) /*!< standby mode */ +#define PMU_CTL_WURST BIT(2) /*!< wakeup flag reset */ +#define PMU_CTL_STBRST BIT(3) /*!< standby flag reset */ +#define PMU_CTL_LVDEN BIT(4) /*!< low voltage detector enable */ +#define PMU_CTL_LVDT BITS(5,7) /*!< low voltage detector threshold */ +#define PMU_CTL_BKPWEN BIT(8) /*!< backup domain write enable */ +#define PMU_CTL_LDLP BIT(10) /*!< low-driver mode when use low power LDO */ +#define PMU_CTL_LDNP BIT(11) /*!< low-driver mode when use normal power LDO */ +#define PMU_CTL_LDOVS BITS(14,15) /*!< LDO output voltage select */ +#define PMU_CTL_HDEN BIT(16) /*!< high-driver mode enable */ +#define PMU_CTL_HDS BIT(17) /*!< high-driver mode switch */ +#define PMU_CTL_LDEN BITS(18,19) /*!< low-driver mode enable in deep-sleep mode */ + +/* PMU_CS */ +#define PMU_CS_WUF BIT(0) /*!< wakeup flag */ +#define PMU_CS_STBF BIT(1) /*!< standby flag */ +#define PMU_CS_LVDF BIT(2) /*!< low voltage detector status flag */ +#define PMU_CS_BLDORF BIT(3) /*!< backup SRAM LDO ready flag */ +#define PMU_CS_WUPEN BIT(8) /*!< wakeup pin enable */ +#define PMU_CS_BLDOON BIT(9) /*!< backup SRAM LDO on */ +#define PMU_CS_LDOVSRF BIT(14) /*!< LDO voltage select ready flag */ +#define PMU_CS_HDRF BIT(16) /*!< high-driver ready flag */ +#define PMU_CS_HDSRF BIT(17) /*!< high-driver switch ready flag */ +#define PMU_CS_LDRF BITS(18,19) /*!< low-driver mode ready flag */ + +/* constants definitions */ +/* PMU ldo definitions */ +#define PMU_LDO_NORMAL ((uint32_t)0x00000000U) /*!< LDO normal work when PMU enter deep-sleep mode */ +#define PMU_LDO_LOWPOWER PMU_CTL_LDOLP /*!< LDO work at low power status when PMU enter deep-sleep mode */ + +/* PMU low voltage detector threshold definitions */ +#define CTL_LVDT(regval) (BITS(5,7)&((uint32_t)(regval)<<5)) +#define PMU_LVDT_0 CTL_LVDT(0) /*!< voltage threshold is 2.1V */ +#define PMU_LVDT_1 CTL_LVDT(1) /*!< voltage threshold is 2.3V */ +#define PMU_LVDT_2 CTL_LVDT(2) /*!< voltage threshold is 2.4V */ +#define PMU_LVDT_3 CTL_LVDT(3) /*!< voltage threshold is 2.6V */ +#define PMU_LVDT_4 CTL_LVDT(4) /*!< voltage threshold is 2.7V */ +#define PMU_LVDT_5 CTL_LVDT(5) /*!< voltage threshold is 2.9V */ +#define PMU_LVDT_6 CTL_LVDT(6) /*!< voltage threshold is 3.0V */ +#define PMU_LVDT_7 CTL_LVDT(7) /*!< voltage threshold is 3.1V */ + +/* PMU low-driver mode when use low power LDO */ +#define CTL_LDLP(regval) (BIT(10)&((uint32_t)(regval)<<10)) +#define PMU_NORMALDR_LOWPWR CTL_LDLP(0) /*!< normal driver when use low power LDO */ +#define PMU_LOWDR_LOWPWR CTL_LDLP(1) /*!< low-driver mode enabled when LDEN is 11 and use low power LDO */ + +/* PMU low-driver mode when use normal power LDO */ +#define CTL_LDNP(regval) (BIT(11)&((uint32_t)(regval)<<11)) +#define PMU_NORMALDR_NORMALPWR CTL_LDNP(0) /*!< normal driver when use normal power LDO */ +#define PMU_LOWDR_NORMALPWR CTL_LDNP(1) /*!< low-driver mode enabled when LDEN is 11 and use normal power LDO */ + +/* PMU LDO output voltage select definitions */ +#define CTL_LDOVS(regval) (BITS(14,15)&((uint32_t)(regval)<<14)) +#define PMU_LDOVS_LOW CTL_LDOVS(1) /*!< LDO output voltage low mode */ +#define PMU_LDOVS_MID CTL_LDOVS(2) /*!< LDO output voltage mid mode */ +#define PMU_LDOVS_HIGH CTL_LDOVS(3) /*!< LDO output voltage high mode */ + + +/* PMU high-driver mode switch */ +#define CTL_HDS(regval) (BIT(17)&((uint32_t)(regval)<<17)) +#define PMU_HIGHDR_SWITCH_NONE CTL_HDS(0) /*!< no high-driver mode switch */ +#define PMU_HIGHDR_SWITCH_EN CTL_HDS(1) /*!< high-driver mode switch */ + +/* PMU low-driver mode enable in deep-sleep mode */ +#define CTL_LDEN(regval) (BITS(18,19)&((uint32_t)(regval)<<18)) +#define PMU_LOWDRIVER_DISABLE CTL_LDEN(0) /*!< low-driver mode disable in deep-sleep mode */ +#define PMU_LOWDRIVER_ENABLE CTL_LDEN(3) /*!< low-driver mode enable in deep-sleep mode */ + +/* PMU backup SRAM LDO on or off */ +#define CS_BLDOON(regval) (BIT(9)&((uint32_t)(regval)<<9)) +#define PMU_BLDOON_OFF CS_BLDOON(0) /*!< backup SRAM LDO off */ +#define PMU_BLDOON_ON CS_BLDOON(1) /*!< the backup SRAM LDO on */ + +/* PMU low power mode ready flag definitions */ +#define CS_LDRF(regval) (BITS(18,19)&((uint32_t)(regval)<<18)) +#define PMU_LDRF_NORMAL CS_LDRF(0) /*!< normal driver in deep-sleep mode */ +#define PMU_LDRF_LOWDRIVER CS_LDRF(3) /*!< low-driver mode in deep-sleep mode */ + +/* PMU flag definitions */ +#define PMU_FLAG_WAKEUP PMU_CS_WUF /*!< wakeup flag status */ +#define PMU_FLAG_STANDBY PMU_CS_STBF /*!< standby flag status */ +#define PMU_FLAG_LVD PMU_CS_LVDF /*!< lvd flag status */ +#define PMU_FLAG_BLDORF PMU_CS_BLDORF /*!< backup SRAM LDO ready flag */ +#define PMU_FLAG_LDOVSRF PMU_CS_LDOVSRF /*!< LDO voltage select ready flag */ +#define PMU_FLAG_HDRF PMU_CS_HDRF /*!< high-driver ready flag */ +#define PMU_FLAG_HDSRF PMU_CS_HDSRF /*!< high-driver switch ready flag */ +#define PMU_FLAG_LDRF PMU_CS_LDRF /*!< low-driver mode ready flag */ + +/* PMU flag reset definitions */ +#define PMU_FLAG_RESET_WAKEUP ((uint8_t)0x00U) /*!< wakeup flag reset */ +#define PMU_FLAG_RESET_STANDBY ((uint8_t)0x01U) /*!< standby flag reset */ + +/* PMU command constants definitions */ +#define WFI_CMD ((uint8_t)0x00U) /*!< use WFI command */ +#define WFE_CMD ((uint8_t)0x01U) /*!< use WFE command */ + +/* function declarations */ +/* reset PMU registers */ +void pmu_deinit(void); + +/* LVD functions */ +/* select low voltage detector threshold */ +void pmu_lvd_select(uint32_t lvdt_n); +/* disable PMU lvd */ +void pmu_lvd_disable(void); + +/* LDO functions */ +/* select LDO output voltage */ +void pmu_ldo_output_select(uint32_t ldo_output); + +/* functions of low-driver mode and high-driver mode */ +/* enable high-driver mode */ +void pmu_highdriver_mode_enable(void); +/* disable high-driver mode */ +void pmu_highdriver_mode_disable(void); +/* switch high-driver mode */ +void pmu_highdriver_switch_select(uint32_t highdr_switch); +/* enable low-driver mode in deep-sleep */ +void pmu_lowdriver_mode_enable(void); +/* disable low-driver mode in deep-sleep */ +void pmu_lowdriver_mode_disable(void); +/* in deep-sleep mode, driver mode when use low power LDO */ +void pmu_lowpower_driver_config(uint32_t mode); +/* in deep-sleep mode, driver mode when use normal power LDO */ +void pmu_normalpower_driver_config(uint32_t mode); + +/* set PMU mode */ +/* PMU work in sleep mode */ +void pmu_to_sleepmode(uint8_t sleepmodecmd); +/* PMU work in deepsleep mode */ +void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd); +/* PMU work in standby mode */ +void pmu_to_standbymode(void); +/* enable PMU wakeup pin */ +void pmu_wakeup_pin_enable(void); +/* disable PMU wakeup pin */ +void pmu_wakeup_pin_disable(void); + +/* backup related functions */ +/* backup SRAM LDO on */ +void pmu_backup_ldo_config(uint32_t bkp_ldo); +/* enable write access to the registers in backup domain */ +void pmu_backup_write_enable(void); +/* disable write access to the registers in backup domain */ +void pmu_backup_write_disable(void); + +/* flag functions */ +/* get flag state */ +FlagStatus pmu_flag_get(uint32_t flag); +/* clear flag bit */ +void pmu_flag_clear(uint32_t flag); + +#endif /* GD32F5XX_PMU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h new file mode 100644 index 00000000000..2a7aa8860ae --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h @@ -0,0 +1,1261 @@ +/*! + \file gd32f5xx_rcu.h + \brief definitions for the RCU + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_RCU_H +#define GD32F5XX_RCU_H + +#include "gd32f5xx.h" + +/* RCU definitions */ +#define RCU RCU_BASE + +/* registers definitions */ +#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ +#define RCU_PLL REG32(RCU + 0x04U) /*!< PLL register */ +#define RCU_CFG0 REG32(RCU + 0x08U) /*!< clock configuration register 0 */ +#define RCU_INT REG32(RCU + 0x0CU) /*!< clock interrupt register */ +#define RCU_AHB1RST REG32(RCU + 0x10U) /*!< AHB1 reset register */ +#define RCU_AHB2RST REG32(RCU + 0x14U) /*!< AHB2 reset register */ +#define RCU_AHB3RST REG32(RCU + 0x18U) /*!< AHB3 reset register */ +#define RCU_APB1RST REG32(RCU + 0x20U) /*!< APB1 reset register */ +#define RCU_APB2RST REG32(RCU + 0x24U) /*!< APB2 reset register */ +#define RCU_AHB1EN REG32(RCU + 0x30U) /*!< AHB1 enable register */ +#define RCU_AHB2EN REG32(RCU + 0x34U) /*!< AHB2 enable register */ +#define RCU_AHB3EN REG32(RCU + 0x38U) /*!< AHB3 enable register */ +#define RCU_APB1EN REG32(RCU + 0x40U) /*!< APB1 enable register */ +#define RCU_APB2EN REG32(RCU + 0x44U) /*!< APB2 enable register */ +#define RCU_AHB1SPEN REG32(RCU + 0x50U) /*!< AHB1 sleep mode enable register */ +#define RCU_AHB2SPEN REG32(RCU + 0x54U) /*!< AHB2 sleep mode enable register */ +#define RCU_AHB3SPEN REG32(RCU + 0x58U) /*!< AHB3 sleep mode enable register */ +#define RCU_APB1SPEN REG32(RCU + 0x60U) /*!< APB1 sleep mode enable register */ +#define RCU_APB2SPEN REG32(RCU + 0x64U) /*!< APB2 sleep mode enable register */ +#define RCU_BDCTL REG32(RCU + 0x70U) /*!< backup domain control register */ +#define RCU_RSTSCK REG32(RCU + 0x74U) /*!< reset source / clock register */ +#define RCU_PLLSSCTL REG32(RCU + 0x80U) /*!< PLL clock spread spectrum control register */ +#define RCU_PLLI2S REG32(RCU + 0x84U) /*!< PLLI2S register */ +#define RCU_PLLSAI REG32(RCU + 0x88U) /*!< PLLSAI register */ +#define RCU_CFG1 REG32(RCU + 0x8CU) /*!< clock configuration register 1 */ +#define RCU_CFG2 REG32(RCU + 0x94U) /*!< clock configuration register 2 */ +#define RCU_ADDCTL REG32(RCU + 0xC0U) /*!< additional clock control register */ +#define RCU_ADDINT REG32(RCU + 0xCCU) /*!< additional clock interrupt register */ +#define RCU_ADDAPB1RST REG32(RCU + 0xE0U) /*!< APB1 additional reset register */ +#define RCU_ADDAPB1EN REG32(RCU + 0xE4U) /*!< APB1 additional enable register */ +#define RCU_ADDAPB1SPEN REG32(RCU + 0xE8U) /*!< APB1 additional sleep mode enable register */ +#define RCU_VKEY REG32(RCU + 0x100U) /*!< voltage key register */ +#define RCU_DSV REG32(RCU + 0x134U) /*!< deep-sleep mode voltage register */ + +/* bits definitions */ +/* RCU_CTL */ +#define RCU_CTL_IRC16MEN BIT(0) /*!< internal high speed oscillator enable */ +#define RCU_CTL_IRC16MSTB BIT(1) /*!< IRC16M high speed internal oscillator stabilization flag */ +#define RCU_CTL_IRC16MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ +#define RCU_CTL_IRC16MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ +#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ +#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ +#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ +#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ +#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ +#define RCU_CTL_PLLSTB BIT(25) /*!< PLL Clock Stabilization Flag */ +#define RCU_CTL_PLLI2SEN BIT(26) /*!< PLLI2S enable */ +#define RCU_CTL_PLLI2SSTB BIT(27) /*!< PLLI2S Clock Stabilization Flag */ +#define RCU_CTL_PLLSAIEN BIT(28) /*!< PLLSAI enable */ +#define RCU_CTL_PLLSAISTB BIT(29) /*!< PLLSAI Clock Stabilization Flag */ + +/* RCU_PLL */ +#define RCU_PLL_PLLPSC BITS(0,5) /*!< the PLL VCO source clock prescaler */ +#define RCU_PLL_PLLN BITS(6,14) /*!< the PLL VCO clock multi factor */ +#define RCU_PLL_PLLP BITS(16,17) /*!< the PLLP output frequency division factor from PLL VCO clock */ +#define RCU_PLL_PLLSEL BIT(22) /*!< PLL Clock Source Selection */ +#define RCU_PLL_PLLQ BITS(24,27) /*!< the PLL Q output frequency division factor from PLL VCO clock */ + +/* RCU_CFG0 */ +#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ +#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ +#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ +#define RCU_CFG0_APB1PSC BITS(10,12) /*!< APB1 prescaler selection */ +#define RCU_CFG0_APB2PSC BITS(13,15) /*!< APB2 prescaler selection */ +#define RCU_CFG0_RTCDIV BITS(16,20) /*!< RTC clock divider factor */ +#define RCU_CFG0_CKOUT0SEL BITS(21,22) /*!< CKOUT0 Clock Source Selection */ +#define RCU_CFG0_I2SSEL BIT(23) /*!< I2S Clock Source Selection */ +#define RCU_CFG0_CKOUT0DIV BITS(24,26) /*!< the CK_OUT0 divider which the CK_OUT0 frequency can be reduced */ +#define RCU_CFG0_CKOUT1DIV BITS(27,29) /*!< the CK_OUT1 divider which the CK_OUT1 frequency can be reduced */ +#define RCU_CFG0_CKOUT1SEL BITS(30,31) /*!< CKOUT1 Clock Source Selection */ + +/* RCU_INT */ +#define RCU_INT_IRC32KSTBIF BIT(0) /*!< IRC32K stabilization interrupt flag */ +#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ +#define RCU_INT_IRC16MSTBIF BIT(2) /*!< IRC16M stabilization interrupt flag */ +#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ +#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ +#define RCU_INT_PLLI2SSTBIF BIT(5) /*!< PLLI2S stabilization interrupt flag */ +#define RCU_INT_PLLSAISTBIF BIT(6) /*!< PLLSAI stabilization interrupt flag */ +#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ +#define RCU_INT_IRC32KSTBIE BIT(8) /*!< IRC32K stabilization interrupt enable */ +#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ +#define RCU_INT_IRC16MSTBIE BIT(10) /*!< IRC16M stabilization interrupt enable */ +#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ +#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ +#define RCU_INT_PLLI2SSTBIE BIT(13) /*!< PLLI2S Stabilization Interrupt Enable */ +#define RCU_INT_PLLSAISTBIE BIT(14) /*!< PLLSAI Stabilization Interrupt Enable */ +#define RCU_INT_IRC32KSTBIC BIT(16) /*!< IRC32K Stabilization Interrupt Clear */ +#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL Stabilization Interrupt Clear */ +#define RCU_INT_IRC16MSTBIC BIT(18) /*!< IRC16M Stabilization Interrupt Clear */ +#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL Stabilization Interrupt Clear */ +#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization Interrupt Clear */ +#define RCU_INT_PLLI2SSTBIC BIT(21) /*!< PLLI2S stabilization Interrupt Clear */ +#define RCU_INT_PLLSAISTBIC BIT(22) /*!< PLLSAI stabilization Interrupt Clear */ +#define RCU_INT_CKMIC BIT(23) /*!< HXTAL Clock Stuck Interrupt Clear */ + +/* RCU_AHB1RST */ +#define RCU_AHB1RST_PARST BIT(0) /*!< GPIO port A reset */ +#define RCU_AHB1RST_PBRST BIT(1) /*!< GPIO port B reset */ +#define RCU_AHB1RST_PCRST BIT(2) /*!< GPIO port C reset */ +#define RCU_AHB1RST_PDRST BIT(3) /*!< GPIO port D reset */ +#define RCU_AHB1RST_PERST BIT(4) /*!< GPIO port E reset */ +#define RCU_AHB1RST_PFRST BIT(5) /*!< GPIO port F reset */ +#define RCU_AHB1RST_PGRST BIT(6) /*!< GPIO port G reset */ +#define RCU_AHB1RST_PHRST BIT(7) /*!< GPIO port H reset */ +#define RCU_AHB1RST_PIRST BIT(8) /*!< GPIO port I reset */ +#define RCU_AHB1RST_CRCRST BIT(12) /*!< CRC reset */ +#define RCU_AHB1RST_DMA0RST BIT(21) /*!< DMA0 reset */ +#define RCU_AHB1RST_DMA1RST BIT(22) /*!< DMA1 reset */ +#define RCU_AHB1RST_IPARST BIT(23) /*!< IPA reset */ +#define RCU_AHB1RST_ENETRST BIT(25) /*!< ENET reset */ +#define RCU_AHB1RST_USBHSRST BIT(29) /*!< USBHS reset */ + +/* RCU_AHB2RST */ +#define RCU_AHB2RST_DCIRST BIT(0) /*!< DCI reset */ +#define RCU_AHB2RST_PKCAURST BIT(3) /*!< PKCAU reset */ +#define RCU_AHB2RST_CAURST BIT(4) /*!< CAU reset */ +#define RCU_AHB2RST_HAURST BIT(5) /*!< HAU reset */ +#define RCU_AHB2RST_TRNGRST BIT(6) /*!< TRNG reset */ +#define RCU_AHB2RST_USBFSRST BIT(7) /*!< USBFS reset */ + +/* RCU_AHB3RST */ +#define RCU_AHB3RST_EXMCRST BIT(0) /*!< EXMC reset */ + +/* RCU_APB1RST */ +#define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 reset */ +#define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 reset */ +#define RCU_APB1RST_TIMER3RST BIT(2) /*!< TIMER3 reset */ +#define RCU_APB1RST_TIMER4RST BIT(3) /*!< TIMER4 reset */ +#define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 reset */ +#define RCU_APB1RST_TIMER6RST BIT(5) /*!< TIMER6 reset */ +#define RCU_APB1RST_TIMER11RST BIT(6) /*!< TIMER11 reset */ +#define RCU_APB1RST_TIMER12RST BIT(7) /*!< TIMER12 reset */ +#define RCU_APB1RST_TIMER13RST BIT(8) /*!< TIMER13 reset */ +#define RCU_APB1RST_I2C3RST BIT(10) /*!< I2C3 reset */ +#define RCU_APB1RST_WWDGTRST BIT(11) /*!< WWDGT reset */ +#define RCU_APB1RST_I2C4RST BIT(12) /*!< I2C4 reset */ +#define RCU_APB1RST_I2C5RST BIT(13) /*!< I2C5 reset */ +#define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */ +#define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */ +#define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */ +#define RCU_APB1RST_USART2RST BIT(18) /*!< USART2 reset */ +#define RCU_APB1RST_UART3RST BIT(19) /*!< UART3 reset */ +#define RCU_APB1RST_UART4RST BIT(20) /*!< UART4 reset */ +#define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */ +#define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */ +#define RCU_APB1RST_I2C2RST BIT(23) /*!< I2C2 reset */ +#define RCU_APB1RST_CAN0RST BIT(25) /*!< CAN0 reset */ +#define RCU_APB1RST_CAN1RST BIT(26) /*!< CAN1 reset */ +#define RCU_APB1RST_PMURST BIT(28) /*!< PMU reset */ +#define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */ +#define RCU_APB1RST_UART6RST BIT(30) /*!< UART6 reset */ +#define RCU_APB1RST_UART7RST BIT(31) /*!< UART7 reset */ + +/* RCU_APB2RST */ +#define RCU_APB2RST_TIMER0RST BIT(0) /*!< TIMER0 reset */ +#define RCU_APB2RST_TIMER7RST BIT(1) /*!< TIMER7 reset */ +#define RCU_APB2RST_USART0RST BIT(4) /*!< USART0 reset */ +#define RCU_APB2RST_USART5RST BIT(5) /*!< USART5 reset */ +#define RCU_APB2RST_ADCRST BIT(8) /*!< ADC reset */ +#define RCU_APB2RST_SDIORST BIT(11) /*!< SDIO reset */ +#define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */ +#define RCU_APB2RST_SPI3RST BIT(13) /*!< SPI3 reset */ +#define RCU_APB2RST_SYSCFGRST BIT(14) /*!< SYSCFG reset */ +#define RCU_APB2RST_TIMER8RST BIT(16) /*!< TIMER8 reset */ +#define RCU_APB2RST_TIMER9RST BIT(17) /*!< TIMER9 reset */ +#define RCU_APB2RST_TIMER10RST BIT(18) /*!< TIMER10 reset */ +#define RCU_APB2RST_SPI4RST BIT(20) /*!< SPI4 reset */ +#define RCU_APB2RST_SPI5RST BIT(21) /*!< SPI5 reset */ +#define RCU_APB2RST_SAIRST BIT(22) /*!< SAI reset */ +#define RCU_APB2RST_TLIRST BIT(26) /*!< TLI reset */ + +/* RCU_AHB1EN */ +#define RCU_AHB1EN_PAEN BIT(0) /*!< GPIO port A clock enable */ +#define RCU_AHB1EN_PBEN BIT(1) /*!< GPIO port B clock enable */ +#define RCU_AHB1EN_PCEN BIT(2) /*!< GPIO port C clock enable */ +#define RCU_AHB1EN_PDEN BIT(3) /*!< GPIO port D clock enable */ +#define RCU_AHB1EN_PEEN BIT(4) /*!< GPIO port E clock enable */ +#define RCU_AHB1EN_PFEN BIT(5) /*!< GPIO port F clock enable */ +#define RCU_AHB1EN_PGEN BIT(6) /*!< GPIO port G clock enable */ +#define RCU_AHB1EN_PHEN BIT(7) /*!< GPIO port H clock enable */ +#define RCU_AHB1EN_PIEN BIT(8) /*!< GPIO port I clock enable */ +#define RCU_AHB1EN_CRCEN BIT(12) /*!< CRC clock enable */ +#define RCU_AHB1EN_BKPSRAMEN BIT(18) /*!< BKPSRAM clock enable */ +#define RCU_AHB1EN_TCMSRAMEN BIT(20) /*!< TCMSRAM clock enable */ +#define RCU_AHB1EN_DMA0EN BIT(21) /*!< DMA0 clock enable */ +#define RCU_AHB1EN_DMA1EN BIT(22) /*!< DMA1 clock enable */ +#define RCU_AHB1EN_IPAEN BIT(23) /*!< IPA clock enable */ +#define RCU_AHB1EN_ENETEN BIT(25) /*!< ENET clock enable */ +#define RCU_AHB1EN_ENETTXEN BIT(26) /*!< ethernet TX clock enable */ +#define RCU_AHB1EN_ENETRXEN BIT(27) /*!< ethernet RX clock enable */ +#define RCU_AHB1EN_ENETPTPEN BIT(28) /*!< ethernet PTP clock enable */ +#define RCU_AHB1EN_USBHSEN BIT(29) /*!< USBHS clock enable */ +#define RCU_AHB1EN_USBHSULPIEN BIT(30) /*!< USBHS ULPI clock enable */ + +/* RCU_AHB2EN */ +#define RCU_AHB2EN_DCIEN BIT(0) /*!< DCI clock enable */ +#define RCU_AHB2EN_PKCAU BIT(3) /*!< PKCAU clock enable */ +#define RCU_AHB2EN_CAU BIT(4) /*!< CAU clock enable */ +#define RCU_AHB2EN_HAU BIT(5) /*!< HAU clock enable */ +#define RCU_AHB2EN_TRNGEN BIT(6) /*!< TRNG clock enable */ +#define RCU_AHB2EN_USBFSEN BIT(7) /*!< USBFS clock enable */ + +/* RCU_AHB3EN */ +#define RCU_AHB3EN_EXMCEN BIT(0) /*!< EXMC clock enable */ + +/* RCU_APB1EN */ +#define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 clock enable */ +#define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 clock enable */ +#define RCU_APB1EN_TIMER3EN BIT(2) /*!< TIMER3 clock enable */ +#define RCU_APB1EN_TIMER4EN BIT(3) /*!< TIMER4 clock enable */ +#define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 clock enable */ +#define RCU_APB1EN_TIMER6EN BIT(5) /*!< TIMER6 clock enable */ +#define RCU_APB1EN_TIMER11EN BIT(6) /*!< TIMER11 clock enable */ +#define RCU_APB1EN_TIMER12EN BIT(7) /*!< TIMER12 clock enable */ +#define RCU_APB1EN_TIMER13EN BIT(8) /*!< TIMER13 clock enable */ +#define RCU_APB1EN_I2C3EN BIT(10) /*!< I2C3 clock enable */ +#define RCU_APB1EN_WWDGTEN BIT(11) /*!< WWDGT clock enable */ +#define RCU_APB1EN_I2C4EN BIT(12) /*!< I2C4 clock enable */ +#define RCU_APB1EN_I2C5EN BIT(13) /*!< I2C5 clock enable */ +#define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */ +#define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */ +#define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */ +#define RCU_APB1EN_USART2EN BIT(18) /*!< USART2 clock enable */ +#define RCU_APB1EN_UART3EN BIT(19) /*!< UART3 clock enable */ +#define RCU_APB1EN_UART4EN BIT(20) /*!< UART4 clock enable */ +#define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */ +#define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */ +#define RCU_APB1EN_I2C2EN BIT(23) /*!< I2C2 clock enable */ +#define RCU_APB1EN_CAN0EN BIT(25) /*!< CAN0 clock enable */ +#define RCU_APB1EN_CAN1EN BIT(26) /*!< CAN1 clock enable */ +#define RCU_APB1EN_PMUEN BIT(28) /*!< PMU clock enable */ +#define RCU_APB1EN_DACEN BIT(29) /*!< DAC clock enable */ +#define RCU_APB1EN_UART6EN BIT(30) /*!< UART6 clock enable */ +#define RCU_APB1EN_UART7EN BIT(31) /*!< UART7 clock enable */ + +/* RCU_APB2EN */ +#define RCU_APB2EN_TIMER0EN BIT(0) /*!< TIMER0 clock enable */ +#define RCU_APB2EN_TIMER7EN BIT(1) /*!< TIMER7 clock enable */ +#define RCU_APB2EN_USART0EN BIT(4) /*!< USART0 clock enable */ +#define RCU_APB2EN_USART5EN BIT(5) /*!< USART5 clock enable */ +#define RCU_APB2EN_ADC0EN BIT(8) /*!< ADC0 clock enable */ +#define RCU_APB2EN_ADC1EN BIT(9) /*!< ADC1 clock enable */ +#define RCU_APB2EN_ADC2EN BIT(10) /*!< ADC2 clock enable */ +#define RCU_APB2EN_SDIOEN BIT(11) /*!< SDIO clock enable */ +#define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */ +#define RCU_APB2EN_SPI3EN BIT(13) /*!< SPI3 clock enable */ +#define RCU_APB2EN_SYSCFGEN BIT(14) /*!< SYSCFG clock enable */ +#define RCU_APB2EN_TIMER8EN BIT(16) /*!< TIMER8 clock enable */ +#define RCU_APB2EN_TIMER9EN BIT(17) /*!< TIMER9 clock enable */ +#define RCU_APB2EN_TIMER10EN BIT(18) /*!< TIMER10 clock enable */ +#define RCU_APB2EN_SPI4EN BIT(20) /*!< SPI4 clock enable */ +#define RCU_APB2EN_SPI5EN BIT(21) /*!< SPI5 clock enable */ +#define RCU_APB2EN_SAIEN BIT(22) /*!< SAI clock enable */ +#define RCU_APB2EN_TLIEN BIT(26) /*!< TLI clock enable */ + +/* RCU_AHB1SPEN */ +#define RCU_AHB1SPEN_PASPEN BIT(0) /*!< GPIO port A clock enable when sleep mode */ +#define RCU_AHB1SPEN_PBSPEN BIT(1) /*!< GPIO port B clock enable when sleep mode */ +#define RCU_AHB1SPEN_PCSPEN BIT(2) /*!< GPIO port C clock enable when sleep mode */ +#define RCU_AHB1SPEN_PDSPEN BIT(3) /*!< GPIO port D clock enable when sleep mode */ +#define RCU_AHB1SPEN_PESPEN BIT(4) /*!< GPIO port E clock enable when sleep mode */ +#define RCU_AHB1SPEN_PFSPEN BIT(5) /*!< GPIO port F clock enable when sleep mode */ +#define RCU_AHB1SPEN_PGSPEN BIT(6) /*!< GPIO port G clock enable when sleep mode */ +#define RCU_AHB1SPEN_PHSPEN BIT(7) /*!< GPIO port H clock enable when sleep mode */ +#define RCU_AHB1SPEN_PISPEN BIT(8) /*!< GPIO port I clock enable when sleep mode */ +#define RCU_AHB1SPEN_CRCSPEN BIT(12) /*!< CRC clock enable when sleep mode */ +#define RCU_AHB1SPEN_FMCSPEN BIT(15) /*!< FMC clock enable when sleep mode */ +#define RCU_AHB1SPEN_SRAM0SPEN BIT(16) /*!< SRAM0 clock enable when sleep mode */ +#define RCU_AHB1SPEN_SRAM1SPEN BIT(17) /*!< SRAM1 clock enable when sleep mode */ +#define RCU_AHB1SPEN_BKPSRAMSPEN BIT(18) /*!< BKPSRAM clock enable when sleep mode */ +#define RCU_AHB1SPEN_SRAM2SPEN BIT(19) /*!< SRAM2 clock enable when sleep mode */ +#define RCU_AHB1SPEN_DMA0SPEN BIT(21) /*!< DMA0 clock when sleep mode enable */ +#define RCU_AHB1SPEN_DMA1SPEN BIT(22) /*!< DMA1 clock when sleep mode enable */ +#define RCU_AHB1SPEN_IPASPEN BIT(23) /*!< IPA clock enable when sleep mode */ +#define RCU_AHB1SPEN_ENETSPEN BIT(25) /*!< ENET clock enable when sleep mode */ +#define RCU_AHB1SPEN_ENETTXSPEN BIT(26) /*!< ethernet TX clock enable when sleep mode */ +#define RCU_AHB1SPEN_ENETRXSPEN BIT(27) /*!< ethernet RX clock enable when sleep mode */ +#define RCU_AHB1SPEN_ENETPTPSPEN BIT(28) /*!< ethernet PTP clock enable when sleep mode */ +#define RCU_AHB1SPEN_USBHSSPEN BIT(29) /*!< USBHS clock enable when sleep mode */ +#define RCU_AHB1SPEN_USBHSULPISPEN BIT(30) /*!< USBHS ULPI clock enable when sleep mode */ + +/* RCU_AHB2SPEN */ +#define RCU_AHB2SPEN_DCISPEN BIT(0) /*!< DCI clock enable when sleep mode */ +#define RCU_AHB2SPEN_PKCAUSPEN BIT(3) /*!< PKCAU clock enable when sleep mode */ +#define RCU_AHB2SPEN_CAUSPEN BIT(4) /*!< CAU clock enable when sleep mode */ +#define RCU_AHB2SPEN_HAUSPEN BIT(5) /*!< HAU clock enable when sleep mode */ +#define RCU_AHB2SPEN_TRNGSPEN BIT(6) /*!< TRNG clock enable when sleep mode */ +#define RCU_AHB2SPEN_USBFSSPEN BIT(7) /*!< USBFS clock enable when sleep mode */ + +/* RCU_AHB3SPEN */ +#define RCU_AHB3SPEN_EXMCSPEN BIT(0) /*!< EXMC clock enable when sleep mode */ + +/* RCU_APB1SPEN */ +#define RCU_APB1SPEN_TIMER1SPEN BIT(0) /*!< TIMER1 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER2SPEN BIT(1) /*!< TIMER2 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER3SPEN BIT(2) /*!< TIMER3 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER4SPEN BIT(3) /*!< TIMER4 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER5SPEN BIT(4) /*!< TIMER5 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER6SPEN BIT(5) /*!< TIMER6 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER11SPEN BIT(6) /*!< TIMER11 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER12SPEN BIT(7) /*!< TIMER12 clock enable when sleep mode */ +#define RCU_APB1SPEN_TIMER13SPEN BIT(8) /*!< TIMER13 clock enable when sleep mode */ +#define RCU_APB1SPEN_I2C3SPEN BIT(10) /*!< I2C3 clock enable when sleep mode */ +#define RCU_APB1SPEN_WWDGTSPEN BIT(11) /*!< WWDGT clock enable when sleep mode */ +#define RCU_APB1SPEN_I2C4SPEN BIT(12) /*!< I2C4 clock enable when sleep mode */ +#define RCU_APB1SPEN_I2C5SPEN BIT(13) /*!< I2C5 clock enable when sleep mode*/ +#define RCU_APB1SPEN_SPI1SPEN BIT(14) /*!< SPI1 clock enable when sleep mode */ +#define RCU_APB1SPEN_SPI2SPEN BIT(15) /*!< SPI2 clock enable when sleep mode */ +#define RCU_APB1SPEN_USART1SPEN BIT(17) /*!< USART1 clock enable when sleep mode*/ +#define RCU_APB1SPEN_USART2SPEN BIT(18) /*!< USART2 clock enable when sleep mode*/ +#define RCU_APB1SPEN_UART3SPEN BIT(19) /*!< UART3 clock enable when sleep mode*/ +#define RCU_APB1SPEN_UART4SPEN BIT(20) /*!< UART4 clock enable when sleep mode */ +#define RCU_APB1SPEN_I2C0SPEN BIT(21) /*!< I2C0 clock enable when sleep mode */ +#define RCU_APB1SPEN_I2C1SPEN BIT(22) /*!< I2C1 clock enable when sleep mode*/ +#define RCU_APB1SPEN_I2C2SPEN BIT(23) /*!< I2C2 clock enable when sleep mode */ +#define RCU_APB1SPEN_CAN0SPEN BIT(25) /*!< CAN0 clock enable when sleep mode*/ +#define RCU_APB1SPEN_CAN1SPEN BIT(26) /*!< CAN1 clock enable when sleep mode */ +#define RCU_APB1SPEN_PMUSPEN BIT(28) /*!< PMU clock enable when sleep mode */ +#define RCU_APB1SPEN_DACSPEN BIT(29) /*!< DAC clock enable when sleep mode */ +#define RCU_APB1SPEN_UART6SPEN BIT(30) /*!< UART6 clock enable when sleep mode */ +#define RCU_APB1SPEN_UART7SPEN BIT(31) /*!< UART7 clock enable when sleep mode */ + +/* RCU_APB2SPEN */ +#define RCU_APB2SPEN_TIMER0SPEN BIT(0) /*!< TIMER0 clock enable when sleep mode */ +#define RCU_APB2SPEN_TIMER7SPEN BIT(1) /*!< TIMER7 clock enable when sleep mode */ +#define RCU_APB2SPEN_USART0SPEN BIT(4) /*!< USART0 clock enable when sleep mode */ +#define RCU_APB2SPEN_USART5SPEN BIT(5) /*!< USART5 clock enable when sleep mode */ +#define RCU_APB2SPEN_ADC0SPEN BIT(8) /*!< ADC0 clock enable when sleep mode */ +#define RCU_APB2SPEN_ADC1SPEN BIT(9) /*!< ADC1 clock enable when sleep mode */ +#define RCU_APB2SPEN_ADC2SPEN BIT(10) /*!< ADC2 clock enable when sleep mode */ +#define RCU_APB2SPEN_SDIOSPEN BIT(11) /*!< SDIO clock enable when sleep mode */ +#define RCU_APB2SPEN_SPI0SPEN BIT(12) /*!< SPI0 clock enable when sleep mode */ +#define RCU_APB2SPEN_SPI3SPEN BIT(13) /*!< SPI3 clock enable when sleep mode */ +#define RCU_APB2SPEN_SYSCFGSPEN BIT(14) /*!< SYSCFG clock enable when sleep mode */ +#define RCU_APB2SPEN_TIMER8SPEN BIT(16) /*!< TIMER8 clock enable when sleep mode */ +#define RCU_APB2SPEN_TIMER9SPEN BIT(17) /*!< TIMER9 clock enable when sleep mode */ +#define RCU_APB2SPEN_TIMER10SPEN BIT(18) /*!< TIMER10 clock enable when sleep mode */ +#define RCU_APB2SPEN_SPI4SPEN BIT(20) /*!< SPI4 clock enable when sleep mode */ +#define RCU_APB2SPEN_SPI5SPEN BIT(21) /*!< SPI5 clock enable when sleep mode */ +#define RCU_APB2SPEN_SAISPEN BIT(22) /*!< SAI clock enable when sleep mode */ +#define RCU_APB2SPEN_TLISPEN BIT(26) /*!< TLI clock enable when sleep mode*/ + +/* RCU_BDCTL */ +#define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */ +#define RCU_BDCTL_LXTALSTB BIT(1) /*!< low speed crystal oscillator stabilization flag */ +#define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */ +#define RCU_BDCTL_LXTALDRI BIT(3) /*!< LXTAL drive capability */ +#define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */ +#define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */ +#define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */ + +/* RCU_RSTSCK */ +#define RCU_RSTSCK_IRC32KEN BIT(0) /*!< IRC32K enable */ +#define RCU_RSTSCK_IRC32KSTB BIT(1) /*!< IRC32K stabilization flag */ +#define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */ +#define RCU_RSTSCK_BORRSTF BIT(25) /*!< BOR reset flag */ +#define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */ +#define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */ +#define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */ +#define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */ +#define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */ +#define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */ + +/* RCU_PLLSSCTL */ +#define RCU_PLLSSCTL_MODCNT BITS(0,12) /*!< these bits configure PLL spread spectrum modulation + profile amplitude and frequency. the following criteria + must be met: MODSTEP*MODCNT=215-1 */ +#define RCU_PLLSSCTL_MODSTEP BITS(13,27) /*!< these bits configure PLL spread spectrum modulation + profile amplitude and frequency. the following criteria + must be met: MODSTEP*MODCNT=215-1 */ +#define RCU_PLLSSCTL_SS_TYPE BIT(30) /*!< PLL spread spectrum modulation type select */ +#define RCU_PLLSSCTL_SSCGON BIT(31) /*!< PLL spread spectrum modulation enable */ + +/* RCU_PLLI2S */ +#define RCU_PLLI2S_PLLI2SN BITS(6,14) /*!< the PLLI2S VCO clock multi factor */ +#define RCU_PLLI2S_PLLI2SQ BITS(24,27) /*!< the PLLI2S Q output frequency division factor from PLLI2S VCO clock */ +#define RCU_PLLI2S_PLLI2SR BITS(28,30) /*!< the PLLI2S R output frequency division factor from PLLI2S VCO clock */ + +/* RCU_PLLSAI */ +#define RCU_PLLSAI_PLLSAIN BITS(6,14) /*!< the PLLSAI VCO clock multi factor */ +#define RCU_PLLSAI_PLLSAIP BITS(16,17) /*!< the PLLSAI P output frequency division factor from PLLSAI VCO clock */ +#define RCU_PLLSAI_PLLSAIQ BITS(24,27) /*!< the PLLSAI Q output frequency division factor from PLLSAI VCO clock */ +#define RCU_PLLSAI_PLLSAIR BITS(28,30) /*!< the PLLSAI R output frequency division factor from PLLSAI VCO clock */ + +/* RCU_CFG1 */ +#define RCU_CFG1_PLLSAIRDIV BITS(16,17) /*!< the divider factor from PLLSAIR clock */ + +/* RCU_SAISEL */ +#define RCU_CFG1_SAISEL BITS(20,21) /*!< SAI clock selection */ +#define RCU_CFG1_TIMERSEL BIT(24) /*!< TIMER clock selection */ + +/* RCU_CFG2 */ +#define RCU_CFG2_I2C3SEL BITS(0,1) /*!< I2C3 clock source selection */ +#define RCU_CFG2_I2C4SEL BITS(2,3) /*!< I2C4 clock source selection */ +#define RCU_CFG2_I2C5SEL BITS(4,5) /*!< I2C5 clock source selection */ + +/* RCU_ADDCTL */ +#define RCU_ADDCTL_CK48MSEL BIT(0) /*!< 48MHz clock selection */ +#define RCU_ADDCTL_PLL48MSEL BIT(1) /*!< PLL48M clock selection */ +#define RCU_ADDCTL_IRC48MEN BIT(16) /*!< internal 48MHz RC oscillator enable */ +#define RCU_ADDCTL_IRC48MSTB BIT(17) /*!< internal 48MHz RC oscillator clock stabilization flag */ +#define RCU_ADDCTL_IRC48MCAL BITS(24,31) /*!< internal 48MHz RC oscillator calibration value register */ + +/* RCU_ADDINT */ +#define RCU_ADDINT_IRC48MSTBIF BIT(6) /*!< IRC48M stabilization interrupt flag */ +#define RCU_ADDINT_IRC48MSTBIE BIT(14) /*!< internal 48 MHz RC oscillator stabilization interrupt enable */ +#define RCU_ADDINT_IRC48MSTBIC BIT(22) /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ + +/* RCU_ADDAPB1RST */ +#define RCU_ADDAPB1RST_CTCRST BIT(27) /*!< CTC reset */ +#define RCU_ADDAPB1RST_IREFRST BIT(31) /*!< IREF reset */ + +/* RCU_ADDAPB1EN */ +#define RCU_ADDAPB1EN_CTCEN BIT(27) /*!< CTC clock enable */ +#define RCU_ADDAPB1EN_IREFEN BIT(31) /*!< IREF interface clock enable */ + +/* RCU_ADDAPB1SPEN */ +#define RCU_ADDAPB1SPEN_CTCSPEN BIT(27) /*!< CTC clock enable during sleep mode */ +#define RCU_ADDAPB1SPEN_IREFSPEN BIT(31) /*!< IREF interface clock enable during sleep mode */ + +/* RCU_VKEY */ +#define RCU_VKEY_KEY BITS(0,31) /*!< RCU_DSV key register */ + +/* RCU_DSV */ +#define RCU_DSV_DSLPVS BITS(0,2) /*!< deep-sleep mode voltage select */ + +/* constants definitions */ +/* define the peripheral clock enable bit position and its register index offset */ +#define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph) >> 6))) +#define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +/* define the voltage key unlock value */ +#define RCU_VKEY_UNLOCK ((uint32_t)0x1A2B3C4DU) + +/* register offset */ +/* peripherals enable */ +#define AHB1EN_REG_OFFSET 0x30U /*!< AHB1 enable register offset */ +#define AHB2EN_REG_OFFSET 0x34U /*!< AHB2 enable register offset */ +#define AHB3EN_REG_OFFSET 0x38U /*!< AHB3 enable register offset */ +#define APB1EN_REG_OFFSET 0x40U /*!< APB1 enable register offset */ +#define APB2EN_REG_OFFSET 0x44U /*!< APB2 enable register offset */ +#define AHB1SPEN_REG_OFFSET 0x50U /*!< AHB1 sleep mode enable register offset */ +#define AHB2SPEN_REG_OFFSET 0x54U /*!< AHB2 sleep mode enable register offset */ +#define AHB3SPEN_REG_OFFSET 0x58U /*!< AHB3 sleep mode enable register offset */ +#define APB1SPEN_REG_OFFSET 0x60U /*!< APB1 sleep mode enable register offset */ +#define APB2SPEN_REG_OFFSET 0x64U /*!< APB2 sleep mode enable register offset */ +#define ADD_APB1EN_REG_OFFSET 0xE4U /*!< APB1 additional enable register offset */ +#define ADD_APB1SPEN_REG_OFFSET 0xE8U /*!< APB1 additional sleep mode enable register offset */ + +/* peripherals reset */ +#define AHB1RST_REG_OFFSET 0x10U /*!< AHB1 reset register offset */ +#define AHB2RST_REG_OFFSET 0x14U /*!< AHB2 reset register offset */ +#define AHB3RST_REG_OFFSET 0x18U /*!< AHB3 reset register offset */ +#define APB1RST_REG_OFFSET 0x20U /*!< APB1 reset register offset */ +#define APB2RST_REG_OFFSET 0x24U /*!< APB2 reset register offset */ +#define ADD_APB1RST_REG_OFFSET 0xE0U /*!< APB1 additional reset register offset */ +#define RSTSCK_REG_OFFSET 0x74U /*!< reset source/clock register offset */ + +/* clock control */ +#define CTL_REG_OFFSET 0x00U /*!< control register offset */ +#define BDCTL_REG_OFFSET 0x70U /*!< backup domain control register offset */ +#define ADDCTL_REG_OFFSET 0xC0U /*!< additional clock control register offset */ + +/* clock stabilization and stuck interrupt */ +#define INT_REG_OFFSET 0x0CU /*!< clock interrupt register offset */ +#define ADDINT_REG_OFFSET 0xCCU /*!< additional clock interrupt register offset */ + +/* configuration register */ +#define PLL_REG_OFFSET 0x04U /*!< PLL register offset */ +#define CFG0_REG_OFFSET 0x08U /*!< clock configuration register 0 offset */ +#define PLLSSCTL_REG_OFFSET 0x80U /*!< PLL clock spread spectrum control register offset */ +#define PLLI2S_REG_OFFSET 0x84U /*!< PLLI2S register offset */ +#define PLLSAI_REG_OFFSET 0x88U /*!< PLLSAI register offset */ +#define CFG1_REG_OFFSET 0x8CU /*!< clock configuration register 1 offset */ + +/* peripheral clock enable */ +typedef enum +{ + /* AHB1 peripherals */ + RCU_GPIOA = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 0U), /*!< GPIOA clock */ + RCU_GPIOB = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 1U), /*!< GPIOB clock */ + RCU_GPIOC = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 2U), /*!< GPIOC clock */ + RCU_GPIOD = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 3U), /*!< GPIOD clock */ + RCU_GPIOE = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 4U), /*!< GPIOE clock */ + RCU_GPIOF = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 5U), /*!< GPIOF clock */ + RCU_GPIOG = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 6U), /*!< GPIOG clock */ + RCU_GPIOH = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 7U), /*!< GPIOH clock */ + RCU_GPIOI = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 8U), /*!< GPIOI clock */ + RCU_CRC = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 12U), /*!< CRC clock */ + RCU_BKPSRAM = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 18U), /*!< BKPSRAM clock */ + RCU_TCMSRAM = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 20U), /*!< TCMSRAM clock */ + RCU_DMA0 = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 21U), /*!< DMA0 clock */ + RCU_DMA1 = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 22U), /*!< DMA1 clock */ + RCU_IPA = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 23U), /*!< IPA clock */ + RCU_ENET = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 25U), /*!< ENET clock */ + RCU_ENETTX = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 26U), /*!< ENETTX clock */ + RCU_ENETRX = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 27U), /*!< ENETRX clock */ + RCU_ENETPTP = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 28U), /*!< ENETPTP clock */ + RCU_USBHS = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 29U), /*!< USBHS clock */ + RCU_USBHSULPI = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 30U), /*!< USBHSULPI clock */ + /* AHB2 peripherals */ + RCU_DCI = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 0U), /*!< DCI clock */ + RCU_PKCAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 3U), /*!< PKCAU clock */ + RCU_CAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 4U), /*!< CAU clock */ + RCU_HAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 5U), /*!< HAU clock */ + RCU_TRNG = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 6U), /*!< TRNG clock */ + RCU_USBFS = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 7U), /*!< USBFS clock */ + /* AHB3 peripherals */ + RCU_EXMC = RCU_REGIDX_BIT(AHB3EN_REG_OFFSET, 0U), /*!< EXMC clock */ + /* APB1 peripherals */ + RCU_TIMER1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U), /*!< TIMER1 clock */ + RCU_TIMER2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U), /*!< TIMER2 clock */ + RCU_TIMER3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U), /*!< TIMER3 clock */ + RCU_TIMER4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U), /*!< TIMER4 clock */ + RCU_TIMER5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U), /*!< TIMER5 clock */ + RCU_TIMER6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U), /*!< TIMER6 clock */ + RCU_TIMER11 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 6U), /*!< TIMER11 clock */ + RCU_TIMER12 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 7U), /*!< TIMER12 clock */ + RCU_TIMER13 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 8U), /*!< TIMER13 clock */ + RCU_I2C3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 10U), /*!< I2C3 clock */ + RCU_WWDGT = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U), /*!< WWDGT clock */ + RCU_I2C4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 12U), /*!< I2C4 clock */ + RCU_I2C5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 13U), /*!< I2C5 clock */ + RCU_SPI1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U), /*!< SPI1 clock */ + RCU_SPI2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U), /*!< SPI2 clock */ + RCU_USART1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U), /*!< USART1 clock */ + RCU_USART2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U), /*!< USART2 clock */ + RCU_UART3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U), /*!< UART3 clock */ + RCU_UART4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U), /*!< UART4 clock */ + RCU_I2C0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U), /*!< I2C0 clock */ + RCU_I2C1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U), /*!< I2C1 clock */ + RCU_I2C2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 23U), /*!< I2C2 clock */ + RCU_CAN0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U), /*!< CAN0 clock */ + RCU_CAN1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U), /*!< CAN1 clock */ + RCU_PMU = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U), /*!< PMU clock */ + RCU_DAC = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U), /*!< DAC clock */ + RCU_UART6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 30U), /*!< UART6 clock */ + RCU_UART7 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 31U), /*!< UART7 clock */ + RCU_RTC = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U), /*!< RTC clock */ + /* APB2 peripherals */ + RCU_TIMER0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U), /*!< TIMER0 clock */ + RCU_TIMER7 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 1U), /*!< TIMER7 clock */ + RCU_USART0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U), /*!< USART0 clock */ + RCU_USART5 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U), /*!< USART5 clock */ + RCU_ADC0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 8U), /*!< ADC0 clock */ + RCU_ADC1 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U), /*!< ADC1 clock */ + RCU_ADC2 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U), /*!< ADC2 clock */ + RCU_SDIO = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U), /*!< SDIO clock */ + RCU_SPI0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U), /*!< SPI0 clock */ + RCU_SPI3 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 13U), /*!< SPI3 clock */ + RCU_SYSCFG = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U), /*!< SYSCFG clock */ + RCU_TIMER8 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 16U), /*!< TIMER8 clock */ + RCU_TIMER9 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 17U), /*!< TIMER9 clock */ + RCU_TIMER10 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 18U), /*!< TIMER10 clock */ + RCU_SPI4 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 20U), /*!< SPI4 clock */ + RCU_SPI5 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 21U), /*!< SPI5 clock */ + RCU_SAI = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 22U), /*!< SAI clock */ + RCU_TLI = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 26U), /*!< TLI clock */ + /* APB1 additional peripherals */ + RCU_CTC = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 27U), /*!< CTC clock */ + RCU_IREF = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 31U), /*!< IREF clock */ +}rcu_periph_enum; + +/* peripheral clock enable when sleep mode*/ +typedef enum +{ + /* AHB1 peripherals */ + RCU_GPIOA_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 0U), /*!< GPIOA clock */ + RCU_GPIOB_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 1U), /*!< GPIOB clock */ + RCU_GPIOC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 2U), /*!< GPIOC clock */ + RCU_GPIOD_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 3U), /*!< GPIOD clock */ + RCU_GPIOE_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 4U), /*!< GPIOE clock */ + RCU_GPIOF_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 5U), /*!< GPIOF clock */ + RCU_GPIOG_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 6U), /*!< GPIOG clock */ + RCU_GPIOH_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 7U), /*!< GPIOH clock */ + RCU_GPIOI_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 8U), /*!< GPIOI clock */ + RCU_CRC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 12U), /*!< CRC clock */ + RCU_FMC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 15U), /*!< FMC clock */ + RCU_SRAM0_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 16U), /*!< SRAM0 clock */ + RCU_SRAM1_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 17U), /*!< SRAM1 clock */ + RCU_BKPSRAM_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 18U), /*!< BKPSRAM clock */ + RCU_SRAM2_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 19U), /*!< SRAM2 clock */ + RCU_DMA0_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 21U), /*!< DMA0 clock */ + RCU_DMA1_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 22U), /*!< DMA1 clock */ + RCU_IPA_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 23U), /*!< IPA clock */ + RCU_ENET_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 25U), /*!< ENET clock */ + RCU_ENETTX_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 26U), /*!< ENETTX clock */ + RCU_ENETRX_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 27U), /*!< ENETRX clock */ + RCU_ENETPTP_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 28U), /*!< ENETPTP clock */ + RCU_USBHS_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 29U), /*!< USBHS clock */ + RCU_USBHSULPI_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 30U), /*!< USBHSULPI clock */ + /* AHB2 peripherals */ + RCU_DCI_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 0U), /*!< DCI clock */ + RCU_PKCAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 3U), /*!< PKCAU clock */ + RCU_CAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 4U), /*!< CAU clock */ + RCU_HAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 5U), /*!< HAU clock */ + RCU_TRNG_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 6U), /*!< TRNG clock */ + RCU_USBFS_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 7U), /*!< USBFS clock */ + /* AHB3 peripherals */ + RCU_EXMC_SLP = RCU_REGIDX_BIT(AHB3SPEN_REG_OFFSET, 0U), /*!< EXMC clock */ + /* APB1 peripherals */ + RCU_TIMER1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 0U), /*!< TIMER1 clock */ + RCU_TIMER2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 1U), /*!< TIMER2 clock */ + RCU_TIMER3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 2U), /*!< TIMER3 clock */ + RCU_TIMER4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 3U), /*!< TIMER4 clock */ + RCU_TIMER5_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 4U), /*!< TIMER5 clock */ + RCU_TIMER6_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 5U), /*!< TIMER6 clock */ + RCU_TIMER11_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 6U), /*!< TIMER11 clock */ + RCU_TIMER12_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 7U), /*!< TIMER12 clock */ + RCU_TIMER13_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 8U), /*!< TIMER13 clock */ + RCU_I2C3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 10U), /*!< I2C3 clock */ + RCU_WWDGT_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 11U), /*!< WWDGT clock */ + RCU_I2C4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 12U), /*!< I2C4 clock */ + RCU_I2C5_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 13U), /*!< I2C5 clock */ + RCU_SPI1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 14U), /*!< SPI1 clock */ + RCU_SPI2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 15U), /*!< SPI2 clock */ + RCU_USART1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 17U), /*!< USART1 clock */ + RCU_USART2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 18U), /*!< USART2 clock */ + RCU_UART3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 19U), /*!< UART3 clock */ + RCU_UART4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 20U), /*!< UART4 clock */ + RCU_I2C0_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 21U), /*!< I2C0 clock */ + RCU_I2C1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 22U), /*!< I2C1 clock */ + RCU_I2C2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 23U), /*!< I2C2 clock */ + RCU_CAN0_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 25U), /*!< CAN0 clock */ + RCU_CAN1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 26U), /*!< CAN1 clock */ + RCU_PMU_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 28U), /*!< PMU clock */ + RCU_DAC_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 29U), /*!< DAC clock */ + RCU_UART6_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 30U), /*!< UART6 clock */ + RCU_UART7_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 31U), /*!< UART7 clock */ + /* APB2 peripherals */ + RCU_TIMER0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 0U), /*!< TIMER0 clock */ + RCU_TIMER7_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 1U), /*!< TIMER7 clock */ + RCU_USART0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 4U), /*!< USART0 clock */ + RCU_USART5_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 5U), /*!< USART5 clock */ + RCU_ADC0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 8U), /*!< ADC0 clock */ + RCU_ADC1_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 9U), /*!< ADC1 clock */ + RCU_ADC2_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 10U), /*!< ADC2 clock */ + RCU_SDIO_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 11U), /*!< SDIO clock */ + RCU_SPI0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 12U), /*!< SPI0 clock */ + RCU_SPI3_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 13U), /*!< SPI3 clock */ + RCU_SYSCFG_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 14U), /*!< SYSCFG clock */ + RCU_TIMER8_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 16U), /*!< TIMER8 clock */ + RCU_TIMER9_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 17U), /*!< TIMER9 clock */ + RCU_TIMER10_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 18U), /*!< TIMER10 clock */ + RCU_SPI4_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 20U), /*!< SPI4 clock */ + RCU_SPI5_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 21U), /*!< SPI5 clock */ + RCU_SAI_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 22U), /*!< SAI clock */ + RCU_TLI_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 26U), /*!< TLI clock */ + /* APB1 additional peripherals */ + RCU_CTC_SLP = RCU_REGIDX_BIT(ADD_APB1SPEN_REG_OFFSET, 27U), /*!< CTC clock */ + RCU_IREF_SLP = RCU_REGIDX_BIT(ADD_APB1SPEN_REG_OFFSET, 31U), /*!< IREF clock */ +}rcu_periph_sleep_enum; + +/* peripherals reset */ +typedef enum +{ + /* AHB1 peripherals */ + RCU_GPIOARST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 0U), /*!< GPIOA clock reset */ + RCU_GPIOBRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 1U), /*!< GPIOB clock reset */ + RCU_GPIOCRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 2U), /*!< GPIOC clock reset */ + RCU_GPIODRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 3U), /*!< GPIOD clock reset */ + RCU_GPIOERST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 4U), /*!< GPIOE clock reset */ + RCU_GPIOFRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 5U), /*!< GPIOF clock reset */ + RCU_GPIOGRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 6U), /*!< GPIOG clock reset */ + RCU_GPIOHRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 7U), /*!< GPIOH clock reset */ + RCU_GPIOIRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 8U), /*!< GPIOI clock reset */ + RCU_CRCRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 12U), /*!< CRC clock reset */ + RCU_DMA0RST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 21U), /*!< DMA0 clock reset */ + RCU_DMA1RST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 22U), /*!< DMA1 clock reset */ + RCU_IPARST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 23U), /*!< IPA clock reset */ + RCU_ENETRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 25U), /*!< ENET clock reset */ + RCU_USBHSRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 29U), /*!< USBHS clock reset */ + /* AHB2 peripherals */ + RCU_DCIRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 0U), /*!< DCI clock reset */ + RCU_PKCAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 3U), /*!< PKCAU clock reset */ + RCU_CAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 4U), /*!< CAU clock reset */ + RCU_HAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 5U), /*!< HAU clock reset */ + RCU_TRNGRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 6U), /*!< TRNG clock reset */ + RCU_USBFSRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 7U), /*!< USBFS clock reset */ + /* AHB3 peripherals */ + RCU_EXMCRST = RCU_REGIDX_BIT(AHB3RST_REG_OFFSET, 0U), /*!< EXMC clock reset */ + /* APB1 peripherals */ + RCU_TIMER1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 0U), /*!< TIMER1 clock reset */ + RCU_TIMER2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 1U), /*!< TIMER2 clock reset */ + RCU_TIMER3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 2U), /*!< TIMER3 clock reset */ + RCU_TIMER4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 3U), /*!< TIMER4 clock reset */ + RCU_TIMER5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 4U), /*!< TIMER5 clock reset */ + RCU_TIMER6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 5U), /*!< TIMER6 clock reset */ + RCU_TIMER11RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 6U), /*!< TIMER11 clock reset */ + RCU_TIMER12RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 7U), /*!< TIMER12 clock reset */ + RCU_TIMER13RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 8U), /*!< TIMER13 clock reset */ + RCU_I2C3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 10U), /*!< I2C3 clock reset */ + RCU_WWDGTRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 11U), /*!< WWDGT clock reset */ + RCU_I2C4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 12U), /*!< I2C4 clock reset */ + RCU_I2C5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 13U), /*!< I2C5 clock reset */ + RCU_SPI1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 14U), /*!< SPI1 clock reset */ + RCU_SPI2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 15U), /*!< SPI2 clock reset */ + RCU_USART1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 17U), /*!< USART1 clock reset */ + RCU_USART2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 18U), /*!< USART2 clock reset */ + RCU_UART3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 19U), /*!< UART3 clock reset */ + RCU_UART4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 20U), /*!< UART4 clock reset */ + RCU_I2C0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 21U), /*!< I2C0 clock reset */ + RCU_I2C1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 22U), /*!< I2C1 clock reset */ + RCU_I2C2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 23U), /*!< I2C2 clock reset */ + RCU_CAN0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 25U), /*!< CAN0 clock reset */ + RCU_CAN1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 26U), /*!< CAN1 clock reset */ + RCU_PMURST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 28U), /*!< PMU clock reset */ + RCU_DACRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 29U), /*!< DAC clock reset */ + RCU_UART6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 30U), /*!< UART6 clock reset */ + RCU_UART7RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 31U), /*!< UART7 clock reset */ + /* APB2 peripherals */ + RCU_TIMER0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 0U), /*!< TIMER0 clock reset */ + RCU_TIMER7RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 1U), /*!< TIMER7 clock reset */ + RCU_USART0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 4U), /*!< USART0 clock reset */ + RCU_USART5RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 5U), /*!< USART5 clock reset */ + RCU_ADCRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 8U), /*!< ADCs all clock reset */ + RCU_SDIORST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 11U), /*!< SDIO clock reset */ + RCU_SPI0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 12U), /*!< SPI0 clock reset */ + RCU_SPI3RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 13U), /*!< SPI3 clock reset */ + RCU_SYSCFGRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 14U), /*!< SYSCFG clock reset */ + RCU_TIMER8RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 16U), /*!< TIMER8 clock reset */ + RCU_TIMER9RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 17U), /*!< TIMER9 clock reset */ + RCU_TIMER10RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 18U), /*!< TIMER10 clock reset */ + RCU_SPI4RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 20U), /*!< SPI4 clock reset */ + RCU_SPI5RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 21U), /*!< SPI5 clock reset */ + RCU_SAIRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 22U), /*!< SAI clock reset */ + RCU_TLIRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 26U), /*!< TLI clock reset */ + /* APB1 additional peripherals */ + RCU_CTCRST = RCU_REGIDX_BIT(ADD_APB1RST_REG_OFFSET, 27U), /*!< CTC clock reset */ + RCU_IREFRST = RCU_REGIDX_BIT(ADD_APB1RST_REG_OFFSET, 31U) /*!< IREF clock reset */ +}rcu_periph_reset_enum; + +/* clock stabilization and peripheral reset flags */ +typedef enum +{ + /* clock stabilization flags */ + RCU_FLAG_IRC16MSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 1U), /*!< IRC16M stabilization flags */ + RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 17U), /*!< HXTAL stabilization flags */ + RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 25U), /*!< PLL stabilization flags */ + RCU_FLAG_PLLI2SSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 27U), /*!< PLLI2S stabilization flags */ + RCU_FLAG_PLLSAISTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 29U), /*!< PLLSAI stabilization flags */ + RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 1U), /*!< LXTAL stabilization flags */ + RCU_FLAG_IRC32KSTB = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 1U), /*!< IRC32K stabilization flags */ + RCU_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 17U), /*!< IRC48M stabilization flags */ + /* reset source flags */ + RCU_FLAG_BORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 25U), /*!< BOR reset flags */ + RCU_FLAG_EPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 26U), /*!< External PIN reset flags */ + RCU_FLAG_PORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 27U), /*!< power reset flags */ + RCU_FLAG_SWRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 28U), /*!< Software reset flags */ + RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 29U), /*!< FWDGT reset flags */ + RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 30U), /*!< WWDGT reset flags */ + RCU_FLAG_LPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 31U), /*!< Low-power reset flags */ +}rcu_flag_enum; + +/* clock stabilization and ckm interrupt flags */ +typedef enum +{ + RCU_INT_FLAG_IRC32KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 0U), /*!< IRC32K stabilization interrupt flag */ + RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 1U), /*!< LXTAL stabilization interrupt flag */ + RCU_INT_FLAG_IRC16MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 2U), /*!< IRC16M stabilization interrupt flag */ + RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 3U), /*!< HXTAL stabilization interrupt flag */ + RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 4U), /*!< PLL stabilization interrupt flag */ + RCU_INT_FLAG_PLLI2SSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 5U), /*!< PLLI2S stabilization interrupt flag */ + RCU_INT_FLAG_PLLSAISTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 6U), /*!< PLLSAI stabilization interrupt flag */ + RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(INT_REG_OFFSET, 7U), /*!< HXTAL clock stuck interrupt flag */ + RCU_INT_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 6U), /*!< IRC48M stabilization interrupt flag */ +}rcu_int_flag_enum; + +/* clock stabilization and stuck interrupt flags clear */ +typedef enum +{ + RCU_INT_FLAG_IRC32KSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 16U), /*!< IRC32K stabilization interrupt flags clear */ + RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 17U), /*!< LXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_IRC16MSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 18U), /*!< IRC16M stabilization interrupt flags clear */ + RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 19U), /*!< HXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 20U), /*!< PLL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLI2SSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 21U), /*!< PLLI2S stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLSAISTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 22U), /*!< PLLSAI stabilization interrupt flags clear */ + RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 23U), /*!< CKM interrupt flags clear */ + RCU_INT_FLAG_IRC48MSTB_CLR = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 22U), /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ +}rcu_int_flag_clear_enum; + +/* clock stabilization interrupt enable or disable */ +typedef enum +{ + RCU_INT_IRC32KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 8U), /*!< IRC32K stabilization interrupt */ + RCU_INT_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 9U), /*!< LXTAL stabilization interrupt */ + RCU_INT_IRC16MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 10U), /*!< IRC16M stabilization interrupt */ + RCU_INT_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 11U), /*!< HXTAL stabilization interrupt */ + RCU_INT_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 12U), /*!< PLL stabilization interrupt */ + RCU_INT_PLLI2SSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 13U), /*!< PLLI2S stabilization interrupt */ + RCU_INT_PLLSAISTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 14U), /*!< PLLSAI stabilization interrupt */ + RCU_INT_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 14U), /*!< internal 48 MHz RC oscillator stabilization interrupt */ +}rcu_int_enum; + +/* oscillator types */ +typedef enum +{ + RCU_HXTAL = RCU_REGIDX_BIT(CTL_REG_OFFSET, 16U), /*!< HXTAL */ + RCU_LXTAL = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 0U), /*!< LXTAL */ + RCU_IRC16M = RCU_REGIDX_BIT(CTL_REG_OFFSET, 0U), /*!< IRC16M */ + RCU_IRC48M = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 16U), /*!< IRC48M */ + RCU_IRC32K = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 0U), /*!< IRC32K */ + RCU_PLL_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 24U), /*!< PLL */ + RCU_PLLI2S_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 26U), /*!< PLLI2S */ + RCU_PLLSAI_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 28U), /*!< PLLSAI */ +}rcu_osci_type_enum; + +/* rcu clock frequency */ +typedef enum +{ + CK_SYS = 0, /*!< system clock */ + CK_AHB, /*!< AHB clock */ + CK_APB1, /*!< APB1 clock */ + CK_APB2, /*!< APB2 clock */ +}rcu_clock_freq_enum; + +typedef enum { + IDX_I2C3 = 0U, /*!< idnex of I2C3 */ + IDX_I2C4, /*!< idnex of I2C4 */ + IDX_I2C5 /*!< idnex of I2C5 */ +} i2c_idx_enum; + +/* RCU_CFG0 register bit define */ +/* system clock source select */ +#define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_CKSYSSRC_IRC16M CFG0_SCS(0) /*!< system clock source select IRC16M */ +#define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */ +#define RCU_CKSYSSRC_PLLP CFG0_SCS(2) /*!< system clock source select PLLP */ + +/* system clock source select status */ +#define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define RCU_SCSS_IRC16M CFG0_SCSS(0) /*!< system clock source select IRC16M */ +#define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */ +#define RCU_SCSS_PLLP CFG0_SCSS(2) /*!< system clock source select PLLP */ + +/* AHB prescaler selection */ +#define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */ +#define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */ +#define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */ +#define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */ +#define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */ +#define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */ +#define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */ +#define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */ +#define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */ + +/* APB1 prescaler selection */ +#define CFG0_APB1PSC(regval) (BITS(10,12) & ((uint32_t)(regval) << 10)) +#define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */ +#define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */ +#define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */ +#define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */ +#define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */ + +/* APB2 prescaler selection */ +#define CFG0_APB2PSC(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) +#define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */ +#define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */ +#define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */ +#define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */ +#define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */ + +/* RTC clock divider factor from HXTAL clock */ +#define CFG0_RTCDIV(regval) (BITS(16,20) & ((uint32_t)(regval) << 16)) +#define RCU_RTC_HXTAL_NONE CFG0_RTCDIV(0) /*!< no clock for RTC */ +#define RCU_RTC_HXTAL_DIV2 CFG0_RTCDIV(2) /*!< RTCDIV clock select CK_HXTAL/2 */ +#define RCU_RTC_HXTAL_DIV3 CFG0_RTCDIV(3) /*!< RTCDIV clock select CK_HXTAL/3 */ +#define RCU_RTC_HXTAL_DIV4 CFG0_RTCDIV(4) /*!< RTCDIV clock select CK_HXTAL/4 */ +#define RCU_RTC_HXTAL_DIV5 CFG0_RTCDIV(5) /*!< RTCDIV clock select CK_HXTAL/5 */ +#define RCU_RTC_HXTAL_DIV6 CFG0_RTCDIV(6) /*!< RTCDIV clock select CK_HXTAL/6 */ +#define RCU_RTC_HXTAL_DIV7 CFG0_RTCDIV(7) /*!< RTCDIV clock select CK_HXTAL/7 */ +#define RCU_RTC_HXTAL_DIV8 CFG0_RTCDIV(8) /*!< RTCDIV clock select CK_HXTAL/8 */ +#define RCU_RTC_HXTAL_DIV9 CFG0_RTCDIV(9) /*!< RTCDIV clock select CK_HXTAL/9 */ +#define RCU_RTC_HXTAL_DIV10 CFG0_RTCDIV(10) /*!< RTCDIV clock select CK_HXTAL/10 */ +#define RCU_RTC_HXTAL_DIV11 CFG0_RTCDIV(11) /*!< RTCDIV clock select CK_HXTAL/11 */ +#define RCU_RTC_HXTAL_DIV12 CFG0_RTCDIV(12) /*!< RTCDIV clock select CK_HXTAL/12 */ +#define RCU_RTC_HXTAL_DIV13 CFG0_RTCDIV(13) /*!< RTCDIV clock select CK_HXTAL/13 */ +#define RCU_RTC_HXTAL_DIV14 CFG0_RTCDIV(14) /*!< RTCDIV clock select CK_HXTAL/14 */ +#define RCU_RTC_HXTAL_DIV15 CFG0_RTCDIV(15) /*!< RTCDIV clock select CK_HXTAL/15 */ +#define RCU_RTC_HXTAL_DIV16 CFG0_RTCDIV(16) /*!< RTCDIV clock select CK_HXTAL/16 */ +#define RCU_RTC_HXTAL_DIV17 CFG0_RTCDIV(17) /*!< RTCDIV clock select CK_HXTAL/17 */ +#define RCU_RTC_HXTAL_DIV18 CFG0_RTCDIV(18) /*!< RTCDIV clock select CK_HXTAL/18 */ +#define RCU_RTC_HXTAL_DIV19 CFG0_RTCDIV(19) /*!< RTCDIV clock select CK_HXTAL/19 */ +#define RCU_RTC_HXTAL_DIV20 CFG0_RTCDIV(20) /*!< RTCDIV clock select CK_HXTAL/20 */ +#define RCU_RTC_HXTAL_DIV21 CFG0_RTCDIV(21) /*!< RTCDIV clock select CK_HXTAL/21 */ +#define RCU_RTC_HXTAL_DIV22 CFG0_RTCDIV(22) /*!< RTCDIV clock select CK_HXTAL/22 */ +#define RCU_RTC_HXTAL_DIV23 CFG0_RTCDIV(23) /*!< RTCDIV clock select CK_HXTAL/23 */ +#define RCU_RTC_HXTAL_DIV24 CFG0_RTCDIV(24) /*!< RTCDIV clock select CK_HXTAL/24 */ +#define RCU_RTC_HXTAL_DIV25 CFG0_RTCDIV(25) /*!< RTCDIV clock select CK_HXTAL/25 */ +#define RCU_RTC_HXTAL_DIV26 CFG0_RTCDIV(26) /*!< RTCDIV clock select CK_HXTAL/26 */ +#define RCU_RTC_HXTAL_DIV27 CFG0_RTCDIV(27) /*!< RTCDIV clock select CK_HXTAL/27 */ +#define RCU_RTC_HXTAL_DIV28 CFG0_RTCDIV(28) /*!< RTCDIV clock select CK_HXTAL/28 */ +#define RCU_RTC_HXTAL_DIV29 CFG0_RTCDIV(29) /*!< RTCDIV clock select CK_HXTAL/29 */ +#define RCU_RTC_HXTAL_DIV30 CFG0_RTCDIV(30) /*!< RTCDIV clock select CK_HXTAL/30 */ +#define RCU_RTC_HXTAL_DIV31 CFG0_RTCDIV(31) /*!< RTCDIV clock select CK_HXTAL/31 */ + +/* CKOUT0 Clock source selection */ +#define CFG0_CKOUT0SEL(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) +#define RCU_CKOUT0SRC_IRC16M CFG0_CKOUT0SEL(0) /*!< internal 16M RC oscillator clock selected */ +#define RCU_CKOUT0SRC_LXTAL CFG0_CKOUT0SEL(1) /*!< low speed crystal oscillator clock (LXTAL) selected */ +#define RCU_CKOUT0SRC_HXTAL CFG0_CKOUT0SEL(2) /*!< high speed crystal oscillator clock (HXTAL) selected */ +#define RCU_CKOUT0SRC_PLLP CFG0_CKOUT0SEL(3) /*!< CK_PLLP clock selected */ + +/* I2S Clock source selection */ +#define RCU_I2SSRC_PLLI2S ((uint32_t)0x00000000U) /*!< PLLI2S output clock selected as I2S source clock */ +#define RCU_I2SSRC_I2S_CKIN RCU_CFG0_I2SSEL /*!< external I2S_CKIN pin selected as I2S source clock */ + +/* I2Cx(x=3,4,5) clock source selection */ +#define CFG2_I2C3SEL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0U)) +#define RCU_I2CSRC_CKAPB1 CFG2_I2C3SEL(0) /*!< CK_I2C select CK_APB1 */ +#define RCU_I2CSRC_PLLSAIR CFG2_I2C3SEL(1) /*!< CK_I2C select CK_PLLSAIR */ +#define RCU_I2CSRC_IRC16M CFG2_I2C3SEL(2) /*!< CK_I2C select IRC16M */ + +/* The CK_OUT0 divider */ +#define CFG0_CKOUT0DIV(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) +#define RCU_CKOUT0_DIV1 CFG0_CKOUT0DIV(0) /*!< CK_OUT0 is divided by 1 */ +#define RCU_CKOUT0_DIV2 CFG0_CKOUT0DIV(4) /*!< CK_OUT0 is divided by 2 */ +#define RCU_CKOUT0_DIV3 CFG0_CKOUT0DIV(5) /*!< CK_OUT0 is divided by 3 */ +#define RCU_CKOUT0_DIV4 CFG0_CKOUT0DIV(6) /*!< CK_OUT0 is divided by 4 */ +#define RCU_CKOUT0_DIV5 CFG0_CKOUT0DIV(7) /*!< CK_OUT0 is divided by 5 */ + +/* The CK_OUT1 divider */ +#define CFG0_CKOUT1DIV(regval) (BITS(27,29) & ((uint32_t)(regval) << 27)) +#define RCU_CKOUT1_DIV1 CFG0_CKOUT1DIV(0) /*!< CK_OUT1 is divided by 1 */ +#define RCU_CKOUT1_DIV2 CFG0_CKOUT1DIV(4) /*!< CK_OUT1 is divided by 2 */ +#define RCU_CKOUT1_DIV3 CFG0_CKOUT1DIV(5) /*!< CK_OUT1 is divided by 3 */ +#define RCU_CKOUT1_DIV4 CFG0_CKOUT1DIV(6) /*!< CK_OUT1 is divided by 4 */ +#define RCU_CKOUT1_DIV5 CFG0_CKOUT1DIV(7) /*!< CK_OUT1 is divided by 5 */ + +/* CKOUT1 Clock source selection */ +#define CFG0_CKOUT1SEL(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) +#define RCU_CKOUT1SRC_SYSTEMCLOCK CFG0_CKOUT1SEL(0) /*!< system clock selected */ +#define RCU_CKOUT1SRC_PLLI2SR CFG0_CKOUT1SEL(1) /*!< CK_PLLI2SR clock selected */ +#define RCU_CKOUT1SRC_HXTAL CFG0_CKOUT1SEL(2) /*!< high speed crystal oscillator clock (HXTAL) selected */ +#define RCU_CKOUT1SRC_PLLP CFG0_CKOUT1SEL(3) /*!< CK_PLLP clock selected */ + +/* RCU_CFG1 register bit define */ +/* the divider factor from PLLI2SQ clock */ +#define CFG1_PLLI2SQDIV(regval) (BITS(0,4) & ((uint32_t)(regval) << 0)) +#define RCU_PLLI2SQ_DIV1 CFG1_PLLI2SQDIV(0) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/1 */ +#define RCU_PLLI2SQ_DIV2 CFG1_PLLI2SQDIV(1) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/2 */ +#define RCU_PLLI2SQ_DIV3 CFG1_PLLI2SQDIV(2) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/3 */ +#define RCU_PLLI2SQ_DIV4 CFG1_PLLI2SQDIV(3) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/4 */ +#define RCU_PLLI2SQ_DIV5 CFG1_PLLI2SQDIV(4) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/5 */ +#define RCU_PLLI2SQ_DIV6 CFG1_PLLI2SQDIV(5) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/6 */ +#define RCU_PLLI2SQ_DIV7 CFG1_PLLI2SQDIV(6) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/7 */ +#define RCU_PLLI2SQ_DIV8 CFG1_PLLI2SQDIV(7) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/8 */ +#define RCU_PLLI2SQ_DIV9 CFG1_PLLI2SQDIV(8) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/9 */ +#define RCU_PLLI2SQ_DIV10 CFG1_PLLI2SQDIV(9) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/10 */ +#define RCU_PLLI2SQ_DIV11 CFG1_PLLI2SQDIV(10) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/11 */ +#define RCU_PLLI2SQ_DIV12 CFG1_PLLI2SQDIV(11) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/12 */ +#define RCU_PLLI2SQ_DIV13 CFG1_PLLI2SQDIV(12) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/13 */ +#define RCU_PLLI2SQ_DIV14 CFG1_PLLI2SQDIV(13) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/14 */ +#define RCU_PLLI2SQ_DIV15 CFG1_PLLI2SQDIV(14) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/15 */ +#define RCU_PLLI2SQ_DIV16 CFG1_PLLI2SQDIV(15) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/16 */ +#define RCU_PLLI2SQ_DIV17 CFG1_PLLI2SQDIV(16) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/17 */ +#define RCU_PLLI2SQ_DIV18 CFG1_PLLI2SQDIV(17) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/18 */ +#define RCU_PLLI2SQ_DIV19 CFG1_PLLI2SQDIV(18) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/19 */ +#define RCU_PLLI2SQ_DIV20 CFG1_PLLI2SQDIV(19) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/20 */ +#define RCU_PLLI2SQ_DIV21 CFG1_PLLI2SQDIV(20) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/21 */ +#define RCU_PLLI2SQ_DIV22 CFG1_PLLI2SQDIV(21) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/22 */ +#define RCU_PLLI2SQ_DIV23 CFG1_PLLI2SQDIV(22) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/23 */ +#define RCU_PLLI2SQ_DIV24 CFG1_PLLI2SQDIV(23) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/24 */ +#define RCU_PLLI2SQ_DIV25 CFG1_PLLI2SQDIV(24) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/25 */ +#define RCU_PLLI2SQ_DIV26 CFG1_PLLI2SQDIV(25) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/26 */ +#define RCU_PLLI2SQ_DIV27 CFG1_PLLI2SQDIV(26) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/27 */ +#define RCU_PLLI2SQ_DIV28 CFG1_PLLI2SQDIV(27) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/28 */ +#define RCU_PLLI2SQ_DIV29 CFG1_PLLI2SQDIV(28) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/29 */ +#define RCU_PLLI2SQ_DIV30 CFG1_PLLI2SQDIV(29) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/30 */ +#define RCU_PLLI2SQ_DIV31 CFG1_PLLI2SQDIV(30) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/31 */ +#define RCU_PLLI2SQ_DIV32 CFG1_PLLI2SQDIV(31) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/32 */ + +/* SAI clock source selection */ +#define CFG1_SAISEL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20U)) +#define RCU_SAISRC_PLLSAIQ CFG1_SAISEL(0) /*!< CK_SAI select CK_PLLSAIQ */ +#define RCU_SAISRC_PLLI2SQ CFG1_SAISEL(1) /*!< CK_SAI select CK_PLLI2SQ */ +#define RCU_SAISRC_I2S_CKIN BIT(21) /*!< CK_SAI select I2S_CKIN */ + +/* the divider factor from PLLSAIR clock */ +#define CFG1_PLLSAIRDIV(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) +#define RCU_PLLSAIR_DIV2 CFG1_PLLSAIRDIV(0) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/2 */ +#define RCU_PLLSAIR_DIV4 CFG1_PLLSAIRDIV(1) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/4 */ +#define RCU_PLLSAIR_DIV8 CFG1_PLLSAIRDIV(2) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/8 */ +#define RCU_PLLSAIR_DIV16 CFG1_PLLSAIRDIV(3) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/16 */ + +/* TIMER clock selection */ +#define RCU_TIMER_PSC_MUL2 ~RCU_CFG1_TIMERSEL /*!< if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB) + or 0b100(CK_APBx = CK_AHB/2), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). + or else, the TIMER clock is twice the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 2 x CK_APB1; + TIMER in APB2 domain: CK_TIMERx = 2 x CK_APB2) */ +#define RCU_TIMER_PSC_MUL4 RCU_CFG1_TIMERSEL /*!< if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB), + 0b100(CK_APBx = CK_AHB/2), or 0b101(CK_APBx = CK_AHB/4), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). + or else, the TIMER clock is four timers the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 4 x CK_APB1; + TIMER in APB2 domain: CK_TIMERx = 4 x CK_APB2) */ + +/* RCU_PLLSSCTL register bit define */ +/* PLL spread spectrum modulation type select */ +#define RCU_SS_TYPE_CENTER ((uint32_t)0x00000000U) /*!< center type is selected */ +#define RCU_SS_TYPE_DOWN RCU_PLLSSCTL_SS_TYPE /*!< down type is selected */ + +/* RCU_PLL register bit define */ +/* The PLL VCO source clock prescaler */ +#define RCU_PLLPSC_DIV_MIN ((uint32_t)2U) /*!< PLLPSC_DIV min value */ +#define RCU_PLLPSC_DIV_MAX ((uint32_t)63U) /*!< PLLPSC_DIV max value */ + +/* The PLL VCO clock multi factor */ +#define RCU_PLLN_MUL_MIN ((uint32_t)64U) /*!< PLLN_MUL min value */ +#define RCU_PLLN_MUL_MAX ((uint32_t)500U) /*!< PLLN_MUL max value */ +#define RCU_SS_MODULATION_CENTER_INC ((uint32_t)5U) /*!< minimum factor of PLLN in center mode */ +#define RCU_SS_MODULATION_DOWN_INC ((uint32_t)7U) /*!< minimum factor of PLLN in down mode */ + +/* The PLLP output frequency division factor from PLL VCO clock */ +#define RCU_PLLP_DIV_MIN ((uint32_t)2U) /*!< PLLP_DIV min value */ +#define RCU_PLLP_DIV_MAX ((uint32_t)8U) /*!< PLLP_DIV max value */ + +/* PLL Clock Source Selection */ +#define RCU_PLLSRC_IRC16M ((uint32_t)0x00000000U) /*!< IRC16M clock selected as source clock of PLL, PLLSAI, PLLI2S */ +#define RCU_PLLSRC_HXTAL RCU_PLL_PLLSEL /*!< HXTAL clock selected as source clock of PLL, PLLSAI, PLLI2S */ + +/* The PLL Q output frequency division factor from PLL VCO clock */ +#define RCU_PLLQ_DIV_MIN ((uint32_t)2U) /*!< PLLQ_DIV min value */ +#define RCU_PLLQ_DIV_MAX ((uint32_t)15U) /*!< PLLQ_DIV max value */ + +#define CHECK_PLL_PSC_VALID(val) (((val) >= RCU_PLLPSC_DIV_MIN)&&((val) <= RCU_PLLPSC_DIV_MAX)) +#define CHECK_PLL_N_VALID(val, inc) (((val) >= (RCU_PLLN_MUL_MIN + (inc)))&&((val) <= RCU_PLLN_MUL_MAX)) +#define CHECK_PLL_P_VALID(val) (((val) == 2U) || ((val) == 4U) || ((val) == 6U) || ((val) == 8U)) +#define CHECK_PLL_Q_VALID(val) (((val) >= RCU_PLLQ_DIV_MIN)&&((val) <= RCU_PLLQ_DIV_MAX)) + +/* RCU_BDCTL register bit define */ +/* LXTAL drive capability */ +#define RCU_LXTALDRI_LOWER_DRIVE ((uint32_t)0x00000000) /*!< LXTAL drive capability is selected lower */ +#define RCU_LXTALDRI_HIGHER_DRIVE RCU_BDCTL_LXTALDRI /*!< LXTAL drive capability is selected higher */ + +/* RTC clock entry selection */ +#define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */ +#define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< RTC source clock select LXTAL */ +#define RCU_RTCSRC_IRC32K BDCTL_RTCSRC(2) /*!< RTC source clock select IRC32K */ +#define RCU_RTCSRC_HXTAL_DIV_RTCDIV BDCTL_RTCSRC(3) /*!< RTC source clock select HXTAL/RTCDIV */ + +/* RCU_PLLI2S register bit define */ +/* The PLLI2S VCO clock multi factor */ +#define RCU_PLLI2SN_MUL_MIN 50U +#define RCU_PLLI2SN_MUL_MAX 500U + +/* The PLLI2S Q output frequency division factor from PLLI2S VCO clock */ +#define RCU_PLLI2SQ_DIV_MIN 2U +#define RCU_PLLI2SQ_DIV_MAX 15U + +/* The PLLI2S R output frequency division factor from PLLI2S VCO clock */ +#define RCU_PLLI2SR_DIV_MIN 2U +#define RCU_PLLI2SR_DIV_MAX 7U + +/* RCU_PLLSAI register bit define */ +/* The PLLSAI VCO clock multi factor */ +#define RCU_PLLSAIN_MUL_MIN 50U +#define RCU_PLLSAIN_MUL_MAX 500U + +/* The PLLSAI P output frequency division factor from PLLSAI VCO clock */ +#define RCU_PLLSAIP_DIV_MIN 2U +#define RCU_PLLSAIP_DIV_MAX 8U + +/* The PLLSAI Q output frequency division factor from PLLSAI VCO clock */ +#define RCU_PLLSAIQ_DIV_MIN 2U +#define RCU_PLLSAIQ_DIV_MAX 15U + +/* The PLLSAI R output frequency division factor from PLLSAI VCO clock */ +#define RCU_PLLSAIR_DIV_MIN 2U +#define RCU_PLLSAIR_DIV_MAX 7U + +#define CHECK_PLLI2S_PSC_VALID(val) (((val) >= RCU_PLLI2SPSC_DIV_MIN)&&((val) <= RCU_PLLI2SPSC_DIV_MAX)) +#define CHECK_PLLI2S_N_VALID(val) (((val) >= RCU_PLLI2SN_MUL_MIN)&&((val) <= RCU_PLLI2SN_MUL_MAX)) +#define CHECK_PLLI2S_Q_VALID(val) (((val) >= RCU_PLLI2SQ_DIV_MIN)&&((val) <= RCU_PLLI2SQ_DIV_MAX)) +#define CHECK_PLLI2S_R_VALID(val) (((val) >= RCU_PLLI2SR_DIV_MIN)&&((val) <= RCU_PLLI2SR_DIV_MAX)) + +#define CHECK_PLLSAI_N_VALID(val) (((val) >= (RCU_PLLSAIN_MUL_MIN))&&((val) <= RCU_PLLSAIN_MUL_MAX)) +#define CHECK_PLLSAI_P_VALID(val) (((val) == 2U) || ((val) == 4U) || ((val) == 6U) || ((val) == 8U)) +#define CHECK_PLLSAI_Q_VALID(val) (((val) >= RCU_PLLSAIQ_DIV_MIN)&&((val) <= RCU_PLLSAIQ_DIV_MAX)) +#define CHECK_PLLSAI_R_VALID(val) (((val) >= RCU_PLLSAIR_DIV_MIN)&&((val) <= RCU_PLLSAIR_DIV_MAX)) + +/* RCU_ADDCTL register bit define */ +/* 48MHz clock selection */ +#define RCU_CK48MSRC_PLL48M ((uint32_t)0x00000000U) /*!< CK48M source clock select PLL48M */ +#define RCU_CK48MSRC_IRC48M RCU_ADDCTL_CK48MSEL /*!< CK48M source clock select IRC48M */ + +/* PLL48M clock selection */ +#define RCU_PLL48MSRC_PLLQ ((uint32_t)0x00000000U) /*!< PLL48M source clock select PLLQ */ +#define RCU_PLL48MSRC_PLLSAIP RCU_ADDCTL_PLL48MSEL /*!< PLL48M source clock select PLLSAIP */ + +/* Deep-sleep mode voltage */ +#define DSV_DSLPVS(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) +#define RCU_DEEPSLEEP_V_0 DSV_DSLPVS(0) /*!< core voltage is default value in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_1 DSV_DSLPVS(1) /*!< core voltage is (default value-0.1)V in deep-sleep mode(customers are not recommended to use it)*/ +#define RCU_DEEPSLEEP_V_2 DSV_DSLPVS(2) /*!< core voltage is (default value-0.2)V in deep-sleep mode(customers are not recommended to use it)*/ +#define RCU_DEEPSLEEP_V_3 DSV_DSLPVS(3) /*!< core voltage is (default value-0.3)V in deep-sleep mode(customers are not recommended to use it)*/ + + +/* function declarations */ +/* peripherals clock configure functions */ +/* deinitialize the RCU */ +void rcu_deinit(void); +/* enable the peripherals clock */ +void rcu_periph_clock_enable(rcu_periph_enum periph); +/* disable the peripherals clock */ +void rcu_periph_clock_disable(rcu_periph_enum periph); +/* enable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph); +/* disable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph); +/* reset the peripherals */ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset); +/* disable reset the peripheral */ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset); +/* reset the BKP */ +void rcu_bkp_reset_enable(void); +/* disable the BKP reset */ +void rcu_bkp_reset_disable(void); + +/* system and peripherals clock source, system reset configure functions */ +/* configure the system clock source */ +void rcu_system_clock_source_config(uint32_t ck_sys); +/* get the system clock source */ +uint32_t rcu_system_clock_source_get(void); +/* configure the AHB prescaler selection */ +void rcu_ahb_clock_config(uint32_t ck_ahb); +/* configure the APB1 prescaler selection */ +void rcu_apb1_clock_config(uint32_t ck_apb1); +/* configure the APB2 prescaler selection */ +void rcu_apb2_clock_config(uint32_t ck_apb2); +/* configure the CK_OUT0 clock source and divider */ +void rcu_ckout0_config(uint32_t ckout0_src, uint32_t ckout0_div); +/* configure the CK_OUT1 clock source and divider */ +void rcu_ckout1_config(uint32_t ckout1_src, uint32_t ckout1_div); +/* configure the main PLL clock */ +ErrStatus rcu_pll_config(uint32_t pll_src, uint32_t pll_psc, uint32_t pll_n, uint32_t pll_p, uint32_t pll_q); +/* configure the PLLI2S_Q clock */ +ErrStatus rcu_plli2s_q_config(uint32_t plli2s_n, uint32_t plli2s_q); +/* configure the PLLI2S_R clock */ +ErrStatus rcu_plli2s_r_config(uint32_t plli2s_n, uint32_t plli2s_r); +/* configure the PLLSAI_P clock */ +ErrStatus rcu_pllsai_p_config(uint32_t pllsai_n, uint32_t pllsai_p); +/* configure the PLLSAI_Q clock */ +ErrStatus rcu_pllsai_q_config(uint32_t pllsai_n, uint32_t pllsai_q); +/* configure the PLLSAI_R clock */ +ErrStatus rcu_pllsai_r_config(uint32_t pllsai_n, uint32_t pllsai_r); +/* configure the RTC clock source selection */ +void rcu_rtc_clock_config(uint32_t rtc_clock_source); +/* cconfigure the frequency division of RTC clock when HXTAL was selected as its clock source */ +void rcu_rtc_div_config(uint32_t rtc_div); +/* configure the I2S clock source selection */ +void rcu_i2s_clock_config(uint32_t i2s_clock_source); +/* configure the I2Cx(x=3,4,5) clock source selection */ +void rcu_i2c_clock_config(i2c_idx_enum i2c_idx, uint32_t ck_i2c); +/* configure the SAI clock source selection */ +void rcu_sai_clock_config(uint32_t sai_clock_source); +/* configure the CK48M clock selection */ +void rcu_ck48m_clock_config(uint32_t ck48m_clock_source); +/* configure the PLL48M clock selection */ +void rcu_pll48m_clock_config(uint32_t pll48m_clock_source); +/* configure the TIMER clock prescaler selection */ +void rcu_timer_clock_prescaler_config(uint32_t timer_clock_prescaler); +/* configure the TLI clock division selection */ +void rcu_tli_clock_div_config(uint32_t pllsai_r_div); + +/* LXTAL, IRC8M, PLL and other oscillator configure functions */ +/* configure the LXTAL drive capability */ +void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap); +/* wait for oscillator stabilization flags is SET or oscillator startup is timeout */ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci); +/* turn on the oscillator */ +void rcu_osci_on(rcu_osci_type_enum osci); +/* turn off the oscillator */ +void rcu_osci_off(rcu_osci_type_enum osci); +/* enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci); +/* disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci); +/* set the IRC16M adjust value */ +void rcu_irc16m_adjust_value_set(uint32_t irc16m_adjval); +/* configure the spread spectrum modulation for the main PLL clock */ +void rcu_spread_spectrum_config(uint32_t spread_spectrum_type, uint32_t modstep, uint32_t modcnt); +/* enable the spread spectrum modulation for the main PLL clock */ +void rcu_spread_spectrum_enable(void); +/* disable the spread spectrum modulation for the main PLL clock */ +void rcu_spread_spectrum_disable(void); + +/* clock monitor configure functions */ +/* enable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_enable(void); +/* disable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_disable(void); + +/* voltage configure and clock frequency get functions */ +/* unlock the voltage key */ +void rcu_voltage_key_unlock(void); +/* set the deep sleep mode voltage */ +void rcu_deepsleep_voltage_set(uint32_t dsvol); +/* get the system clock, bus and peripheral clock frequency */ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock); + +/* flag & interrupt functions */ +/* get the clock stabilization and periphral reset flags */ +FlagStatus rcu_flag_get(rcu_flag_enum flag); +/* clear the reset flag */ +void rcu_all_reset_flag_clear(void); +/* get the clock stabilization interrupt and ckm flags */ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag); +/* clear the interrupt flags */ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag); +/* enable the stabilization interrupt */ +void rcu_interrupt_enable(rcu_int_enum interrupt); +/* disable the stabilization interrupt */ +void rcu_interrupt_disable(rcu_int_enum interrupt); + +#endif /* GD32F5XX_RCU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h new file mode 100644 index 00000000000..55d0da25bc1 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h @@ -0,0 +1,638 @@ +/*! + \file gd32f5xx_rtc.c + \brief definitions for the RTC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F5XX_RTC_H +#define GD32F5XX_RTC_H + +#include "gd32f5xx.h" + +/* RTC definitions */ +#define RTC RTC_BASE + +/* registers definitions */ +#define RTC_TIME REG32((RTC) + 0x00U) /*!< RTC time of day register */ +#define RTC_DATE REG32((RTC) + 0x04U) /*!< RTC date register */ +#define RTC_CTL REG32((RTC) + 0x08U) /*!< RTC control register */ +#define RTC_STAT REG32((RTC) + 0x0CU) /*!< RTC status register */ +#define RTC_PSC REG32((RTC) + 0x10U) /*!< RTC time prescaler register */ +#define RTC_WUT REG32((RTC) + 0x14U) /*!< RTC wakeup timer register */ +#define RTC_COSC REG32((RTC) + 0x18U) /*!< RTC coarse calibration register */ +#define RTC_ALRM0TD REG32((RTC) + 0x1CU) /*!< RTC alarm 0 time and date register */ +#define RTC_ALRM1TD REG32((RTC) + 0x20U) /*!< RTC alarm 1 time and date register */ +#define RTC_WPK REG32((RTC) + 0x24U) /*!< RTC write protection key register */ +#define RTC_SS REG32((RTC) + 0x28U) /*!< RTC sub second register */ +#define RTC_SHIFTCTL REG32((RTC) + 0x2CU) /*!< RTC shift function control register */ +#define RTC_TTS REG32((RTC) + 0x30U) /*!< RTC time of timestamp register */ +#define RTC_DTS REG32((RTC) + 0x34U) /*!< RTC date of timestamp register */ +#define RTC_SSTS REG32((RTC) + 0x38U) /*!< RTC sub second of timestamp register */ +#define RTC_HRFC REG32((RTC) + 0x3CU) /*!< RTC high resolution frequency compensation register */ +#define RTC_TAMP REG32((RTC) + 0x40U) /*!< RTC tamper register */ +#define RTC_ALRM0SS REG32((RTC) + 0x44U) /*!< RTC alarm 0 sub second register */ +#define RTC_ALRM1SS REG32((RTC) + 0x48U) /*!< RTC alarm 1 sub second register */ +#define RTC_BKP0 REG32((RTC) + 0x50U) /*!< RTC backup register */ +#define RTC_BKP1 REG32((RTC) + 0x54U) /*!< RTC backup register */ +#define RTC_BKP2 REG32((RTC) + 0x58U) /*!< RTC backup register */ +#define RTC_BKP3 REG32((RTC) + 0x5CU) /*!< RTC backup register */ +#define RTC_BKP4 REG32((RTC) + 0x60U) /*!< RTC backup register */ +#define RTC_BKP5 REG32((RTC) + 0x64U) /*!< RTC backup register */ +#define RTC_BKP6 REG32((RTC) + 0x68U) /*!< RTC backup register */ +#define RTC_BKP7 REG32((RTC) + 0x6CU) /*!< RTC backup register */ +#define RTC_BKP8 REG32((RTC) + 0x70U) /*!< RTC backup register */ +#define RTC_BKP9 REG32((RTC) + 0x74U) /*!< RTC backup register */ +#define RTC_BKP10 REG32((RTC) + 0x78U) /*!< RTC backup register */ +#define RTC_BKP11 REG32((RTC) + 0x7CU) /*!< RTC backup register */ +#define RTC_BKP12 REG32((RTC) + 0x80U) /*!< RTC backup register */ +#define RTC_BKP13 REG32((RTC) + 0x84U) /*!< RTC backup register */ +#define RTC_BKP14 REG32((RTC) + 0x88U) /*!< RTC backup register */ +#define RTC_BKP15 REG32((RTC) + 0x8CU) /*!< RTC backup register */ +#define RTC_BKP16 REG32((RTC) + 0x90U) /*!< RTC backup register */ +#define RTC_BKP17 REG32((RTC) + 0x94U) /*!< RTC backup register */ +#define RTC_BKP18 REG32((RTC) + 0x98U) /*!< RTC backup register */ +#define RTC_BKP19 REG32((RTC) + 0x9CU) /*!< RTC backup register */ + +/* bits definitions */ +/* RTC_TIME */ +#define RTC_TIME_SCU BITS(0,3) /*!< second units in BCD code */ +#define RTC_TIME_SCT BITS(4,6) /*!< second tens in BCD code */ +#define RTC_TIME_MNU BITS(8,11) /*!< minute units in BCD code */ +#define RTC_TIME_MNT BITS(12,14) /*!< minute tens in BCD code */ +#define RTC_TIME_HRU BITS(16,19) /*!< hour units in BCD code */ +#define RTC_TIME_HRT BITS(20,21) /*!< hour tens in BCD code */ +#define RTC_TIME_PM BIT(22) /*!< AM/PM notation */ + +/* RTC_DATE */ +#define RTC_DATE_DAYU BITS(0,3) /*!< date units in BCD code */ +#define RTC_DATE_DAYT BITS(4,5) /*!< date tens in BCD code */ +#define RTC_DATE_MONU BITS(8,11) /*!< month units in BCD code */ +#define RTC_DATE_MONT BIT(12) /*!< month tens in BCD code */ +#define RTC_DATE_DOW BITS(13,15) /*!< day of week units */ +#define RTC_DATE_YRU BITS(16,19) /*!< year units in BCD code */ +#define RTC_DATE_YRT BITS(20,23) /*!< year tens in BCD code */ + +/* RTC_CTL */ +#define RTC_CTL_WTCS BITS(0,2) /*!< auto wakeup timer clock selection */ +#define RTC_CTL_TSEG BIT(3) /*!< valid event edge of time-stamp */ +#define RTC_CTL_REFEN BIT(4) /*!< reference clock detection function enable */ +#define RTC_CTL_BPSHAD BIT(5) /*!< shadow registers bypass control */ +#define RTC_CTL_CS BIT(6) /*!< display format of clock system */ +#define RTC_CTL_CCEN BIT(7) /*!< coarse calibration function enable */ +#define RTC_CTL_ALRM0EN BIT(8) /*!< alarm0 function enable */ +#define RTC_CTL_ALRM1EN BIT(9) /*!< alarm1 function enable */ +#define RTC_CTL_WTEN BIT(10) /*!< auto wakeup timer function enable */ +#define RTC_CTL_TSEN BIT(11) /*!< time-stamp function enable */ +#define RTC_CTL_ALRM0IE BIT(12) /*!< RTC alarm0 interrupt enable */ +#define RTC_CTL_ALRM1IE BIT(13) /*!< RTC alarm1 interrupt enable */ +#define RTC_CTL_WTIE BIT(14) /*!< auto wakeup timer interrupt enable */ +#define RTC_CTL_TSIE BIT(15) /*!< time-stamp interrupt enable */ +#define RTC_CTL_A1H BIT(16) /*!< add 1 hour(summer time change) */ +#define RTC_CTL_S1H BIT(17) /*!< subtract 1 hour(winter time change) */ +#define RTC_CTL_DSM BIT(18) /*!< daylight saving mark */ +#define RTC_CTL_COS BIT(19) /*!< calibration output selection */ +#define RTC_CTL_OPOL BIT(20) /*!< output polarity */ +#define RTC_CTL_OS BITS(21,22) /*!< output selection */ +#define RTC_CTL_COEN BIT(23) /*!< calibration output enable */ + +/* RTC_STAT */ +#define RTC_STAT_ALRM0WF BIT(0) /*!< alarm0 configuration can be write flag */ +#define RTC_STAT_ALRM1WF BIT(1) /*!< alarm1 configuration can be write flag */ +#define RTC_STAT_WTWF BIT(2) /*!< wakeup timer can be write flag */ +#define RTC_STAT_SOPF BIT(3) /*!< shift function operation pending flag */ +#define RTC_STAT_YCM BIT(4) /*!< year configuration mark status flag */ +#define RTC_STAT_RSYNF BIT(5) /*!< register synchronization flag */ +#define RTC_STAT_INITF BIT(6) /*!< initialization state flag */ +#define RTC_STAT_INITM BIT(7) /*!< enter initialization mode */ +#define RTC_STAT_ALRM0F BIT(8) /*!< alarm0 occurs flag */ +#define RTC_STAT_ALRM1F BIT(9) /*!< alarm1 occurs flag */ +#define RTC_STAT_WTF BIT(10) /*!< wakeup timer occurs flag */ +#define RTC_STAT_TSF BIT(11) /*!< time-stamp flag */ +#define RTC_STAT_TSOVRF BIT(12) /*!< time-stamp overflow flag */ +#define RTC_STAT_TP0F BIT(13) /*!< RTC tamper 0 detected flag */ +#define RTC_STAT_TP1F BIT(14) /*!< RTC tamper 1 detected flag */ +#define RTC_STAT_SCPF BIT(16) /*!< smooth calibration pending flag */ + +/* RTC_PSC */ +#define RTC_PSC_FACTOR_S BITS(0,14) /*!< synchronous prescaler factor */ +#define RTC_PSC_FACTOR_A BITS(16,22) /*!< asynchronous prescaler factor */ + +/* RTC_WUT */ +#define RTC_WUT_WTRV BITS(0,15) /*!< auto wakeup timer reloads value */ + +/* RTC_COSC */ +#define RTC_COSC_COSS BITS(0,4) /*!< coarse calibration step */ +#define RTC_COSC_COSD BIT(7) /*!< coarse calibration direction */ + +/* RTC_ALRMxTD */ +#define RTC_ALRMXTD_SCU BITS(0,3) /*!< second units in BCD code */ +#define RTC_ALRMXTD_SCT BITS(4,6) /*!< second tens in BCD code */ +#define RTC_ALRMXTD_MSKS BIT(7) /*!< alarm second mask bit */ +#define RTC_ALRMXTD_MNU BITS(8,11) /*!< minutes units in BCD code */ +#define RTC_ALRMXTD_MNT BITS(12,14) /*!< minutes tens in BCD code */ +#define RTC_ALRMXTD_MSKM BIT(15) /*!< alarm minutes mask bit */ +#define RTC_ALRMXTD_HRU BITS(16,19) /*!< hour units in BCD code */ +#define RTC_ALRMXTD_HRT BITS(20,21) /*!< hour units in BCD code */ +#define RTC_ALRMXTD_PM BIT(22) /*!< AM/PM flag */ +#define RTC_ALRMXTD_MSKH BIT(23) /*!< alarm hour mask bit */ +#define RTC_ALRMXTD_DAYU BITS(24,27) /*!< date units or week day in BCD code */ +#define RTC_ALRMXTD_DAYT BITS(28,29) /*!< date tens in BCD code */ +#define RTC_ALRMXTD_DOWS BIT(30) /*!< day of week selection */ +#define RTC_ALRMXTD_MSKD BIT(31) /*!< alarm date mask bit */ + +/* RTC_WPK */ +#define RTC_WPK_WPK BITS(0,7) /*!< key for write protection */ + +/* RTC_SS */ +#define RTC_SS_SSC BITS(0,15) /*!< sub second value */ + +/* RTC_SHIFTCTL */ +#define RTC_SHIFTCTL_SFS BITS(0,14) /*!< subtract a fraction of a second */ +#define RTC_SHIFTCTL_A1S BIT(31) /*!< one second add */ + +/* RTC_TTS */ +#define RTC_TTS_SCU BITS(0,3) /*!< second units in BCD code */ +#define RTC_TTS_SCT BITS(4,6) /*!< second units in BCD code */ +#define RTC_TTS_MNU BITS(8,11) /*!< minute units in BCD code */ +#define RTC_TTS_MNT BITS(12,14) /*!< minute tens in BCD code */ +#define RTC_TTS_HRU BITS(16,19) /*!< hour units in BCD code */ +#define RTC_TTS_HRT BITS(20,21) /*!< hour tens in BCD code */ +#define RTC_TTS_PM BIT(22) /*!< AM/PM notation */ + +/* RTC_DTS */ +#define RTC_DTS_DAYU BITS(0,3) /*!< date units in BCD code */ +#define RTC_DTS_DAYT BITS(4,5) /*!< date tens in BCD code */ +#define RTC_DTS_MONU BITS(8,11) /*!< month units in BCD code */ +#define RTC_DTS_MONT BIT(12) /*!< month tens in BCD code */ +#define RTC_DTS_DOW BITS(13,15) /*!< day of week units */ + +/* RTC_SSTS */ +#define RTC_SSTS_SSC BITS(0,15) /*!< timestamp sub second units */ + +/* RTC_HRFC */ +#define RTC_HRFC_CMSK BITS(0,8) /*!< calibration mask number */ +#define RTC_HRFC_CWND16 BIT(13) /*!< calibration window select 16 seconds */ +#define RTC_HRFC_CWND8 BIT(14) /*!< calibration window select 16 seconds */ +#define RTC_HRFC_FREQI BIT(15) /*!< increase RTC frequency by 488.5ppm */ + +/* RTC_TAMP */ +#define RTC_TAMP_TP0EN BIT(0) /*!< tamper 0 detection enable */ +#define RTC_TAMP_TP0EG BIT(1) /*!< tamper 0 event trigger edge for RTC tamp 0 input */ +#define RTC_TAMP_TPIE BIT(2) /*!< tamper detection interrupt enable */ +#define RTC_TAMP_TP1EN BIT(3) /*!< tamper 1 detection enable */ +#define RTC_TAMP_TP1EG BIT(4) /*!< Tamper 1 event trigger edge for RTC tamp 1 input */ +#define RTC_TAMP_TPTS BIT(7) /*!< make tamper function used for timestamp function */ +#define RTC_TAMP_FREQ BITS(8,10) /*!< sample frequency of tamper event detection */ +#define RTC_TAMP_FLT BITS(11,12) /*!< RTC tamp x filter count setting */ +#define RTC_TAMP_PRCH BITS(13,14) /*!< precharge duration time of RTC tamp x */ +#define RTC_TAMP_DISPU BIT(15) /*!< RTC tamp x pull up disable bit */ +#define RTC_TAMP_TP0SEL BIT(16) /*!< Tamper 0 function input mapping selection */ +#define RTC_TAMP_TSSEL BIT(17) /*!< Timestamp input mapping selection */ +#define RTC_TAMP_AOT BIT(18) /*!< RTC_ALARM output Type */ + +/* RTC_ALRM0SS */ +#define RTC_ALRM0SS_SSC BITS(0,14) /*!< alarm0 sub second value */ +#define RTC_ALRM0SS_MASKSSC BITS(24,27) /*!< mask control bit of SS */ + +/* RTC_ALRM1SS */ +#define RTC_ALRM1SS_SSC BITS(0,14) /*!< alarm1 sub second value */ +#define RTC_ALRM1SS_MASKSSC BITS(24,27) /*!< mask control bit of SS */ + +/* constants definitions */ +/* structure for initialization of the RTC */ +typedef struct +{ + uint8_t year; /*!< RTC year value: 0x0 - 0x99(BCD format) */ + uint8_t month; /*!< RTC month value */ + uint8_t date; /*!< RTC date value: 0x1 - 0x31(BCD format) */ + uint8_t day_of_week; /*!< RTC weekday value */ + uint8_t hour; /*!< RTC hour value */ + uint8_t minute; /*!< RTC minute value: 0x0 - 0x59(BCD format) */ + uint8_t second; /*!< RTC second value: 0x0 - 0x59(BCD format) */ + uint16_t factor_asyn; /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */ + uint16_t factor_syn; /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */ + uint32_t am_pm; /*!< RTC AM/PM value */ + uint32_t display_format; /*!< RTC time notation */ +}rtc_parameter_struct; + +/* structure for RTC alarm configuration */ +typedef struct +{ + uint32_t alarm_mask; /*!< RTC alarm mask */ + uint32_t weekday_or_date; /*!< specify RTC alarm is on date or weekday */ + uint8_t alarm_day; /*!< RTC alarm date or weekday value*/ + uint8_t alarm_hour; /*!< RTC alarm hour value */ + uint8_t alarm_minute; /*!< RTC alarm minute value: 0x0 - 0x59(BCD format) */ + uint8_t alarm_second; /*!< RTC alarm second value: 0x0 - 0x59(BCD format) */ + uint32_t am_pm; /*!< RTC alarm AM/PM value */ +}rtc_alarm_struct; + +/* structure for RTC time-stamp configuration */ +typedef struct +{ + uint8_t timestamp_month; /*!< RTC time-stamp month value */ + uint8_t timestamp_date; /*!< RTC time-stamp date value: 0x1 - 0x31(BCD format) */ + uint8_t timestamp_day; /*!< RTC time-stamp weekday value */ + uint8_t timestamp_hour; /*!< RTC time-stamp hour value */ + uint8_t timestamp_minute; /*!< RTC time-stamp minute value: 0x0 - 0x59(BCD format) */ + uint8_t timestamp_second; /*!< RTC time-stamp second value: 0x0 - 0x59(BCD format) */ + uint32_t am_pm; /*!< RTC time-stamp AM/PM value */ +}rtc_timestamp_struct; + +/* structure for RTC tamper configuration */ +typedef struct +{ + uint32_t tamper_source; /*!< RTC tamper source */ + uint32_t tamper_trigger; /*!< RTC tamper trigger */ + uint32_t tamper_filter; /*!< RTC tamper consecutive samples needed during a voltage level detection */ + uint32_t tamper_sample_frequency; /*!< RTC tamper sampling frequency during a voltage level detection */ + ControlStatus tamper_precharge_enable; /*!< RTC tamper precharge feature during a voltage level detection */ + uint32_t tamper_precharge_time; /*!< RTC tamper precharge duration if precharge feature is enabled */ + ControlStatus tamper_with_timestamp; /*!< RTC tamper time-stamp feature */ +}rtc_tamper_struct; + +/* time register value */ +#define TIME_SC(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_TIME_SC bit field */ +#define GET_TIME_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_TIME_SC bit field */ + +#define TIME_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TIME_MN bit field */ +#define GET_TIME_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_TIME_MN bit field */ + +#define TIME_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_TIME_HR bit field */ +#define GET_TIME_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_TIME_HR bit field */ + +#define RTC_AM ((uint32_t)0x00000000U) /*!< AM format */ +#define RTC_PM RTC_TIME_PM /*!< PM format */ + +/* date register value */ +#define DATE_DAY(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_DATE_DAY bit field */ +#define GET_DATE_DAY(regval) GET_BITS((regval),0,5) /*!< get value of RTC_DATE_DAY bit field */ + +#define DATE_MON(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_DATE_MON bit field */ +#define GET_DATE_MON(regval) GET_BITS((regval),8,12) /*!< get value of RTC_DATE_MON bit field */ +#define RTC_JAN ((uint8_t)0x01U) /*!< janurary */ +#define RTC_FEB ((uint8_t)0x02U) /*!< february */ +#define RTC_MAR ((uint8_t)0x03U) /*!< march */ +#define RTC_APR ((uint8_t)0x04U) /*!< april */ +#define RTC_MAY ((uint8_t)0x05U) /*!< may */ +#define RTC_JUN ((uint8_t)0x06U) /*!< june */ +#define RTC_JUL ((uint8_t)0x07U) /*!< july */ +#define RTC_AUG ((uint8_t)0x08U) /*!< august */ +#define RTC_SEP ((uint8_t)0x09U) /*!< september */ +#define RTC_OCT ((uint8_t)0x10U) /*!< october */ +#define RTC_NOV ((uint8_t)0x11U) /*!< november */ +#define RTC_DEC ((uint8_t)0x12U) /*!< december */ + +#define DATE_DOW(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_DATE_DOW bit field */ +#define GET_DATE_DOW(regval) GET_BITS((uint32_t)(regval),13,15) /*!< get value of RTC_DATE_DOW bit field */ +#define RTC_MONDAY ((uint8_t)0x01) /*!< monday */ +#define RTC_TUESDAY ((uint8_t)0x02) /*!< tuesday */ +#define RTC_WEDSDAY ((uint8_t)0x03) /*!< wednesday */ +#define RTC_THURSDAY ((uint8_t)0x04) /*!< thursday */ +#define RTC_FRIDAY ((uint8_t)0x05) /*!< friday */ +#define RTC_SATURDAY ((uint8_t)0x06) /*!< saturday */ +#define RTC_SUNDAY ((uint8_t)0x07) /*!< sunday */ + +#define DATE_YR(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_DATE_YR bit field */ +#define GET_DATE_YR(regval) GET_BITS((regval),16,23) /*!< get value of RTC_DATE_YR bit field */ + +/* ctl register value */ +#define CTL_OS(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) /*!< write value to RTC_CTL_OS bit field */ +#define RTC_OS_DISABLE CTL_OS(0) /*!< disable output RTC_ALARM */ +#define RTC_OS_ALARM0 CTL_OS(1) /*!< enable alarm0 flag output */ +#define RTC_OS_ALARM1 CTL_OS(2) /*!< enable alarm1 flag output */ +#define RTC_OS_WAKEUP CTL_OS(3) /*!< enable wakeup flag output */ + +#define RTC_CALIBRATION_512HZ RTC_CTL_COEN /*!< calibration output of 512Hz is enable */ +#define RTC_CALIBRATION_1HZ (RTC_CTL_COEN | RTC_CTL_COS) /*!< calibration output of 1Hz is enable */ +#define RTC_ALARM0_HIGH RTC_OS_ALARM0 /*!< enable alarm0 flag output with high level */ +#define RTC_ALARM0_LOW (RTC_OS_ALARM0 | RTC_CTL_OPOL) /*!< enable alarm0 flag output with low level*/ +#define RTC_ALARM1_HIGH RTC_OS_ALARM1 /*!< enable alarm1 flag output with high level */ +#define RTC_ALARM1_LOW (RTC_OS_ALARM1 | RTC_CTL_OPOL) /*!< enable alarm1 flag output with low level*/ +#define RTC_WAKEUP_HIGH RTC_OS_WAKEUP /*!< enable wakeup flag output with high level */ +#define RTC_WAKEUP_LOW (RTC_OS_WAKEUP | RTC_CTL_OPOL) /*!< enable wakeup flag output with low level*/ + +#define RTC_24HOUR ((uint32_t)0x00000000U) /*!< 24-hour format */ +#define RTC_12HOUR RTC_CTL_CS /*!< 12-hour format */ + +#define RTC_TIMESTAMP_RISING_EDGE ((uint32_t)0x00000000U) /*!< rising edge is valid event edge for time-stamp event */ +#define RTC_TIMESTAMP_FALLING_EDGE RTC_CTL_TSEG /*!< falling edge is valid event edge for time-stamp event */ + +/* psc register value */ +#define PSC_FACTOR_S(regval) (BITS(0,14) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_PSC_FACTOR_S bit field */ +#define GET_PSC_FACTOR_S(regval) GET_BITS((regval),0,14) /*!< get value of RTC_PSC_FACTOR_S bit field */ + +#define PSC_FACTOR_A(regval) (BITS(16,22) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_PSC_FACTOR_A bit field */ +#define GET_PSC_FACTOR_A(regval) GET_BITS((regval),16,22) /*!< get value of RTC_PSC_FACTOR_A bit field */ + +/* alrmtd register value */ +#define ALRMTD_SC(regval) (BITS(0,6) & ((uint32_t)(regval)<< 0)) /*!< write value to RTC_ALRMTD_SC bit field */ +#define GET_ALRMTD_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_ALRMTD_SC bit field */ + +#define ALRMTD_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_ALRMTD_MN bit field */ +#define GET_ALRMTD_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_ALRMTD_MN bit field */ + +#define ALRMTD_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_ALRMTD_HR bit field */ +#define GET_ALRMTD_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_ALRMTD_HR bit field */ + +#define ALRMTD_DAY(regval) (BITS(24,29) & ((uint32_t)(regval) << 24)) /*!< write value to RTC_ALRMTD_DAY bit field */ +#define GET_ALRMTD_DAY(regval) GET_BITS((regval),24,29) /*!< get value of RTC_ALRMTD_DAY bit field */ + +#define RTC_ALARM_NONE_MASK ((uint32_t)0x00000000U) /*!< alarm none mask */ +#define RTC_ALARM_DATE_MASK RTC_ALRMXTD_MSKD /*!< alarm date mask */ +#define RTC_ALARM_HOUR_MASK RTC_ALRMXTD_MSKH /*!< alarm hour mask */ +#define RTC_ALARM_MINUTE_MASK RTC_ALRMXTD_MSKM /*!< alarm minute mask */ +#define RTC_ALARM_SECOND_MASK RTC_ALRMXTD_MSKS /*!< alarm second mask */ +#define RTC_ALARM_ALL_MASK (RTC_ALRMXTD_MSKD|RTC_ALRMXTD_MSKH|RTC_ALRMXTD_MSKM|RTC_ALRMXTD_MSKS) /*!< alarm all mask */ + +#define RTC_ALARM_DATE_SELECTED ((uint32_t)0x00000000U) /*!< alarm date format selected */ +#define RTC_ALARM_WEEKDAY_SELECTED RTC_ALRMXTD_DOWS /*!< alarm weekday format selected */ + +/* wpk register value */ +#define WPK_WPK(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_WPK_WPK bit field */ + +/* ss register value */ +#define SS_SSC(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SS_SSC bit field */ + +/* shiftctl register value */ +#define SHIFTCTL_SFS(regval) (BITS(0,14) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SHIFTCTL_SFS bit field */ + +#define RTC_SHIFT_ADD1S_RESET ((uint32_t)0x00000000U) /*!< not add 1 second */ +#define RTC_SHIFT_ADD1S_SET RTC_SHIFTCTL_A1S /*!< add one second to the clock */ + +/* tts register value */ +#define TTS_SC(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_TTS_SC bit field */ +#define GET_TTS_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_TTS_SC bit field */ + +#define TTS_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TTS_MN bit field */ +#define GET_TTS_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_TTS_MN bit field */ + +#define TTS_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_TTS_HR bit field */ +#define GET_TTS_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_TTS_HR bit field */ + +/* dts register value */ +#define DTS_DAY(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_DTS_DAY bit field */ +#define GET_DTS_DAY(regval) GET_BITS((regval),0,5) /*!< get value of RTC_DTS_DAY bit field */ + +#define DTS_MON(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_DTS_MON bit field */ +#define GET_DTS_MON(regval) GET_BITS((regval),8,12) /*!< get value of RTC_DTS_MON bit field */ + +#define DTS_DOW(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_DTS_DOW bit field */ +#define GET_DTS_DOW(regval) GET_BITS((regval),13,15) /*!< get value of RTC_DTS_DOW bit field */ + +/* ssts register value */ +#define SSTS_SSC(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SSTS_SSC bit field */ + +/* hrfc register value */ +#define HRFC_CMSK(regval) (BITS(0,8) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_HRFC_CMSK bit field */ + +#define RTC_CALIBRATION_WINDOW_32S ((uint32_t)0x00000000U) /*!< 2exp20 RTCCLK cycles, 32s if RTCCLK = 32768 Hz */ +#define RTC_CALIBRATION_WINDOW_16S RTC_HRFC_CWND16 /*!< 2exp19 RTCCLK cycles, 16s if RTCCLK = 32768 Hz */ +#define RTC_CALIBRATION_WINDOW_8S RTC_HRFC_CWND8 /*!< 2exp18 RTCCLK cycles, 8s if RTCCLK = 32768 Hz */ + +#define RTC_CALIBRATION_PLUS_SET RTC_HRFC_FREQI /*!< increase RTC frequency by 488.5ppm */ +#define RTC_CALIBRATION_PLUS_RESET ((uint32_t)0x00000000U) /*!< no effect */ + +/* tamp register value */ +#define TAMP_FREQ(regval) (BITS(8,10) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TAMP_FREQ bit field */ +#define RTC_FREQ_DIV32768 TAMP_FREQ(0) /*!< sample once every 32768 RTCCLK(1Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV16384 TAMP_FREQ(1) /*!< sample once every 16384 RTCCLK(2Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV8192 TAMP_FREQ(2) /*!< sample once every 8192 RTCCLK(4Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV4096 TAMP_FREQ(3) /*!< sample once every 4096 RTCCLK(8Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV2048 TAMP_FREQ(4) /*!< sample once every 2048 RTCCLK(16Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV1024 TAMP_FREQ(5) /*!< sample once every 1024 RTCCLK(32Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV512 TAMP_FREQ(6) /*!< sample once every 512 RTCCLK(64Hz if RTCCLK=32.768KHz) */ +#define RTC_FREQ_DIV256 TAMP_FREQ(7) /*!< sample once every 256 RTCCLK(128Hz if RTCCLK=32.768KHz) */ + +#define TAMP_FLT(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) /*!< write value to RTC_TAMP_FLT bit field */ +#define RTC_FLT_EDGE TAMP_FLT(0) /*!< detecting tamper event using edge mode. precharge duration is disabled automatically */ +#define RTC_FLT_2S TAMP_FLT(1) /*!< detecting tamper event using level mode.2 consecutive valid level samples will make a effective tamper event */ +#define RTC_FLT_4S TAMP_FLT(2) /*!< detecting tamper event using level mode.4 consecutive valid level samples will make an effective tamper event */ +#define RTC_FLT_8S TAMP_FLT(3) /*!< detecting tamper event using level mode.8 consecutive valid level samples will make a effective tamper event */ + +#define TAMP_PRCH(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_TAMP_PRCH bit field */ +#define RTC_PRCH_1C TAMP_PRCH(0) /*!< 1 RTC clock prechagre time before each sampling */ +#define RTC_PRCH_2C TAMP_PRCH(1) /*!< 2 RTC clock prechagre time before each sampling */ +#define RTC_PRCH_4C TAMP_PRCH(2) /*!< 4 RTC clock prechagre time before each sampling */ +#define RTC_PRCH_8C TAMP_PRCH(3) /*!< 8 RTC clock prechagre time before each sampling */ + +#define RTC_TAMPER0 RTC_TAMP_TP0EN /*!< tamper 0 detection enable */ +#define RTC_TAMPER1 RTC_TAMP_TP1EN /*!< tamper 1 detection enable */ + +#define RTC_TAMPER_TRIGGER_EDGE_RISING ((uint32_t)0x00000000U) /*!< tamper detection is in rising edge mode */ +#define RTC_TAMPER_TRIGGER_EDGE_FALLING RTC_TAMP_TP0EG /*!< tamper detection is in falling edge mode */ +#define RTC_TAMPER_TRIGGER_LEVEL_LOW ((uint32_t)0x00000000U) /*!< tamper detection is in low level mode */ +#define RTC_TAMPER_TRIGGER_LEVEL_HIGH RTC_TAMP_TP0EG /*!< tamper detection is in high level mode */ + +#define RTC_TAMPER_TRIGGER_POS ((uint32_t)0x00000001U) /* shift position of trigger relative to source */ + +#define RTC_ALARM_OUTPUT_OD ((uint32_t)0x00000000U) /*!< RTC alarm output open-drain mode */ +#define RTC_ALARM_OUTPUT_PP RTC_TAMP_AOT /*!< RTC alarm output push-pull mode */ + +/* ALRMXSS register value */ +#define ALRMXSS_SSC(regval) (BITS(0,14) & ((uint32_t)(regval)<< 0)) /*!< write value to RTC_ALRMXSS_SSC bit field */ + +#define ALRMXSS_MASKSSC(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) /*!< write value to RTC_ALRMXSS_MASKSSC bit field */ +#define RTC_MASKSSC_0_14 ALRMXSS_MASKSSC(0) /*!< mask alarm subsecond configuration */ +#define RTC_MASKSSC_1_14 ALRMXSS_MASKSSC(1) /*!< mask RTC_ALRMXSS_SSC[14:1], and RTC_ALRMXSS_SSC[0] is to be compared */ +#define RTC_MASKSSC_2_14 ALRMXSS_MASKSSC(2) /*!< mask RTC_ALRMXSS_SSC[14:2], and RTC_ALRMXSS_SSC[1:0] is to be compared */ +#define RTC_MASKSSC_3_14 ALRMXSS_MASKSSC(3) /*!< mask RTC_ALRMXSS_SSC[14:3], and RTC_ALRMXSS_SSC[2:0] is to be compared */ +#define RTC_MASKSSC_4_14 ALRMXSS_MASKSSC(4) /*!< mask RTC_ALRMXSS_SSC[14:4]], and RTC_ALRMXSS_SSC[3:0] is to be compared */ +#define RTC_MASKSSC_5_14 ALRMXSS_MASKSSC(5) /*!< mask RTC_ALRMXSS_SSC[14:5], and RTC_ALRMXSS_SSC[4:0] is to be compared */ +#define RTC_MASKSSC_6_14 ALRMXSS_MASKSSC(6) /*!< mask RTC_ALRMXSS_SSC[14:6], and RTC_ALRMXSS_SSC[5:0] is to be compared */ +#define RTC_MASKSSC_7_14 ALRMXSS_MASKSSC(7) /*!< mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared */ +#define RTC_MASKSSC_8_14 ALRMXSS_MASKSSC(8) /*!< mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared */ +#define RTC_MASKSSC_9_14 ALRMXSS_MASKSSC(9) /*!< mask RTC_ALRMXSS_SSC[14:9], and RTC_ALRMXSS_SSC[8:0] is to be compared */ +#define RTC_MASKSSC_10_14 ALRMXSS_MASKSSC(10) /*!< mask RTC_ALRMXSS_SSC[14:10], and RTC_ALRMXSS_SSC[9:0] is to be compared */ +#define RTC_MASKSSC_11_14 ALRMXSS_MASKSSC(11) /*!< mask RTC_ALRMXSS_SSC[14:11], and RTC_ALRMXSS_SSC[10:0] is to be compared */ +#define RTC_MASKSSC_12_14 ALRMXSS_MASKSSC(12) /*!< mask RTC_ALRMXSS_SSC[14:12], and RTC_ALRMXSS_SSC[11:0] is to be compared */ +#define RTC_MASKSSC_13_14 ALRMXSS_MASKSSC(13) /*!< mask RTC_ALRMXSS_SSC[14:13], and RTC_ALRMXSS_SSC[12:0] is to be compared */ +#define RTC_MASKSSC_14 ALRMXSS_MASKSSC(14) /*!< mask RTC_ALRMXSS_SSC[14], and RTC_ALRMXSS_SSC[13:0] is to be compared */ +#define RTC_MASKSSC_NONE ALRMXSS_MASKSSC(15) /*!< mask none, and RTC_ALRMXSS_SSC[14:0] is to be compared */ + +/* RTC interrupt source */ +#define RTC_INT_TIMESTAMP RTC_CTL_TSIE /*!< time-stamp interrupt enable */ +#define RTC_INT_ALARM0 RTC_CTL_ALRM0IE /*!< RTC alarm0 interrupt enable */ +#define RTC_INT_ALARM1 RTC_CTL_ALRM1IE /*!< RTC alarm1 interrupt enable */ +#define RTC_INT_TAMP RTC_TAMP_TPIE /*!< tamper detection interrupt enable */ +#define RTC_INT_WAKEUP RTC_CTL_WTIE /*!< RTC wakeup timer interrupt enable */ + +/* write protect key */ +#define RTC_UNLOCK_KEY1 ((uint8_t)0xCAU) /*!< RTC unlock key1 */ +#define RTC_UNLOCK_KEY2 ((uint8_t)0x53U) /*!< RTC unlock key2 */ +#define RTC_LOCK_KEY ((uint8_t)0xFFU) /*!< RTC lock key */ + +/* registers reset value */ +#define RTC_REGISTER_RESET ((uint32_t)0x00000000U) /*!< RTC common register reset value */ +#define RTC_DATE_RESET ((uint32_t)0x00002101U) /*!< RTC_DATE register reset value */ +#define RTC_STAT_RESET ((uint32_t)0x00000000U) /*!< RTC_STAT register reset value */ +#define RTC_PSC_RESET ((uint32_t)0x007F00FFU) /*!< RTC_PSC register reset value */ +#define RTC_WUT_RESET ((uint32_t)0x0000FFFFU) /*!< RTC_WUT register reset value */ + +/* RTC alarm */ +#define RTC_ALARM0 ((uint8_t)0x01U) /*!< RTC alarm 0 */ +#define RTC_ALARM1 ((uint8_t)0x02U) /*!< RTC alarm 1 */ + +/* RTC coarse calibration direction */ +#define CALIB_INCREASE ((uint8_t)0x01U) /*!< RTC coarse calibration increase */ +#define CALIB_DECREASE ((uint8_t)0x02U) /*!< RTC coarse calibration decrease */ + +/* RTC wakeup timer clock */ +#define CTL_WTCS(regval) (BITS(0,2) & ((regval)<< 0)) +#define WAKEUP_RTCCK_DIV16 CTL_WTCS(0) /*!< wakeup timer clock is RTC clock divided by 16 */ +#define WAKEUP_RTCCK_DIV8 CTL_WTCS(1) /*!< wakeup timer clock is RTC clock divided by 8 */ +#define WAKEUP_RTCCK_DIV4 CTL_WTCS(2) /*!< wakeup timer clock is RTC clock divided by 4 */ +#define WAKEUP_RTCCK_DIV2 CTL_WTCS(3) /*!< wakeup timer clock is RTC clock divided by 2 */ +#define WAKEUP_CKSPRE CTL_WTCS(4) /*!< wakeup timer clock is ckspre */ +#define WAKEUP_CKSPRE_2EXP16 CTL_WTCS(6) /*!< wakeup timer clock is ckspre and wakeup timer add 2exp16 */ + +/* RTC_AF pin */ +#define RTC_AF0_TIMESTAMP ((uint32_t)0x00000000) /*!< RTC_AF0 use for timestamp */ +#define RTC_AF1_TIMESTAMP RTC_TAMP_TSSEL /*!< RTC_AF1 use for timestamp */ +#define RTC_AF0_TAMPER0 ((uint32_t)0x00000000) /*!< RTC_AF0 use for tamper0 */ +#define RTC_AF1_TAMPER0 RTC_TAMP_TP0SEL /*!< RTC_AF1 use for tamper0 */ + +/* RTC flags */ +#define RTC_FLAG_ALRM0W RTC_STAT_ALRM0WF /*!< alarm0 configuration can be write flag */ +#define RTC_FLAG_ALRM1W RTC_STAT_ALRM1WF /*!< alarm1 configuration can be write flag */ +#define RTC_FLAG_WTW RTC_STAT_WTWF /*!< wakeup timer can be write flag */ +#define RTC_FLAG_SOP RTC_STAT_SOPF /*!< shift function operation pending flag */ +#define RTC_FLAG_YCM RTC_STAT_YCM /*!< year configuration mark status flag */ +#define RTC_FLAG_RSYN RTC_STAT_RSYNF /*!< register synchronization flag */ +#define RTC_FLAG_INIT RTC_STAT_INITF /*!< initialization state flag */ +#define RTC_FLAG_ALRM0 RTC_STAT_ALRM0F /*!< alarm0 occurs flag */ +#define RTC_FLAG_ALRM1 RTC_STAT_ALRM1F /*!< alarm1 occurs flag */ +#define RTC_FLAG_WT RTC_STAT_WTF /*!< wakeup timer occurs flag */ +#define RTC_FLAG_TS RTC_STAT_TSF /*!< time-stamp flag */ +#define RTC_FLAG_TSOVR RTC_STAT_TSOVRF /*!< time-stamp overflow flag */ +#define RTC_FLAG_TP0 RTC_STAT_TP0F /*!< RTC tamper 0 detected flag */ +#define RTC_FLAG_TP1 RTC_STAT_TP1F /*!< RTC tamper 1 detected flag */ +#define RTC_STAT_SCP RTC_STAT_SCPF /*!< smooth calibration pending flag */ + +/* function declarations */ +/* reset most of the RTC registers */ +ErrStatus rtc_deinit(void); +/* initialize RTC registers */ +ErrStatus rtc_init(rtc_parameter_struct* rtc_initpara_struct); +/* enter RTC init mode */ +ErrStatus rtc_init_mode_enter(void); +/* exit RTC init mode */ +void rtc_init_mode_exit(void); +/* wait until RTC_TIME and RTC_DATE registers are synchronized with APB clock, and the shadow registers are updated */ +ErrStatus rtc_register_sync_wait(void); + +/* get current time and date */ +void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct); +/* get current subsecond value */ +uint32_t rtc_subsecond_get(void); + +/* configure RTC alarm */ +void rtc_alarm_config(uint8_t rtc_alarm, rtc_alarm_struct* rtc_alarm_time); +/* configure subsecond of RTC alarm */ +void rtc_alarm_subsecond_config(uint8_t rtc_alarm, uint32_t mask_subsecond, uint32_t subsecond); +/* get RTC alarm */ +void rtc_alarm_get(uint8_t rtc_alarm,rtc_alarm_struct* rtc_alarm_time); +/* get RTC alarm subsecond */ +uint32_t rtc_alarm_subsecond_get(uint8_t rtc_alarm); +/* enable RTC alarm */ +void rtc_alarm_enable(uint8_t rtc_alarm); +/* disable RTC alarm */ +ErrStatus rtc_alarm_disable(uint8_t rtc_alarm); + +/* enable RTC time-stamp */ +void rtc_timestamp_enable(uint32_t edge); +/* disable RTC time-stamp */ +void rtc_timestamp_disable(void); +/* get RTC timestamp time and date */ +void rtc_timestamp_get(rtc_timestamp_struct* rtc_timestamp); +/* get RTC time-stamp subsecond */ +uint32_t rtc_timestamp_subsecond_get(void); +/* RTC time-stamp pin map */ +void rtc_timestamp_pin_map(uint32_t rtc_af); + +/* enable RTC tamper */ +void rtc_tamper_enable(rtc_tamper_struct* rtc_tamper); +/* disable RTC tamper */ +void rtc_tamper_disable(uint32_t source); +/* RTC tamper0 pin map */ +void rtc_tamper0_pin_map(uint32_t rtc_af); + +/* enable specified RTC interrupt */ +void rtc_interrupt_enable(uint32_t interrupt); +/* disable specified RTC interrupt */ +void rtc_interrupt_disable(uint32_t interrupt); +/* check specified flag */ +FlagStatus rtc_flag_get(uint32_t flag); +/* clear specified flag */ +void rtc_flag_clear(uint32_t flag); + +/* configure RTC alarm output source */ +void rtc_alarm_output_config(uint32_t source, uint32_t mode); +/* configure RTC calibration output source */ +void rtc_calibration_output_config(uint32_t source); + +/* adjust the daylight saving time by adding or substracting one hour from the current time */ +void rtc_hour_adjust(uint32_t operation); +/* adjust RTC second or subsecond value of current time */ +ErrStatus rtc_second_adjust(uint32_t add, uint32_t minus); + +/* enable RTC bypass shadow registers function */ +void rtc_bypass_shadow_enable(void); +/* disable RTC bypass shadow registers function */ +void rtc_bypass_shadow_disable(void); + +/* enable RTC reference clock detection function */ +ErrStatus rtc_refclock_detection_enable(void); +/* disable RTC reference clock detection function */ +ErrStatus rtc_refclock_detection_disable(void); + +/* enable RTC wakeup timer */ +void rtc_wakeup_enable(void); +/* disable RTC wakeup timer */ +ErrStatus rtc_wakeup_disable(void); +/* set auto wakeup timer clock */ +ErrStatus rtc_wakeup_clock_set(uint8_t wakeup_clock); +/* set auto wakeup timer value */ +ErrStatus rtc_wakeup_timer_set(uint16_t wakeup_timer); +/* get auto wakeup timer value */ +uint16_t rtc_wakeup_timer_get(void); + +/* configure RTC smooth calibration */ +ErrStatus rtc_smooth_calibration_config(uint32_t window, uint32_t plus, uint32_t minus); +/* enable RTC coarse calibration */ +ErrStatus rtc_coarse_calibration_enable(void); +/* disable RTC coarse calibration */ +ErrStatus rtc_coarse_calibration_disable(void); +/* configure RTC coarse calibration direction and step */ +ErrStatus rtc_coarse_calibration_config(uint8_t direction, uint8_t step); + +#endif /* GD32F5XX_RTC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h new file mode 100644 index 00000000000..fcbbfe2ae9f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h @@ -0,0 +1,473 @@ +/*! + \file gd32f5xx_sai.h + \brief definitions for the SAI + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_SAI_H +#define GD32F5XX_SAI_H + +#include "gd32f5xx.h" + +/* SAI definitions */ +#define SAI SAI_BASE /*!< SAI base address */ + +/* registers definitions */ +#define SAI_SYNCFG REG32((SAI) + 0x00000000U) /*!< SAI synchronize configuration register */ +#define SAI_B0CFG0 REG32((SAI) + 0x00000004U) /*!< SAI block 0 configuration register0 */ +#define SAI_B0CFG1 REG32((SAI) + 0x00000008U) /*!< SAI block 0 configuration register1 */ +#define SAI_B0FCFG REG32((SAI) + 0x0000000CU) /*!< SAI block 0 frame configuration register */ +#define SAI_B0SCFG REG32((SAI) + 0x00000010U) /*!< SAI block 0 slot configuration register */ +#define SAI_B0INTEN REG32((SAI) + 0x00000014U) /*!< SAI block 0 interrupt enable register */ +#define SAI_B0STAT REG32((SAI) + 0x00000018U) /*!< SAI block 0 status register */ +#define SAI_B0INTC REG32((SAI) + 0x0000001CU) /*!< SAI block 0 interrupt flag clear register */ +#define SAI_B0DATA REG32((SAI) + 0x00000020U) /*!< SAI block 0 data register */ +#define SAI_B1CFG0 REG32((SAI) + 0x00000024U) /*!< SAI block 1 configuration register0 */ +#define SAI_B1CFG1 REG32((SAI) + 0x00000028U) /*!< SAI block 1 configuration register1 */ +#define SAI_B1FCFG REG32((SAI) + 0x0000002CU) /*!< SAI block 1 frame configuration register */ +#define SAI_B1SCFG REG32((SAI) + 0x00000030U) /*!< SAI block 1 slot configuration register */ +#define SAI_B1INTEN REG32((SAI) + 0x00000034U) /*!< SAI block 1 interrupt enable register */ +#define SAI_B1STAT REG32((SAI) + 0x00000038U) /*!< SAI block 1 status register */ +#define SAI_B1INTC REG32((SAI) + 0x0000003CU) /*!< SAI block 1 interrupt flag clear register */ +#define SAI_B1DATA REG32((SAI) + 0x00000040U) /*!< SAI block 1 data register */ + +#define SAI_CFG0(blocky) REG32(((SAI) + 0x00000004U) + 0x20U*(blocky)) /*!< SAI block configuration register0 */ +#define SAI_CFG1(blocky) REG32(((SAI) + 0x00000008U) + 0x20U*(blocky)) /*!< SAI block configuration register1 */ +#define SAI_FCFG(blocky) REG32(((SAI) + 0x0000000CU) + 0x20U*(blocky)) /*!< SAI block frame configuration register */ +#define SAI_SCFG(blocky) REG32(((SAI) + 0x00000010U) + 0x20U*(blocky)) /*!< SAI block slot configuration register */ +#define SAI_INTEN(blocky) REG32(((SAI) + 0x00000014U) + 0x20U*(blocky)) /*!< SAI block interrupt enable register */ +#define SAI_STAT(blocky) REG32(((SAI) + 0x00000018U) + 0x20U*(blocky)) /*!< SAI block status register */ +#define SAI_INTC(blocky) REG32(((SAI) + 0x0000001CU) + 0x20U*(blocky)) /*!< SAI block interrupt flag clear register */ +#define SAI_DATA(blocky) REG32(((SAI) + 0x00000020U) + 0x20U*(blocky)) /*!< SAI block data register */ + +/* bits definitions */ +/* SAI_SYNCFG */ +#define SAI_SYNCFG_SYNI BITS(0,1) /*!< synchronization inputs */ +#define SAI_SYNCFG_SYNO BITS(4,5) /*!< synchronization outputs */ + +/* SAI_CFG0 */ +#define SAI_CFG0_OPTMOD BITS(0,1) /*!< operating mode */ +#define SAI_CFG0_PROT BITS(2,3) /*!< protocol selection */ +#define SAI_CFG0_DATAWD BITS(5,7) /*!< data width */ +#define SAI_CFG0_SHIFTDIR BIT(8) /*!< shift direction */ +#define SAI_CFG0_SAMPEDGE BIT(9) /*!< sampling clock edge */ +#define SAI_CFG0_SYNCMOD BITS(10,11) /*!< synchronization mode */ +#define SAI_CFG0_MONO BIT(12) /*!< stereo and mono mode selection */ +#define SAI_CFG0_ODRIV BIT(13) /*!< output drive */ +#define SAI_CFG0_SAIEN BIT(16) /*!< sai sub-block enable */ +#define SAI_CFG0_DMAEN BIT(17) /*!< DMA enable */ +#define SAI_CFG0_BYPASS BIT(19) /*!< clock divider logic bypass */ +#define SAI_CFG0_MDIV BITS(20,25) /*!< master clock divider ratio */ +#define SAI_CFG0_MOSPR BIT(26) /*!< the master clock oversampling rate */ +#define SAI_CFG0_MCLKEN BIT(27) /*!< the master clock enable */ + +/* SAI_CFG1 */ +#define SAI_CFG1_FFTH BITS(0,2) /*!< FIFO threshold */ +#define SAI_CFG1_FLUSH BIT(3) /*!< FIFO flush */ +#define SAI_CFG1_SDOM BIT(4) /*!< serial data output management */ +#define SAI_CFG1_MT BIT(5) /*!< mute mode on */ +#define SAI_CFG1_MTVAL BIT(6) /*!< mute value */ +#define SAI_CFG1_MTFCNT BITS(7,12) /*!< mute frame count */ +#define SAI_CFG1_CPLMOD BIT(13) /*!< complement mode */ +#define SAI_CFG1_CPAMOD BITS(14,15) /*!< compander mode */ + +/* SAI_FCFG */ +#define SAI_FCFG_FWD BITS(0,7) /*!< frame width */ +#define SAI_FCFG_FSAWD BITS(8,14) /*!< frame synchronization active width */ +#define SAI_FCFG_FSFUNC BIT(16) /*!< frame synchronization function */ +#define SAI_FCFG_FSPL BIT(17) /*!< Frame synchronization active polarity */ +#define SAI_FCFG_FSOST BIT(18) /*!< frame synchronization offset */ + +/* SAI_SCFG */ +#define SAI_SCFG_DATAOST BITS(0,4) /*!< data offset */ +#define SAI_SCFG_SLOTWD BITS(6,7) /*!< slot width */ +#define SAI_SCFG_SLOTNUM BITS(8,11) /*!< slot number within frame */ +#define SAI_SCFG_SLOTAV BITS(16,31) /*!< slot activation vector */ + +/* SAI_INTEN */ +#define SAI_INTEN_OUERRIE BIT(0) /*!< FIFO overrun or underrun interrupt enable */ +#define SAI_INTEN_MTDETIE BIT(1) /*!< mute detection interrupt enable */ +#define SAI_INTEN_ERRCKIE BIT(2) /*!< error clock interrupt enable */ +#define SAI_INTEN_FFREQIE BIT(3) /*!< FIFO request interrupt enable */ +#define SAI_INTEN_ACNRDYIE BIT(4) /*!< audio codec not ready interrupt enable */ +#define SAI_INTEN_FSADETIE BIT(5) /*!< frame synchronization advanced detection interrupt enable */ +#define SAI_INTEN_FSPDETIE BIT(6) /*!< frame synchronization postpone detection interrupt enable */ + +/* SAI_STAT */ +#define SAI_STAT_OUERR BIT(0) /*!< FIFO overrun or underrun */ +#define SAI_STAT_MTDET BIT(1) /*!< mute detection */ +#define SAI_STAT_ERRCK BIT(2) /*!< error clock */ +#define SAI_STAT_FFREQ BIT(3) /*!< FIFO request */ +#define SAI_STAT_ACNRDY BIT(4) /*!< audio codec not ready */ +#define SAI_STAT_FSADET BIT(5) /*!< frame synchronization advanced detection */ +#define SAI_STAT_FSPDET BIT(6) /*!< frame synchronization postpone detection */ +#define SAI_STAT_FFSTAT BITS(16,18) /*!< FIFO status */ + +/* SAI_INTC */ +#define SAI_INTC_OUERRC BIT(0) /*!< FIFO overrun or underrun interrupt clear */ +#define SAI_INTC_MTDETC BIT(1) /*!< mute detection interrupt clear */ +#define SAI_INTC_ERRCKC BIT(2) /*!< error clock interrupt clear */ +#define SAI_INTC_ACNRDYC BIT(4) /*!< audio codec not ready interrupt clear */ +#define SAI_INTC_FSADETC BIT(5) /*!< frame synchronization advanced detection interrupt clear */ +#define SAI_INTC_FSPDETC BIT(6) /*!< frame synchronization postpone detection interrupt clear */ + +/* SAI_DATA */ +#define SAI_DATA_DATA BITS(0,31) /*!< transfer data or receive data */ + +/* constants definitions */ +/* SAI initialize parameter struct definitions */ +typedef struct { + uint32_t operating_mode; /*!< operating mode */ + uint32_t protocol; /*!< protocol selection */ + uint32_t data_width; /*!< data width */ + uint32_t shift_dir; /*!< shift direction */ + uint32_t sample_edge; /*!< sampling clock edge */ + uint32_t sync_mode; /*!< synchronization mode */ + uint32_t output_drive; /*!< output drive */ + uint32_t clk_div_bypass; /*!< clock divider logic bypass */ + uint32_t mclk_div; /*!< master clock divider ratio */ + uint32_t mclk_oversampling; /*!< the master clock oversampling rate */ + uint32_t mclk_enable; /*!< the master clock enable */ + uint32_t fifo_threshold; /*!< FIFO threshold */ +} sai_parameter_struct; + +/* SAI frame initialize parameter struct definitions */ +typedef struct { + uint32_t frame_width; /*!< frame width */ + uint32_t frame_sync_width; /*!< frame synchronization active width */ + uint32_t frame_sync_function; /*!< frame synchronization function */ + uint32_t frame_sync_polarity; /*!< frame synchronization active polarity */ + uint32_t frame_sync_offset; /*!< frame synchronization offset */ +} sai_frame_parameter_struct; + +/* SAI slot initialize parameter struct definitions */ +typedef struct { + uint32_t slot_number; /*!< slot number */ + uint32_t slot_width; /*!< slot width */ + uint32_t data_offset; /*!< data offset */ + uint32_t slot_active; /*!< slot activation vector */ +} sai_slot_parameter_struct; + +/* SAI FIFO status */ +typedef enum { + FIFO_EMPTY = 0U, /*!< empty */ + FIFO_EMPTY_TO_1_4_FULL, /*!< empty < fifo_level <= 1/4_full. */ + FIFO_1_4_FULL_TO_1_2_FULL, /*!< 1/4_full < fifo_level <= 1/2_full. */ + FIFO_1_2_FULL_TO_3_4_FULL, /*!< 1/2_full < fifo_level <= 3/4_full. */ + FIFO_3_4_FULL_TO_FULL, /*!< 3/4_full < fifo_level < full */ + FIFO_FULL /*!< full */ +} sai_fifo_state_enum; +/* SAI master clock enable */ +#define SAI_MCLK_DISABLE ((uint32_t)0x00000000U) /*!< the master clock is enable when SAI enable */ +#define SAI_MCLK_ENABLE SAI_CFG0_MCLKEN /*!< the master clock is enable now */ + +/* SAI master clock oversampling rate */ +#define SAI_MCLK_OVERSAMP_256 ((uint32_t)0x00000000U) /*!< MCLK = 256 * Ffs */ +#define SAI_MCLK_OVERSAMP_512 SAI_CFG0_MOSPR /*!< MCLK = 512 * Ffs */ + +/* SAI master clock divider ratio definitions */ +#define CFG0_MDIV(regval) (BITS(20,25)&((uint32_t)(regval) << 20U)) +#define SAI_MCLKDIV_1 CFG0_MDIV(0) /*!< primary frequency divider logic bypass */ +#define SAI_MCLKDIV_2 CFG0_MDIV(2) /*!< SAI clock is divided by 2 */ +#define SAI_MCLKDIV_3 CFG0_MDIV(3) /*!< SAI clock is divided by 3 */ +#define SAI_MCLKDIV_4 CFG0_MDIV(4) /*!< SAI clock is divided by 4 */ +#define SAI_MCLKDIV_5 CFG0_MDIV(5) /*!< SAI clock is divided by 5 */ +#define SAI_MCLKDIV_6 CFG0_MDIV(6) /*!< SAI clock is divided by 6 */ +#define SAI_MCLKDIV_7 CFG0_MDIV(7) /*!< SAI clock is divided by 7 */ +#define SAI_MCLKDIV_8 CFG0_MDIV(8) /*!< SAI clock is divided by 8 */ +#define SAI_MCLKDIV_9 CFG0_MDIV(9) /*!< SAI clock is divided by 9 */ +#define SAI_MCLKDIV_10 CFG0_MDIV(10) /*!< SAI clock is divided by 10 */ +#define SAI_MCLKDIV_11 CFG0_MDIV(11) /*!< SAI clock is divided by 11 */ +#define SAI_MCLKDIV_12 CFG0_MDIV(12) /*!< SAI clock is divided by 12 */ +#define SAI_MCLKDIV_13 CFG0_MDIV(13) /*!< SAI clock is divided by 13 */ +#define SAI_MCLKDIV_14 CFG0_MDIV(14) /*!< SAI clock is divided by 14 */ +#define SAI_MCLKDIV_15 CFG0_MDIV(15) /*!< SAI clock is divided by 15 */ +#define SAI_MCLKDIV_16 CFG0_MDIV(16) /*!< SAI clock is divided by 16 */ +#define SAI_MCLKDIV_17 CFG0_MDIV(17) /*!< SAI clock is divided by 17 */ +#define SAI_MCLKDIV_18 CFG0_MDIV(18) /*!< SAI clock is divided by 18 */ +#define SAI_MCLKDIV_19 CFG0_MDIV(19) /*!< SAI clock is divided by 19 */ +#define SAI_MCLKDIV_20 CFG0_MDIV(20) /*!< SAI clock is divided by 20 */ +#define SAI_MCLKDIV_21 CFG0_MDIV(21) /*!< SAI clock is divided by 21 */ +#define SAI_MCLKDIV_22 CFG0_MDIV(22) /*!< SAI clock is divided by 22 */ +#define SAI_MCLKDIV_23 CFG0_MDIV(23) /*!< SAI clock is divided by 23 */ +#define SAI_MCLKDIV_24 CFG0_MDIV(24) /*!< SAI clock is divided by 24 */ +#define SAI_MCLKDIV_25 CFG0_MDIV(25) /*!< SAI clock is divided by 25 */ +#define SAI_MCLKDIV_26 CFG0_MDIV(26) /*!< SAI clock is divided by 26 */ +#define SAI_MCLKDIV_27 CFG0_MDIV(27) /*!< SAI clock is divided by 27 */ +#define SAI_MCLKDIV_28 CFG0_MDIV(28) /*!< SAI clock is divided by 28 */ +#define SAI_MCLKDIV_29 CFG0_MDIV(29) /*!< SAI clock is divided by 29 */ +#define SAI_MCLKDIV_30 CFG0_MDIV(30) /*!< SAI clock is divided by 30 */ +#define SAI_MCLKDIV_31 CFG0_MDIV(31) /*!< SAI clock is divided by 31 */ +#define SAI_MCLKDIV_32 CFG0_MDIV(32) /*!< SAI clock is divided by 32 */ +#define SAI_MCLKDIV_33 CFG0_MDIV(33) /*!< SAI clock is divided by 33 */ +#define SAI_MCLKDIV_34 CFG0_MDIV(34) /*!< SAI clock is divided by 34 */ +#define SAI_MCLKDIV_35 CFG0_MDIV(35) /*!< SAI clock is divided by 35 */ +#define SAI_MCLKDIV_36 CFG0_MDIV(36) /*!< SAI clock is divided by 36 */ +#define SAI_MCLKDIV_37 CFG0_MDIV(37) /*!< SAI clock is divided by 37 */ +#define SAI_MCLKDIV_38 CFG0_MDIV(38) /*!< SAI clock is divided by 38 */ +#define SAI_MCLKDIV_39 CFG0_MDIV(39) /*!< SAI clock is divided by 39 */ +#define SAI_MCLKDIV_40 CFG0_MDIV(40) /*!< SAI clock is divided by 40 */ +#define SAI_MCLKDIV_41 CFG0_MDIV(41) /*!< SAI clock is divided by 41 */ +#define SAI_MCLKDIV_42 CFG0_MDIV(42) /*!< SAI clock is divided by 42 */ +#define SAI_MCLKDIV_43 CFG0_MDIV(43) /*!< SAI clock is divided by 43 */ +#define SAI_MCLKDIV_44 CFG0_MDIV(44) /*!< SAI clock is divided by 44 */ +#define SAI_MCLKDIV_45 CFG0_MDIV(45) /*!< SAI clock is divided by 45 */ +#define SAI_MCLKDIV_46 CFG0_MDIV(46) /*!< SAI clock is divided by 46 */ +#define SAI_MCLKDIV_47 CFG0_MDIV(47) /*!< SAI clock is divided by 47 */ +#define SAI_MCLKDIV_48 CFG0_MDIV(48) /*!< SAI clock is divided by 48 */ +#define SAI_MCLKDIV_49 CFG0_MDIV(49) /*!< SAI clock is divided by 49 */ +#define SAI_MCLKDIV_50 CFG0_MDIV(50) /*!< SAI clock is divided by 50 */ +#define SAI_MCLKDIV_51 CFG0_MDIV(51) /*!< SAI clock is divided by 51 */ +#define SAI_MCLKDIV_52 CFG0_MDIV(52) /*!< SAI clock is divided by 52 */ +#define SAI_MCLKDIV_53 CFG0_MDIV(53) /*!< SAI clock is divided by 53 */ +#define SAI_MCLKDIV_54 CFG0_MDIV(54) /*!< SAI clock is divided by 54 */ +#define SAI_MCLKDIV_55 CFG0_MDIV(55) /*!< SAI clock is divided by 55 */ +#define SAI_MCLKDIV_56 CFG0_MDIV(56) /*!< SAI clock is divided by 56 */ +#define SAI_MCLKDIV_57 CFG0_MDIV(57) /*!< SAI clock is divided by 57 */ +#define SAI_MCLKDIV_58 CFG0_MDIV(58) /*!< SAI clock is divided by 58 */ +#define SAI_MCLKDIV_59 CFG0_MDIV(59) /*!< SAI clock is divided by 59 */ +#define SAI_MCLKDIV_60 CFG0_MDIV(60) /*!< SAI clock is divided by 60 */ +#define SAI_MCLKDIV_61 CFG0_MDIV(61) /*!< SAI clock is divided by 61 */ +#define SAI_MCLKDIV_62 CFG0_MDIV(62) /*!< SAI clock is divided by 62 */ +#define SAI_MCLKDIV_63 CFG0_MDIV(63) /*!< SAI clock is divided by 63 */ + +/* SAI clock divider logic bypass */ +#define SAI_CLKDIV_BYPASS_OFF ((uint32_t)0x00000000U) /*!< clock divider ratio is applied to both primary and secondary divider logic */ +#define SAI_CLKDIV_BYPASS_ON SAI_CFG0_BYPASS /*!< clock divider logic is bypassed */ + +/* SAI output drive */ +#define SAI_OUTPUT_WITH_SAIEN ((uint32_t)0x00000000U) /*!< SAI sub-block output driven only when SAIEN is set */ +#define SAI_OUTPUT_NOW SAI_CFG0_ODRIV /*!< SAI sub-block output driven according to ODRIV setting */ + +/* SAI stereo and mono mode selection */ +#define SAI_STEREO_MODE ((uint32_t)0x00000000U) /*!< stereo mode */ +#define SAI_MONO_MODE SAI_CFG0_MONO /*!< mono mode */ + +/* SAI synchronization mode definitions */ +#define CFG0_SYNCMOD(regval) (BITS(10,11)&((uint32_t)(regval) << 10U)) +#define SAI_SYNCMODE_ASYNC CFG0_SYNCMOD(0) /*!< asynchronous with the other sub-block */ +#define SAI_SYNCMODE_OTHERBLOCK CFG0_SYNCMOD(1) /*!< synchronous with the other sub-block */ + +/* SAI sampling clock edge */ +#define SAI_SAMPEDGE_FALLING ((uint32_t)0x00000000U) /*!< data sampled on SCK falling edge */ +#define SAI_SAMPEDGE_RISING SAI_CFG0_SAMPEDGE /*!< data sampled on SCK rising edge */ + +/* SAI Shift direction */ +#define SAI_SHIFT_MSB ((uint32_t)0x00000000U) /*!< data is shifted with MSB first */ +#define SAI_SHIFT_LSB SAI_CFG0_SHIFTDIR /*!< data is shifted with LSB first */ + +/* SAI data width definitions */ +#define CFG0_DW(regval) (BITS(5,7)&((uint32_t)(regval) << 5U)) +#define SAI_DATAWIDTH_8BIT CFG0_DW(2) /*!< SAI data width 8 bit */ +#define SAI_DATAWIDTH_10BIT CFG0_DW(3) /*!< SAI data width 10 bit */ +#define SAI_DATAWIDTH_16BIT CFG0_DW(4) /*!< SAI data width 16 bit */ +#define SAI_DATAWIDTH_20BIT CFG0_DW(5) /*!< SAI data width 20 bit */ +#define SAI_DATAWIDTH_24BIT CFG0_DW(6) /*!< SAI data width 24 bit */ +#define SAI_DATAWIDTH_32BIT CFG0_DW(7) /*!< SAI data width 32 bit */ + +/* SAI protocol selection */ +#define CFG0_PROTOCOL(regval) (BITS(2,3)&((uint32_t)(regval) << 2U)) +#define SAI_PROTOCOL_POLYMORPHIC CFG0_PROTOCOL(0) /*!< polymorphic */ +#define SAI_PROTOCOL_SPDIF CFG0_PROTOCOL(1) /*!< SPDIF */ +#define SAI_PROTOCOL_AC97 CFG0_PROTOCOL(2) /*!< AC97 */ + +/* SAI operating mode */ +#define CFG0_OPERATING(regval) (BITS(0,1)&((uint32_t)(regval) << 0U)) +#define SAI_MASTER_TRANSMITTER CFG0_OPERATING(0) /*!< master transmitter */ +#define SAI_MASTER_RECEIVER CFG0_OPERATING(1) /*!< master receiver */ +#define SAI_SLAVE_TRANSMITTER CFG0_OPERATING(2) /*!< slave transmitter */ +#define SAI_SLAVE_RECEIVER CFG0_OPERATING(3) /*!< slave receiver */ + +/* SAI compander mode */ +#define CFG1_COMPANDER(regval) (BITS(14,15)&((uint32_t)(regval) << 14U)) +#define SAI_COMPANDER_OFF CFG1_COMPANDER(0) /*!< no compansion applies */ +#define SAI_COMPANDER_ULAW CFG1_COMPANDER(2) /*!< u-law algorithm */ +#define SAI_COMPANDER_ALAW CFG1_COMPANDER(3) /*!< A-law algorithm */ + +/* SAI complement mode */ +#define SAI_COMPLEMENT_1S ((uint32_t)0x00000000U) /*!< data represented in 1's complement form */ +#define SAI_COMPLEMENT_2S SAI_CFG1_CPLMOD /*!< data represented in 2's complement form */ + +/* SAI mute value */ +#define SAI_MUTESENT_0 ((uint32_t)0x00000000U) /*!< 0 is sent via the serial data line when mute is on */ +#define SAI_MUTESENT_LASTFREAM SAI_CFG1_MTVAL /*!< if SLOTNB is less or equals to two, last frame is sent via the serial data line */ + +/* SAI mute on */ +#define SAI_MUTE_OFF ((uint32_t)0x00000000U) /*!< mute mode off */ +#define SAI_MUTE_ON SAI_CFG1_MT /*!< mute mode on */ + +/* SAI serial data line output management */ +#define SAI_SDLINE_DRIVE ((uint32_t)0x00000000U) /*!< SD line output is driven entirely during the audio frame */ +#define SAI_SDLINE_RELEASE SAI_CFG1_SDOM /*!< SD line output is released near inactive slots */ + +/* SAI FIFO threshold */ +#define CFG1_FFTH(regval) (BITS(0,2)&((uint32_t)(regval) << 0U)) +#define SAI_FIFOTH_EMPTY CFG1_FFTH(0) /*!< FIFO threshold empty */ +#define SAI_FIFOTH_QUARTER CFG1_FFTH(1) /*!< FIFO threshold quarter full */ +#define SAI_FIFOTH_HALF CFG1_FFTH(2) /*!< FIFO threshold half full */ +#define SAI_FIFOTH_THREE_QUARTER CFG1_FFTH(3) /*!< FIFO threshold three quarter full */ +#define SAI_FIFOTH_FULL CFG1_FFTH(4) /*!< FIFO threshold full */ + +/* SAI frame synchronization offset */ +#define SAI_FS_OFFSET_BEGINNING ((uint32_t)0x00000000U) /*!< FS active edge asserted at the beginning of the first bit of the first slot */ +#define SAI_FS_OFFSET_ONEBITBEFORE SAI_FCFG_FSOST /*!< FS active edge asserted one bit cycle before normal FS when FSOST is 0 */ + +/* SAI frame synchronization active polarity */ +#define SAI_FS_POLARITY_LOW ((uint32_t)0x00000000U) /*!< FS low active polarity */ +#define SAI_FS_POLARITY_HIGH SAI_FCFG_FSPL /*!< FS high active polarity */ + +/* SAI frame synchronization function */ +#define SAI_FS_FUNC_START ((uint32_t)0x00000000U) /*!< FS only defines frame start */ +#define SAI_FS_FUNC_START_CHANNEL SAI_FCFG_FSFUNC /*!< FS define both frame start and channel number */ + +/* SAI slot active */ +#define SAI_SLOT_ACTIVE_NONE ((uint32_t)0x00000000U) /*!< all slot inactive */ +#define SAI_SLOT_ACTIVE_0 BIT(16) /*!< slot 0 active */ +#define SAI_SLOT_ACTIVE_1 BIT(17) /*!< slot 1 active */ +#define SAI_SLOT_ACTIVE_2 BIT(18) /*!< slot 2 active */ +#define SAI_SLOT_ACTIVE_3 BIT(19) /*!< slot 3 active */ +#define SAI_SLOT_ACTIVE_4 BIT(20) /*!< slot 4 active */ +#define SAI_SLOT_ACTIVE_5 BIT(21) /*!< slot 5 active */ +#define SAI_SLOT_ACTIVE_6 BIT(22) /*!< slot 6 active */ +#define SAI_SLOT_ACTIVE_7 BIT(23) /*!< slot 7 active */ +#define SAI_SLOT_ACTIVE_8 BIT(24) /*!< slot 8 active */ +#define SAI_SLOT_ACTIVE_9 BIT(25) /*!< slot 9 active */ +#define SAI_SLOT_ACTIVE_10 BIT(26) /*!< slot 10 active */ +#define SAI_SLOT_ACTIVE_11 BIT(27) /*!< slot 11 active */ +#define SAI_SLOT_ACTIVE_12 BIT(28) /*!< slot 12 active */ +#define SAI_SLOT_ACTIVE_13 BIT(29) /*!< slot 13 active */ +#define SAI_SLOT_ACTIVE_14 BIT(30) /*!< slot 14 active */ +#define SAI_SLOT_ACTIVE_15 BIT(31) /*!< slot 15 active */ +#define SAI_SLOT_ACTIVE_ALL BITS(16,31) /*!< slot all active */ + +/* SAI slot width definitions */ +#define SCFG_SW(regval) (BITS(6,7)&((uint32_t)(regval) << 6U)) +#define SAI_SLOT_WIDTH_DATA SCFG_SW(0) /*!< slot width equals data width */ +#define SAI_SLOT_WIDTH_16BIT SCFG_SW(1) /*!< slot width of 16-bits */ +#define SAI_SLOT_WIDTH_32BIT SCFG_SW(2) /*!< slot width of 32-bits */ + +/* SAI interrupt enable or disable */ +#define SAI_INT_OUERR SAI_INTEN_OUERRIE /*!< FIFO overrun or underrun interrupt enable */ +#define SAI_INT_MTDET SAI_INTEN_MTDETIE /*!< mute detection interrupt enable */ +#define SAI_INT_ERRCK SAI_INTEN_ERRCKIE /*!< error clock interrupt enable */ +#define SAI_INT_FFREQ SAI_INTEN_FFREQIE /*!< FIFO request interrupt enable */ +#define SAI_INT_ACNRDY SAI_INTEN_ACNRDYIE /*!< audio codec not ready interrupt enable */ +#define SAI_INT_FSADET SAI_INTEN_FSADETIE /*!< frame synchronization advanced detection interrupt enable */ +#define SAI_INT_FSPDET SAI_INTEN_FSPDETIE /*!< frame synchronization postpone detection interrupt enable */ + +/* SAI flags */ +#define SAI_FLAG_OUERR SAI_STAT_OUERR /*!< FIFO overrun or underrun flag */ +#define SAI_FLAG_MTDET SAI_STAT_MTDET /*!< mute detection flag */ +#define SAI_FLAG_ERRCK SAI_STAT_ERRCK /*!< error clock flag */ +#define SAI_FLAG_FFREQ SAI_STAT_FFREQ /*!< FIFO request flag */ +#define SAI_FLAG_ACNRDY SAI_STAT_ACNRDY /*!< audio codec not ready flag */ +#define SAI_FLAG_FSADET SAI_STAT_FSADET /*!< frame synchronization advanced detection flag */ +#define SAI_FLAG_FSPDET SAI_STAT_FSPDET /*!< frame synchronization postpone detection flag */ + +/* SAI FIFO status */ +#define STAT_FFSTAT(regval) (BITS(16,18)&((uint32_t)(regval) << 16U)) +#define SAI_FIFO_STAT_EMPTY STAT_FFSTAT(0) /*!< FIFO status empty */ +#define SAI_FIFO_STAT_QUARTER STAT_FFSTAT(1) /*!< receiver: empty < FIFO <= 1/4, transmitter: empty < FIFO < 1/4 */ +#define SAI_FIFO_STAT_HALF STAT_FFSTAT(2) /*!< receiver: 1/4 < FIFO <= 1/2, transmitter: 1/4 <= FIFO < 1/2 */ +#define SAI_FIFO_STAT_THREE_QUARTER STAT_FFSTAT(3) /*!< receiver: 1/2 < FIFO <= 3/4, transmitter: 1/2 <= FIFO < 3/4 */ +#define SAI_FIFO_STAT_NEARFULL STAT_FFSTAT(4) /*!< receiver: 3/4 < FIFO < full, transmitter: 3/4 <= FIFO < full */ +#define SAI_FIFO_STAT_FULL STAT_FFSTAT(5) /*!< FIFO status full */ + +#define SAI_BLOCK0 ((uint32_t)0x00000000U) /*!< Block 0 */ +#define SAI_BLOCK1 ((uint32_t)0x00000001U) /*!< Block 1 */ + +/* function declarations */ +/* SAI deinitialization and initialization functions */ +/* reset SAI */ +void sai_deinit(void); + +/* initialize SAI parameter struct with the default values */ +void sai_struct_para_init(sai_parameter_struct *sai_init_stuct); +/* initialize SAI frame parameter struct with the default values */ +void sai_frame_struct_para_init(sai_frame_parameter_struct *sai_frame_init_struct); +/* initialize SAI slot parameter struct with the default values */ +void sai_slot_struct_para_init(sai_slot_parameter_struct *sai_slot_init_struct); + +/* initialize SAI */ +void sai_init(uint32_t block, sai_parameter_struct *sai_struct); +/* initialize SAI frame */ +void sai_frame_init(uint32_t block, sai_frame_parameter_struct *sai_frame_struct); +/* initialize SAI slot */ +void sai_slot_init(uint32_t block, sai_slot_parameter_struct *sai_slot_struct); + +/* sai enable*/ +void sai_enable(uint32_t block); +/* sai disable*/ +void sai_disable(uint32_t block); + +/* SAI configuration functions */ +/* SAI serial data near inactive slot output management */ +void sai_sdoutput_config(uint32_t block, uint32_t sdout); +/* configure SAI mono mode */ +void sai_monomode_config(uint32_t block, uint32_t mono); +/* configure SAI companding mode */ +void sai_companding_config(uint32_t block, uint32_t compander, uint32_t complement); +/* enable SAI mute detected or mute send */ +void sai_mute_enable(uint32_t block); +/* disable SAI mute detected or mute send */ +void sai_mute_disable(uint32_t block); +/* configure SAI mute value */ +void sai_mute_value_config(uint32_t block, uint32_t value); +/* configure SAI mute frame count */ +void sai_mute_count_config(uint32_t block, uint32_t count); +/* SAI transmit data */ +void sai_data_transmit(uint32_t block, uint32_t data); +/* SAI receive data */ +uint32_t sai_data_receive(uint32_t block); +/* get SAI fifo status */ +sai_fifo_state_enum sai_fifo_status_get(uint32_t block); +/* SAI fifo flush */ +void sai_fifo_flush(uint32_t block); + +/* SAI DMA functions */ +/* enable SAI dma */ +void sai_dma_enable(uint32_t block); +/* disable SAI dma */ +void sai_dma_disable(uint32_t block); + +/* flag and interrupt functions */ +/* enable the SAI interrupt */ +void sai_interrupt_enable(uint32_t block, uint32_t interrupt); +/* disable the SAI interrupt */ +void sai_interrupt_disable(uint32_t block, uint32_t interrupt); +/* get SAI interrupt flag */ +FlagStatus sai_interrupt_flag_get(uint32_t block, uint32_t interrupt); +/* clear SAI interrupt flag */ +void sai_interrupt_flag_clear(uint32_t block, uint32_t interrupt); +/* get SAI flag */ +FlagStatus sai_flag_get(uint32_t block, uint32_t flag); +/* clear SAI flag */ +void sai_flag_clear(uint32_t block, uint32_t flag); + +#endif /* GD32F5XX_SAI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h new file mode 100644 index 00000000000..e174c3c60a2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h @@ -0,0 +1,431 @@ +/*! + \file gd32f5xx_sdio.h + \brief definitions for the SDIO + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_SDIO_H +#define GD32F5XX_SDIO_H + +#include "gd32f5xx.h" + +/* SDIO definitions */ +#define SDIO SDIO_BASE + +/* registers definitions */ +#define SDIO_PWRCTL REG32(SDIO + 0x00000000U) /*!< SDIO power control register */ +#define SDIO_CLKCTL REG32(SDIO + 0x00000004U) /*!< SDIO clock control register */ +#define SDIO_CMDAGMT REG32(SDIO + 0x00000008U) /*!< SDIO command argument register */ +#define SDIO_CMDCTL REG32(SDIO + 0x0000000CU) /*!< SDIO command control register */ +#define SDIO_RSPCMDIDX REG32(SDIO + 0x00000010U) /*!< SDIO command index response register */ +#define SDIO_RESP0 REG32(SDIO + 0x00000014U) /*!< SDIO response register 0 */ +#define SDIO_RESP1 REG32(SDIO + 0x00000018U) /*!< SDIO response register 1 */ +#define SDIO_RESP2 REG32(SDIO + 0x0000001CU) /*!< SDIO response register 2 */ +#define SDIO_RESP3 REG32(SDIO + 0x00000020U) /*!< SDIO response register 3 */ +#define SDIO_DATATO REG32(SDIO + 0x00000024U) /*!< SDIO data timeout register */ +#define SDIO_DATALEN REG32(SDIO + 0x00000028U) /*!< SDIO data length register */ +#define SDIO_DATACTL REG32(SDIO + 0x0000002CU) /*!< SDIO data control register */ +#define SDIO_DATACNT REG32(SDIO + 0x00000030U) /*!< SDIO data counter register */ +#define SDIO_STAT REG32(SDIO + 0x00000034U) /*!< SDIO status register */ +#define SDIO_INTC REG32(SDIO + 0x00000038U) /*!< SDIO interrupt clear register */ +#define SDIO_INTEN REG32(SDIO + 0x0000003CU) /*!< SDIO interrupt enable register */ +#define SDIO_FIFOCNT REG32(SDIO + 0x00000048U) /*!< SDIO FIFO counter register */ +#define SDIO_FIFO REG32(SDIO + 0x00000080U) /*!< SDIO FIFO data register */ + +/* bits definitions */ +/* SDIO_PWRCTL */ +#define SDIO_PWRCTL_PWRCTL BITS(0,1) /*!< SDIO power control bits */ + +/* SDIO_CLKCTL */ +#define SDIO_CLKCTL_DIV BITS(0,7) /*!< clock division */ +#define SDIO_CLKCTL_CLKEN BIT(8) /*!< SDIO_CLK clock output enable bit */ +#define SDIO_CLKCTL_CLKPWRSAV BIT(9) /*!< SDIO_CLK clock dynamic switch on/off for power saving */ +#define SDIO_CLKCTL_CLKBYP BIT(10) /*!< clock bypass enable bit */ +#define SDIO_CLKCTL_BUSMODE BITS(11,12) /*!< SDIO card bus mode control bit */ +#define SDIO_CLKCTL_CLKEDGE BIT(13) /*!< SDIO_CLK clock edge selection bit */ +#define SDIO_CLKCTL_HWCLKEN BIT(14) /*!< hardware clock control enable bit */ +#define SDIO_CLKCTL_DIV8 BIT(31) /*!< MSB of clock division */ + +/* SDIO_CMDAGMT */ +#define SDIO_CMDAGMT_CMDAGMT BITS(0,31) /*!< SDIO card command argument */ + +/* SDIO_CMDCTL */ +#define SDIO_CMDCTL_CMDIDX BITS(0,5) /*!< command index */ +#define SDIO_CMDCTL_CMDRESP BITS(6,7) /*!< command response type bits */ +#define SDIO_CMDCTL_INTWAIT BIT(8) /*!< interrupt wait instead of timeout */ +#define SDIO_CMDCTL_WAITDEND BIT(9) /*!< wait for ends of data transfer */ +#define SDIO_CMDCTL_CSMEN BIT(10) /*!< command state machine(CSM) enable bit */ +#define SDIO_CMDCTL_SUSPEND BIT(11) /*!< SD I/O suspend command(SD I/O only) */ +#define SDIO_CMDCTL_ENCMDC BIT(12) /*!< CMD completion signal enabled (CE-ATA only) */ +#define SDIO_CMDCTL_NINTEN BIT(13) /*!< no CE-ATA interrupt (CE-ATA only) */ +#define SDIO_CMDCTL_ATAEN BIT(14) /*!< CE-ATA command enable(CE-ATA only) */ + +/* SDIO_DATATO */ +#define SDIO_DATATO_DATATO BITS(0,31) /*!< data timeout period */ + +/* SDIO_DATALEN */ +#define SDIO_DATALEN_DATALEN BITS(0,24) /*!< data transfer length */ + +/* SDIO_DATACTL */ +#define SDIO_DATACTL_DATAEN BIT(0) /*!< data transfer enabled bit */ +#define SDIO_DATACTL_DATADIR BIT(1) /*!< data transfer direction */ +#define SDIO_DATACTL_TRANSMOD BIT(2) /*!< data transfer mode */ +#define SDIO_DATACTL_DMAEN BIT(3) /*!< DMA enable bit */ +#define SDIO_DATACTL_BLKSZ BITS(4,7) /*!< data block size */ +#define SDIO_DATACTL_RWEN BIT(8) /*!< read wait mode enabled(SD I/O only) */ +#define SDIO_DATACTL_RWSTOP BIT(9) /*!< read wait stop(SD I/O only) */ +#define SDIO_DATACTL_RWTYPE BIT(10) /*!< read wait type(SD I/O only) */ +#define SDIO_DATACTL_IOEN BIT(11) /*!< SD I/O specific function enable(SD I/O only) */ + +/* SDIO_STAT */ +#define SDIO_STAT_CCRCERR BIT(0) /*!< command response received (CRC check failed) */ +#define SDIO_STAT_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) */ +#define SDIO_STAT_CMDTMOUT BIT(2) /*!< command response timeout */ +#define SDIO_STAT_DTTMOUT BIT(3) /*!< data timeout */ +#define SDIO_STAT_TXURE BIT(4) /*!< transmit FIFO underrun error occurs */ +#define SDIO_STAT_RXORE BIT(5) /*!< received FIFO overrun error occurs */ +#define SDIO_STAT_CMDRECV BIT(6) /*!< command response received (CRC check passed) */ +#define SDIO_STAT_CMDSEND BIT(7) /*!< command sent (no response required) */ +#define SDIO_STAT_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) */ +#define SDIO_STAT_STBITE BIT(9) /*!< start bit error in the bus */ +#define SDIO_STAT_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) */ +#define SDIO_STAT_CMDRUN BIT(11) /*!< command transmission in progress */ +#define SDIO_STAT_TXRUN BIT(12) /*!< data transmission in progress */ +#define SDIO_STAT_RXRUN BIT(13) /*!< data reception in progress */ +#define SDIO_STAT_TFH BIT(14) /*!< transmit FIFO is half empty: at least 8 words can be written into the FIFO */ +#define SDIO_STAT_RFH BIT(15) /*!< receive FIFO is half full: at least 8 words can be read in the FIFO */ +#define SDIO_STAT_TFF BIT(16) /*!< transmit FIFO is full */ +#define SDIO_STAT_RFF BIT(17) /*!< receive FIFO is full */ +#define SDIO_STAT_TFE BIT(18) /*!< transmit FIFO is empty */ +#define SDIO_STAT_RFE BIT(19) /*!< receive FIFO is empty */ +#define SDIO_STAT_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO */ +#define SDIO_STAT_RXDTVAL BIT(21) /*!< data is valid in receive FIFO */ +#define SDIO_STAT_SDIOINT BIT(22) /*!< SD I/O interrupt received */ +#define SDIO_STAT_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) */ + +/* SDIO_INTC */ +#define SDIO_INTC_CCRCERRC BIT(0) /*!< CCRCERR flag clear bit */ +#define SDIO_INTC_DTCRCERRC BIT(1) /*!< DTCRCERR flag clear bit */ +#define SDIO_INTC_CMDTMOUTC BIT(2) /*!< CMDTMOUT flag clear bit */ +#define SDIO_INTC_DTTMOUTC BIT(3) /*!< DTTMOUT flag clear bit */ +#define SDIO_INTC_TXUREC BIT(4) /*!< TXURE flag clear bit */ +#define SDIO_INTC_RXOREC BIT(5) /*!< RXORE flag clear bit */ +#define SDIO_INTC_CMDRECVC BIT(6) /*!< CMDRECV flag clear bit */ +#define SDIO_INTC_CMDSENDC BIT(7) /*!< CMDSEND flag clear bit */ +#define SDIO_INTC_DTENDC BIT(8) /*!< DTEND flag clear bit */ +#define SDIO_INTC_STBITEC BIT(9) /*!< STBITE flag clear bit */ +#define SDIO_INTC_DTBLKENDC BIT(10) /*!< DTBLKEND flag clear bit */ +#define SDIO_INTC_SDIOINTC BIT(22) /*!< SDIOINT flag clear bit */ +#define SDIO_INTC_ATAENDC BIT(23) /*!< ATAEND flag clear bit */ + +/* SDIO_INTEN */ +#define SDIO_INTEN_CCRCERRIE BIT(0) /*!< command response CRC fail interrupt enable */ +#define SDIO_INTEN_DTCRCERRIE BIT(1) /*!< data CRC fail interrupt enable */ +#define SDIO_INTEN_CMDTMOUTIE BIT(2) /*!< command response timeout interrupt enable */ +#define SDIO_INTEN_DTTMOUTIE BIT(3) /*!< data timeout interrupt enable */ +#define SDIO_INTEN_TXUREIE BIT(4) /*!< transmit FIFO underrun error interrupt enable */ +#define SDIO_INTEN_RXOREIE BIT(5) /*!< received FIFO overrun error interrupt enable */ +#define SDIO_INTEN_CMDRECVIE BIT(6) /*!< command response received interrupt enable */ +#define SDIO_INTEN_CMDSENDIE BIT(7) /*!< command sent interrupt enable */ +#define SDIO_INTEN_DTENDIE BIT(8) /*!< data end interrupt enable */ +#define SDIO_INTEN_STBITEIE BIT(9) /*!< start bit error interrupt enable */ +#define SDIO_INTEN_DTBLKENDIE BIT(10) /*!< data block end interrupt enable */ +#define SDIO_INTEN_CMDRUNIE BIT(11) /*!< command transmission interrupt enable */ +#define SDIO_INTEN_TXRUNIE BIT(12) /*!< data transmission interrupt enable */ +#define SDIO_INTEN_RXRUNIE BIT(13) /*!< data reception interrupt enable */ +#define SDIO_INTEN_TFHIE BIT(14) /*!< transmit FIFO half empty interrupt enable */ +#define SDIO_INTEN_RFHIE BIT(15) /*!< receive FIFO half full interrupt enable */ +#define SDIO_INTEN_TFFIE BIT(16) /*!< transmit FIFO full interrupt enable */ +#define SDIO_INTEN_RFFIE BIT(17) /*!< receive FIFO full interrupt enable */ +#define SDIO_INTEN_TFEIE BIT(18) /*!< transmit FIFO empty interrupt enable */ +#define SDIO_INTEN_RFEIE BIT(19) /*!< receive FIFO empty interrupt enable */ +#define SDIO_INTEN_TXDTVALIE BIT(20) /*!< data valid in transmit FIFO interrupt enable */ +#define SDIO_INTEN_RXDTVALIE BIT(21) /*!< data valid in receive FIFO interrupt enable */ +#define SDIO_INTEN_SDIOINTIE BIT(22) /*!< SD I/O interrupt received interrupt enable */ +#define SDIO_INTEN_ATAENDIE BIT(23) /*!< CE-ATA command completion signal received interrupt enable */ + +/* SDIO_FIFO */ +#define SDIO_FIFO_FIFODT BITS(0,31) /*!< receive FIFO data or transmit FIFO data */ + +/* constants definitions */ +/* SDIO flags */ +#define SDIO_FLAG_CCRCERR BIT(0) /*!< command response received (CRC check failed) flag */ +#define SDIO_FLAG_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) flag */ +#define SDIO_FLAG_CMDTMOUT BIT(2) /*!< command response timeout flag */ +#define SDIO_FLAG_DTTMOUT BIT(3) /*!< data timeout flag */ +#define SDIO_FLAG_TXURE BIT(4) /*!< transmit FIFO underrun error occurs flag */ +#define SDIO_FLAG_RXORE BIT(5) /*!< received FIFO overrun error occurs flag */ +#define SDIO_FLAG_CMDRECV BIT(6) /*!< command response received (CRC check passed) flag */ +#define SDIO_FLAG_CMDSEND BIT(7) /*!< command sent (no response required) flag */ +#define SDIO_FLAG_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) flag */ +#define SDIO_FLAG_STBITE BIT(9) /*!< start bit error in the bus flag */ +#define SDIO_FLAG_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) flag */ +#define SDIO_FLAG_CMDRUN BIT(11) /*!< command transmission in progress flag */ +#define SDIO_FLAG_TXRUN BIT(12) /*!< data transmission in progress flag */ +#define SDIO_FLAG_RXRUN BIT(13) /*!< data reception in progress flag */ +#define SDIO_FLAG_TFH BIT(14) /*!< transmit FIFO is half empty flag: at least 8 words can be written into the FIFO */ +#define SDIO_FLAG_RFH BIT(15) /*!< receive FIFO is half full flag: at least 8 words can be read in the FIFO */ +#define SDIO_FLAG_TFF BIT(16) /*!< transmit FIFO is full flag */ +#define SDIO_FLAG_RFF BIT(17) /*!< receive FIFO is full flag */ +#define SDIO_FLAG_TFE BIT(18) /*!< transmit FIFO is empty flag */ +#define SDIO_FLAG_RFE BIT(19) /*!< receive FIFO is empty flag */ +#define SDIO_FLAG_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO flag */ +#define SDIO_FLAG_RXDTVAL BIT(21) /*!< data is valid in receive FIFO flag */ +#define SDIO_FLAG_SDIOINT BIT(22) /*!< SD I/O interrupt received flag */ +#define SDIO_FLAG_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) flag */ + +/* SDIO interrupt enable or disable */ +#define SDIO_INT_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt */ +#define SDIO_INT_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt */ +#define SDIO_INT_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt */ +#define SDIO_INT_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt */ +#define SDIO_INT_TXURE BIT(4) /*!< SDIO TXURE interrupt */ +#define SDIO_INT_RXORE BIT(5) /*!< SDIO RXORE interrupt */ +#define SDIO_INT_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt */ +#define SDIO_INT_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt */ +#define SDIO_INT_DTEND BIT(8) /*!< SDIO DTEND interrupt */ +#define SDIO_INT_STBITE BIT(9) /*!< SDIO STBITE interrupt */ +#define SDIO_INT_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt */ +#define SDIO_INT_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt */ +#define SDIO_INT_TXRUN BIT(12) /*!< SDIO TXRUN interrupt */ +#define SDIO_INT_RXRUN BIT(13) /*!< SDIO RXRUN interrupt */ +#define SDIO_INT_TFH BIT(14) /*!< SDIO TFH interrupt */ +#define SDIO_INT_RFH BIT(15) /*!< SDIO RFH interrupt */ +#define SDIO_INT_TFF BIT(16) /*!< SDIO TFF interrupt */ +#define SDIO_INT_RFF BIT(17) /*!< SDIO RFF interrupt */ +#define SDIO_INT_TFE BIT(18) /*!< SDIO TFE interrupt */ +#define SDIO_INT_RFE BIT(19) /*!< SDIO RFE interrupt */ +#define SDIO_INT_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt */ +#define SDIO_INT_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt */ +#define SDIO_INT_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt */ +#define SDIO_INT_ATAEND BIT(23) /*!< SDIO ATAEND interrupt */ + +/* SDIO interrupt flags */ +#define SDIO_INT_FLAG_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt flag */ +#define SDIO_INT_FLAG_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt flag */ +#define SDIO_INT_FLAG_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt flag */ +#define SDIO_INT_FLAG_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt flag */ +#define SDIO_INT_FLAG_TXURE BIT(4) /*!< SDIO TXURE interrupt flag */ +#define SDIO_INT_FLAG_RXORE BIT(5) /*!< SDIO RXORE interrupt flag */ +#define SDIO_INT_FLAG_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt flag */ +#define SDIO_INT_FLAG_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt flag */ +#define SDIO_INT_FLAG_DTEND BIT(8) /*!< SDIO DTEND interrupt flag */ +#define SDIO_INT_FLAG_STBITE BIT(9) /*!< SDIO STBITE interrupt flag */ +#define SDIO_INT_FLAG_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt flag */ +#define SDIO_INT_FLAG_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt flag */ +#define SDIO_INT_FLAG_TXRUN BIT(12) /*!< SDIO TXRUN interrupt flag */ +#define SDIO_INT_FLAG_RXRUN BIT(13) /*!< SDIO RXRUN interrupt flag */ +#define SDIO_INT_FLAG_TFH BIT(14) /*!< SDIO TFH interrupt flag */ +#define SDIO_INT_FLAG_RFH BIT(15) /*!< SDIO RFH interrupt flag */ +#define SDIO_INT_FLAG_TFF BIT(16) /*!< SDIO TFF interrupt flag */ +#define SDIO_INT_FLAG_RFF BIT(17) /*!< SDIO RFF interrupt flag */ +#define SDIO_INT_FLAG_TFE BIT(18) /*!< SDIO TFE interrupt flag */ +#define SDIO_INT_FLAG_RFE BIT(19) /*!< SDIO RFE interrupt flag */ +#define SDIO_INT_FLAG_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt flag */ +#define SDIO_INT_FLAG_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt flag */ +#define SDIO_INT_FLAG_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt flag */ +#define SDIO_INT_FLAG_ATAEND BIT(23) /*!< SDIO ATAEND interrupt flag */ + +/* SDIO power control */ +#define PWRCTL_PWRCTL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define SDIO_POWER_OFF PWRCTL_PWRCTL(0) /*!< SDIO power off */ +#define SDIO_POWER_ON PWRCTL_PWRCTL(3) /*!< SDIO power on */ + +/* SDIO card bus mode control */ +#define CLKCTL_BUSMODE(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) +#define SDIO_BUSMODE_1BIT CLKCTL_BUSMODE(0) /*!< 1-bit SDIO card bus mode */ +#define SDIO_BUSMODE_4BIT CLKCTL_BUSMODE(1) /*!< 4-bit SDIO card bus mode */ +#define SDIO_BUSMODE_8BIT CLKCTL_BUSMODE(2) /*!< 8-bit SDIO card bus mode */ + +/* SDIO_CLK clock edge selection */ +#define SDIO_SDIOCLKEDGE_RISING (uint32_t)0x00000000U /*!< select the rising edge of the SDIOCLK to generate SDIO_CLK */ +#define SDIO_SDIOCLKEDGE_FALLING SDIO_CLKCTL_CLKEDGE /*!< select the falling edge of the SDIOCLK to generate SDIO_CLK */ + +/* clock bypass enable or disable */ +#define SDIO_CLOCKBYPASS_DISABLE (uint32_t)0x00000000U /*!< no bypass */ +#define SDIO_CLOCKBYPASS_ENABLE SDIO_CLKCTL_CLKBYP /*!< clock bypass */ + +/* SDIO_CLK clock dynamic switch on/off for power saving */ +#define SDIO_CLOCKPWRSAVE_DISABLE (uint32_t)0x00000000U /*!< SDIO_CLK clock is always on */ +#define SDIO_CLOCKPWRSAVE_ENABLE SDIO_CLKCTL_CLKPWRSAV /*!< SDIO_CLK closed when bus is idle */ + +/* SDIO command response type */ +#define CMDCTL_CMDRESP(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define SDIO_RESPONSETYPE_NO CMDCTL_CMDRESP(0) /*!< no response */ +#define SDIO_RESPONSETYPE_SHORT CMDCTL_CMDRESP(1) /*!< short response */ +#define SDIO_RESPONSETYPE_LONG CMDCTL_CMDRESP(3) /*!< long response */ + +/* command state machine wait type */ +#define SDIO_WAITTYPE_NO (uint32_t)0x00000000U /*!< not wait interrupt */ +#define SDIO_WAITTYPE_INTERRUPT SDIO_CMDCTL_INTWAIT /*!< wait interrupt */ +#define SDIO_WAITTYPE_DATAEND SDIO_CMDCTL_WAITDEND /*!< wait the end of data transfer */ + +#define SDIO_RESPONSE0 (uint32_t)0x00000000U /*!< card response[31:0]/card response[127:96] */ +#define SDIO_RESPONSE1 (uint32_t)0x00000001U /*!< card response[95:64] */ +#define SDIO_RESPONSE2 (uint32_t)0x00000002U /*!< card response[63:32] */ +#define SDIO_RESPONSE3 (uint32_t)0x00000003U /*!< card response[31:1], plus bit 0 */ + +/* SDIO data block size */ +#define DATACTL_BLKSZ(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define SDIO_DATABLOCKSIZE_1BYTE DATACTL_BLKSZ(0) /*!< block size = 1 byte */ +#define SDIO_DATABLOCKSIZE_2BYTES DATACTL_BLKSZ(1) /*!< block size = 2 bytes */ +#define SDIO_DATABLOCKSIZE_4BYTES DATACTL_BLKSZ(2) /*!< block size = 4 bytes */ +#define SDIO_DATABLOCKSIZE_8BYTES DATACTL_BLKSZ(3) /*!< block size = 8 bytes */ +#define SDIO_DATABLOCKSIZE_16BYTES DATACTL_BLKSZ(4) /*!< block size = 16 bytes */ +#define SDIO_DATABLOCKSIZE_32BYTES DATACTL_BLKSZ(5) /*!< block size = 32 bytes */ +#define SDIO_DATABLOCKSIZE_64BYTES DATACTL_BLKSZ(6) /*!< block size = 64 bytes */ +#define SDIO_DATABLOCKSIZE_128BYTES DATACTL_BLKSZ(7) /*!< block size = 128 bytes */ +#define SDIO_DATABLOCKSIZE_256BYTES DATACTL_BLKSZ(8) /*!< block size = 256 bytes */ +#define SDIO_DATABLOCKSIZE_512BYTES DATACTL_BLKSZ(9) /*!< block size = 512 bytes */ +#define SDIO_DATABLOCKSIZE_1024BYTES DATACTL_BLKSZ(10) /*!< block size = 1024 bytes */ +#define SDIO_DATABLOCKSIZE_2048BYTES DATACTL_BLKSZ(11) /*!< block size = 2048 bytes */ +#define SDIO_DATABLOCKSIZE_4096BYTES DATACTL_BLKSZ(12) /*!< block size = 4096 bytes */ +#define SDIO_DATABLOCKSIZE_8192BYTES DATACTL_BLKSZ(13) /*!< block size = 8192 bytes */ +#define SDIO_DATABLOCKSIZE_16384BYTES DATACTL_BLKSZ(14) /*!< block size = 16384 bytes */ + +/* SDIO data transfer mode */ +#define SDIO_TRANSMODE_BLOCK (uint32_t)0x00000000U /*!< block transfer */ +#define SDIO_TRANSMODE_STREAM SDIO_DATACTL_TRANSMOD /*!< stream transfer or SDIO multibyte transfer */ + +/* SDIO data transfer direction */ +#define SDIO_TRANSDIRECTION_TOCARD (uint32_t)0x00000000U /*!< write data to card */ +#define SDIO_TRANSDIRECTION_TOSDIO SDIO_DATACTL_DATADIR /*!< read data from card */ + +/* SDIO read wait type */ +#define SDIO_READWAITTYPE_DAT2 (uint32_t)0x00000000U /*!< read wait control using SDIO_DAT[2] */ +#define SDIO_READWAITTYPE_CLK SDIO_DATACTL_RWTYPE /*!< read wait control by stopping SDIO_CLK */ + +/* function declarations */ +/* de/initialization functions, hardware clock, bus mode, power_state and SDIO clock configuration */ +/* deinitialize the SDIO */ +void sdio_deinit(void); +/* configure the SDIO clock */ +void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division); +/* enable hardware clock control */ +void sdio_hardware_clock_enable(void); +/* disable hardware clock control */ +void sdio_hardware_clock_disable(void); +/* set different SDIO card bus mode */ +void sdio_bus_mode_set(uint32_t bus_mode); +/* set the SDIO power state */ +void sdio_power_state_set(uint32_t power_state); +/* get the SDIO power state */ +uint32_t sdio_power_state_get(void); +/* enable SDIO_CLK clock output */ +void sdio_clock_enable(void); +/* disable SDIO_CLK clock output */ +void sdio_clock_disable(void); + +/* configure the command index, argument, response type, wait type and CSM to send command functions */ +/* configure the command and response */ +void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type); +/* set the command state machine wait type */ +void sdio_wait_type_set(uint32_t wait_type); +/* enable the CSM(command state machine) */ +void sdio_csm_enable(void); +/* disable the CSM(command state machine) */ +void sdio_csm_disable(void); +/* get the last response command index */ +uint8_t sdio_command_index_get(void); +/* get the response for the last received command */ +uint32_t sdio_response_get(uint32_t sdio_responsex); + +/* configure the data timeout, length, block size, transfer mode, direction and DSM for data transfer functions */ +/* configure the data timeout, data length and data block size */ +void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize); +/* configure the data transfer mode and direction */ +void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction); +/* enable the DSM(data state machine) for data transfer */ +void sdio_dsm_enable(void); +/* disable the DSM(data state machine) */ +void sdio_dsm_disable(void); +/* write data(one word) to the transmit FIFO */ +void sdio_data_write(uint32_t data); +/* read data(one word) from the receive FIFO */ +uint32_t sdio_data_read(void); +/* get the number of remaining data bytes to be transferred to card */ +uint32_t sdio_data_counter_get(void); +/* get the number of words remaining to be written or read from FIFO */ +uint32_t sdio_fifo_counter_get(void); +/* enable the DMA request for SDIO */ +void sdio_dma_enable(void); +/* disable the DMA request for SDIO */ +void sdio_dma_disable(void); + +/* flag and interrupt functions */ +/* get the flags state of SDIO */ +FlagStatus sdio_flag_get(uint32_t flag); +/* clear the pending flags of SDIO */ +void sdio_flag_clear(uint32_t flag); +/* enable the SDIO interrupt */ +void sdio_interrupt_enable(uint32_t int_flag); +/* disable the SDIO interrupt */ +void sdio_interrupt_disable(uint32_t int_flag); +/* get the interrupt flags state of SDIO */ +FlagStatus sdio_interrupt_flag_get(uint32_t int_flag); +/* clear the interrupt pending flags of SDIO */ +void sdio_interrupt_flag_clear(uint32_t int_flag); + +/* SD I/O card functions */ +/* enable the read wait mode(SD I/O only) */ +void sdio_readwait_enable(void); +/* disable the read wait mode(SD I/O only) */ +void sdio_readwait_disable(void); +/* enable the function that stop the read wait process(SD I/O only) */ +void sdio_stop_readwait_enable(void); +/* disable the function that stop the read wait process(SD I/O only) */ +void sdio_stop_readwait_disable(void); +/* set the read wait type(SD I/O only) */ +void sdio_readwait_type_set(uint32_t readwait_type); +/* enable the SD I/O mode specific operation(SD I/O only) */ +void sdio_operation_enable(void); +/* disable the SD I/O mode specific operation(SD I/O only) */ +void sdio_operation_disable(void); +/* enable the SD I/O suspend operation(SD I/O only) */ +void sdio_suspend_enable(void); +/* disable the SD I/O suspend operation(SD I/O only) */ +void sdio_suspend_disable(void); + +/* CE-ATA functions */ +/* enable the CE-ATA command(CE-ATA only) */ +void sdio_ceata_command_enable(void); +/* disable the CE-ATA command(CE-ATA only) */ +void sdio_ceata_command_disable(void); +/* enable the CE-ATA interrupt(CE-ATA only) */ +void sdio_ceata_interrupt_enable(void); +/* disable the CE-ATA interrupt(CE-ATA only) */ +void sdio_ceata_interrupt_disable(void); +/* enable the CE-ATA command completion signal(CE-ATA only) */ +void sdio_ceata_command_completion_enable(void); +/* disable the CE-ATA command completion signal(CE-ATA only) */ +void sdio_ceata_command_completion_disable(void); + +#endif /* GD32F5XX_SDIO_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h new file mode 100644 index 00000000000..7b42cae8d55 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h @@ -0,0 +1,376 @@ +/*! + \file gd32f5xx_spi.h + \brief definitions for the SPI + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F5XX_SPI_H +#define GD32F5XX_SPI_H + +#include "gd32f5xx.h" + +/* SPIx(x=0,1,2,3,4,5) definitions */ +#define SPI0 (SPI_BASE + 0x0000F800U) +#define SPI1 SPI_BASE +#define SPI2 (SPI_BASE + 0x00000400U) +#define SPI3 (SPI_BASE + 0x0000FC00U) +#define SPI4 (SPI_BASE + 0x00011800U) +#define SPI5 (SPI_BASE + 0x00011C00U) + +/* I2Sx_ADD(x=1,2) definitions */ +#define I2S1_ADD I2S_ADD_BASE +#define I2S2_ADD (I2S_ADD_BASE + 0x00000C00U) + +/* SPI registers definitions */ +#define SPI_CTL0(spix) REG32((spix) + 0x00U) /*!< SPI control register 0 */ +#define SPI_CTL1(spix) REG32((spix) + 0x04U) /*!< SPI control register 1*/ +#define SPI_STAT(spix) REG32((spix) + 0x08U) /*!< SPI status register */ +#define SPI_DATA(spix) REG32((spix) + 0x0CU) /*!< SPI data register */ +#define SPI_CRCPOLY(spix) REG32((spix) + 0x10U) /*!< SPI CRC polynomial register */ +#define SPI_RCRC(spix) REG32((spix) + 0x14U) /*!< SPI receive CRC register */ +#define SPI_TCRC(spix) REG32((spix) + 0x18U) /*!< SPI transmit CRC register */ +#define SPI_I2SCTL(spix) REG32((spix) + 0x1CU) /*!< SPI I2S control register */ +#define SPI_I2SPSC(spix) REG32((spix) + 0x20U) /*!< SPI I2S clock prescaler register */ +#define SPI_QCTL(spix) REG32((spix) + 0x80U) /*!< SPI quad mode control register */ + +/* I2S_ADD registers definitions */ +#define I2S_ADD_CTL0(i2sx_add) REG32((i2sx_add) + 0x00U) /*!< I2S_ADD control register 0 */ +#define I2S_ADD_CTL1(i2sx_add) REG32((i2sx_add) + 0x04U) /*!< I2S_ADD control register 1*/ +#define I2S_ADD_STAT(i2sx_add) REG32((i2sx_add) + 0x08U) /*!< I2S_ADD status register */ +#define I2S_ADD_DATA(i2sx_add) REG32((i2sx_add) + 0x0CU) /*!< I2S_ADD data register */ +#define I2S_ADD_CRCPOLY(i2sx_add) REG32((i2sx_add) + 0x10U) /*!< I2S_ADD CRC polynomial register */ +#define I2S_ADD_RCRC(i2sx_add) REG32((i2sx_add) + 0x14U) /*!< I2S_ADD receive CRC register */ +#define I2S_ADD_TCRC(i2sx_add) REG32((i2sx_add) + 0x18U) /*!< I2S_ADD transmit CRC register */ +#define I2S_ADD_I2SCTL(i2sx_add) REG32((i2sx_add) + 0x1CU) /*!< I2S_ADD I2S control register */ +#define I2S_ADD_I2SPSC(i2sx_add) REG32((i2sx_add) + 0x20U) /*!< I2S_ADD I2S clock prescaler register */ + +/* bits definitions */ +/* SPI_CTL0 */ +#define SPI_CTL0_CKPH BIT(0) /*!< clock phase selection*/ +#define SPI_CTL0_CKPL BIT(1) /*!< clock polarity selection */ +#define SPI_CTL0_MSTMOD BIT(2) /*!< master mode enable */ +#define SPI_CTL0_PSC BITS(3,5) /*!< master clock prescaler selection */ +#define SPI_CTL0_SPIEN BIT(6) /*!< SPI enable*/ +#define SPI_CTL0_LF BIT(7) /*!< lsb first mode */ +#define SPI_CTL0_SWNSS BIT(8) /*!< nss pin selection in nss software mode */ +#define SPI_CTL0_SWNSSEN BIT(9) /*!< nss software mode selection */ +#define SPI_CTL0_RO BIT(10) /*!< receive only */ +#define SPI_CTL0_FF16 BIT(11) /*!< data frame size */ +#define SPI_CTL0_CRCNT BIT(12) /*!< CRC next transfer */ +#define SPI_CTL0_CRCEN BIT(13) /*!< CRC calculation enable */ +#define SPI_CTL0_BDOEN BIT(14) /*!< bidirectional transmit output enable*/ +#define SPI_CTL0_BDEN BIT(15) /*!< bidirectional enable */ + +/* SPI_CTL1 */ +#define SPI_CTL1_DMAREN BIT(0) /*!< receive buffer dma enable */ +#define SPI_CTL1_DMATEN BIT(1) /*!< transmit buffer dma enable */ +#define SPI_CTL1_NSSDRV BIT(2) /*!< drive nss output */ +#define SPI_CTL1_TMOD BIT(4) /*!< SPI TI mode enable */ +#define SPI_CTL1_ERRIE BIT(5) /*!< errors interrupt enable */ +#define SPI_CTL1_RBNEIE BIT(6) /*!< receive buffer not empty interrupt enable */ +#define SPI_CTL1_TBEIE BIT(7) /*!< transmit buffer empty interrupt enable */ + +/* SPI_STAT */ +#define SPI_STAT_RBNE BIT(0) /*!< receive buffer not empty */ +#define SPI_STAT_TBE BIT(1) /*!< transmit buffer empty */ +#define SPI_STAT_I2SCH BIT(2) /*!< I2S channel side */ +#define SPI_STAT_TXURERR BIT(3) /*!< I2S transmission underrun error bit */ +#define SPI_STAT_CRCERR BIT(4) /*!< SPI CRC error bit */ +#define SPI_STAT_CONFERR BIT(5) /*!< SPI configuration error bit */ +#define SPI_STAT_RXORERR BIT(6) /*!< SPI reception overrun error bit */ +#define SPI_STAT_TRANS BIT(7) /*!< transmitting on-going bit */ +#define SPI_STAT_FERR BIT(8) /*!< format error bit */ + +/* SPI_DATA */ +#define SPI_DATA_DATA BITS(0,15) /*!< data transfer register */ + +/* SPI_CRCPOLY */ +#define SPI_CRCPOLY_CPR BITS(0,15) /*!< CRC polynomial register */ + +/* SPI_RCRC */ +#define SPI_RCRC_RCR BITS(0,15) /*!< RX CRC register */ + +/* SPI_TCRC */ +#define SPI_TCRC_TCR BITS(0,15) /*!< TX CRC register */ + +/* SPI_I2SCTL */ +#define SPI_I2SCTL_CHLEN BIT(0) /*!< channel length */ +#define SPI_I2SCTL_DTLEN BITS(1,2) /*!< data length */ +#define SPI_I2SCTL_CKPL BIT(3) /*!< idle state clock polarity */ +#define SPI_I2SCTL_I2SSTD BITS(4,5) /*!< I2S standard selection */ +#define SPI_I2SCTL_PCMSMOD BIT(7) /*!< PCM frame synchronization mode */ +#define SPI_I2SCTL_I2SOPMOD BITS(8,9) /*!< I2S operation mode */ +#define SPI_I2SCTL_I2SEN BIT(10) /*!< I2S enable */ +#define SPI_I2SCTL_I2SSEL BIT(11) /*!< I2S mode selection */ + +/* SPI_I2S_PSC */ +#define SPI_I2SPSC_DIV BITS(0,7) /*!< dividing factor for the prescaler */ +#define SPI_I2SPSC_OF BIT(8) /*!< odd factor for the prescaler */ +#define SPI_I2SPSC_MCKOEN BIT(9) /*!< I2S MCK output enable */ + +/* SPI_SPI_QCTL(only SPI5) */ +#define SPI_QCTL_QMOD BIT(0) /*!< quad-SPI mode enable */ +#define SPI_QCTL_QRD BIT(1) /*!< quad-SPI mode read select */ +#define SPI_QCTL_IO23_DRV BIT(2) /*!< drive SPI_IO2 and SPI_IO3 enable */ + +/* constants definitions */ +/* SPI and I2S parameter struct definitions */ +typedef struct { + uint32_t device_mode; /*!< SPI master or slave */ + uint32_t trans_mode; /*!< SPI transtype */ + uint32_t frame_size; /*!< SPI frame size */ + uint32_t nss; /*!< SPI nss control by handware or software */ + uint32_t endian; /*!< SPI big endian or little endian */ + uint32_t clock_polarity_phase; /*!< SPI clock phase and polarity */ + uint32_t prescale; /*!< SPI prescale factor */ +} spi_parameter_struct; + +/* SPI mode definitions */ +#define SPI_MASTER (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS) /*!< SPI as master */ +#define SPI_SLAVE ((uint32_t)0x00000000U) /*!< SPI as slave */ + +/* SPI bidirectional transfer direction */ +#define SPI_BIDIRECTIONAL_TRANSMIT SPI_CTL0_BDOEN /*!< SPI work in transmit-only mode */ +#define SPI_BIDIRECTIONAL_RECEIVE (~SPI_CTL0_BDOEN) /*!< SPI work in receive-only mode */ + +/* SPI transmit type */ +#define SPI_TRANSMODE_FULLDUPLEX ((uint32_t)0x00000000U) /*!< SPI receive and send data at fullduplex communication */ +#define SPI_TRANSMODE_RECEIVEONLY SPI_CTL0_RO /*!< SPI only receive data */ +#define SPI_TRANSMODE_BDRECEIVE SPI_CTL0_BDEN /*!< bidirectional receive data */ +#define SPI_TRANSMODE_BDTRANSMIT (SPI_CTL0_BDEN | SPI_CTL0_BDOEN) /*!< bidirectional transmit data*/ + +/* SPI frame size */ +#define SPI_FRAMESIZE_16BIT SPI_CTL0_FF16 /*!< SPI frame size is 16 bits */ +#define SPI_FRAMESIZE_8BIT ((uint32_t)0x00000000U) /*!< SPI frame size is 8 bits */ + +/* SPI NSS control mode */ +#define SPI_NSS_SOFT SPI_CTL0_SWNSSEN /*!< SPI nss control by sofrware */ +#define SPI_NSS_HARD ((uint32_t)0x00000000U) /*!< SPI nss control by hardware */ + +/* SPI transmit way */ +#define SPI_ENDIAN_MSB ((uint32_t)0x00000000U) /*!< SPI transmit way is big endian: transmit MSB first */ +#define SPI_ENDIAN_LSB SPI_CTL0_LF /*!< SPI transmit way is little endian: transmit LSB first */ + +/* SPI clock polarity and phase */ +#define SPI_CK_PL_LOW_PH_1EDGE ((uint32_t)0x00000000U) /*!< SPI clock polarity is low level and phase is first edge */ +#define SPI_CK_PL_HIGH_PH_1EDGE SPI_CTL0_CKPL /*!< SPI clock polarity is high level and phase is first edge */ +#define SPI_CK_PL_LOW_PH_2EDGE SPI_CTL0_CKPH /*!< SPI clock polarity is low level and phase is second edge */ +#define SPI_CK_PL_HIGH_PH_2EDGE (SPI_CTL0_CKPL|SPI_CTL0_CKPH) /*!< SPI clock polarity is high level and phase is second edge */ + +/* SPI clock prescale factor */ +#define CTL0_PSC(regval) (BITS(3,5)&((uint32_t)(regval)<<3)) +#define SPI_PSC_2 CTL0_PSC(0) /*!< SPI clock prescale factor is 2 */ +#define SPI_PSC_4 CTL0_PSC(1) /*!< SPI clock prescale factor is 4 */ +#define SPI_PSC_8 CTL0_PSC(2) /*!< SPI clock prescale factor is 8 */ +#define SPI_PSC_16 CTL0_PSC(3) /*!< SPI clock prescale factor is 16 */ +#define SPI_PSC_32 CTL0_PSC(4) /*!< SPI clock prescale factor is 32 */ +#define SPI_PSC_64 CTL0_PSC(5) /*!< SPI clock prescale factor is 64 */ +#define SPI_PSC_128 CTL0_PSC(6) /*!< SPI clock prescale factor is 128 */ +#define SPI_PSC_256 CTL0_PSC(7) /*!< SPI clock prescale factor is 256 */ + +/* I2S audio sample rate */ +#define I2S_AUDIOSAMPLE_8K ((uint32_t)8000U) /*!< I2S audio sample rate is 8KHz */ +#define I2S_AUDIOSAMPLE_11K ((uint32_t)11025U) /*!< I2S audio sample rate is 11KHz */ +#define I2S_AUDIOSAMPLE_16K ((uint32_t)16000U) /*!< I2S audio sample rate is 16KHz */ +#define I2S_AUDIOSAMPLE_22K ((uint32_t)22050U) /*!< I2S audio sample rate is 22KHz */ +#define I2S_AUDIOSAMPLE_32K ((uint32_t)32000U) /*!< I2S audio sample rate is 32KHz */ +#define I2S_AUDIOSAMPLE_44K ((uint32_t)44100U) /*!< I2S audio sample rate is 44KHz */ +#define I2S_AUDIOSAMPLE_48K ((uint32_t)48000U) /*!< I2S audio sample rate is 48KHz */ +#define I2S_AUDIOSAMPLE_96K ((uint32_t)96000U) /*!< I2S audio sample rate is 96KHz */ +#define I2S_AUDIOSAMPLE_192K ((uint32_t)192000U) /*!< I2S audio sample rate is 192KHz */ + +/* I2S frame format */ +#define I2SCTL_DTLEN(regval) (BITS(1,2)&((uint32_t)(regval)<<1)) +#define I2S_FRAMEFORMAT_DT16B_CH16B I2SCTL_DTLEN(0) /*!< I2S data length is 16 bit and channel length is 16 bit */ +#define I2S_FRAMEFORMAT_DT16B_CH32B (I2SCTL_DTLEN(0)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 16 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT24B_CH32B (I2SCTL_DTLEN(1)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 24 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT32B_CH32B (I2SCTL_DTLEN(2)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 32 bit and channel length is 32 bit */ + +/* I2S master clock output */ +#define I2S_MCKOUT_DISABLE ((uint32_t)0x00000000U) /*!< I2S master clock output disable */ +#define I2S_MCKOUT_ENABLE SPI_I2SPSC_MCKOEN /*!< I2S master clock output enable */ + +/* I2S operation mode */ +#define I2SCTL_I2SOPMOD(regval) (BITS(8,9)&((uint32_t)(regval)<<8)) +#define I2S_MODE_SLAVETX I2SCTL_I2SOPMOD(0) /*!< I2S slave transmit mode */ +#define I2S_MODE_SLAVERX I2SCTL_I2SOPMOD(1) /*!< I2S slave receive mode */ +#define I2S_MODE_MASTERTX I2SCTL_I2SOPMOD(2) /*!< I2S master transmit mode */ +#define I2S_MODE_MASTERRX I2SCTL_I2SOPMOD(3) /*!< I2S master receive mode */ + +/* I2S standard */ +#define I2SCTL_I2SSTD(regval) (BITS(4,5)&((uint32_t)(regval)<<4)) +#define I2S_STD_PHILIPS I2SCTL_I2SSTD(0) /*!< I2S philips standard */ +#define I2S_STD_MSB I2SCTL_I2SSTD(1) /*!< I2S MSB standard */ +#define I2S_STD_LSB I2SCTL_I2SSTD(2) /*!< I2S LSB standard */ +#define I2S_STD_PCMSHORT I2SCTL_I2SSTD(3) /*!< I2S PCM short standard */ +#define I2S_STD_PCMLONG (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */ + +/* I2S clock polarity */ +#define I2S_CKPL_LOW ((uint32_t)0x00000000U) /*!< I2S clock polarity low level */ +#define I2S_CKPL_HIGH SPI_I2SCTL_CKPL /*!< I2S clock polarity high level */ + +/* SPI DMA constants definitions */ +#define SPI_DMA_TRANSMIT ((uint8_t)0x00U) /*!< SPI transmit data use DMA */ +#define SPI_DMA_RECEIVE ((uint8_t)0x01U) /*!< SPI receive data use DMA */ + +/* SPI CRC constants definitions */ +#define SPI_CRC_TX ((uint8_t)0x00U) /*!< SPI transmit CRC value */ +#define SPI_CRC_RX ((uint8_t)0x01U) /*!< SPI receive CRC value */ + +/* SPI/I2S interrupt enable/disable constants definitions */ +#define SPI_I2S_INT_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt */ +#define SPI_I2S_INT_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt */ +#define SPI_I2S_INT_ERR ((uint8_t)0x02U) /*!< error interrupt */ + +/* SPI/I2S interrupt flag constants definitions */ +#define SPI_I2S_INT_FLAG_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RXORERR ((uint8_t)0x02U) /*!< overrun interrupt flag */ +#define SPI_INT_FLAG_CONFERR ((uint8_t)0x03U) /*!< config error interrupt flag */ +#define SPI_INT_FLAG_CRCERR ((uint8_t)0x04U) /*!< CRC error interrupt flag */ +#define I2S_INT_FLAG_TXURERR ((uint8_t)0x05U) /*!< underrun error interrupt flag */ +#define SPI_I2S_INT_FLAG_FERR ((uint8_t)0x06U) /*!< format error interrupt flag */ + +/* SPI/I2S flag definitions */ +#define SPI_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define SPI_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define SPI_FLAG_CRCERR SPI_STAT_CRCERR /*!< CRC error flag */ +#define SPI_FLAG_CONFERR SPI_STAT_CONFERR /*!< mode config error flag */ +#define SPI_FLAG_RXORERR SPI_STAT_RXORERR /*!< receive overrun error flag */ +#define SPI_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define SPI_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ +#define I2S_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define I2S_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define I2S_FLAG_CH SPI_STAT_I2SCH /*!< channel side flag */ +#define I2S_FLAG_TXURERR SPI_STAT_TXURERR /*!< underrun error flag */ +#define I2S_FLAG_RXORERR SPI_STAT_RXORERR /*!< overrun error flag */ +#define I2S_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define I2S_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ + +/* function declarations */ +/* initialization functions */ +/* deinitialize SPI and I2S */ +void spi_i2s_deinit(uint32_t spi_periph); +/* initialize the parameters of SPI struct with default values */ +void spi_struct_para_init(spi_parameter_struct *spi_struct); +/* initialize SPI parameter */ +void spi_init(uint32_t spi_periph, spi_parameter_struct *spi_struct); +/* enable SPI */ +void spi_enable(uint32_t spi_periph); +/* disable SPI */ +void spi_disable(uint32_t spi_periph); + +/* initialize I2S parameter */ +void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl); +/* configure I2S prescale */ +void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout); +/* enable I2S */ +void i2s_enable(uint32_t spi_periph); +/* disable I2S */ +void i2s_disable(uint32_t spi_periph); + +/* NSS functions */ +/* enable SPI nss output */ +void spi_nss_output_enable(uint32_t spi_periph); +/* disable SPI nss output */ +void spi_nss_output_disable(uint32_t spi_periph); +/* SPI nss pin high level in software mode */ +void spi_nss_internal_high(uint32_t spi_periph); +/* SPI nss pin low level in software mode */ +void spi_nss_internal_low(uint32_t spi_periph); + +/* SPI DMA functions */ +/* enable SPI DMA send or receive */ +void spi_dma_enable(uint32_t spi_periph, uint8_t spi_dma); +/* diable SPI DMA send or receive */ +void spi_dma_disable(uint32_t spi_periph, uint8_t spi_dma); + +/* SPI/I2S transfer configure functions */ +/* configure SPI/I2S data frame format */ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format); +/* SPI transmit data */ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data); +/* SPI receive data */ +uint16_t spi_i2s_data_receive(uint32_t spi_periph); +/* configure SPI bidirectional transfer direction */ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction); + +/* SPI CRC functions */ +/* set SPI CRC polynomial */ +void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly); +/* get SPI CRC polynomial */ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph); +/* turn on SPI CRC function */ +void spi_crc_on(uint32_t spi_periph); +/* turn off SPI CRC function */ +void spi_crc_off(uint32_t spi_periph); +/* SPI next data is CRC value */ +void spi_crc_next(uint32_t spi_periph); +/* get SPI CRC send value or receive value */ +uint16_t spi_crc_get(uint32_t spi_periph, uint8_t spi_crc); + +/* SPI TI mode functions */ +/* enable SPI TI mode */ +void spi_ti_mode_enable(uint32_t spi_periph); +/* disable SPI TI mode */ +void spi_ti_mode_disable(uint32_t spi_periph); + +/* configure i2s full duplex mode */ +void i2s_full_duplex_mode_config(uint32_t i2s_add_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl, uint32_t i2s_frameformat); + +/* quad wire SPI functions */ +/* enable quad wire SPI */ +void spi_quad_enable(uint32_t spi_periph); +/* disable quad wire SPI */ +void spi_quad_disable(uint32_t spi_periph); +/* enable quad wire SPI write */ +void spi_quad_write_enable(uint32_t spi_periph); +/* enable quad wire SPI read */ +void spi_quad_read_enable(uint32_t spi_periph); +/* enable SPI_IO2 and SPI_IO3 pin output */ +void spi_quad_io23_output_enable(uint32_t spi_periph); +/* disable SPI_IO2 and SPI_IO3 pin output */ +void spi_quad_io23_output_disable(uint32_t spi_periph); + +/* flag & interrupt functions */ +/* enable SPI and I2S interrupt */ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t spi_i2s_int); +/* disable SPI and I2S interrupt */ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t spi_i2s_int); +/* get SPI and I2S interrupt status*/ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t spi_i2s_int); +/* get SPI and I2S flag status */ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t spi_i2s_flag); +/* clear SPI CRC error flag status */ +void spi_crc_error_clear(uint32_t spi_periph); + +#endif /* GD32F5XX_SPI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h new file mode 100644 index 00000000000..857b1da0f3f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h @@ -0,0 +1,358 @@ +/*! + \file gd32f5xx_syscfg.h + \brief definitions for the SYSCFG + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_SYSCFG_H +#define GD32F5XX_SYSCFG_H + +#include "gd32f5xx.h" + +/* SYSCFG definitions */ +#define SYSCFG SYSCFG_BASE + +/* registers definitions */ +#define SYSCFG_CFG0 REG32(SYSCFG + 0x00U) /*!< system configuration register 0 */ +#define SYSCFG_CFG1 REG32(SYSCFG + 0x04U) /*!< system configuration register 1 */ +#define SYSCFG_EXTISS0 REG32(SYSCFG + 0x08U) /*!< EXTI sources selection register 0 */ +#define SYSCFG_EXTISS1 REG32(SYSCFG + 0x0CU) /*!< EXTI sources selection register 1 */ +#define SYSCFG_EXTISS2 REG32(SYSCFG + 0x10U) /*!< EXTI sources selection register 2 */ +#define SYSCFG_EXTISS3 REG32(SYSCFG + 0x14U) /*!< EXTI sources selection register 3 */ +#define SYSCFG_CPSCTL REG32(SYSCFG + 0x20U) /*!< system I/O compensation control register */ +#define SYSCFG_STAT REG32(SYSCFG + 0x24U) /*!< system status register 0 */ +#define SYSCFG_SRAM0ECC REG32(SYSCFG + 0x28U) /*!< SRAM0 ECC status register */ +#define SYSCFG_SRAM1ECC REG32(SYSCFG + 0x2CU) /*!< SRAM1 ECC status register */ +#define SYSCFG_SRAM2ECC REG32(SYSCFG + 0x30U) /*!< SRAM2 ECC status register */ +#define SYSCFG_ADDSRAMECC REG32(SYSCFG + 0x34U) /*!< ADDSRAM ECC status register */ +#define SYSCFG_TCMSRAMECC REG32(SYSCFG + 0x38U) /*!< TCMSRAM ECC status register */ +#define SYSCFG_BKPSRAMECC REG32(SYSCFG + 0x3CU) /*!< BKPSRAM ECC status register */ +#define SYSCFG_FLASHECC_ADDR REG32(SYSCFG + 0x40U) /*!< FLASH ECC address register */ +#define SYSCFG_FLASHECC REG32(SYSCFG + 0x44U) /*!< FLASH ECC register */ +#define USER_CFG REG32(SYSCFG + 0x300U) /*!< user configuration register */ + +/* SYSCFG_CFG0 bits definitions */ +#define SYSCFG_CFG0_BOOT_MODE BITS(0,2) /*!< SYSCFG memory remap config */ +#define SYSCFG_CFG0_FMC_SWP BIT(8) /*!< FMC memory swap config */ +#define SYSCFG_CFG0_EXMC_SWP BITS(10,11) /*!< EXMC memory swap config */ + +/* SYSCFG_CFG1 bits definitions */ +#define SYSCFG_CFG1_I2C3FMP BIT(0) /*!< enable fast mode+ on I2C3 */ +#define SYSCFG_CFG1_I2C4FMP BIT(1) /*!< enable fast mode+ on I2C4 */ +#define SYSCFG_CFG1_I2C5FMP BIT(2) /*!< enable fast mode+ on I2C5 */ +#define SYSCFG_CFG1_ENET_PHY_SEL BIT(23) /*!< Ethernet PHY selection config */ + +/* SYSCFG_EXTISS0 bits definitions */ +#define SYSCFG_EXTISS0_EXTI0_SS BITS(0,3) /*!< EXTI 0 configuration */ +#define SYSCFG_EXTISS0_EXTI1_SS BITS(4,7) /*!< EXTI 1 configuration */ +#define SYSCFG_EXTISS0_EXTI2_SS BITS(8,11) /*!< EXTI 2 configuration */ +#define SYSCFG_EXTISS0_EXTI3_SS BITS(12,15) /*!< EXTI 3 configuration */ + +/* SYSCFG_EXTISS1 bits definitions */ +#define SYSCFG_EXTISS1_EXTI4_SS BITS(0,3) /*!< EXTI 4 configuration */ +#define SYSCFG_EXTISS1_EXTI5_SS BITS(4,7) /*!< EXTI 5 configuration */ +#define SYSCFG_EXTISS1_EXTI6_SS BITS(8,11) /*!< EXTI 6 configuration */ +#define SYSCFG_EXTISS1_EXTI7_SS BITS(12,15) /*!< EXTI 7 configuration */ + +/* SYSCFG_EXTISS2 bits definitions */ +#define SYSCFG_EXTISS2_EXTI8_SS BITS(0,3) /*!< EXTI 8 configuration */ +#define SYSCFG_EXTISS2_EXTI9_SS BITS(4,7) /*!< EXTI 9 configuration */ +#define SYSCFG_EXTISS2_EXTI10_SS BITS(8,11) /*!< EXTI 10 configuration */ +#define SYSCFG_EXTISS2_EXTI11_SS BITS(12,15) /*!< EXTI 11 configuration */ + +/* SYSCFG_EXTISS3 bits definitions */ +#define SYSCFG_EXTISS3_EXTI12_SS BITS(0,3) /*!< EXTI 12 configuration */ +#define SYSCFG_EXTISS3_EXTI13_SS BITS(4,7) /*!< EXTI 13 configuration */ +#define SYSCFG_EXTISS3_EXTI14_SS BITS(8,11) /*!< EXTI 14 configuration */ +#define SYSCFG_EXTISS3_EXTI15_SS BITS(12,15) /*!< EXTI 15 configuration */ + +/* SYSCFG_CPSCTL bits definitions */ +#define SYSCFG_CPSCTL_CPS_EN BIT(0) /*!< I/O compensation cell enable */ +#define SYSCFG_CPSCTL_CPS_RDY BIT(8) /*!< I/O compensation cell is ready or not */ + +/* SYSCFG_STAT bits definitions */ +#define SYSCFG_STAT_ECCMEIF0 BIT(0) /*!< SRAM0 two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF0 BIT(1) /*!< SRAM0 single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF1 BIT(2) /*!< SRAM1 two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF1 BIT(3) /*!< SRAM1 single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF2 BIT(4) /*!< SRAM2 two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF2 BIT(5) /*!< SRAM2 single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF3 BIT(6) /*!< ADDSRAM two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF3 BIT(7) /*!< ADDSRAM single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF4 BIT(8) /*!< TCMSRAM two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF4 BIT(9) /*!< TCMSRAM single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF5 BIT(10) /*!< BKPSRAM two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF5 BIT(11) /*!< BKPSRAM single bit correction event flag */ +#define SYSCFG_STAT_ECCMEIF6 BIT(12) /*!< FLASH two bits no-correction event flag */ +#define SYSCFG_STAT_ECCSEIF6 BIT(13) /*!< FLASH single bit correction event flag */ +#define SYSCFG_STAT_CKMNMIIF BIT(14) /*!< HXTAL clock moniotor NMI interrupt flag */ + +/* SYSCFG_SRAM0ECC bits definitions */ +#define SYSCFG_SRAM0ECC_ECCMEIE0 BIT(0) /*!< SRAM0 two bits non-correction interrupt enable */ +#define SYSCFG_SRAM0ECC_ECCSEIE0 BIT(1) /*!< SRAM0 single bit correction interrupt enable */ +#define SYSCFG_SRAM0ECC_CKMNMIIE BIT(2) /*!< HXTAL clock moniotor NMI interrupt enable */ +#define SYSCFG_SRAM0ECC_ECCSERRBITS0 BITS(10,15) /*!< indicates the error bit */ +#define SYSCFG_SRAM0ECC_ECCEADDR0 BITS(16,31) /*!< indicates the last address ECC event on SRAM0 occurred */ + +/* SYSCFG_SRAM1ECC bits definitions */ +#define SYSCFG_SRAM1ECC_ECCMEIE1 BIT(0) /*!< SRAM1 two bits non-correction interrupt enable */ +#define SYSCFG_SRAM1ECC_ECCSEIE1 BIT(1) /*!< SRAM1 single bit correction interrupt enable */ +#define SYSCFG_SRAM1ECC_ECCSERRBITS1 BITS(12,17) /*!< indicates the error bit */ +#define SYSCFG_SRAM1ECC_ECCEADDR1 BITS(18,31) /*!< indicates the last address ECC event on SRAM1 occurred */ + +/* SYSCFG_SRAM2ECC bits definitions */ +#define SYSCFG_SRAM2ECC_ECCMEIE2 BIT(0) /*!< SRAM2 two bits non-correction interrupt enable */ +#define SYSCFG_SRAM2ECC_ECCSEIE2 BIT(1) /*!< SRAM2 single bit correction interrupt enable */ +#define SYSCFG_SRAM2ECC_ECCSERRBITS2 BITS(10,15) /*!< indicates the error bit */ +#define SYSCFG_SRAM2ECC_ECCEADDR2 BITS(16,31) /*!< indicates the last address ECC event on SRAM2 occurred */ + +/* SYSCFG_ADDSRAMECC bits definitions */ +#define SYSCFG_ADDSRAMECC_ECCMEIE3 BIT(0) /*!< ADDSRAM two bits non-correction interrupt enable */ +#define SYSCFG_ADDSRAMECC_ECCSEIE3 BIT(1) /*!< ADDSRAM single bit correction interrupt enable */ +#define SYSCFG_ADDSRAMECC_ECCSERRBITS3 BITS(8,13) /*!< indicates the error bit */ +#define SYSCFG_ADDSRAMECC_ECCEADDR3 BITS(14,31) /*!< indicates the last address ECC event on ADDSRAM occurred */ + +/* SYSCFG_TCMSRAMECC bits definitions */ +#define SYSCFG_TCMSRAMECC_ECCMEIE4 BIT(0) /*!< TCMSRAM two bits non-correction interrupt enable */ +#define SYSCFG_TCMSRAMECC_ECCSEIE4 BIT(1) /*!< TCMSRAM single bit correction interrupt enable */ +#define SYSCFG_TCMSRAMECC_ECCSERRBITS4 BITS(12,17) /*!< indicates the error bit */ +#define SYSCFG_TCMSRAMECC_ECCEADDR4 BITS(18,31) /*!< indicates the last address ECC event on TCMSRAM occurred */ + +/* SYSCFG_BKPSRAMECC bits definitions */ +#define SYSCFG_BKPSRAMECC_ECCMEIE5 BIT(0) /*!< BKPSRAM two bits non-correction interrupt enable */ +#define SYSCFG_BKPSRAMECC_ECCSEIE5 BIT(1) /*!< BKPSRAM single bit correction interrupt enable */ +#define SYSCFG_BKPSRAMECC_ECCSERRBITS5 BITS(16,21) /*!< indicates the error bit */ +#define SYSCFG_BKPSRAMECC_ECCEADDR5 BITS(22,31) /*!< indicates the last address ECC event on BKPSRAM occurred */ + +/* SYSCFG_FLASHECC_ADDR */ +#define SYSCFG_FLASHECC_ADDR_ECCEADDR6 BITS(0,31) /*!< indicates the last address of ECC event on FLASH occurred */ + +/* SYSCFG_FLASHECC bits definitions */ +#define SYSCFG_FLASHECC_ECCMEIE6 BIT(0) /*!< FLASH two bits non-correction interrupt enable */ +#define SYSCFG_FLASHECC_ECCSEIE6 BIT(1) /*!< FLASH single bit correction interrupt enable */ +#define SYSCFG_FLASHECC_ECCSERRBITS6 BITS(2,7) /*!< indicates the error bit */ + +/* USER_CFG bits definitions */ +#define USER_CFG_ANA_VERSION BITS(24,31) /*!< analog version information */ + +/* constants definitions */ +/* boot mode definitions */ +#define SYSCFG_BOOTMODE_FLASH ((uint8_t)0x00U) /*!< main flash memory remap */ +#define SYSCFG_BOOTMODE_BOOTLOADER ((uint8_t)0x01U) /*!< boot loader remap */ +#define SYSCFG_BOOTMODE_SRAM ((uint8_t)0x03U) /*!< SRAM0 of on-chip SRAM remap */ +#define SYSCFG_BOOTMODE_OTP ((uint8_t)0x05U) /*!< OTP remap */ + +/* FMC swap definitions */ +#define SYSCFG_FMC_SWP_BANK0 ((uint32_t)0x00000000U) /*!< main flash Bank 0 is mapped at address 0x08000000 */ +#define SYSCFG_FMC_SWP_BANK1 ((uint32_t)0x00000100U) /*!< main flash Bank 1 is mapped at address 0x08000000 */ + +/* EXMC swap enable/disable */ +#define SYSCFG_EXMC_SWP_ENABLE ((uint32_t)0x00000400U) /*!< SDRAM bank 0 and bank 1 are swapped with NAND bank 1 and PC card */ +#define SYSCFG_EXMC_SWP_DISABLE ((uint32_t)0x00000000U) /*!< no memory mapping swap */ + +/* EXTI source select definition */ +#define EXTISS0 ((uint8_t)0x00U) /*!< EXTI source select GPIOx pin 0~3 */ +#define EXTISS1 ((uint8_t)0x01U) /*!< EXTI source select GPIOx pin 4~7 */ +#define EXTISS2 ((uint8_t)0x02U) /*!< EXTI source select GPIOx pin 8~11 */ +#define EXTISS3 ((uint8_t)0x03U) /*!< EXTI source select GPIOx pin 12~15 */ + +/* EXTI source select mask bits definition */ +#define EXTI_SS_MASK BITS(0,3) /*!< EXTI source select mask */ + +/* EXTI source select jumping step definition */ +#define EXTI_SS_JSTEP ((uint8_t)(0x04U)) /*!< EXTI source select jumping step */ + +/* EXTI source select moving step definition */ +#define EXTI_SS_MSTEP(pin) (EXTI_SS_JSTEP*((pin)%EXTI_SS_JSTEP)) /*!< EXTI source select moving step */ + +/* EXTI source port definitions */ +#define EXTI_SOURCE_GPIOA ((uint8_t)0x00U) /*!< EXTI GPIOA configuration */ +#define EXTI_SOURCE_GPIOB ((uint8_t)0x01U) /*!< EXTI GPIOB configuration */ +#define EXTI_SOURCE_GPIOC ((uint8_t)0x02U) /*!< EXTI GPIOC configuration */ +#define EXTI_SOURCE_GPIOD ((uint8_t)0x03U) /*!< EXTI GPIOD configuration */ +#define EXTI_SOURCE_GPIOE ((uint8_t)0x04U) /*!< EXTI GPIOE configuration */ +#define EXTI_SOURCE_GPIOF ((uint8_t)0x05U) /*!< EXTI GPIOF configuration */ +#define EXTI_SOURCE_GPIOG ((uint8_t)0x06U) /*!< EXTI GPIOG configuration */ +#define EXTI_SOURCE_GPIOH ((uint8_t)0x07U) /*!< EXTI GPIOH configuration */ +#define EXTI_SOURCE_GPIOI ((uint8_t)0x08U) /*!< EXTI GPIOI configuration */ + +/* EXTI source pin definitions */ +#define EXTI_SOURCE_PIN0 ((uint8_t)0x00U) /*!< EXTI GPIO pin0 configuration */ +#define EXTI_SOURCE_PIN1 ((uint8_t)0x01U) /*!< EXTI GPIO pin1 configuration */ +#define EXTI_SOURCE_PIN2 ((uint8_t)0x02U) /*!< EXTI GPIO pin2 configuration */ +#define EXTI_SOURCE_PIN3 ((uint8_t)0x03U) /*!< EXTI GPIO pin3 configuration */ +#define EXTI_SOURCE_PIN4 ((uint8_t)0x04U) /*!< EXTI GPIO pin4 configuration */ +#define EXTI_SOURCE_PIN5 ((uint8_t)0x05U) /*!< EXTI GPIO pin5 configuration */ +#define EXTI_SOURCE_PIN6 ((uint8_t)0x06U) /*!< EXTI GPIO pin6 configuration */ +#define EXTI_SOURCE_PIN7 ((uint8_t)0x07U) /*!< EXTI GPIO pin7 configuration */ +#define EXTI_SOURCE_PIN8 ((uint8_t)0x08U) /*!< EXTI GPIO pin8 configuration */ +#define EXTI_SOURCE_PIN9 ((uint8_t)0x09U) /*!< EXTI GPIO pin9 configuration */ +#define EXTI_SOURCE_PIN10 ((uint8_t)0x0AU) /*!< EXTI GPIO pin10 configuration */ +#define EXTI_SOURCE_PIN11 ((uint8_t)0x0BU) /*!< EXTI GPIO pin11 configuration */ +#define EXTI_SOURCE_PIN12 ((uint8_t)0x0CU) /*!< EXTI GPIO pin12 configuration */ +#define EXTI_SOURCE_PIN13 ((uint8_t)0x0DU) /*!< EXTI GPIO pin13 configuration */ +#define EXTI_SOURCE_PIN14 ((uint8_t)0x0EU) /*!< EXTI GPIO pin14 configuration */ +#define EXTI_SOURCE_PIN15 ((uint8_t)0x0FU) /*!< EXTI GPIO pin15 configuration */ + +/* ethernet PHY selection */ +#define SYSCFG_ENET_PHY_MII ((uint32_t)0x00000000U) /*!< MII is selected for the Ethernet MAC */ +#define SYSCFG_ENET_PHY_RMII ((uint32_t)0x00800000U) /*!< RMII is selected for the Ethernet MAC */ + +/* I/O compensation cell enable/disable */ +#define SYSCFG_COMPENSATION_ENABLE ((uint32_t)0x00000001U) /*!< I/O compensation cell enable */ +#define SYSCFG_COMPENSATION_DISABLE ((uint32_t)0x00000000U) /*!< I/O compensation cell disable */ + +/* define ECC type */ +typedef enum +{ + SYSCFG_SRAM0_ECC = 0, /*!< SRAM0 ECC event */ + SYSCFG_SRAM1_ECC, /*!< SRAM1 ECC event */ + SYSCFG_SRAM2_ECC, /*!< SRAM2 ECC event */ + SYSCFG_ADDSRAM_ECC, /*!< ADDSRAM ECC event */ + SYSCFG_TCMSRAM_ECC, /*!< TCMSRAM ECC event */ + SYSCFG_BKPSRAM_ECC, /*!< BKPSRAM ECC event */ + SYSCFG_FLASH_ECC /*!< FLASH ECC event */ +} syscfg_ecc_enum; + +/* define the EXTI bit position and its register group index offset */ +#define SYSCFG_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6U) | (uint32_t)(bitpos)) +#define SYSCFG_REG_VAL(offset) (REG32(SYSCFG + ((uint32_t)(offset) >> 6U))) +#define SYSCFG_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) + +/* register offset */ +#define SRAM0ECC_REG_OFFSET ((uint32_t)0x00000028U) /*!< SRAM0ECC register offset */ +#define SRAM1ECC_REG_OFFSET ((uint32_t)0x0000002CU) /*!< SRAM1ECC register offset */ +#define SRAM2ECC_REG_OFFSET ((uint32_t)0x00000030U) /*!< SRAM2ECC register offset */ +#define ADDSRAMECC_REG_OFFSET ((uint32_t)0x00000034U) /*!< ADDSRAMECC register offset */ +#define TCMSRAMECC_REG_OFFSET ((uint32_t)0x00000038U) /*!< TCMSRAMECC register offset */ +#define BKPSRAMECC_REG_OFFSET ((uint32_t)0x0000003CU) /*!< BKPSRAMECC register offset */ +#define FLASHECC_REG_OFFSET ((uint32_t)0x00000044U) /*!< FLASHECC register offset */ + +/* SYSCFG interrupt enable or disable */ +typedef enum +{ + SYSCFG_INT_ECCME0 = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 0U), /*!< SRAM0 two bits non-correction interrupt */ + SYSCFG_INT_ECCSE0 = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 1U), /*!< SRAM0 single bit correction interrupt */ + SYSCFG_INT_CKMNMI = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 2U), /*!< HXTAL clock moniotor NMI interrupt */ + SYSCFG_INT_ECCME1 = SYSCFG_REGIDX_BIT(SRAM1ECC_REG_OFFSET, 0U), /*!< SRAM1 two bits non-correction interrupt */ + SYSCFG_INT_ECCSE1 = SYSCFG_REGIDX_BIT(SRAM1ECC_REG_OFFSET, 1U), /*!< SRAM1 single bit correction interrupt */ + SYSCFG_INT_ECCME2 = SYSCFG_REGIDX_BIT(SRAM2ECC_REG_OFFSET, 0U), /*!< SRAM2 two bits non-correction interrupt */ + SYSCFG_INT_ECCSE2 = SYSCFG_REGIDX_BIT(SRAM2ECC_REG_OFFSET, 1U), /*!< SRAM2 single bit correction interrupt */ + SYSCFG_INT_ECCME3 = SYSCFG_REGIDX_BIT(ADDSRAMECC_REG_OFFSET, 0U), /*!< ADDSRAM two bits non-correction interrupt */ + SYSCFG_INT_ECCSE3 = SYSCFG_REGIDX_BIT(ADDSRAMECC_REG_OFFSET, 1U), /*!< ADDSRAM single bit correction interrupt */ + SYSCFG_INT_ECCME4 = SYSCFG_REGIDX_BIT(TCMSRAMECC_REG_OFFSET, 0U), /*!< TCMSRAM two bits non-correction interrupt */ + SYSCFG_INT_ECCSE4 = SYSCFG_REGIDX_BIT(TCMSRAMECC_REG_OFFSET, 1U), /*!< TCMSRAM single bit correction interrupt */ + SYSCFG_INT_ECCME5 = SYSCFG_REGIDX_BIT(BKPSRAMECC_REG_OFFSET, 0U), /*!< BKPSRAM two bits non-correction interrupt */ + SYSCFG_INT_ECCSE5 = SYSCFG_REGIDX_BIT(BKPSRAMECC_REG_OFFSET, 1U), /*!< BKPSRAM single bit correction interrupt */ + SYSCFG_INT_ECCME6 = SYSCFG_REGIDX_BIT(FLASHECC_REG_OFFSET, 0U), /*!< FLASH two bits non-correction interrupt */ + SYSCFG_INT_ECCSE6 = SYSCFG_REGIDX_BIT(FLASHECC_REG_OFFSET, 1U) /*!< FLASH single bit correction interrupt */ +} syscfg_interrupt_enum; + +/* SYSCFG flags */ +typedef enum +{ + SYSCFG_FLAG_ECCME0 = SYSCFG_STAT_ECCMEIF0, /*!< SRAM0 two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE0 = SYSCFG_STAT_ECCSEIF0, /*!< SRAM0 single bit correction event flag */ + SYSCFG_FLAG_ECCME1 = SYSCFG_STAT_ECCMEIF1, /*!< SRAM1 two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE1 = SYSCFG_STAT_ECCSEIF1, /*!< SRAM1 single bit correction event flag */ + SYSCFG_FLAG_ECCME2 = SYSCFG_STAT_ECCMEIF2, /*!< SRAM2 two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE2 = SYSCFG_STAT_ECCSEIF2, /*!< SRAM2 single bit correction event flag */ + SYSCFG_FLAG_ECCME3 = SYSCFG_STAT_ECCMEIF3, /*!< ADDSRAM two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE3 = SYSCFG_STAT_ECCSEIF3, /*!< ADDSRAM single bit correction event flag */ + SYSCFG_FLAG_ECCME4 = SYSCFG_STAT_ECCMEIF4, /*!< TCMSRAM two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE4 = SYSCFG_STAT_ECCSEIF4, /*!< TCMSRAM single bit correction event flag */ + SYSCFG_FLAG_ECCME5 = SYSCFG_STAT_ECCMEIF5, /*!< BKPSRAM two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE5 = SYSCFG_STAT_ECCSEIF5, /*!< BKPSRAM single bit correction event flag */ + SYSCFG_FLAG_ECCME6 = SYSCFG_STAT_ECCMEIF6, /*!< FLASH two bits non-correction event flag */ + SYSCFG_FLAG_ECCSE6 = SYSCFG_STAT_ECCSEIF6, /*!< FLASH single bit correction event flag */ + SYSCFG_FLAG_CKMNMI = SYSCFG_STAT_CKMNMIIF /*!< HXTAL clock moniotor NMI flag */ +} syscfg_flag_enum; + +/* SYSCFG interrupt flags */ +typedef enum +{ + SYSCFG_INT_FLAG_ECCME0 = SYSCFG_STAT_ECCMEIF0, /*!< SRAM0 two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE0 = SYSCFG_STAT_ECCSEIF0, /*!< SRAM0 single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME1 = SYSCFG_STAT_ECCMEIF1, /*!< SRAM1 two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE1 = SYSCFG_STAT_ECCSEIF1, /*!< SRAM1 single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME2 = SYSCFG_STAT_ECCMEIF2, /*!< SRAM2 two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE2 = SYSCFG_STAT_ECCSEIF2, /*!< SRAM2 single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME3 = SYSCFG_STAT_ECCMEIF3, /*!< ADDSRAM two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE3 = SYSCFG_STAT_ECCSEIF3, /*!< ADDSRAM single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME4 = SYSCFG_STAT_ECCMEIF4, /*!< TCMSRAM two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE4 = SYSCFG_STAT_ECCSEIF4, /*!< TCMSRAM single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME5 = SYSCFG_STAT_ECCMEIF5, /*!< BKPSRAM two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE5 = SYSCFG_STAT_ECCSEIF5, /*!< BKPSRAM single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCME6 = SYSCFG_STAT_ECCMEIF6, /*!< FLASH two bits non-correction event interrupt flag */ + SYSCFG_INT_FLAG_ECCSE6 = SYSCFG_STAT_ECCSEIF6, /*!< FLASH single bit correction event interrupt flag */ + SYSCFG_INT_FLAG_CKMNMI = SYSCFG_STAT_CKMNMIIF /*!< HXTAL clock moniotor NMI interrupt flag */ +} syscfg_interrupt_flag_enum; + +/* function declarations */ +/* initialization functions */ +/* deinit syscfg module */ +void syscfg_deinit(void); + +/* function configuration */ +/* configure the boot mode */ +void syscfg_bootmode_config(uint8_t syscfg_bootmode); +/* configure FMC memory mapping swap */ +void syscfg_fmc_swap_config(uint32_t syscfg_fmc_swap); +/* configure the EXMC swap */ +void syscfg_exmc_swap_config(uint32_t syscfg_exmc_swap); +/* configure the GPIO pin as EXTI Line */ +void syscfg_exti_line_config(uint8_t exti_port, uint8_t exti_pin); +/* configure the PHY interface for the ethernet MAC */ +void syscfg_enet_phy_interface_config(uint32_t syscfg_enet_phy_interface); +/* configure the I/O compensation cell */ +void syscfg_compensation_config(uint32_t syscfg_compensation); +/* get Compensation cell ready flag */ +FlagStatus syscfg_cps_cell_ready_get(void); +/* get ecc err bits */ +uint32_t syscfg_ecc_err_bits_get(syscfg_ecc_enum ecc_type); +/* get ecc address */ +uint32_t syscfg_ecc_address_get(syscfg_ecc_enum ecc_type); + +/* interrupt & flag functions */ +/* get SYSCFG flag state */ +FlagStatus syscfg_flag_get(syscfg_flag_enum flag); +/* clear SYSCFG flag state */ +void syscfg_flag_clear(syscfg_flag_enum flag); +/* enable SYSCFG interrupt */ +void syscfg_interrupt_enable(syscfg_interrupt_enum interrupt); +/* disable SYSCFG interrupt */ +void syscfg_interrupt_disable(syscfg_interrupt_enum interrupt); +/* get SYSCFG interrupt flag state */ +FlagStatus syscfg_interrupt_flag_get(syscfg_interrupt_flag_enum flag); +/* clear SYSCFG interrupt flag state */ +void syscfg_interrupt_flag_clear(syscfg_interrupt_flag_enum flag); + +#endif /* GD32F5XX_SYSCFG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h new file mode 100644 index 00000000000..47b8879dc35 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h @@ -0,0 +1,869 @@ +/*! + \file gd32f5xx_timer.h + \brief definitions for the TIMER + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_TIMER_H +#define GD32F5XX_TIMER_H + +#include "gd32f5xx.h" + +/* TIMERx(x=0..13) definitions */ +#define TIMER0 (TIMER_BASE + 0x00010000U) +#define TIMER1 (TIMER_BASE + 0x00000000U) +#define TIMER2 (TIMER_BASE + 0x00000400U) +#define TIMER3 (TIMER_BASE + 0x00000800U) +#define TIMER4 (TIMER_BASE + 0x00000C00U) +#define TIMER5 (TIMER_BASE + 0x00001000U) +#define TIMER6 (TIMER_BASE + 0x00001400U) +#define TIMER7 (TIMER_BASE + 0x00010400U) +#define TIMER8 (TIMER_BASE + 0x00014000U) +#define TIMER9 (TIMER_BASE + 0x00014400U) +#define TIMER10 (TIMER_BASE + 0x00014800U) +#define TIMER11 (TIMER_BASE + 0x00001800U) +#define TIMER12 (TIMER_BASE + 0x00001C00U) +#define TIMER13 (TIMER_BASE + 0x00002000U) + +/* registers definitions */ +#define TIMER_CTL0(timerx) REG32((timerx) + 0x00000000U) /*!< TIMER control register 0 */ +#define TIMER_CTL1(timerx) REG32((timerx) + 0x00000004U) /*!< TIMER control register 1 */ +#define TIMER_SMCFG(timerx) REG32((timerx) + 0x00000008U) /*!< TIMER slave mode configuration register */ +#define TIMER_DMAINTEN(timerx) REG32((timerx) + 0x0000000CU) /*!< TIMER DMA and interrupt enable register */ +#define TIMER_INTF(timerx) REG32((timerx) + 0x00000010U) /*!< TIMER interrupt flag register */ +#define TIMER_SWEVG(timerx) REG32((timerx) + 0x00000014U) /*!< TIMER software event generation register */ +#define TIMER_CHCTL0(timerx) REG32((timerx) + 0x00000018U) /*!< TIMER channel control register 0 */ +#define TIMER_CHCTL1(timerx) REG32((timerx) + 0x0000001CU) /*!< TIMER channel control register 1 */ +#define TIMER_CHCTL2(timerx) REG32((timerx) + 0x00000020U) /*!< TIMER channel control register 2 */ +#define TIMER_CNT(timerx) REG32((timerx) + 0x00000024U) /*!< TIMER counter register */ +#define TIMER_PSC(timerx) REG32((timerx) + 0x00000028U) /*!< TIMER prescaler register */ +#define TIMER_CAR(timerx) REG32((timerx) + 0x0000002CU) /*!< TIMER counter auto reload register */ +#define TIMER_CREP(timerx) REG32((timerx) + 0x00000030U) /*!< TIMER counter repetition register */ +#define TIMER_CH0CV(timerx) REG32((timerx) + 0x00000034U) /*!< TIMER channel 0 capture/compare value register */ +#define TIMER_CH1CV(timerx) REG32((timerx) + 0x00000038U) /*!< TIMER channel 1 capture/compare value register */ +#define TIMER_CH2CV(timerx) REG32((timerx) + 0x0000003CU) /*!< TIMER channel 2 capture/compare value register */ +#define TIMER_CH3CV(timerx) REG32((timerx) + 0x00000040U) /*!< TIMER channel 3 capture/compare value register */ +#define TIMER_CCHP(timerx) REG32((timerx) + 0x00000044U) /*!< TIMER complementary channel protection register */ +#define TIMER_DMACFG(timerx) REG32((timerx) + 0x00000048U) /*!< TIMER DMA configuration register */ +#define TIMER_DMATB(timerx) REG32((timerx) + 0x0000004CU) /*!< TIMER DMA transfer buffer register */ +#define TIMER_IRMP(timerx) REG32((timerx) + 0x00000050U) /*!< TIMER channel input remap register */ +#define TIMER_CH0COMV_ADD(timerx) REG32((timerx) + 0x00000064U) /*!< TIMER channel 0 additional compare value register */ +#define TIMER_CH1COMV_ADD(timerx) REG32((timerx) + 0x00000068U) /*!< TIMER channel 1 additional compare value register */ +#define TIMER_CH2COMV_ADD(timerx) REG32((timerx) + 0x0000006CU) /*!< TIMER channel 2 additional compare value register */ +#define TIMER_CH3COMV_ADD(timerx) REG32((timerx) + 0x00000070U) /*!< TIMER channel 3 additional compare value register */ +#define TIMER_CTL2(timerx) REG32((timerx) + 0x00000074U) /*!< TIMER control register 2 */ + +#define TIMER_CFG(timerx) REG32((timerx) + 0x000000FCU) /*!< TIMER configuration register */ + +/* bits definitions */ +/* TIMER_CTL0 */ +#define TIMER_CTL0_CEN BIT(0) /*!< TIMER counter enable */ +#define TIMER_CTL0_UPDIS BIT(1) /*!< update disable */ +#define TIMER_CTL0_UPS BIT(2) /*!< update source */ +#define TIMER_CTL0_SPM BIT(3) /*!< single pulse mode */ +#define TIMER_CTL0_DIR BIT(4) /*!< timer counter direction */ +#define TIMER_CTL0_CAM BITS(5,6) /*!< center-aligned mode selection */ +#define TIMER_CTL0_ARSE BIT(7) /*!< auto-reload shadow enable */ +#define TIMER_CTL0_CKDIV BITS(8,9) /*!< clock division */ + +/* TIMER_CTL1 */ +#define TIMER_CTL1_CCSE BIT(0) /*!< commutation control shadow enable */ +#define TIMER_CTL1_CCUC BIT(2) /*!< commutation control shadow register update control */ +#define TIMER_CTL1_DMAS BIT(3) /*!< DMA request source selection */ +#define TIMER_CTL1_MMC BITS(4,6) /*!< master mode control */ +#define TIMER_CTL1_TI0S BIT(7) /*!< channel 0 trigger input selection(hall mode selection) */ +#define TIMER_CTL1_ISO0 BIT(8) /*!< idle state of channel 0 output */ +#define TIMER_CTL1_ISO0N BIT(9) /*!< idle state of channel 0 complementary output */ +#define TIMER_CTL1_ISO1 BIT(10) /*!< idle state of channel 1 output */ +#define TIMER_CTL1_ISO1N BIT(11) /*!< idle state of channel 1 complementary output */ +#define TIMER_CTL1_ISO2 BIT(12) /*!< idle state of channel 2 output */ +#define TIMER_CTL1_ISO2N BIT(13) /*!< idle state of channel 2 complementary output */ +#define TIMER_CTL1_ISO3 BIT(14) /*!< idle state of channel 3 output */ +#define TIMER_CTL1_ISO3N BIT(15) /*!< idle state of channel 3 complementary output */ + +/* TIMER_SMCFG */ +#define TIMER_SMCFG_SMC BITS(0,2) /*!< slave mode control */ +#define TIMER_SMCFG_TRGS BITS(4,6) /*!< trigger selection */ +#define TIMER_SMCFG_MSM BIT(7) /*!< master-slave mode */ +#define TIMER_SMCFG_ETFC BITS(8,11) /*!< external trigger filter control */ +#define TIMER_SMCFG_ETPSC BITS(12,13) /*!< external trigger prescaler */ +#define TIMER_SMCFG_SMC1 BIT(14) /*!< part of SMC for enable external clock mode 1 */ +#define TIMER_SMCFG_ETP BIT(15) /*!< external trigger polarity */ + +/* TIMER_DMAINTEN */ +#define TIMER_DMAINTEN_UPIE BIT(0) /*!< update interrupt enable */ +#define TIMER_DMAINTEN_CH0IE BIT(1) /*!< channel 0 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH1IE BIT(2) /*!< channel 1 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH2IE BIT(3) /*!< channel 2 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH3IE BIT(4) /*!< channel 3 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CMTIE BIT(5) /*!< commutation interrupt request enable */ +#define TIMER_DMAINTEN_TRGIE BIT(6) /*!< trigger interrupt enable */ +#define TIMER_DMAINTEN_BRKIE BIT(7) /*!< break interrupt enable */ +#define TIMER_DMAINTEN_UPDEN BIT(8) /*!< update DMA request enable */ +#define TIMER_DMAINTEN_CH0DEN BIT(9) /*!< channel 0 DMA request enable */ +#define TIMER_DMAINTEN_CH1DEN BIT(10) /*!< channel 1 DMA request enable */ +#define TIMER_DMAINTEN_CH2DEN BIT(11) /*!< channel 2 DMA request enable */ +#define TIMER_DMAINTEN_CH3DEN BIT(12) /*!< channel 3 DMA request enable */ +#define TIMER_DMAINTEN_CMTDEN BIT(13) /*!< commutation DMA request enable */ +#define TIMER_DMAINTEN_TRGDEN BIT(14) /*!< trigger DMA request enable */ +#define TIMER_DMAINTEN_CH0COMADDIE BIT(28) /*!< channel 0 additional compare interrupt enable */ +#define TIMER_DMAINTEN_CH1COMADDIE BIT(29) /*!< channel 1 additional compare interrupt enable */ +#define TIMER_DMAINTEN_CH2COMADDIE BIT(30) /*!< channel 2 additional compare interrupt enable */ +#define TIMER_DMAINTEN_CH3COMADDIE BIT(31) /*!< channel 3 additional compare interrupt enable */ + +/* TIMER_INTF */ +#define TIMER_INTF_UPIF BIT(0) /*!< update interrupt flag */ +#define TIMER_INTF_CH0IF BIT(1) /*!< channel 0 capture/compare interrupt flag */ +#define TIMER_INTF_CH1IF BIT(2) /*!< channel 1 capture/compare interrupt flag */ +#define TIMER_INTF_CH2IF BIT(3) /*!< channel 2 capture/compare interrupt flag */ +#define TIMER_INTF_CH3IF BIT(4) /*!< channel 3 capture/compare interrupt flag */ +#define TIMER_INTF_CMTIF BIT(5) /*!< channel commutation interrupt flag */ +#define TIMER_INTF_TRGIF BIT(6) /*!< trigger interrupt flag */ +#define TIMER_INTF_BRKIF BIT(7) /*!< break interrupt flag */ +#define TIMER_INTF_CH0OF BIT(9) /*!< channel 0 overcapture flag */ +#define TIMER_INTF_CH1OF BIT(10) /*!< channel 1 overcapture flag */ +#define TIMER_INTF_CH2OF BIT(11) /*!< channel 2 overcapture flag */ +#define TIMER_INTF_CH3OF BIT(12) /*!< channel 3 overcapture flag */ +#define TIMER_INTF_CH0COMADDIF BIT(28) /*!< channel 0 additional compare interrupt flag */ +#define TIMER_INTF_CH1COMADDIF BIT(29) /*!< channel 1 additional compare interrupt flag */ +#define TIMER_INTF_CH2COMADDIF BIT(30) /*!< channel 2 additional compare interrupt flag */ +#define TIMER_INTF_CH3COMADDIF BIT(31) /*!< channel 3 additional compare interrupt flag */ + +/* TIMER_SWEVG */ +#define TIMER_SWEVG_UPG BIT(0) /*!< update event generate */ +#define TIMER_SWEVG_CH0G BIT(1) /*!< channel 0 capture or compare event generation */ +#define TIMER_SWEVG_CH1G BIT(2) /*!< channel 1 capture or compare event generation */ +#define TIMER_SWEVG_CH2G BIT(3) /*!< channel 2 capture or compare event generation */ +#define TIMER_SWEVG_CH3G BIT(4) /*!< channel 3 capture or compare event generation */ +#define TIMER_SWEVG_CMTG BIT(5) /*!< channel commutation event generation */ +#define TIMER_SWEVG_TRGG BIT(6) /*!< trigger event generation */ +#define TIMER_SWEVG_BRKG BIT(7) /*!< break event generation */ +#define TIMER_SWEVG_CH0COMADDG BIT(28) /*!< channel 0 additional compare event generation */ +#define TIMER_SWEVG_CH1COMADDG BIT(29) /*!< channel 1 additional compare event generation */ +#define TIMER_SWEVG_CH2COMADDG BIT(30) /*!< channel 2 additional compare event generation */ +#define TIMER_SWEVG_CH3COMADDG BIT(31) /*!< channel 3 additional compare event generation */ + +/* TIMER_CHCTL0 */ +/* output compare mode */ +#define TIMER_CHCTL0_CH0MS BITS(0,1) /*!< channel 0 mode selection */ +#define TIMER_CHCTL0_CH0COMFEN BIT(2) /*!< channel 0 output compare fast enable */ +#define TIMER_CHCTL0_CH0COMSEN BIT(3) /*!< channel 0 output compare shadow enable */ +#define TIMER_CHCTL0_CH0COMCTL BITS(4,6) /*!< channel 0 output compare mode */ +#define TIMER_CHCTL0_CH0COMCEN BIT(7) /*!< channel 0 output compare clear enable */ +#define TIMER_CHCTL0_CH1MS BITS(8,9) /*!< channel 1 mode selection */ +#define TIMER_CHCTL0_CH1COMFEN BIT(10) /*!< channel 1 output compare fast enable */ +#define TIMER_CHCTL0_CH1COMSEN BIT(11) /*!< channel 1 output compare shadow enable */ +#define TIMER_CHCTL0_CH1COMCTL BITS(12,14) /*!< channel 1 output compare mode */ +#define TIMER_CHCTL0_CH1COMCEN BIT(15) /*!< channel 1 output compare clear enable */ +#define TIMER_CHCTL0_CH0COMADDSEN BIT(28) /*!< channel 0 additional compare output shadow enable */ +#define TIMER_CHCTL0_CH1COMADDSEN BIT(29) /*!< channel 1 additional compare output shadow enable */ +/* input capture mode */ +#define TIMER_CHCTL0_CH0CAPPSC BITS(2,3) /*!< channel 0 input capture prescaler */ +#define TIMER_CHCTL0_CH0CAPFLT BITS(4,7) /*!< channel 0 input capture filter control */ +#define TIMER_CHCTL0_CH1CAPPSC BITS(10,11) /*!< channel 1 input capture prescaler */ +#define TIMER_CHCTL0_CH1CAPFLT BITS(12,15) /*!< channel 1 input capture filter control */ + +/* TIMER_CHCTL1 */ +/* output compare mode */ +#define TIMER_CHCTL1_CH2MS BITS(0,1) /*!< channel 2 mode selection */ +#define TIMER_CHCTL1_CH2COMFEN BIT(2) /*!< channel 2 output compare fast enable */ +#define TIMER_CHCTL1_CH2COMSEN BIT(3) /*!< channel 2 output compare shadow enable */ +#define TIMER_CHCTL1_CH2COMCTL BITS(4,6) /*!< channel 2 output compare mode */ +#define TIMER_CHCTL1_CH2COMCEN BIT(7) /*!< channel 2 output compare clear enable */ +#define TIMER_CHCTL1_CH3MS BITS(8,9) /*!< channel 3 mode selection */ +#define TIMER_CHCTL1_CH3COMFEN BIT(10) /*!< channel 3 output compare fast enable */ +#define TIMER_CHCTL1_CH3COMSEN BIT(11) /*!< channel 3 output compare shadow enable */ +#define TIMER_CHCTL1_CH3COMCTL BITS(12,14) /*!< channel 3 output compare mode */ +#define TIMER_CHCTL1_CH3COMCEN BIT(15) /*!< channel 3 output compare clear enable */ +#define TIMER_CHCTL1_CH2COMADDSEN BIT(28) /*!< channel 2 additional compare output shadow enable */ +#define TIMER_CHCTL1_CH3COMADDSEN BIT(29) /*!< channel 3 additional compare output shadow enable */ +/* input capture mode */ +#define TIMER_CHCTL1_CH2CAPPSC BITS(2,3) /*!< channel 2 input capture prescaler */ +#define TIMER_CHCTL1_CH2CAPFLT BITS(4,7) /*!< channel 2 input capture filter control */ +#define TIMER_CHCTL1_CH3CAPPSC BITS(10,11) /*!< channel 3 input capture prescaler */ +#define TIMER_CHCTL1_CH3CAPFLT BITS(12,15) /*!< channel 3 input capture filter control */ + +/* TIMER_CHCTL2 */ +#define TIMER_CHCTL2_CH0EN BIT(0) /*!< channel 0 capture/compare function enable */ +#define TIMER_CHCTL2_CH0P BIT(1) /*!< channel 0 capture/compare function polarity */ +#define TIMER_CHCTL2_CH0NEN BIT(2) /*!< channel 0 complementary output enable */ +#define TIMER_CHCTL2_CH0NP BIT(3) /*!< channel 0 complementary output polarity */ +#define TIMER_CHCTL2_CH1EN BIT(4) /*!< channel 1 capture/compare function enable */ +#define TIMER_CHCTL2_CH1P BIT(5) /*!< channel 1 capture/compare function polarity */ +#define TIMER_CHCTL2_CH1NEN BIT(6) /*!< channel 1 complementary output enable */ +#define TIMER_CHCTL2_CH1NP BIT(7) /*!< channel 1 complementary output polarity */ +#define TIMER_CHCTL2_CH2EN BIT(8) /*!< channel 2 capture/compare function enable */ +#define TIMER_CHCTL2_CH2P BIT(9) /*!< channel 2 capture/compare function polarity */ +#define TIMER_CHCTL2_CH2NEN BIT(10) /*!< channel 2 complementary output enable */ +#define TIMER_CHCTL2_CH2NP BIT(11) /*!< channel 2 complementary output polarity */ +#define TIMER_CHCTL2_CH3EN BIT(12) /*!< channel 3 capture/compare function enable */ +#define TIMER_CHCTL2_CH3P BIT(13) /*!< channel 3 capture/compare function polarity */ +#define TIMER_CHCTL2_CH3NEN BIT(14) /*!< channel 3 complementary output enable */ +#define TIMER_CHCTL2_CH3NP BIT(15) /*!< channel 3 complementary output polarity */ + +/* TIMER_CNT */ +#define TIMER_CNT_CNT16 BITS(0,15) /*!< 16 bit timer counter */ +#define TIMER_CNT_CNT32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) timer counter */ + +/* TIMER_PSC */ +#define TIMER_PSC_PSC BITS(0,15) /*!< prescaler value of the counter clock */ + +/* TIMER_CAR */ +#define TIMER_CAR_CARL16 BITS(0,15) /*!< 16 bit counter auto reload value */ +#define TIMER_CAR_CARL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) counter auto reload value */ + +/* TIMER_CREP */ +#define TIMER_CREP_CREP BITS(0,7) /*!< counter repetition value */ + +/* TIMER_CH0CV */ +#define TIMER_CH0CV_CH0VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 0 */ +#define TIMER_CH0CV_CH0VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 0 */ + +/* TIMER_CH1CV */ +#define TIMER_CH1CV_CH1VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 1 */ +#define TIMER_CH1CV_CH1VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 1 */ + +/* TIMER_CH2CV */ +#define TIMER_CH2CV_CH2VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 2 */ +#define TIMER_CH2CV_CH2VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 2 */ + +/* TIMER_CH3CV */ +#define TIMER_CH3CV_CH3VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 3 */ +#define TIMER_CH3CV_CH3VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 3 */ + +/* TIMER_CCHP */ +#define TIMER_CCHP_DTCFG BITS(0,7) /*!< dead time configure */ +#define TIMER_CCHP_PROT BITS(8,9) /*!< complementary register protect control */ +#define TIMER_CCHP_IOS BIT(10) /*!< idle mode off-state configure */ +#define TIMER_CCHP_ROS BIT(11) /*!< run mode off-state configure */ +#define TIMER_CCHP_BRKEN BIT(12) /*!< break enable */ +#define TIMER_CCHP_BRKP BIT(13) /*!< break polarity */ +#define TIMER_CCHP_OAEN BIT(14) /*!< output automatic enable */ +#define TIMER_CCHP_POEN BIT(15) /*!< primary output enable */ + +/* TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA BITS(0,4) /*!< DMA transfer access start address */ +#define TIMER_DMACFG_DMATC BITS(8,12) /*!< DMA transfer count */ + +/* TIMER_DMATB */ +#define TIMER_DMATB_DMATB BITS(0,15) /*!< DMA transfer buffer address */ + +/* TIMER_IRMP */ +#define TIMER1_IRMP_ITI1_RMP BITS(10,11) /*!< TIMER1 internal trigger input 1 remap */ +#define TIMER4_IRMP_CI3_RMP BITS(6,7) /*!< TIMER4 channel 3 input remap */ +#define TIMER10_IRMP_ITI1_RMP BITS(0,1) /*!< TIMER10 internal trigger input 1 remap */ + +/* TIMER_CFG */ +#define TIMER_CFG_OUTSEL BIT(0) /*!< the output value selection */ +#define TIMER_CFG_CHVSEL BIT(1) /*!< write CHxVAL register selection */ + +/* TIMER_CH0COMV_ADD */ +#define TIMER_CH0COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 0 */ + +/* TIMER_CH1COMV_ADD */ +#define TIMER_CH1COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 1 */ + +/* TIMER_CH2COMV_ADD */ +#define TIMER_CH2COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 2 */ + +/* TIMER_CH3COMV_ADD */ +#define TIMER_CH3COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 3 */ + +/* TIMER_CTL2 */ +#define TIMER_CTL2_CH0CPWMEN BIT(28) /*!< Channel 0 composite PWM mode enable */ +#define TIMER_CTL2_CH1CPWMEN BIT(29) /*!< Channel 1 composite PWM mode enable */ +#define TIMER_CTL2_CH2CPWMEN BIT(30) /*!< Channel 2 composite PWM mode enable */ +#define TIMER_CTL2_CH3CPWMEN BIT(31) /*!< Channel 3 composite PWM mode enable */ + +/* constants definitions */ +/* TIMER init parameter struct definitions*/ +typedef struct { + uint16_t prescaler; /*!< prescaler value */ + uint16_t alignedmode; /*!< aligned mode */ + uint16_t counterdirection; /*!< counter direction */ + uint16_t clockdivision; /*!< clock division value */ + uint32_t period; /*!< period value */ + uint8_t repetitioncounter; /*!< the counter repetition value */ +} timer_parameter_struct; + +/* break parameter struct definitions*/ +typedef struct { + uint16_t runoffstate; /*!< run mode off-state */ + uint16_t ideloffstate; /*!< idle mode off-state */ + uint16_t deadtime; /*!< dead time */ + uint16_t breakpolarity; /*!< break polarity */ + uint16_t outputautostate; /*!< output automatic enable */ + uint16_t protectmode; /*!< complementary register protect control */ + uint16_t breakstate; /*!< break enable */ +} timer_break_parameter_struct; + +/* channel output parameter struct definitions */ +typedef struct { + uint16_t outputstate; /*!< channel output state */ + uint16_t outputnstate; /*!< channel complementary output state */ + uint16_t ocpolarity; /*!< channel output polarity */ + uint16_t ocnpolarity; /*!< channel complementary output polarity */ + uint16_t ocidlestate; /*!< idle state of channel output */ + uint16_t ocnidlestate; /*!< idle state of channel complementary output */ +} timer_oc_parameter_struct; + +/* channel input parameter struct definitions */ +typedef struct { + uint16_t icpolarity; /*!< channel input polarity */ + uint16_t icselection; /*!< channel input mode selection */ + uint16_t icprescaler; /*!< channel input capture prescaler */ + uint16_t icfilter; /*!< channel input capture filter control */ +} timer_ic_parameter_struct; + +/* TIMER interrupt enable or disable */ +#define TIMER_INT_UP TIMER_DMAINTEN_UPIE /*!< update interrupt */ +#define TIMER_INT_CH0 TIMER_DMAINTEN_CH0IE /*!< channel 0 interrupt */ +#define TIMER_INT_CH1 TIMER_DMAINTEN_CH1IE /*!< channel 1 interrupt */ +#define TIMER_INT_CH2 TIMER_DMAINTEN_CH2IE /*!< channel 2 interrupt */ +#define TIMER_INT_CH3 TIMER_DMAINTEN_CH3IE /*!< channel 3 interrupt */ +#define TIMER_INT_CMT TIMER_DMAINTEN_CMTIE /*!< channel commutation interrupt flag */ +#define TIMER_INT_TRG TIMER_DMAINTEN_TRGIE /*!< trigger interrupt */ +#define TIMER_INT_BRK TIMER_DMAINTEN_BRKIE /*!< break interrupt */ +#define TIMER_INT_CH0COMADD TIMER_DMAINTEN_CH0COMADDIE /*!< Channel 0 additional compare interrupt */ +#define TIMER_INT_CH1COMADD TIMER_DMAINTEN_CH1COMADDIE /*!< Channel 1 additional compare interrupt */ +#define TIMER_INT_CH2COMADD TIMER_DMAINTEN_CH2COMADDIE /*!< Channel 2 additional compare interrupt */ +#define TIMER_INT_CH3COMADD TIMER_DMAINTEN_CH3COMADDIE /*!< Channel 3 additional compare interrupt */ + +/* TIMER flag */ +#define TIMER_FLAG_UP TIMER_INTF_UPIF /*!< update flag */ +#define TIMER_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 flag */ +#define TIMER_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 flag */ +#define TIMER_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 flag */ +#define TIMER_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 flag */ +#define TIMER_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation flag */ +#define TIMER_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger flag */ +#define TIMER_FLAG_BRK TIMER_INTF_BRKIF /*!< break flag */ +#define TIMER_FLAG_CH0O TIMER_INTF_CH0OF /*!< channel 0 overcapture flag */ +#define TIMER_FLAG_CH1O TIMER_INTF_CH1OF /*!< channel 1 overcapture flag */ +#define TIMER_FLAG_CH2O TIMER_INTF_CH2OF /*!< channel 2 overcapture flag */ +#define TIMER_FLAG_CH3O TIMER_INTF_CH3OF /*!< channel 3 overcapture flag */ +#define TIMER_FLAG_CH0COMADD TIMER_INTF_CH0COMADDIF /*!< Channel 0 additional compare interrupt flag */ +#define TIMER_FLAG_CH1COMADD TIMER_INTF_CH1COMADDIF /*!< Channel 1 additional compare interrupt flag */ +#define TIMER_FLAG_CH2COMADD TIMER_INTF_CH2COMADDIF /*!< Channel 2 additional compare interrupt flag */ +#define TIMER_FLAG_CH3COMADD TIMER_INTF_CH3COMADDIF /*!< Channel 3 additional compare interrupt flag */ + +/* TIMER interrupt flag */ +#define TIMER_INT_FLAG_UP TIMER_INTF_UPIF /*!< update interrupt flag */ +#define TIMER_INT_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 interrupt flag */ +#define TIMER_INT_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 interrupt flag */ +#define TIMER_INT_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 interrupt flag */ +#define TIMER_INT_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 interrupt flag */ +#define TIMER_INT_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation interrupt flag */ +#define TIMER_INT_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger interrupt flag */ +#define TIMER_INT_FLAG_BRK TIMER_INTF_BRKIF /*!< break interrupt */ +#define TIMER_INT_FLAG_CH0COMADD TIMER_INT_CH0COMADD /*!< Channel 0 additional compare interrupt */ +#define TIMER_INT_FLAG_CH1COMADD TIMER_INT_CH1COMADD /*!< Channel 1 additional compare interrupt */ +#define TIMER_INT_FLAG_CH2COMADD TIMER_INT_CH2COMADD /*!< Channel 2 additional compare interrupt */ +#define TIMER_INT_FLAG_CH3COMADD TIMER_INT_CH3COMADD /*!< Channel 3 additional compare interrupt */ + +/* TIMER DMA source enable */ +#define TIMER_DMA_UPD ((uint16_t)TIMER_DMAINTEN_UPDEN) /*!< update DMA enable */ +#define TIMER_DMA_CH0D ((uint16_t)TIMER_DMAINTEN_CH0DEN) /*!< channel 0 DMA enable */ +#define TIMER_DMA_CH1D ((uint16_t)TIMER_DMAINTEN_CH1DEN) /*!< channel 1 DMA enable */ +#define TIMER_DMA_CH2D ((uint16_t)TIMER_DMAINTEN_CH2DEN) /*!< channel 2 DMA enable */ +#define TIMER_DMA_CH3D ((uint16_t)TIMER_DMAINTEN_CH3DEN) /*!< channel 3 DMA enable */ +#define TIMER_DMA_CMTD ((uint16_t)TIMER_DMAINTEN_CMTDEN) /*!< commutation DMA request enable */ +#define TIMER_DMA_TRGD ((uint16_t)TIMER_DMAINTEN_TRGDEN) /*!< trigger DMA enable */ + +/* channel DMA request source selection */ +#define TIMER_DMAREQUEST_UPDATEEVENT ((uint8_t)0x00U) /*!< DMA request of channel y is sent when update event occurs */ +#define TIMER_DMAREQUEST_CHANNELEVENT ((uint8_t)0x01U) /*!< DMA request of channel y is sent when channel y event occurs */ + +/* DMA access base address */ +#define DMACFG_DMATA(regval) (BITS(0, 4) & ((uint32_t)(regval) << 0U)) +#define TIMER_DMACFG_DMATA_CTL0 DMACFG_DMATA(0) /*!< DMA transfer address is TIMER_CTL0 */ +#define TIMER_DMACFG_DMATA_CTL1 DMACFG_DMATA(1) /*!< DMA transfer address is TIMER_CTL1 */ +#define TIMER_DMACFG_DMATA_SMCFG DMACFG_DMATA(2) /*!< DMA transfer address is TIMER_SMCFG */ +#define TIMER_DMACFG_DMATA_DMAINTEN DMACFG_DMATA(3) /*!< DMA transfer address is TIMER_DMAINTEN */ +#define TIMER_DMACFG_DMATA_INTF DMACFG_DMATA(4) /*!< DMA transfer address is TIMER_INTF */ +#define TIMER_DMACFG_DMATA_SWEVG DMACFG_DMATA(5) /*!< DMA transfer address is TIMER_SWEVG */ +#define TIMER_DMACFG_DMATA_CHCTL0 DMACFG_DMATA(6) /*!< DMA transfer address is TIMER_CHCTL0 */ +#define TIMER_DMACFG_DMATA_CHCTL1 DMACFG_DMATA(7) /*!< DMA transfer address is TIMER_CHCTL1 */ +#define TIMER_DMACFG_DMATA_CHCTL2 DMACFG_DMATA(8) /*!< DMA transfer address is TIMER_CHCTL2 */ +#define TIMER_DMACFG_DMATA_CNT DMACFG_DMATA(9) /*!< DMA transfer address is TIMER_CNT */ +#define TIMER_DMACFG_DMATA_PSC DMACFG_DMATA(10) /*!< DMA transfer address is TIMER_PSC */ +#define TIMER_DMACFG_DMATA_CAR DMACFG_DMATA(11) /*!< DMA transfer address is TIMER_CAR */ +#define TIMER_DMACFG_DMATA_CREP DMACFG_DMATA(12) /*!< DMA transfer address is TIMER_CREP */ +#define TIMER_DMACFG_DMATA_CH0CV DMACFG_DMATA(13) /*!< DMA transfer address is TIMER_CH0CV */ +#define TIMER_DMACFG_DMATA_CH1CV DMACFG_DMATA(14) /*!< DMA transfer address is TIMER_CH1CV */ +#define TIMER_DMACFG_DMATA_CH2CV DMACFG_DMATA(15) /*!< DMA transfer address is TIMER_CH2CV */ +#define TIMER_DMACFG_DMATA_CH3CV DMACFG_DMATA(16) /*!< DMA transfer address is TIMER_CH3CV */ +#define TIMER_DMACFG_DMATA_CCHP DMACFG_DMATA(17) /*!< DMA transfer address is TIMER_CCHP */ +#define TIMER_DMACFG_DMATA_DMACFG DMACFG_DMATA(18) /*!< DMA transfer address is TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA_DMATB DMACFG_DMATA(19) /*!< DMA transfer address is TIMER_DMATB */ + +/* DMA access burst length */ +#define DMACFG_DMATC(regval) (BITS(8, 12) & ((uint32_t)(regval) << 8U)) +#define TIMER_DMACFG_DMATC_1TRANSFER DMACFG_DMATC(0) /*!< DMA transfer 1 time */ +#define TIMER_DMACFG_DMATC_2TRANSFER DMACFG_DMATC(1) /*!< DMA transfer 2 times */ +#define TIMER_DMACFG_DMATC_3TRANSFER DMACFG_DMATC(2) /*!< DMA transfer 3 times */ +#define TIMER_DMACFG_DMATC_4TRANSFER DMACFG_DMATC(3) /*!< DMA transfer 4 times */ +#define TIMER_DMACFG_DMATC_5TRANSFER DMACFG_DMATC(4) /*!< DMA transfer 5 times */ +#define TIMER_DMACFG_DMATC_6TRANSFER DMACFG_DMATC(5) /*!< DMA transfer 6 times */ +#define TIMER_DMACFG_DMATC_7TRANSFER DMACFG_DMATC(6) /*!< DMA transfer 7 times */ +#define TIMER_DMACFG_DMATC_8TRANSFER DMACFG_DMATC(7) /*!< DMA transfer 8 times */ +#define TIMER_DMACFG_DMATC_9TRANSFER DMACFG_DMATC(8) /*!< DMA transfer 9 times */ +#define TIMER_DMACFG_DMATC_10TRANSFER DMACFG_DMATC(9) /*!< DMA transfer 10 times */ +#define TIMER_DMACFG_DMATC_11TRANSFER DMACFG_DMATC(10) /*!< DMA transfer 11 times */ +#define TIMER_DMACFG_DMATC_12TRANSFER DMACFG_DMATC(11) /*!< DMA transfer 12 times */ +#define TIMER_DMACFG_DMATC_13TRANSFER DMACFG_DMATC(12) /*!< DMA transfer 13 times */ +#define TIMER_DMACFG_DMATC_14TRANSFER DMACFG_DMATC(13) /*!< DMA transfer 14 times */ +#define TIMER_DMACFG_DMATC_15TRANSFER DMACFG_DMATC(14) /*!< DMA transfer 15 times */ +#define TIMER_DMACFG_DMATC_16TRANSFER DMACFG_DMATC(15) /*!< DMA transfer 16 times */ +#define TIMER_DMACFG_DMATC_17TRANSFER DMACFG_DMATC(16) /*!< DMA transfer 17 times */ +#define TIMER_DMACFG_DMATC_18TRANSFER DMACFG_DMATC(17) /*!< DMA transfer 18 times */ + +/* TIMER software event generation source */ +#define TIMER_EVENT_SRC_UPG TIMER_SWEVG_UPG /*!< update event generation */ +#define TIMER_EVENT_SRC_CH0G TIMER_SWEVG_CH0G /*!< channel 0 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH1G TIMER_SWEVG_CH1G /*!< channel 1 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH2G TIMER_SWEVG_CH2G /*!< channel 2 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH3G TIMER_SWEVG_CH3G /*!< channel 3 capture or compare event generation */ +#define TIMER_EVENT_SRC_CMTG TIMER_SWEVG_CMTG /*!< channel commutation event generation */ +#define TIMER_EVENT_SRC_TRGG TIMER_SWEVG_TRGG /*!< trigger event generation */ +#define TIMER_EVENT_SRC_BRKG ((uint16_t)0x0080U) /*!< break event generation */ +#define TIMER_EVENT_SRC_CH0COMADDG TIMER_SWEVG_CH0COMADDG /*!< Channel 0 additional compare event generation */ +#define TIMER_EVENT_SRC_CH1COMADDG TIMER_SWEVG_CH1COMADDG /*!< Channel 1 additional compare event generation */ +#define TIMER_EVENT_SRC_CH2COMADDG TIMER_SWEVG_CH2COMADDG /*!< Channel 2 additional compare event generation */ +#define TIMER_EVENT_SRC_CH3COMADDG TIMER_SWEVG_CH3COMADDG /*!< Channel 3 additional compare event generation */ + +/* center-aligned mode selection */ +#define CTL0_CAM(regval) ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U))) +#define TIMER_COUNTER_EDGE CTL0_CAM(0) /*!< edge-aligned mode */ +#define TIMER_COUNTER_CENTER_DOWN CTL0_CAM(1) /*!< center-aligned and counting down assert mode */ +#define TIMER_COUNTER_CENTER_UP CTL0_CAM(2) /*!< center-aligned and counting up assert mode */ +#define TIMER_COUNTER_CENTER_BOTH CTL0_CAM(3) /*!< center-aligned and counting up/down assert mode */ + +/* TIMER prescaler reload mode */ +#define TIMER_PSC_RELOAD_NOW ((uint32_t)0x00000000U) /*!< the prescaler is loaded right now */ +#define TIMER_PSC_RELOAD_UPDATE ((uint32_t)0x00000001U) /*!< the prescaler is loaded at the next update event */ + +/* count direction */ +#define TIMER_COUNTER_UP ((uint16_t)0x0000U) /*!< counter up direction */ +#define TIMER_COUNTER_DOWN ((uint16_t)TIMER_CTL0_DIR) /*!< counter down direction */ + +/* specify division ratio between TIMER clock and dead-time and sampling clock */ +#define CTL0_CKDIV(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CKDIV_DIV1 CTL0_CKDIV(0) /*!< clock division value is 1,fDTS=fTIMER_CK */ +#define TIMER_CKDIV_DIV2 CTL0_CKDIV(1) /*!< clock division value is 2,fDTS= fTIMER_CK/2 */ +#define TIMER_CKDIV_DIV4 CTL0_CKDIV(2) /*!< clock division value is 4, fDTS= fTIMER_CK/4 */ + +/* single pulse mode */ +#define TIMER_SP_MODE_SINGLE ((uint32_t)0x00000000U) /*!< single pulse mode */ +#define TIMER_SP_MODE_REPETITIVE ((uint32_t)0x00000001U) /*!< repetitive pulse mode */ + +/* update source */ +#define TIMER_UPDATE_SRC_REGULAR ((uint32_t)0x00000000U) /*!< update generate only by counter overflow/underflow */ +#define TIMER_UPDATE_SRC_GLOBAL ((uint32_t)0x00000001U) /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */ + +/* run mode off-state configure */ +#define TIMER_ROS_STATE_ENABLE ((uint16_t)TIMER_CCHP_ROS) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_ROS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are disabled */ + +/* idle mode off-state configure */ +#define TIMER_IOS_STATE_ENABLE ((uint16_t)TIMER_CCHP_IOS) /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_IOS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are disabled */ + +/* break input polarity */ +#define TIMER_BREAK_POLARITY_LOW ((uint16_t)0x0000U) /*!< break input polarity is low */ +#define TIMER_BREAK_POLARITY_HIGH ((uint16_t)TIMER_CCHP_BRKP) /*!< break input polarity is high */ + +/* output automatic enable */ +#define TIMER_OUTAUTO_ENABLE ((uint16_t)TIMER_CCHP_OAEN) /*!< output automatic enable */ +#define TIMER_OUTAUTO_DISABLE ((uint16_t)0x0000U) /*!< output automatic disable */ + +/* complementary register protect control */ +#define CCHP_PROT(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CCHP_PROT_OFF CCHP_PROT(0) /*!< protect disable */ +#define TIMER_CCHP_PROT_0 CCHP_PROT(1) /*!< PROT mode 0 */ +#define TIMER_CCHP_PROT_1 CCHP_PROT(2) /*!< PROT mode 1 */ +#define TIMER_CCHP_PROT_2 CCHP_PROT(3) /*!< PROT mode 2 */ + +/* break input enable */ +#define TIMER_BREAK_ENABLE ((uint16_t)TIMER_CCHP_BRKEN) /*!< break input enable */ +#define TIMER_BREAK_DISABLE ((uint16_t)0x0000U) /*!< break input disable */ + +/* TIMER channel n(n=0,1,2,3) */ +#define TIMER_CH_0 ((uint16_t)0x0000U) /*!< TIMER channel 0(TIMERx(x=0..4,7..13)) */ +#define TIMER_CH_1 ((uint16_t)0x0001U) /*!< TIMER channel 1(TIMERx(x=0..4,7,8,11)) */ +#define TIMER_CH_2 ((uint16_t)0x0002U) /*!< TIMER channel 2(TIMERx(x=0..4,7)) */ +#define TIMER_CH_3 ((uint16_t)0x0003U) /*!< TIMER channel 3(TIMERx(x=0..4,7)) */ + +/* channel enable state*/ +#define TIMER_CCX_ENABLE ((uint32_t)0x00000001U) /*!< channel enable */ +#define TIMER_CCX_DISABLE ((uint32_t)0x00000000U) /*!< channel disable */ + +/* channel complementary output enable state*/ +#define TIMER_CCXN_ENABLE ((uint16_t)0x0004U) /*!< channel complementary enable */ +#define TIMER_CCXN_DISABLE ((uint16_t)0x0000U) /*!< channel complementary disable */ + +/* channel output polarity */ +#define TIMER_OC_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel output polarity is high */ +#define TIMER_OC_POLARITY_LOW ((uint16_t)0x0002U) /*!< channel output polarity is low */ + +/* channel complementary output polarity */ +#define TIMER_OCN_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel complementary output polarity is high */ +#define TIMER_OCN_POLARITY_LOW ((uint16_t)0x0008U) /*!< channel complementary output polarity is low */ + +/* idle state of channel output */ +#define TIMER_OC_IDLE_STATE_HIGH ((uint16_t)0x0100) /*!< idle state of channel output is high */ +#define TIMER_OC_IDLE_STATE_LOW ((uint16_t)0x0000) /*!< idle state of channel output is low */ + +/* idle state of channel complementary output */ +#define TIMER_OCN_IDLE_STATE_HIGH ((uint16_t)0x0200U) /*!< idle state of channel complementary output is high */ +#define TIMER_OCN_IDLE_STATE_LOW ((uint16_t)0x0000U) /*!< idle state of channel complementary output is low */ + +/* channel output compare mode */ +#define TIMER_OC_MODE_TIMING ((uint16_t)0x0000U) /*!< timing mode */ +#define TIMER_OC_MODE_ACTIVE ((uint16_t)0x0010U) /*!< active mode */ +#define TIMER_OC_MODE_INACTIVE ((uint16_t)0x0020U) /*!< inactive mode */ +#define TIMER_OC_MODE_TOGGLE ((uint16_t)0x0030U) /*!< toggle mode */ +#define TIMER_OC_MODE_LOW ((uint16_t)0x0040U) /*!< force low mode */ +#define TIMER_OC_MODE_HIGH ((uint16_t)0x0050U) /*!< force high mode */ +#define TIMER_OC_MODE_PWM0 ((uint16_t)0x0060U) /*!< PWM0 mode */ +#define TIMER_OC_MODE_PWM1 ((uint16_t)0x0070U) /*!< PWM1 mode*/ + +/* channel output compare shadow enable */ +#define TIMER_OC_SHADOW_ENABLE ((uint16_t)0x0008U) /*!< channel output shadow state enable */ +#define TIMER_OC_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel output shadow state disable */ + +/* channel output compare fast enable */ +#define TIMER_OC_FAST_ENABLE ((uint16_t)0x0004) /*!< channel output fast function enable */ +#define TIMER_OC_FAST_DISABLE ((uint16_t)0x0000) /*!< channel output fast function disable */ + +/* channel output compare clear enable */ +#define TIMER_OC_CLEAR_ENABLE ((uint16_t)0x0080U) /*!< channel output clear function enable */ +#define TIMER_OC_CLEAR_DISABLE ((uint16_t)0x0000U) /*!< channel output clear function disable */ + +/* channel control shadow register update control */ +#define TIMER_UPDATECTL_CCU ((uint32_t)0x00000000U) /*!< the shadow registers are updated when CMTG bit is set */ +#define TIMER_UPDATECTL_CCUTRI ((uint32_t)0x00000001U) /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */ + +/* channel input capture polarity */ +#define TIMER_IC_POLARITY_RISING ((uint16_t)0x0000U) /*!< input capture rising edge */ +#define TIMER_IC_POLARITY_FALLING ((uint16_t)0x0002U) /*!< input capture falling edge */ +#define TIMER_IC_POLARITY_BOTH_EDGE ((uint16_t)0x000AU) /*!< input capture both edge */ + +/* TIMER input capture selection */ +#define TIMER_IC_SELECTION_DIRECTTI ((uint16_t)0x0001U) /*!< channel y is configured as input and icy is mapped on CIy */ +#define TIMER_IC_SELECTION_INDIRECTTI ((uint16_t)0x0002U) /*!< channel y is configured as input and icy is mapped on opposite input */ +#define TIMER_IC_SELECTION_ITS ((uint16_t)0x0003U) /*!< channel y is configured as input and icy is mapped on ITS */ + +/* channel input capture prescaler */ +#define TIMER_IC_PSC_DIV1 ((uint16_t)0x0000U) /*!< no prescaler */ +#define TIMER_IC_PSC_DIV2 ((uint16_t)0x0004U) /*!< divided by 2 */ +#define TIMER_IC_PSC_DIV4 ((uint16_t)0x0008U) /*!< divided by 4*/ +#define TIMER_IC_PSC_DIV8 ((uint16_t)0x000CU) /*!< divided by 8 */ + +/* trigger selection */ +#define SMCFG_TRGSEL(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_SMCFG_TRGSEL_ITI0 SMCFG_TRGSEL(0) /*!< internal trigger 0 */ +#define TIMER_SMCFG_TRGSEL_ITI1 SMCFG_TRGSEL(1) /*!< internal trigger 1 */ +#define TIMER_SMCFG_TRGSEL_ITI2 SMCFG_TRGSEL(2) /*!< internal trigger 2 */ +#define TIMER_SMCFG_TRGSEL_ITI3 SMCFG_TRGSEL(3) /*!< internal trigger 3 */ +#define TIMER_SMCFG_TRGSEL_CI0F_ED SMCFG_TRGSEL(4) /*!< TI0 Edge Detector */ +#define TIMER_SMCFG_TRGSEL_CI0FE0 SMCFG_TRGSEL(5) /*!< filtered TIMER input 0 */ +#define TIMER_SMCFG_TRGSEL_CI1FE1 SMCFG_TRGSEL(6) /*!< filtered TIMER input 1 */ +#define TIMER_SMCFG_TRGSEL_ETIFP SMCFG_TRGSEL(7) /*!< external trigger */ + +/* master mode control */ +#define CTL1_MMC(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_TRI_OUT_SRC_RESET CTL1_MMC(0) /*!< the UPG bit as trigger output */ +#define TIMER_TRI_OUT_SRC_ENABLE CTL1_MMC(1) /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */ +#define TIMER_TRI_OUT_SRC_UPDATE CTL1_MMC(2) /*!< update event as trigger output */ +#define TIMER_TRI_OUT_SRC_CH0 CTL1_MMC(3) /*!< a capture or a compare match occurred in channal0 as trigger output TRGO */ +#define TIMER_TRI_OUT_SRC_O0CPRE CTL1_MMC(4) /*!< O0CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O1CPRE CTL1_MMC(5) /*!< O1CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O2CPRE CTL1_MMC(6) /*!< O2CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O3CPRE CTL1_MMC(7) /*!< O3CPRE as trigger output */ + +/* slave mode control */ +#define SMCFG_SMC(regval) (BITS(0, 2) & ((uint32_t)(regval) << 0U)) +#define TIMER_SLAVE_MODE_DISABLE SMCFG_SMC(0) /*!< slave mode disable */ +#define TIMER_ENCODER_MODE0 SMCFG_SMC(1) /*!< encoder mode 0 */ +#define TIMER_ENCODER_MODE1 SMCFG_SMC(2) /*!< encoder mode 1 */ +#define TIMER_ENCODER_MODE2 SMCFG_SMC(3) /*!< encoder mode 2 */ +#define TIMER_SLAVE_MODE_RESTART SMCFG_SMC(4) /*!< restart mode */ +#define TIMER_SLAVE_MODE_PAUSE SMCFG_SMC(5) /*!< pause mode */ +#define TIMER_SLAVE_MODE_EVENT SMCFG_SMC(6) /*!< event mode */ +#define TIMER_SLAVE_MODE_EXTERNAL0 SMCFG_SMC(7) /*!< external clock mode 0 */ + +/* master slave mode selection */ +#define TIMER_MASTER_SLAVE_MODE_ENABLE ((uint32_t)0x00000000U) /*!< master slave mode enable */ +#define TIMER_MASTER_SLAVE_MODE_DISABLE ((uint32_t)0x00000001U) /*!< master slave mode disable */ + +/* external trigger prescaler */ +#define SMCFG_ETPSC(regval) (BITS(12, 13) & ((uint32_t)(regval) << 12U)) +#define TIMER_EXT_TRI_PSC_OFF SMCFG_ETPSC(0) /*!< no divided */ +#define TIMER_EXT_TRI_PSC_DIV2 SMCFG_ETPSC(1) /*!< divided by 2 */ +#define TIMER_EXT_TRI_PSC_DIV4 SMCFG_ETPSC(2) /*!< divided by 4 */ +#define TIMER_EXT_TRI_PSC_DIV8 SMCFG_ETPSC(3) /*!< divided by 8 */ + +/* external trigger polarity */ +#define TIMER_ETP_FALLING TIMER_SMCFG_ETP /*!< active low or falling edge active */ +#define TIMER_ETP_RISING ((uint32_t)0x00000000U) /*!< active high or rising edge active */ + +/* channel 0 trigger input selection */ +#define TIMER_HALLINTERFACE_ENABLE ((uint32_t)0x00000000U) /*!< TIMER hall sensor mode enable */ +#define TIMER_HALLINTERFACE_DISABLE ((uint32_t)0x00000001U) /*!< TIMER hall sensor mode disable */ + +/* timer1 internal trigger input1 remap */ +#define TIMER1_IRMP(regval) (BITS(10, 11) & ((uint32_t)(regval) << 10U)) +#define TIMER1_ITI1_RMP_TIMER7_TRGO TIMER1_IRMP(0) /*!< timer1 internal trigger input 1 remap to TIMER7_TRGO */ +#define TIMER1_ITI1_RMP_ETHERNET_PTP TIMER1_IRMP(1) /*!< timer1 internal trigger input 1 remap to ethernet PTP */ +#define TIMER1_ITI1_RMP_USB_FS_SOF TIMER1_IRMP(2) /*!< timer1 internal trigger input 1 remap to USB FS SOF */ +#define TIMER1_ITI1_RMP_USB_HS_SOF TIMER1_IRMP(3) /*!< timer1 internal trigger input 1 remap to USB HS SOF */ + +/* timer4 channel 3 input remap */ +#define TIMER4_IRMP(regval) (BITS(6, 7) & ((uint32_t)(regval) << 6U)) +#define TIMER4_CI3_RMP_GPIO TIMER4_IRMP(0) /*!< timer4 channel 3 input remap to GPIO pin */ +#define TIMER4_CI3_RMP_IRC32K TIMER4_IRMP(1) /*!< timer4 channel 3 input remap to IRC32K */ +#define TIMER4_CI3_RMP_LXTAL TIMER4_IRMP(2) /*!< timer4 channel 3 input remap to LXTAL */ +#define TIMER4_CI3_RMP_RTC_WAKEUP_INT TIMER4_IRMP(3) /*!< timer4 channel 3 input remap to RTC wakeup interrupt */ + +/* timer10 internal trigger input1 remap */ +#define TIMER10_IRMP(regval) (BITS(0, 1) & ((uint32_t)(regval) << 0U)) +#define TIMER10_ITI1_RMP_GPIO TIMER10_IRMP(0) /*!< timer10 internal trigger input1 remap based on GPIO setting */ +#define TIMER10_ITI1_RMP_RTC_HXTAL_DIV TIMER10_IRMP(2) /*!< timer10 internal trigger input1 remap HXTAL _DIV(clock used for RTC which is HXTAL clock divided by RTCDIV bits in RCU_CFG0 register) */ + +/* timerx(x=0,1,2,13,14,15,16) write cc register selection */ +#define TIMER_CHVSEL_ENABLE ((uint16_t)TIMER_CFG_CHVSEL) /*!< write CHxVAL register selection enable */ +#define TIMER_CHVSEL_DISABLE ((uint16_t)0x0000U) /*!< write CHxVAL register selection disable */ + +/* TIMER output value selection enable */ +#define TIMER_OUTSEL_ENABLE ((uint16_t)TIMER_CFG_OUTSEL) /*!< output value selection enable */ +#define TIMER_OUTSEL_DISABLE ((uint16_t)0x0000U) /*!< output value selection disable */ + +/* channel additional output compare shadow enable */ +#define TIMER_CH0_ADD_SHADOW_ENABLE ((uint32_t)0x10000000U) /*!< channel 0 additional output shadow state enable */ +#define TIMER_CH1_ADD_SHADOW_ENABLE ((uint32_t)0x20000000U) /*!< channel 1 additional output shadow state enable */ +#define TIMER_CH2_ADD_SHADOW_ENABLE ((uint32_t)0x10000000U) /*!< channel 2 additional output shadow state enable */ +#define TIMER_CH3_ADD_SHADOW_ENABLE ((uint32_t)0x20000000U) /*!< channel 3 additional output shadow state enable */ + +/* channel additional output compare shadow enable */ +#define TIMER_ADD_SHADOW_ENABLE ((uint16_t)0x0001U) /*!< channel additional output shadow state enable */ +#define TIMER_ADD_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel additional output shadow state disable */ + +/* function declarations */ +/* TIMER timebase */ +/* deinit a TIMER */ +void timer_deinit(uint32_t timer_periph); +/* initialize TIMER init parameter struct */ +void timer_struct_para_init(timer_parameter_struct *initpara); +/* initialize TIMER counter */ +void timer_init(uint32_t timer_periph, timer_parameter_struct *initpara); +/* enable a TIMER */ +void timer_enable(uint32_t timer_periph); +/* disable a TIMER */ +void timer_disable(uint32_t timer_periph); +/* enable the auto reload shadow function */ +void timer_auto_reload_shadow_enable(uint32_t timer_periph); +/* disable the auto reload shadow function */ +void timer_auto_reload_shadow_disable(uint32_t timer_periph); +/* enable the update event */ +void timer_update_event_enable(uint32_t timer_periph); +/* disable the update event */ +void timer_update_event_disable(uint32_t timer_periph); +/* set TIMER counter alignment mode */ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned); +/* set TIMER counter up direction */ +void timer_counter_up_direction(uint32_t timer_periph); +/* set TIMER counter down direction */ +void timer_counter_down_direction(uint32_t timer_periph); +/* configure TIMER prescaler */ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload); +/* configure TIMER repetition register value */ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition); +/* configure TIMER autoreload register value */ +void timer_autoreload_value_config(uint32_t timer_periph, uint32_t autoreload); +/* configure TIMER counter register value */ +void timer_counter_value_config(uint32_t timer_periph, uint32_t counter); +/* read TIMER counter value */ +uint32_t timer_counter_read(uint32_t timer_periph); +/* read TIMER prescaler value */ +uint16_t timer_prescaler_read(uint32_t timer_periph); +/* configure TIMER single pulse mode */ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode); +/* configure TIMER update source */ +void timer_update_source_config(uint32_t timer_periph, uint32_t update); + +/* TIMER DMA and event */ +/* enable the TIMER DMA */ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma); +/* disable the TIMER DMA */ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma); +/* channel DMA request source selection */ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request); +/* configure the TIMER DMA transfer */ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth); +/* software generate events */ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event); + +/* TIMER channel complementary protection */ +/* initialize TIMER break parameter struct */ +void timer_break_struct_para_init(timer_break_parameter_struct *breakpara); +/* configure TIMER break function */ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct *breakpara); +/* enable TIMER break function */ +void timer_break_enable(uint32_t timer_periph); +/* disable TIMER break function */ +void timer_break_disable(uint32_t timer_periph); +/* enable TIMER output automatic function */ +void timer_automatic_output_enable(uint32_t timer_periph); +/* disable TIMER output automatic function */ +void timer_automatic_output_disable(uint32_t timer_periph); +/* enable or disable TIMER primary output function */ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue); +/* enable or disable channel capture/compare control shadow register */ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue); +/* configure TIMER channel control shadow register update control */ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl); + +/* TIMER channel output */ +/* initialize TIMER channel output parameter struct */ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara); +/* configure TIMER channel output function */ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, + timer_oc_parameter_struct *ocpara); +/* configure TIMER channel output compare mode */ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode); +/* configure TIMER channel output pulse value */ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, + uint32_t pulse); +/* configure TIMER channel output shadow function */ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow); +/* configure TIMER channel output fast function */ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast); +/* configure TIMER channel output clear function */ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear); +/* configure TIMER channel output polarity */ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocpolarity); +/* configure TIMER channel complementary output polarity */ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocnpolarity); +/* configure TIMER channel enable state */ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state); +/* configure TIMER channel complementary output enable state */ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocnstate); + +/* TIMER channel input */ +/* initialize TIMER channel input parameter struct */ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct *icpara); +/* configure TIMER input capture parameter */ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, + timer_ic_parameter_struct *icpara); +/* configure TIMER channel input capture prescaler value */ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, + uint16_t prescaler); +/* read TIMER channel capture compare register value */ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel); +/* configure TIMER input pwm capture function */ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, + timer_ic_parameter_struct *icpwm); +/* configure TIMER hall sensor mode */ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode); + +/* TIMER master and slave */ +/* select TIMER input trigger source */ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger); +/* select TIMER master mode output trigger source */ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger); +/* select TIMER slave mode */ +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode); +/* configure TIMER master slave mode */ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave); +/* configure TIMER external trigger input */ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER quadrature decoder mode */ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, + uint16_t ic0polarity, uint16_t ic1polarity); +/* configure TIMER internal clock mode */ +void timer_internal_clock_config(uint32_t timer_periph); +/* configure TIMER the internal trigger as external clock input */ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger); +/* configure TIMER the external trigger as external clock input */ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, + uint16_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 0 */ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 1 */ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter); +/* disable TIMER the external clock mode 1 */ +void timer_external_clock_mode1_disable(uint32_t timer_periph); +/* configure TIMER channel remap function */ +void timer_channel_remap_config(uint32_t timer_periph, uint32_t remap); + +/* TIMER configure */ +/* configure TIMER write CHxVAL register selection */ +void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel); +/* configure TIMER output value selection */ +void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel); + +/* TIMER composite pwm */ +/* enable the TIMER composite pwm */ +void timer_channel_composite_pwm_enable(uint32_t timer_periph, uint32_t channel); +/* disable the TIMER composite pwm */ +void timer_channel_composite_pwm_disable(uint32_t timer_periph, uint32_t channel); + +/* configure TIMER channel additional compare value */ +void timer_channel_additional_compare_value_config(uint32_t timer_periph, uint16_t channel, + uint32_t value); +/* configure TIMER channel additional output shadow function */ +void timer_channel_additional_output_shadow_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocshadow); +/* get TIMER channel additional compare value */ +uint32_t timer_channel_additional_compare_value_read(uint32_t timer_periph, uint16_t channel); + +/* TIMER interrupt and flag*/ +/* get TIMER flags */ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag); +/* clear TIMER flags */ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag); +/* enable the TIMER interrupt */ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt); +/* disable the TIMER interrupt */ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER interrupt flag */ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt); +/* clear TIMER interrupt flag */ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt); + +#endif /* GD32F5XX_TIMER_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h new file mode 100644 index 00000000000..b31b7c0256c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h @@ -0,0 +1,370 @@ +/*! + \file gd32f5xx_tli.h + \brief definitions for the TLI + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_TLI_H +#define GD32F5XX_TLI_H + +#include "gd32f5xx.h" + +/* TLI definitions */ +#define TLI TLI_BASE /*!< TLI base address */ +/* TLI layer definitions */ +#define LAYER0 TLI_BASE /*!< TLI layer0 base address */ +#define LAYER1 (TLI_BASE + 0x00000080U) /*!< TLI layer1 base address */ + +/* registers definitions */ +#define TLI_SPSZ REG32(TLI + 0x00000008U) /*!< TLI synchronous pulse size register */ +#define TLI_BPSZ REG32(TLI + 0x0000000CU) /*!< TLI back-porch size register */ +#define TLI_ASZ REG32(TLI + 0x00000010U) /*!< TLI active size register */ +#define TLI_TSZ REG32(TLI + 0x00000014U) /*!< TLI total size register */ +#define TLI_CTL REG32(TLI + 0x00000018U) /*!< TLI control register */ +#define TLI_RL REG32(TLI + 0x00000024U) /*!< TLI reload Layer register */ +#define TLI_BGC REG32(TLI + 0x0000002CU) /*!< TLI background color register */ +#define TLI_INTEN REG32(TLI + 0x00000034U) /*!< TLI interrupt enable register */ +#define TLI_INTF REG32(TLI + 0x00000038U) /*!< TLI interrupt flag register */ +#define TLI_INTC REG32(TLI + 0x0000003CU) /*!< TLI interrupt flag clear register */ +#define TLI_LM REG32(TLI + 0x00000040U) /*!< TLI line mark register */ +#define TLI_CPPOS REG32(TLI + 0x00000044U) /*!< TLI current pixel position register */ +#define TLI_STAT REG32(TLI + 0x00000048U) /*!< TLI status register */ +#define TLI_LxCTL(layerx) REG32((layerx) + 0x00000084U) /*!< TLI layer x control register */ +#define TLI_LxHPOS(layerx) REG32((layerx) + 0x00000088U) /*!< TLI layer x horizontal position parameters register */ +#define TLI_LxVPOS(layerx) REG32((layerx) + 0x0000008CU) /*!< TLI layer x vertical position parameters register */ +#define TLI_LxCKEY(layerx) REG32((layerx) + 0x00000090U) /*!< TLI layer x color key register */ +#define TLI_LxPPF(layerx) REG32((layerx) + 0x00000094U) /*!< TLI layer x packeted pixel format register */ +#define TLI_LxSA(layerx) REG32((layerx) + 0x00000098U) /*!< TLI layer x specified alpha register */ +#define TLI_LxDC(layerx) REG32((layerx) + 0x0000009CU) /*!< TLI layer x default color register */ +#define TLI_LxBLEND(layerx) REG32((layerx) + 0x000000A0U) /*!< TLI layer x blending register */ +#define TLI_LxFBADDR(layerx) REG32((layerx) + 0x000000ACU) /*!< TLI layer x frame base address register */ +#define TLI_LxFLLEN(layerx) REG32((layerx) + 0x000000B0U) /*!< TLI layer x frame line length register */ +#define TLI_LxFTLN(layerx) REG32((layerx) + 0x000000B4U) /*!< TLI layer x frame total line number register */ +#define TLI_LxLUT(layerx) REG32((layerx) + 0x000000C4U) /*!< TLI layer x look up table register */ + +/* bits definitions */ +/* TLI_SPSZ */ +#define TLI_SPSZ_VPSZ BITS(0,11) /*!< size of the vertical synchronous pulse */ +#define TLI_SPSZ_HPSZ BITS(16,27) /*!< size of the horizontal synchronous pulse */ + +/* TLI_BPSZ */ +#define TLI_BPSZ_VBPSZ BITS(0,11) /*!< size of the vertical back porch plus synchronous pulse */ +#define TLI_BPSZ_HBPSZ BITS(16,27) /*!< size of the horizontal back porch plus synchronous pulse */ + +/* TLI_ASZ */ +#define TLI_ASZ_VASZ BITS(0,11) /*!< size of the vertical active area width plus back porch and synchronous pulse */ +#define TLI_ASZ_HASZ BITS(16,27) /*!< size of the horizontal active area width plus back porch and synchronous pulse */ + +/* TLI_SPSZ */ +#define TLI_TSZ_VTSZ BITS(0,11) /*!< vertical total size of the display, including active area, back porch, synchronous pulse and front porch */ +#define TLI_TSZ_HTSZ BITS(16,27) /*!< horizontal total size of the display, including active area, back porch, synchronous pulse and front porch */ + +/* TLI_CTL */ +#define TLI_CTL_TLIEN BIT(0) /*!< TLI enable bit */ +#define TLI_CTL_BDB BITS(4,6) /*!< blue channel dither bits number */ +#define TLI_CTL_GDB BITS(8,10) /*!< green channel dither bits number */ +#define TLI_CTL_RDB BITS(12,14) /*!< red channel dither bits number */ +#define TLI_CTL_DFEN BIT(16) /*!< dither function enable */ +#define TLI_CTL_CLKPS BIT(28) /*!< pixel clock polarity selection */ +#define TLI_CTL_DEPS BIT(29) /*!< data enable polarity selection */ +#define TLI_CTL_VPPS BIT(30) /*!< vertical pulse polarity selection */ +#define TLI_CTL_HPPS BIT(31) /*!< horizontal pulse polarity selection */ + +/* TLI_RL */ +#define TLI_RL_RQR BIT(0) /*!< request reload */ +#define TLI_RL_FBR BIT(1) /*!< frame blank reload */ + +/* TLI_BGC */ +#define TLI_BGC_BVB BITS(0,7) /*!< background value blue */ +#define TLI_BGC_BVG BITS(8,15) /*!< background value green */ +#define TLI_BGC_BVR BITS(16,23) /*!< background value red */ + +/* TLI_INTEN */ +#define TLI_INTEN_LMIE BIT(0) /*!< line mark interrupt enable */ +#define TLI_INTEN_FEIE BIT(1) /*!< FIFO error interrupt enable */ +#define TLI_INTEN_TEIE BIT(2) /*!< transaction error interrupt enable */ +#define TLI_INTEN_LCRIE BIT(3) /*!< layer configuration reloaded interrupt enable */ + +/* TLI_INTF */ +#define TLI_INTF_LMF BIT(0) /*!< line mark flag */ +#define TLI_INTF_FEF BIT(1) /*!< FIFO error flag */ +#define TLI_INTF_TEF BIT(2) /*!< transaction error flag */ +#define TLI_INTF_LCRF BIT(3) /*!< layer configuration reloaded flag */ + +/* TLI_INTC */ +#define TLI_INTC_LMC BIT(0) /*!< line mark flag clear */ +#define TLI_INTC_FEC BIT(1) /*!< FIFO error flag clear */ +#define TLI_INTC_TEC BIT(2) /*!< transaction error flag clear */ +#define TLI_INTC_LCRC BIT(3) /*!< layer configuration reloaded flag clear */ + +/* TLI_LM */ +#define TLI_LM_LM BITS(0,10) /*!< line mark value */ + +/* TLI_CPPOS */ +#define TLI_CPPOS_VPOS BITS(0,15) /*!< vertical position */ +#define TLI_CPPOS_HPOS BITS(16,31) /*!< horizontal position */ + +/* TLI_STAT */ +#define TLI_STAT_VDE BIT(0) /*!< current VDE status */ +#define TLI_STAT_HDE BIT(1) /*!< current HDE status */ +#define TLI_STAT_VS BIT(2) /*!< current VS status of the TLI */ +#define TLI_STAT_HS BIT(3) /*!< current HS status of the TLI */ + +/* TLI_LxCTL */ +#define TLI_LxCTL_LEN BIT(0) /*!< layer enable */ +#define TLI_LxCTL_CKEYEN BIT(1) /*!< color keying enable */ +#define TLI_LxCTL_LUTEN BIT(4) /*!< LUT enable */ + +/* TLI_LxHPOS */ +#define TLI_LxHPOS_WLP BITS(0,11) /*!< window left position */ +#define TLI_LxHPOS_WRP BITS(16,27) /*!< window right position */ + +/* TLI_LxVPOS */ +#define TLI_LxVPOS_WTP BITS(0,11) /*!< window top position */ +#define TLI_LxVPOS_WBP BITS(16,27) /*!< window bottom position */ + +/* TLI_LxCKEY */ +#define TLI_LxCKEY_CKEYB BITS(0,7) /*!< color key blue */ +#define TLI_LxCKEY_CKEYG BITS(8,15) /*!< color key green */ +#define TLI_LxCKEY_CKEYR BITS(16,23) /*!< color key red */ + +/* TLI_LxPPF */ +#define TLI_LxPPF_PPF BITS(0,2) /*!< packeted pixel format */ + +/* TLI_LxSA */ +#define TLI_LxSA_SA BITS(0,7) /*!< specified alpha */ + +/* TLI_LxDC */ +#define TLI_LxDC_DCB BITS(0,7) /*!< the default color blue */ +#define TLI_LxDC_DCG BITS(8,15) /*!< the default color green */ +#define TLI_LxDC_DCR BITS(16,23) /*!< the default color red */ +#define TLI_LxDC_DCA BITS(24,31) /*!< the default color alpha */ + +/* TLI_LxBLEND */ +#define TLI_LxBLEND_ACF2 BITS(0,2) /*!< alpha calculation factor 2 of blending method */ +#define TLI_LxBLEND_ACF1 BITS(8,10) /*!< alpha calculation factor 1 of blending method */ + +/* TLI_LxFBADDR */ +#define TLI_LxFBADDR_FBADD BITS(0,31) /*!< frame buffer base address */ + +/* TLI_LxFLLEN */ +#define TLI_LxFLLEN_FLL BITS(0,13) /*!< frame line length */ +#define TLI_LxFLLEN_STDOFF BITS(16,29) /*!< frame buffer stride offset */ + +/* TLI_LxFTLN */ +#define TLI_LxFTLN_FTLN BITS(0,10) /*!< frame total line number */ + +/* TLI_LxLUT */ +#define TLI_LxLUT_TB BITS(0,7) /*!< blue channel of a LUT entry */ +#define TLI_LxLUT_TG BITS(8,15) /*!< green channel of a LUT entry */ +#define TLI_LxLUT_TR BITS(16,23) /*!< red channel of a LUT entry */ +#define TLI_LxLUT_TADD BITS(24,31) /*!< look up table write address */ + +/* constants definitions */ +/* TLI parameter struct definitions */ +typedef struct { + uint16_t synpsz_vpsz; /*!< size of the vertical synchronous pulse */ + uint16_t synpsz_hpsz; /*!< size of the horizontal synchronous pulse */ + uint16_t backpsz_vbpsz; /*!< size of the vertical back porch plus synchronous pulse */ + uint16_t backpsz_hbpsz; /*!< size of the horizontal back porch plus synchronous pulse */ + uint32_t activesz_vasz; /*!< size of the vertical active area width plus back porch and synchronous pulse */ + uint32_t activesz_hasz; /*!< size of the horizontal active area width plus back porch and synchronous pulse */ + uint32_t totalsz_vtsz; /*!< vertical total size of the display */ + uint32_t totalsz_htsz; /*!< horizontal total size of the display */ + uint32_t backcolor_red; /*!< background value red */ + uint32_t backcolor_green; /*!< background value green */ + uint32_t backcolor_blue; /*!< background value blue */ + uint32_t signalpolarity_hs; /*!< horizontal pulse polarity selection */ + uint32_t signalpolarity_vs; /*!< vertical pulse polarity selection */ + uint32_t signalpolarity_de; /*!< data enable polarity selection */ + uint32_t signalpolarity_pixelck; /*!< pixel clock polarity selection */ +} tli_parameter_struct; + +/* TLI layer parameter struct definitions */ +typedef struct { + uint16_t layer_window_rightpos; /*!< window right position */ + uint16_t layer_window_leftpos; /*!< window left position */ + uint16_t layer_window_bottompos; /*!< window bottom position */ + uint16_t layer_window_toppos; /*!< window top position */ + uint32_t layer_ppf; /*!< packeted pixel format */ + uint8_t layer_sa; /*!< specified alpha */ + uint8_t layer_default_alpha; /*!< the default color alpha */ + uint8_t layer_default_red; /*!< the default color red */ + uint8_t layer_default_green; /*!< the default color green */ + uint8_t layer_default_blue; /*!< the default color blue */ + uint32_t layer_acf1; /*!< alpha calculation factor 1 of blending method */ + uint32_t layer_acf2; /*!< alpha calculation factor 2 of blending method */ + uint32_t layer_frame_bufaddr; /*!< frame buffer base address */ + uint16_t layer_frame_buf_stride_offset; /*!< frame buffer stride offset */ + uint16_t layer_frame_line_length; /*!< frame line length */ + uint16_t layer_frame_total_line_number; /*!< frame total line number */ +} tli_layer_parameter_struct; + +/* TLI layer LUT parameter struct definitions */ +typedef struct { + uint32_t layer_table_addr; /*!< look up table write address */ + uint8_t layer_lut_channel_red; /*!< red channel of a LUT entry */ + uint8_t layer_lut_channel_green; /*!< green channel of a LUT entry */ + uint8_t layer_lut_channel_blue; /*!< blue channel of a LUT entry */ +} tli_layer_lut_parameter_struct; + +/* packeted pixel format */ +typedef enum { + LAYER_PPF_ARGB8888, /*!< layerx pixel format ARGB8888 */ + LAYER_PPF_RGB888, /*!< layerx pixel format RGB888 */ + LAYER_PPF_RGB565, /*!< layerx pixel format RGB565 */ + LAYER_PPF_ARGB1555, /*!< layerx pixel format ARGB1555 */ + LAYER_PPF_ARGB4444, /*!< layerx pixel format ARGB4444 */ + LAYER_PPF_L8, /*!< layerx pixel format L8 */ + LAYER_PPF_AL44, /*!< layerx pixel format AL44 */ + LAYER_PPF_AL88 /*!< layerx pixel format AL88 */ +} tli_layer_ppf_enum; + +/* TLI flags */ +#define TLI_FLAG_VDE TLI_STAT_VDE /*!< current VDE status */ +#define TLI_FLAG_HDE TLI_STAT_HDE /*!< current HDE status */ +#define TLI_FLAG_VS TLI_STAT_VS /*!< current VS status of the TLI */ +#define TLI_FLAG_HS TLI_STAT_HS /*!< current HS status of the TLI */ +#define TLI_FLAG_LM BIT(0) | BIT(31) /*!< line mark interrupt flag */ +#define TLI_FLAG_FE BIT(1) | BIT(31) /*!< FIFO error interrupt flag */ +#define TLI_FLAG_TE BIT(2) | BIT(31) /*!< transaction error interrupt flag */ +#define TLI_FLAG_LCR BIT(3) | BIT(31) /*!< layer configuration reloaded interrupt flag */ + +/* TLI interrupt enable or disable */ +#define TLI_INT_LM BIT(0) /*!< line mark interrupt */ +#define TLI_INT_FE BIT(1) /*!< FIFO error interrupt */ +#define TLI_INT_TE BIT(2) /*!< transaction error interrupt */ +#define TLI_INT_LCR BIT(3) /*!< layer configuration reloaded interrupt */ + +/* TLI interrupt flag */ +#define TLI_INT_FLAG_LM BIT(0) /*!< line mark interrupt flag */ +#define TLI_INT_FLAG_FE BIT(1) /*!< FIFO error interrupt flag */ +#define TLI_INT_FLAG_TE BIT(2) /*!< transaction error interrupt flag */ +#define TLI_INT_FLAG_LCR BIT(3) /*!< layer configuration reloaded interrupt flag */ + +/* layer reload configure */ +#define TLI_FRAME_BLANK_RELOAD_EN ((uint8_t)0x00U) /*!< the layer configuration will be reloaded at frame blank */ +#define TLI_REQUEST_RELOAD_EN ((uint8_t)0x01U) /*!< the layer configuration will be reloaded after this bit sets */ + +/* dither function */ +#define TLI_DITHER_DISABLE ((uint8_t)0x00U) /*!< dither function disable */ +#define TLI_DITHER_ENABLE ((uint8_t)0x01U) /*!< dither function enable */ + +/* horizontal pulse polarity selection */ +#define TLI_HSYN_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< horizontal synchronous pulse active low */ +#define TLI_HSYN_ACTLIVE_HIGHT TLI_CTL_HPPS /*!< horizontal synchronous pulse active high */ + +/* vertical pulse polarity selection */ +#define TLI_VSYN_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< vertical synchronous pulse active low */ +#define TLI_VSYN_ACTLIVE_HIGHT TLI_CTL_VPPS /*!< vertical synchronous pulse active high */ + +/* pixel clock polarity selection */ +#define TLI_PIXEL_CLOCK_TLI ((uint32_t)0x00000000U) /*!< pixel clock is TLI clock */ +#define TLI_PIXEL_CLOCK_INVERTEDTLI TLI_CTL_CLKPS /*!< pixel clock is inverted TLI clock */ + +/* data enable polarity selection */ +#define TLI_DE_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< data enable active low */ +#define TLI_DE_ACTLIVE_HIGHT TLI_CTL_DEPS /*!< data enable active high */ + +/* alpha calculation factor 1 of blending method */ +#define LxBLEND_ACF1(regval) (BITS(8,10) & ((uint32_t)(regval)<<8)) +#define LAYER_ACF1_SA LxBLEND_ACF1(4) /*!< normalization specified alpha */ +#define LAYER_ACF1_PASA LxBLEND_ACF1(6) /*!< normalization pixel alpha * normalization specified alpha */ + +/* alpha calculation factor 2 of blending method */ +#define LxBLEND_ACF2(regval) (BITS(0,2) & ((uint32_t)(regval))) +#define LAYER_ACF2_SA LxBLEND_ACF2(5) /*!< normalization specified alpha */ +#define LAYER_ACF2_PASA LxBLEND_ACF2(7) /*!< normalization pixel alpha * normalization specified alpha */ + +/* function declarations */ +/* initialization functions, TLI enable or disable, TLI reload mode configuration */ +/* deinitialize TLI registers */ +void tli_deinit(void); +/* initialize the parameters of TLI parameter structure with the default values, it is suggested + that call this function after a tli_parameter_struct structure is defined */ +void tli_struct_para_init(tli_parameter_struct *tli_struct); +/* initialize TLI */ +void tli_init(tli_parameter_struct *tli_struct); +/* configure TLI dither function */ +void tli_dither_config(uint8_t dither_stat); +/* enable TLI */ +void tli_enable(void); +/* disable TLI */ +void tli_disable(void); +/* configurate TLI reload mode */ +void tli_reload_config(uint8_t reload_mod); + +/* TLI layer configuration functions */ +/* initialize the parameters of TLI layer structure with the default values, it is suggested + that call this function after a tli_layer_parameter_struct structure is defined */ +void tli_layer_struct_para_init(tli_layer_parameter_struct *layer_struct); +/* initialize TLI layer */ +void tli_layer_init(uint32_t layerx, tli_layer_parameter_struct *layer_struct); +/* reconfigure window position */ +void tli_layer_window_offset_modify(uint32_t layerx, uint16_t offset_x, uint16_t offset_y); +/* initialize the parameters of TLI layer LUT structure with the default values, it is suggested + that call this function after a tli_layer_lut_parameter_struct structure is defined */ +void tli_lut_struct_para_init(tli_layer_lut_parameter_struct *lut_struct); +/* initialize TLI layer LUT */ +void tli_lut_init(uint32_t layerx, tli_layer_lut_parameter_struct *lut_struct); +/* initialize TLI layer color key */ +void tli_color_key_init(uint32_t layerx, uint8_t redkey, uint8_t greenkey, uint8_t bluekey); +/* enable TLI layer */ +void tli_layer_enable(uint32_t layerx); +/* disable TLI layer */ +void tli_layer_disable(uint32_t layerx); +/* enable TLI layer color keying */ +void tli_color_key_enable(uint32_t layerx); +/* disable TLI layer color keying */ +void tli_color_key_disable(uint32_t layerx); +/* enable TLI layer LUT */ +void tli_lut_enable(uint32_t layerx); +/* disable TLI layer LUT */ +void tli_lut_disable(uint32_t layerx); + +/* set line mark value */ +void tli_line_mark_set(uint16_t line_num); +/* get current displayed position */ +uint32_t tli_current_pos_get(void); + +/* flag and interrupt functions */ +/* enable TLI interrupt */ +void tli_interrupt_enable(uint32_t int_flag); +/* disable TLI interrupt */ +void tli_interrupt_disable(uint32_t int_flag); +/* get TLI interrupt flag */ +FlagStatus tli_interrupt_flag_get(uint32_t int_flag); +/* clear TLI interrupt flag */ +void tli_interrupt_flag_clear(uint32_t int_flag); +/* get TLI flag or state in TLI_INTF register or TLI_STAT register */ +FlagStatus tli_flag_get(uint32_t flag); + +#endif /* GD32F5XX_TLI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h new file mode 100644 index 00000000000..029cbbd1784 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h @@ -0,0 +1,100 @@ +/*! + \file gd32f5xx_trng.h + \brief definitions for the TRNG + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_TRNG_H +#define GD32F5XX_TRNG_H + +#include "gd32f5xx.h" + +/* TRNG definitions */ +#define TRNG TRNG_BASE + +/* registers definitions */ +#define TRNG_CTL REG32(TRNG + 0x00000000U) /*!< control register */ +#define TRNG_STAT REG32(TRNG + 0x00000004U) /*!< status register */ +#define TRNG_DATA REG32(TRNG + 0x00000008U) /*!< data register */ + +/* bits definitions */ +/* TRNG_CTL */ +#define TRNG_CTL_TRNGEN BIT(2) /*!< TRNG enable bit */ +#define TRNG_CTL_TRNGIE BIT(3) /*!< interrupt enable bit */ + +/* TRNG_STAT */ +#define TRNG_STAT_DRDY BIT(0) /*!< random data ready status bit */ +#define TRNG_STAT_CECS BIT(1) /*!< clock error current status */ +#define TRNG_STAT_SECS BIT(2) /*!< seed error current status */ +#define TRNG_STAT_CEIF BIT(5) /*!< clock error interrupt flag */ +#define TRNG_STAT_SEIF BIT(6) /*!< seed error interrupt flag */ + +/* TRNG_DATA */ +#define TRNG_DATA_TRNGDATA BITS(0,31) /*!< 32-Bit Random data */ + +/* constants definitions */ +/* TRNG status flag */ +typedef enum { + TRNG_FLAG_DRDY = TRNG_STAT_DRDY, /*!< random Data ready status */ + TRNG_FLAG_CECS = TRNG_STAT_CECS, /*!< clock error current status */ + TRNG_FLAG_SECS = TRNG_STAT_SECS /*!< seed error current status */ +} trng_flag_enum; + +/* TRNG inerrupt flag */ +typedef enum { + TRNG_INT_FLAG_CEIF = TRNG_STAT_CEIF, /*!< clock error interrupt flag */ + TRNG_INT_FLAG_SEIF = TRNG_STAT_SEIF /*!< seed error interrupt flag */ +} trng_int_flag_enum; + +/* function declarations */ +/* initialization functions */ +/* reset TRNG */ +void trng_deinit(void); +/* enable TRNG */ +void trng_enable(void); +/* disable TRNG */ +void trng_disable(void); +/* get the true random data */ +uint32_t trng_get_true_random_data(void); + +/* interrupt & flag functions */ +/* get TRNG flag status */ +FlagStatus trng_flag_get(trng_flag_enum flag); +/* enable TRNG interrupt */ +void trng_interrupt_enable(void); +/* disable TRNG interrupt */ +void trng_interrupt_disable(void); +/* get TRNG interrupt flag status */ +FlagStatus trng_interrupt_flag_get(trng_int_flag_enum int_flag); +/* clear TRNG interrupt flag status */ +void trng_interrupt_flag_clear(trng_int_flag_enum int_flag); + +#endif /* GD32F5XX_TRNG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h new file mode 100644 index 00000000000..4047fd78f02 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h @@ -0,0 +1,489 @@ +/*! + \file gd32f5xx_usart.h + \brief definitions for the USART + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_USART_H +#define GD32F5XX_USART_H + +#include "gd32f5xx.h" + +/* USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) definitions */ +#define USART1 USART_BASE /*!< USART1 base address */ +#define USART2 (USART_BASE+0x00000400U) /*!< USART2 base address */ +#define UART3 (USART_BASE+0x00000800U) /*!< UART3 base address */ +#define UART4 (USART_BASE+0x00000C00U) /*!< UART4 base address */ +#define UART6 (USART_BASE+0x00003400U) /*!< UART6 base address */ +#define UART7 (USART_BASE+0x00003800U) /*!< UART7 base address */ +#define USART0 (USART_BASE+0x0000CC00U) /*!< USART0 base address */ +#define USART5 (USART_BASE+0x0000D000U) /*!< USART5 base address */ + +/* registers definitions */ +#define USART_STAT0(usartx) REG32((usartx) + 0x00U) /*!< USART status register 0 */ +#define USART_DATA(usartx) REG32((usartx) + 0x04U) /*!< USART data register */ +#define USART_BAUD(usartx) REG32((usartx) + 0x08U) /*!< USART baud rate register */ +#define USART_CTL0(usartx) REG32((usartx) + 0x0CU) /*!< USART control register 0 */ +#define USART_CTL1(usartx) REG32((usartx) + 0x10U) /*!< USART control register 1 */ +#define USART_CTL2(usartx) REG32((usartx) + 0x14U) /*!< USART control register 2 */ +#define USART_GP(usartx) REG32((usartx) + 0x18U) /*!< USART guard time and prescaler register */ +#define USART_CTL3(usartx) REG32((usartx) + 0x80U) /*!< USART control register 3 */ +#define USART_RT(usartx) REG32((usartx) + 0x84U) /*!< USART receiver timeout register */ +#define USART_STAT1(usartx) REG32((usartx) + 0x88U) /*!< USART status register 1 */ +#define USART_CHC(usartx) REG32((usartx) + 0xC0U) /*!< USART coherence control register */ + +/* bits definitions */ +/* USARTx_STAT0 */ +#define USART_STAT0_PERR BIT(0) /*!< parity error flag */ +#define USART_STAT0_FERR BIT(1) /*!< frame error flag */ +#define USART_STAT0_NERR BIT(2) /*!< noise error flag */ +#define USART_STAT0_ORERR BIT(3) /*!< overrun error */ +#define USART_STAT0_IDLEF BIT(4) /*!< IDLE frame detected flag */ +#define USART_STAT0_RBNE BIT(5) /*!< read data buffer not empty */ +#define USART_STAT0_TC BIT(6) /*!< transmission complete */ +#define USART_STAT0_TBE BIT(7) /*!< transmit data buffer empty */ +#define USART_STAT0_LBDF BIT(8) /*!< LIN break detected flag */ +#define USART_STAT0_CTSF BIT(9) /*!< CTS change flag */ + +/* USARTx_DATA */ +#define USART_DATA_DATA BITS(0,8) /*!< transmit or read data value */ + +/* USARTx_BAUD */ +#define USART_BAUD_FRADIV BITS(0,3) /*!< fraction part of baud-rate divider */ +#define USART_BAUD_INTDIV BITS(4,15) /*!< integer part of baud-rate divider */ + +/* USARTx_CTL0 */ +#define USART_CTL0_SBKCMD BIT(0) /*!< send break command */ +#define USART_CTL0_RWU BIT(1) /*!< receiver wakeup from mute mode */ +#define USART_CTL0_REN BIT(2) /*!< receiver enable */ +#define USART_CTL0_TEN BIT(3) /*!< transmitter enable */ +#define USART_CTL0_IDLEIE BIT(4) /*!< idle line detected interrupt enable */ +#define USART_CTL0_RBNEIE BIT(5) /*!< read data buffer not empty interrupt and overrun error interrupt enable */ +#define USART_CTL0_TCIE BIT(6) /*!< transmission complete interrupt enable */ +#define USART_CTL0_TBEIE BIT(7) /*!< transmitter buffer empty interrupt enable */ +#define USART_CTL0_PERRIE BIT(8) /*!< parity error interrupt enable */ +#define USART_CTL0_PM BIT(9) /*!< parity mode */ +#define USART_CTL0_PCEN BIT(10) /*!< parity check function enable */ +#define USART_CTL0_WM BIT(11) /*!< wakeup method in mute mode */ +#define USART_CTL0_WL BIT(12) /*!< word length */ +#define USART_CTL0_UEN BIT(13) /*!< USART enable */ +#define USART_CTL0_OVSMOD BIT(15) /*!< oversample mode */ + +/* USARTx_CTL1 */ +#define USART_CTL1_ADDR BITS(0,3) /*!< address of USART */ +#define USART_CTL1_LBLEN BIT(5) /*!< LIN break frame length */ +#define USART_CTL1_LBDIE BIT(6) /*!< LIN break detected interrupt eanble */ +#define USART_CTL1_CLEN BIT(8) /*!< CK length */ +#define USART_CTL1_CPH BIT(9) /*!< CK phase */ +#define USART_CTL1_CPL BIT(10) /*!< CK polarity */ +#define USART_CTL1_CKEN BIT(11) /*!< CK pin enable */ +#define USART_CTL1_STB BITS(12,13) /*!< STOP bits length */ +#define USART_CTL1_LMEN BIT(14) /*!< LIN mode enable */ + +/* USARTx_CTL2 */ +#define USART_CTL2_ERRIE BIT(0) /*!< error interrupt enable */ +#define USART_CTL2_IREN BIT(1) /*!< IrDA mode enable */ +#define USART_CTL2_IRLP BIT(2) /*!< IrDA low-power */ +#define USART_CTL2_HDEN BIT(3) /*!< half-duplex enable */ +#define USART_CTL2_NKEN BIT(4) /*!< NACK enable in smartcard mode */ +#define USART_CTL2_SCEN BIT(5) /*!< smartcard mode enable */ +#define USART_CTL2_DENR BIT(6) /*!< DMA request enable for reception */ +#define USART_CTL2_DENT BIT(7) /*!< DMA request enable for transmission */ +#define USART_CTL2_RTSEN BIT(8) /*!< RTS enable */ +#define USART_CTL2_CTSEN BIT(9) /*!< CTS enable */ +#define USART_CTL2_CTSIE BIT(10) /*!< CTS interrupt enable */ +#define USART_CTL2_OSB BIT(11) /*!< one sample bit method */ + +/* USARTx_GP */ +#define USART_GP_PSC BITS(0,7) /*!< prescaler value for dividing the system clock */ +#define USART_GP_GUAT BITS(8,15) /*!< guard time value in smartcard mode */ + +/* USARTx_CTL3 */ +#define USART_CTL3_RTEN BIT(0) /*!< receiver timeout enable */ +#define USART_CTL3_SCRTNUM BITS(1,3) /*!< smartcard auto-retry number */ +#define USART_CTL3_RTIE BIT(4) /*!< interrupt enable bit of receive timeout event */ +#define USART_CTL3_EBIE BIT(5) /*!< interrupt enable bit of end of block event */ +#define USART_CTL3_RINV BIT(8) /*!< RX pin level inversion */ +#define USART_CTL3_TINV BIT(9) /*!< TX pin level inversion */ +#define USART_CTL3_DINV BIT(10) /*!< data bit level inversion */ +#define USART_CTL3_MSBF BIT(11) /*!< most significant bit first */ + +/* USARTx_RT */ +#define USART_RT_RT BITS(0,23) /*!< receiver timeout threshold */ +#define USART_RT_BL BITS(24,31) /*!< block length */ + +/* USARTx_STAT1 */ +#define USART_STAT1_RTF BIT(11) /*!< receiver timeout flag */ +#define USART_STAT1_EBF BIT(12) /*!< end of block flag */ +#define USART_STAT1_BSY BIT(16) /*!< busy flag */ + +/* USARTx_CHC */ +#define USART_CHC_HCM BIT(0) /*!< hardware flow control coherence mode */ +#define USART_CHC_PCM BIT(1) /*!< parity check coherence mode */ +#define USART_CHC_BCM BIT(2) /*!< break frame coherence mode */ +#define USART_CHC_EPERR BIT(8) /*!< early parity error flag */ + +/* constants definitions */ +/* define the USART bit position and its register index offset */ +#define USART_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define USART_REG_VAL(usartx, offset) (REG32((usartx) + (((uint32_t)(offset) & 0xFFFFU) >> 6))) +#define USART_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define USART_REG_VAL2(usartx, offset) (REG32((usartx) + ((uint32_t)(offset) >> 22))) +#define USART_BIT_POS2(val) (((uint32_t)(val) & 0x1F0000U) >> 16) + +/* register offset */ +#define USART_STAT0_REG_OFFSET 0x00U /*!< STAT0 register offset */ +#define USART_STAT1_REG_OFFSET 0x88U /*!< STAT1 register offset */ +#define USART_CTL0_REG_OFFSET 0x0CU /*!< CTL0 register offset */ +#define USART_CTL1_REG_OFFSET 0x10U /*!< CTL1 register offset */ +#define USART_CTL2_REG_OFFSET 0x14U /*!< CTL2 register offset */ +#define USART_CTL3_REG_OFFSET 0x80U /*!< CTL3 register offset */ +#define USART_CHC_REG_OFFSET 0xC0U /*!< CHC register offset */ + +/* USART flags */ +typedef enum { + /* flags in STAT0 register */ + USART_FLAG_CTS = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 9U), /*!< CTS change flag */ + USART_FLAG_LBD = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected flag */ + USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 7U), /*!< transmit data buffer empty */ + USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete */ + USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty */ + USART_FLAG_IDLE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 4U), /*!< IDLE frame detected flag */ + USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 3U), /*!< overrun error */ + USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 2U), /*!< noise error flag */ + USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 1U), /*!< frame error flag */ + USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 0U), /*!< parity error flag */ + /* flags in STAT1 register */ + USART_FLAG_BSY = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 16U), /*!< busy flag */ + USART_FLAG_EB = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 12U), /*!< end of block flag */ + USART_FLAG_RT = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 11U), /*!< receiver timeout flag */ + /* flags in CHC register */ + USART_FLAG_EPERR = USART_REGIDX_BIT(USART_CHC_REG_OFFSET, 8U) /*!< early parity error flag */ +} usart_flag_enum; + +/* USART interrupt flags */ +typedef enum { + /* interrupt flags in CTL0 register */ + USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT0_REG_OFFSET, 0U), /*!< parity error interrupt and flag */ + USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt and flag */ + USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete interrupt and flag */ + USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and flag */ + USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */ + USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt and flag */ + /* interrupt flags in CTL1 register */ + USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected interrupt and flag */ + /* interrupt flags in CTL2 register */ + USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT0_REG_OFFSET, 9U), /*!< CTS interrupt and flag */ + USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 3U), /*!< error interrupt and overrun error */ + USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 2U), /*!< error interrupt and noise error flag */ + USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 1U), /*!< error interrupt and frame error flag */ + /* interrupt flags in CTL3 register */ + USART_INT_FLAG_EB = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 5U, USART_STAT1_REG_OFFSET, 12U), /*!< interrupt enable bit of end of block event and flag */ + USART_INT_FLAG_RT = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 4U, USART_STAT1_REG_OFFSET, 11U) /*!< interrupt enable bit of receive timeout event and flag */ +} usart_interrupt_flag_enum; + +/* USART interrupt flags */ +typedef enum { + /* interrupt in CTL0 register */ + USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U), /*!< parity error interrupt */ + USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt */ + USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U), /*!< transmission complete interrupt */ + USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and overrun error interrupt */ + USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt */ + /* interrupt in CTL1 register */ + USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U), /*!< LIN break detected interrupt */ + /* interrupt in CTL2 register */ + USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U), /*!< CTS interrupt */ + USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U), /*!< error interrupt */ + /* interrupt in CTL3 register */ + USART_INT_EB = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 5U), /*!< interrupt enable bit of end of block event */ + USART_INT_RT = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 4U) /*!< interrupt enable bit of receive timeout event */ +} usart_interrupt_enum; + +/* USART invert configure */ +typedef enum { + /* data bit level inversion */ + USART_DINV_ENABLE, /*!< data bit level inversion */ + USART_DINV_DISABLE, /*!< data bit level not inversion */ + /* TX pin level inversion */ + USART_TXPIN_ENABLE, /*!< TX pin level inversion */ + USART_TXPIN_DISABLE, /*!< TX pin level not inversion */ + /* RX pin level inversion */ + USART_RXPIN_ENABLE, /*!< RX pin level inversion */ + USART_RXPIN_DISABLE /*!< RX pin level not inversion */ +} usart_invert_enum; + +/* USART receiver configure */ +#define CTL0_REN(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_RECEIVE_ENABLE CTL0_REN(1) /*!< enable receiver */ +#define USART_RECEIVE_DISABLE CTL0_REN(0) /*!< disable receiver */ + +/* USART transmitter configure */ +#define CTL0_TEN(regval) (BIT(3) & ((uint32_t)(regval) << 3)) +#define USART_TRANSMIT_ENABLE CTL0_TEN(1) /*!< enable transmitter */ +#define USART_TRANSMIT_DISABLE CTL0_TEN(0) /*!< disable transmitter */ + +/* USART parity bits definitions */ +#define CTL0_PM(regval) (BITS(9,10) & ((uint32_t)(regval) << 9)) +#define USART_PM_NONE CTL0_PM(0) /*!< no parity */ +#define USART_PM_EVEN CTL0_PM(2) /*!< even parity */ +#define USART_PM_ODD CTL0_PM(3) /*!< odd parity */ + +/* USART wakeup method in mute mode */ +#define CTL0_WM(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_WM_IDLE CTL0_WM(0) /*!< idle Line */ +#define USART_WM_ADDR CTL0_WM(1) /*!< address mask */ + +/* USART word length definitions */ +#define CTL0_WL(regval) (BIT(12) & ((uint32_t)(regval) << 12)) +#define USART_WL_8BIT CTL0_WL(0) /*!< 8 bits */ +#define USART_WL_9BIT CTL0_WL(1) /*!< 9 bits */ + +/* USART oversampling mode definitions */ +#define CTL0_OVSMOD(regval) (BIT(15) & ((uint32_t)(regval) << 15)) +#define USART_OVSMOD_16 CTL0_OVSMOD(0) /*!< 16 bits */ +#define USART_OVSMOD_8 CTL0_OVSMOD(1) /*!< 8 bits */ + +/* USART stop bits definitions */ +#define CTL1_STB(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) +#define USART_STB_1BIT CTL1_STB(0) /*!< 1 bit */ +#define USART_STB_0_5BIT CTL1_STB(1) /*!< 0.5 bit */ +#define USART_STB_2BIT CTL1_STB(2) /*!< 2 bits */ +#define USART_STB_1_5BIT CTL1_STB(3) /*!< 1.5 bits */ + +/* USART LIN break frame length */ +#define CTL1_LBLEN(regval) (BIT(5) & ((uint32_t)(regval) << 5)) +#define USART_LBLEN_10B CTL1_LBLEN(0) /*!< 10 bits */ +#define USART_LBLEN_11B CTL1_LBLEN(1) /*!< 11 bits */ + +/* USART CK length */ +#define CTL1_CLEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_CLEN_NONE CTL1_CLEN(0) /*!< there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame */ +#define USART_CLEN_EN CTL1_CLEN(1) /*!< there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame */ + +/* USART clock phase */ +#define CTL1_CPH(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CPH_1CK CTL1_CPH(0) /*!< first clock transition is the first data capture edge */ +#define USART_CPH_2CK CTL1_CPH(1) /*!< second clock transition is the first data capture edge */ + +/* USART clock polarity */ +#define CTL1_CPL(regval) (BIT(10) & ((uint32_t)(regval) << 10)) +#define USART_CPL_LOW CTL1_CPL(0) /*!< steady low value on CK pin */ +#define USART_CPL_HIGH CTL1_CPL(1) /*!< steady high value on CK pin */ + +/* USART DMA request for receive configure */ +#define CLT2_DENR(regval) (BIT(6) & ((uint32_t)(regval) << 6)) +#define USART_DENR_ENABLE CLT2_DENR(1) /*!< DMA request enable for reception */ +#define USART_DENR_DISABLE CLT2_DENR(0) /*!< DMA request disable for reception */ + +/* USART DMA request for transmission configure */ +#define CLT2_DENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) +#define USART_DENT_ENABLE CLT2_DENT(1) /*!< DMA request enable for transmission */ +#define USART_DENT_DISABLE CLT2_DENT(0) /*!< DMA request disable for transmission */ + +/* USART RTS configure */ +#define CLT2_RTSEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_RTS_ENABLE CLT2_RTSEN(1) /*!< RTS enable */ +#define USART_RTS_DISABLE CLT2_RTSEN(0) /*!< RTS disable */ + +/* USART CTS configure */ +#define CLT2_CTSEN(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CTS_ENABLE CLT2_CTSEN(1) /*!< CTS enable */ +#define USART_CTS_DISABLE CLT2_CTSEN(0) /*!< CTS disable */ + +/* USART one sample bit method configure */ +#define CTL2_OSB(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_OSB_1bit CTL2_OSB(1) /*!< 1 bit */ +#define USART_OSB_3bit CTL2_OSB(0) /*!< 3 bits */ + +/* USART IrDA low-power enable */ +#define CTL2_IRLP(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_IRLP_LOW CTL2_IRLP(1) /*!< low-power */ +#define USART_IRLP_NORMAL CTL2_IRLP(0) /*!< normal */ + +/* USART data is transmitted/received with the LSB/MSB first */ +#define CTL3_MSBF(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_MSBF_LSB CTL3_MSBF(0) /*!< LSB first */ +#define USART_MSBF_MSB CTL3_MSBF(1) /*!< MSB first */ + +/* break frame coherence mode */ +#define CHC_BCM(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_BCM_NONE CHC_BCM(0) /*!< no parity error is detected */ +#define USART_BCM_EN CHC_BCM(1) /*!< parity error is detected */ + +/* USART parity check coherence mode */ +#define CHC_PCM(regval) (BIT(1) & ((uint32_t)(regval) << 1)) +#define USART_PCM_NONE CHC_PCM(0) /*!< not check parity */ +#define USART_PCM_EN CHC_PCM(1) /*!< check the parity */ + +/* USART hardware flow control coherence mode */ +#define CHC_HCM(regval) (BIT(0) & ((uint32_t)(regval) << 0)) +#define USART_HCM_NONE CHC_HCM(0) /*!< nRTS signal equals to the rxne status register */ +#define USART_HCM_EN CHC_HCM(1) /*!< nRTS signal is set when the last data bit has been sampled */ + +/* function declarations */ +/* initialization functions */ +/* reset USART */ +void usart_deinit(uint32_t usart_periph); +/* configure usart baud rate value */ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval); +/* configure usart parity function */ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg); +/* configure usart word length */ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen); +/* configure usart stop bit length */ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen); +/* enable usart */ +void usart_enable(uint32_t usart_periph); +/* disable usart */ +void usart_disable(uint32_t usart_periph); +/* configure USART transmitter */ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig); +/* configure USART receiver */ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig); + +/* USART normal mode communication */ +/* transmit/receive ddata with the LSB/MSB first */ +void usart_data_first_config(uint32_t usart_periph, uint32_t msbf); +/* configure USART inversion */ +void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara); +/* configure the USART oversample mode */ +void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp); +/* configure sample bit method */ +void usart_sample_bit_config(uint32_t usart_periph, uint32_t obsm); +/* enable receiver timeout */ +void usart_receiver_timeout_enable(uint32_t usart_periph); +/* disable receiver timeout */ +void usart_receiver_timeout_disable(uint32_t usart_periph); +/* configure receiver timeout threshold */ +void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout); +/* USART transmit data function */ +void usart_data_transmit(uint32_t usart_periph, uint32_t data); +/* USART receive data function */ +uint16_t usart_data_receive(uint32_t usart_periph); + +/* multi-processor communication */ +/* configure address of the USART */ +void usart_address_config(uint32_t usart_periph, uint8_t addr); +/* enable mute mode */ +void usart_mute_mode_enable(uint32_t usart_periph); +/* disable mute mode */ +void usart_mute_mode_disable(uint32_t usart_periph); +/* configure wakeup method in mute mode */ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmehtod); + +/* LIN mode communication */ +/* enable LIN mode */ +void usart_lin_mode_enable(uint32_t usart_periph); +/* disable LIN mode */ +void usart_lin_mode_disable(uint32_t usart_periph); +/* configure lin break frame length */ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen); +/* send break frame */ +void usart_send_break(uint32_t usart_periph); + +/* half-duplex communication */ +/* enable half-duplex mode */ +void usart_halfduplex_enable(uint32_t usart_periph); +/* disable half-duplex mode */ +void usart_halfduplex_disable(uint32_t usart_periph); + +/* synchronous communication */ +/* enable CK pin in synchronous mode */ +void usart_synchronous_clock_enable(uint32_t usart_periph); +/* disable CK pin in synchronous mode */ +void usart_synchronous_clock_disable(uint32_t usart_periph); +/* configure usart synchronous mode parameters */ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl); + +/* smartcard communication */ +/* configure guard time value in smartcard mode */ +void usart_guard_time_config(uint32_t usart_periph, uint32_t guat); +/* enable smartcard mode */ +void usart_smartcard_mode_enable(uint32_t usart_periph); +/* disable smartcard mode */ +void usart_smartcard_mode_disable(uint32_t usart_periph); +/* enable NACK in smartcard mode */ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph); +/* disable NACK in smartcard mode */ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph); +/* configure smartcard auto-retry number */ +void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum); +/* configure block length */ +void usart_block_length_config(uint32_t usart_periph, uint32_t bl); + +/* IrDA communication */ +/* enable IrDA mode */ +void usart_irda_mode_enable(uint32_t usart_periph); +/* disable IrDA mode */ +void usart_irda_mode_disable(uint32_t usart_periph); +/* configure the peripheral clock prescaler */ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc); +/* configure IrDA low-power */ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp); + +/* hardware flow communication */ +/* configure hardware flow control RTS */ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig); +/* configure hardware flow control CTS */ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig); + +/* coherence control */ +/* configure break frame coherence mode */ +void usart_break_frame_coherence_config(uint32_t usart_periph, uint32_t bcm); +/* configure parity check coherence mode */ +void usart_parity_check_coherence_config(uint32_t usart_periph, uint32_t pcm); +/* configure hardware flow control coherence mode */ +void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm); + +/* DMA communication */ +/* configure USART DMA for reception */ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd); +/* configure USART DMA for transmission */ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd); + +/* flag & interrupt functions */ +/* get USART flag status */ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag); +/* clear USART flag status */ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag); +/* enable USART interrupt */ +void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt); +/* disable USART interrupt */ +void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt); +/* get USART interrupt and flag status */ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); +/* clear interrupt flag and flag status */ +void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); + +#endif /* GD32F5XX_USART_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h new file mode 100644 index 00000000000..4ecac5e542f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h @@ -0,0 +1,107 @@ +/*! + \file gd32f5xx_wwdgt.h + \brief definitions for the WWDGT + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F5XX_WWDGT_H +#define GD32F5XX_WWDGT_H + +#include "gd32f5xx.h" + +/* WWDGT definitions */ +#define WWDGT WWDGT_BASE /*!< WWDGT base address */ + +/* registers definitions */ +#define WWDGT_CTL REG32((WWDGT) + 0x00U) /*!< WWDGT control register */ +#define WWDGT_CFG REG32((WWDGT) + 0x04U) /*!< WWDGT configuration register */ +#define WWDGT_STAT REG32((WWDGT) + 0x08U) /*!< WWDGT status register */ + +/* bits definitions */ +/* WWDGT_CTL */ +#define WWDGT_CTL_CNT BITS(0,6) /*!< WWDGT counter value */ +#define WWDGT_CTL_WDGTEN BIT(7) /*!< WWDGT counter enable */ + +/* WWDGT_CFG */ +#define WWDGT_CFG_WIN BITS(0,6) /*!< WWDGT counter window value */ +#define WWDGT_CFG_PSC (BITS(7,8) | BITS(10,12)) /*!< WWDGT prescaler divider value */ +#define WWDGT_CFG_EWIE BIT(9) /*!< early wakeup interrupt enable */ + +/* WWDGT_STAT */ +#define WWDGT_STAT_EWIF BIT(0) /*!< early wakeup interrupt flag */ + +/* constants definitions */ +#define CFG_PSCL(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) /*!< write value to WWDGT_CFG_PSC bit field */ +#define CFG_PSCH(regval) (BITS(10,12) & ((uint32_t)(regval) << 10)) /*!< write value to WWDGT_CFG_PSC bit field */ +#define WWDGT_CFG_PSC_DIV1 CFG_PSCL(0) /*!< the time base of WWDGT = (PCLK1/4096)/1 */ +#define WWDGT_CFG_PSC_DIV2 CFG_PSCL(1) /*!< the time base of WWDGT = (PCLK1/4096)/2 */ +#define WWDGT_CFG_PSC_DIV4 CFG_PSCL(2) /*!< the time base of WWDGT = (PCLK1/4096)/4 */ +#define WWDGT_CFG_PSC_DIV8 CFG_PSCL(3) /*!< the time base of WWDGT = (PCLK1/4096)/8 */ +#define WWDGT_CFG_PSC_DIV16 (CFG_PSCH(1)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/16 */ +#define WWDGT_CFG_PSC_DIV32 (CFG_PSCH(1)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/32 */ +#define WWDGT_CFG_PSC_DIV64 (CFG_PSCH(1)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/64 */ +#define WWDGT_CFG_PSC_DIV128 (CFG_PSCH(1)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/128 */ +#define WWDGT_CFG_PSC_DIV256 (CFG_PSCH(2)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/256 */ +#define WWDGT_CFG_PSC_DIV512 (CFG_PSCH(2)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/512 */ +#define WWDGT_CFG_PSC_DIV1024 (CFG_PSCH(2)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/1024 */ +#define WWDGT_CFG_PSC_DIV2048 (CFG_PSCH(2)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/2048 */ +#define WWDGT_CFG_PSC_DIV4096 (CFG_PSCH(3)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/4096 */ +#define WWDGT_CFG_PSC_DIV8192 (CFG_PSCH(3)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/8192 */ +#define WWDGT_CFG_PSC_DIV16384 (CFG_PSCH(3)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/16384 */ +#define WWDGT_CFG_PSC_DIV32768 (CFG_PSCH(3)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/32768 */ +#define WWDGT_CFG_PSC_DIV65536 (CFG_PSCH(4)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/65536 */ +#define WWDGT_CFG_PSC_DIV131072 (CFG_PSCH(4)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/131072 */ +#define WWDGT_CFG_PSC_DIV262144 (CFG_PSCH(4)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/262144 */ + +/* write value to WWDGT_CTL_CNT bit field */ +#define CTL_CNT(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) +/* write value to WWDGT_CFG_WIN bit field */ +#define CFG_WIN(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) + +/* function declarations */ +/* reset the window watchdog timer configuration */ +void wwdgt_deinit(void); +/* start the window watchdog timer counter */ +void wwdgt_enable(void); + +/* configure the window watchdog timer counter value */ +void wwdgt_counter_update(uint16_t counter_value); +/* configure counter value, window value, and prescaler divider value */ +void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler); + +/* check early wakeup interrupt state of WWDGT */ +FlagStatus wwdgt_flag_get(void); +/* clear early wakeup interrupt state of WWDGT */ +void wwdgt_flag_clear(void); +/* enable early wakeup interrupt of WWDGT */ +void wwdgt_interrupt_enable(void); + +#endif /* GD32F5XX_WWDGT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c new file mode 100644 index 00000000000..ded23c04a5d --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c @@ -0,0 +1,1200 @@ +/*! + \file gd32f5xx_adc.c + \brief ADC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_adc.h" + +#define ROUTINE_TRIGGER_MODE ((uint32_t)28U) +#define INSERTED_TRIGGER_MODE ((uint32_t)20U) +/* discontinuous mode macro*/ +#define ADC_CHANNEL_LENGTH_SUBTRACT_ONE ((uint8_t)1U) + +/* ADC routine channel macro */ +#define ADC_ROUTINE_CHANNEL_RANK_SIX ((uint8_t)6U) +#define ADC_ROUTINE_CHANNEL_RANK_TWELVE ((uint8_t)12U) +#define ADC_ROUTINE_CHANNEL_RANK_SIXTEEN ((uint8_t)16U) +#define ADC_ROUTINE_CHANNEL_RANK_LENGTH ((uint8_t)5U) + +/* ADC sampling time macro */ +#define ADC_CHANNEL_SAMPLE_TEN ((uint8_t)10U) +#define ADC_CHANNEL_SAMPLE_EIGHTEEN ((uint8_t)18U) +#define ADC_CHANNEL_SAMPLE_LENGTH ((uint8_t)3U) + +/* ADC inserted channel macro */ +#define ADC_INSERTED_CHANNEL_RANK_LENGTH ((uint8_t)5U) +#define ADC_INSERTED_CHANNEL_SHIFT_LENGTH ((uint8_t)15U) + +/* ADC inserted channel offset macro */ +#define ADC_OFFSET_LENGTH ((uint8_t)3U) +#define ADC_OFFSET_SHIFT_LENGTH ((uint8_t)4U) + +/*! + \brief reset ADC + \param[in] none + \param[out] none + \retval none +*/ +void adc_deinit(void) +{ + rcu_periph_reset_enable(RCU_ADCRST); + rcu_periph_reset_disable(RCU_ADCRST); +} + +/*! + \brief configure the ADC clock for all the ADCs + \param[in] prescaler: configure ADCs prescaler ratio + only one parameter can be selected which is shown as below: + \arg ADC_ADCCK_PCLK2_DIV2: PCLK2 div2 + \arg ADC_ADCCK_PCLK2_DIV4: PCLK2 div4 + \arg ADC_ADCCK_PCLK2_DIV6: PCLK2 div6 + \arg ADC_ADCCK_PCLK2_DIV8: PCLK2 div8 + \arg ADC_ADCCK_HCLK_DIV5: HCLK div5 + \arg ADC_ADCCK_HCLK_DIV6: HCLK div6 + \arg ADC_ADCCK_HCLK_DIV10: HCLK div10 + \arg ADC_ADCCK_HCLK_DIV20: HCLK div20 + \param[out] none + \retval none +*/ +void adc_clock_config(uint32_t prescaler) +{ + ADC_SYNCCTL &= ~((uint32_t)ADC_SYNCCTL_ADCCK); + ADC_SYNCCTL |= (uint32_t) prescaler; +} + +/*! + \brief enable or disable ADC special function + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] function: the function to config + only one parameter can be selected which is shown as below: + \arg ADC_SCAN_MODE: scan mode select + \arg ADC_INSERTED_CHANNEL_AUTO: inserted sequence convert automatically + \arg ADC_CONTINUOUS_MODE: continuous mode select + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_special_function_config(uint32_t adc_periph, uint32_t function, ControlStatus newvalue) +{ + if(newvalue) { + if(0U != (function & ADC_SCAN_MODE)) { + /* enable scan mode */ + ADC_CTL0(adc_periph) |= ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)) { + /* enable inserted sequence convert automatically */ + ADC_CTL0(adc_periph) |= ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)) { + /* enable continuous mode */ + ADC_CTL1(adc_periph) |= ADC_CONTINUOUS_MODE; + } + } else { + if(0U != (function & ADC_SCAN_MODE)) { + /* disable scan mode */ + ADC_CTL0(adc_periph) &= ~ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)) { + /* disable inserted sequence convert automatically */ + ADC_CTL0(adc_periph) &= ~ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)) { + /* disable continuous mode */ + ADC_CTL1(adc_periph) &= ~ADC_CONTINUOUS_MODE; + } + } +} + +/*! + \brief configure ADC data alignment + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] data_alignment: data alignment select + only one parameter can be selected which is shown as below: + \arg ADC_DATAALIGN_RIGHT: LSB alignment + \arg ADC_DATAALIGN_LEFT: MSB alignment + \param[out] none + \retval none +*/ +void adc_data_alignment_config(uint32_t adc_periph, uint32_t data_alignment) +{ + if(ADC_DATAALIGN_RIGHT != data_alignment) { + /* MSB alignment */ + ADC_CTL1(adc_periph) |= ADC_CTL1_DAL; + } else { + /* LSB alignment */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DAL); + } +} + +/*! + \brief enable ADC interface + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_enable(uint32_t adc_periph) +{ + if(RESET == (ADC_CTL1(adc_periph) & ADC_CTL1_ADCON)) { + /* enable ADC */ + ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_ADCON; + } +} + +/*! + \brief disable ADC interface + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_disable(uint32_t adc_periph) +{ + /* disable ADC */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ADCON); +} + +/*! + \brief ADC calibration and reset calibration + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_calibration_enable(uint32_t adc_periph) +{ + /* reset the selected ADC calibration registers */ + ADC_CTL1(adc_periph) |= (uint32_t) ADC_CTL1_RSTCLB; + /* check the RSTCLB bit state */ + while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_RSTCLB)) { + } + /* enable ADC calibration process */ + ADC_CTL1(adc_periph) |= ADC_CTL1_CLB; + /* check the CLB bit state */ + while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_CLB)) { + } +} + +/*! + \brief configure temperature sensor and internal reference voltage channel or VBAT channel function + \param[in] function: temperature sensor and internal reference voltage channel or VBAT channel + only one parameter can be selected which is shown as below: + \arg ADC_VBAT_CHANNEL_SWITCH: channel 18 (1/4 voltate of external battery) switch of ADC0 + \arg ADC_TEMP_VREF_CHANNEL_SWITCH: channel 16 (temperature sensor) and 17 (internal reference voltage) switch of ADC0 + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_channel_16_to_18(uint32_t function, ControlStatus newvalue) +{ + if(newvalue) { + if(RESET != (function & ADC_VBAT_CHANNEL_SWITCH)) { + /* enable ADC0 Vbat channel */ + ADC_SYNCCTL |= ADC_VBAT_CHANNEL_SWITCH; + } + if(RESET != (function & ADC_TEMP_VREF_CHANNEL_SWITCH)) { + /* enable ADC0 Vref and Temperature channel */ + ADC_SYNCCTL |= ADC_TEMP_VREF_CHANNEL_SWITCH; + } + } else { + if(RESET != (function & ADC_VBAT_CHANNEL_SWITCH)) { + /* disable ADC0 Vbat channel */ + ADC_SYNCCTL &= ~ADC_VBAT_CHANNEL_SWITCH; + } + if(RESET != (function & ADC_TEMP_VREF_CHANNEL_SWITCH)) { + /* disable ADC0 Vref and Temperature channel */ + ADC_SYNCCTL &= ~ADC_TEMP_VREF_CHANNEL_SWITCH; + } + } +} + +/*! + \brief configure ADC resolution + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] resolution: ADC resolution + only one parameter can be selected which is shown as below: + \arg ADC_RESOLUTION_12B: 12-bit ADC resolution + \arg ADC_RESOLUTION_10B: 10-bit ADC resolution + \arg ADC_RESOLUTION_8B: 8-bit ADC resolution + \arg ADC_RESOLUTION_6B: 6-bit ADC resolution + \param[out] none + \retval none +*/ +void adc_resolution_config(uint32_t adc_periph, uint32_t resolution) +{ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DRES); + ADC_CTL0(adc_periph) |= (uint32_t)resolution; +} + +/*! + \brief configure ADC oversample mode + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] mode: ADC oversampling mode + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_ALL_CONVERT: all oversampled conversions for a channel are done consecutively after a trigger + \arg ADC_OVERSAMPLING_ONE_CONVERT: each oversampled conversion for a channel needs a trigger + \param[in] shift: ADC oversampling shift + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_SHIFT_NONE: no oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_1B: 1-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_2B: 2-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_3B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_4B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_5B: 5-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_6B: 6-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_7B: 7-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_8B: 8-bit oversampling shift + \param[in] ratio: ADC oversampling ratio + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_RATIO_MUL2: oversampling ratio multiple 2 + \arg ADC_OVERSAMPLING_RATIO_MUL4: oversampling ratio multiple 4 + \arg ADC_OVERSAMPLING_RATIO_MUL8: oversampling ratio multiple 8 + \arg ADC_OVERSAMPLING_RATIO_MUL16: oversampling ratio multiple 16 + \arg ADC_OVERSAMPLING_RATIO_MUL32: oversampling ratio multiple 32 + \arg ADC_OVERSAMPLING_RATIO_MUL64: oversampling ratio multiple 64 + \arg ADC_OVERSAMPLING_RATIO_MUL128: oversampling ratio multiple 128 + \arg ADC_OVERSAMPLING_RATIO_MUL256: oversampling ratio multiple 256 + \param[out] none + \retval none +*/ +void adc_oversample_mode_config(uint32_t adc_periph, uint32_t mode, uint16_t shift, uint8_t ratio) +{ + if(ADC_OVERSAMPLING_ONE_CONVERT == mode) { + ADC_OVSAMPCTL(adc_periph) |= (uint32_t)ADC_OVSAMPCTL_TOVS; + } else { + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_TOVS); + } + /* config the shift and ratio */ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)(ADC_OVSAMPCTL_OVSR | ADC_OVSAMPCTL_OVSS)); + ADC_OVSAMPCTL(adc_periph) |= ((uint32_t)shift | (uint32_t)ratio); +} + +/*! + \brief enable ADC oversample mode + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_oversample_mode_enable(uint32_t adc_periph) +{ + ADC_OVSAMPCTL(adc_periph) |= ADC_OVSAMPCTL_OVSEN; +} + +/*! + \brief disable ADC oversample mode + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_oversample_mode_disable(uint32_t adc_periph) +{ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_OVSEN); +} + +/*! + \brief enable DMA request + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_dma_mode_enable(uint32_t adc_periph) +{ + /* enable DMA request */ + ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DMA); +} + +/*! + \brief disable DMA request + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_dma_mode_disable(uint32_t adc_periph) +{ + /* disable DMA request */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DMA); +} + +/*! + \brief when DMA=1, the DMA engine issues a request at end of each routine conversion + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_dma_request_after_last_enable(uint32_t adc_periph) +{ + ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DDM); +} + +/*! + \brief the DMA engine is disabled after the end of transfer signal from DMA controller is detected + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_dma_request_after_last_disable(uint32_t adc_periph) +{ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DDM); +} + +/*! + \brief configure ADC discontinuous mode + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: select the sequence + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \arg ADC_CHANNEL_DISCON_DISABLE: disable discontinuous mode of routine & inserted channel + \param[in] length: number of conversions in discontinuous mode,the number can be 1..8 + for routine sequence ,the number has no effect for inserted sequence + \param[out] none + \retval none +*/ +void adc_discontinuous_mode_config(uint32_t adc_periph, uint8_t adc_sequence, uint8_t length) +{ + /* disable discontinuous mode of routine & inserted channel */ + ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_DISRC | ADC_CTL0_DISIC)); + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* config the number of conversions in discontinuous mode */ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DISNUM); + if((length <= 8U) && (length >= 1U)) { + ADC_CTL0(adc_periph) |= CTL0_DISNUM(((uint32_t)length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + } + /* enable routine sequence discontinuous mode */ + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISRC; + break; + case ADC_INSERTED_CHANNEL: + /* enable inserted sequence discontinuous mode */ + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISIC; + break; + case ADC_CHANNEL_DISCON_DISABLE: + /* disable discontinuous mode of routine & inserted channel */ + default: + break; + } +} + +/*! + \brief configure the length of routine sequence or inserted sequence + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: select the sequence + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \param[in] length: the length of the channel + routine channel 1-16 + inserted channel 1-4 + \param[out] none + \retval none +*/ +void adc_channel_length_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t length) +{ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + if((length >= 1U) && (length <= 16U)) { + ADC_RSQ0(adc_periph) &= ~((uint32_t)ADC_RSQ0_RL); + ADC_RSQ0(adc_periph) |= RSQ0_RL((uint32_t)(length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + } + break; + case ADC_INSERTED_CHANNEL: + if((length >= 1U) && (length <= 4U)) { + ADC_ISQ(adc_periph) &= ~((uint32_t)ADC_ISQ_IL); + ADC_ISQ(adc_periph) |= ISQ_IL((uint32_t)(length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + } + break; + default: + break; + } +} + +/*! + \brief configure ADC routine channel + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] rank: the routine sequence rank,this parameter must be between 0 to 15 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x(x=0..18): ADC channelx + \param[in] sample_time: the sample time value + only one parameter can be selected which is shown as below: + \arg ADC_SAMPLETIME_3: 3 cycles + \arg ADC_SAMPLETIME_15: 15 cycles + \arg ADC_SAMPLETIME_28: 28 cycles + \arg ADC_SAMPLETIME_56: 56 cycles + \arg ADC_SAMPLETIME_84: 84 cycles + \arg ADC_SAMPLETIME_112: 112 cycles + \arg ADC_SAMPLETIME_144: 144 cycles + \arg ADC_SAMPLETIME_480: 480 cycles + \param[out] none + \retval none +*/ +void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) +{ + uint32_t rsq, sampt; + + /* ADC routine sequence config */ + if(rank < ADC_ROUTINE_CHANNEL_RANK_SIX) { + /* the routine sequence rank is smaller than six */ + rsq = ADC_RSQ2(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * rank))); + /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ + rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * rank)); + ADC_RSQ2(adc_periph) = rsq; + } else if(rank < ADC_ROUTINE_CHANNEL_RANK_TWELVE) { + /* the routine sequence rank is smaller than twelve */ + rsq = ADC_RSQ1(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_SIX)))); + /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ + rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_SIX))); + ADC_RSQ1(adc_periph) = rsq; + } else if(rank < ADC_ROUTINE_CHANNEL_RANK_SIXTEEN) { + /* the routine sequence rank is smaller than sixteen */ + rsq = ADC_RSQ0(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_TWELVE)))); + /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ + rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_TWELVE))); + ADC_RSQ0(adc_periph) = rsq; + } else { + } + + /* ADC sampling time config */ + if(adc_channel < ADC_CHANNEL_SAMPLE_TEN) { + /* the routine sequence rank is smaller than ten */ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel))); + /* channel sample time set*/ + sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel)); + ADC_SAMPT1(adc_periph) = sampt; + } else if(adc_channel <= ADC_CHANNEL_SAMPLE_EIGHTEEN) { + /* the routine sequence rank is smaller than eighteen */ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN)))); + /* channel sample time set*/ + sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN))); + ADC_SAMPT0(adc_periph) = sampt; + } else { + } +} + +/*! + \brief configure ADC inserted channel + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] rank: the inserted sequence rank,this parameter must be between 0 to 3 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x(x=0..18): ADC Channelx + \param[in] sample_time: The sample time value + only one parameter can be selected which is shown as below: + \arg ADC_SAMPLETIME_3: 3 cycles + \arg ADC_SAMPLETIME_15: 15 cycles + \arg ADC_SAMPLETIME_28: 28 cycles + \arg ADC_SAMPLETIME_56: 56 cycles + \arg ADC_SAMPLETIME_84: 84 cycles + \arg ADC_SAMPLETIME_112: 112 cycles + \arg ADC_SAMPLETIME_144: 144 cycles + \arg ADC_SAMPLETIME_480: 480 cycles + \param[out] none + \retval none +*/ +void adc_inserted_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) +{ + uint8_t inserted_length; + uint32_t isq, sampt; + + /* get inserted sequence length */ + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph), 20U, 21U); + /* the channel number is written to these bits to select a channel as the nth conversion in the inserted sequence */ + if(rank < 4U) { + isq = ADC_ISQ(adc_periph); + isq &= ~((uint32_t)(ADC_ISQ_ISQN << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH - (inserted_length - rank) * ADC_INSERTED_CHANNEL_RANK_LENGTH))); + isq |= ((uint32_t)adc_channel << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH - (inserted_length - rank) * ADC_INSERTED_CHANNEL_RANK_LENGTH)); + ADC_ISQ(adc_periph) = isq; + } + + /* ADC sampling time config */ + if(adc_channel < ADC_CHANNEL_SAMPLE_TEN) { + /* the inserted sequence rank is smaller than ten */ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel))); + /* channel sample time set*/ + sampt |= (uint32_t) sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel); + ADC_SAMPT1(adc_periph) = sampt; + } else if(adc_channel <= ADC_CHANNEL_SAMPLE_EIGHTEEN) { + /* the inserted sequence rank is smaller than eighteen */ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN)))); + /* channel sample time set*/ + sampt |= ((uint32_t)sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN))); + ADC_SAMPT0(adc_periph) = sampt; + } else { + } +} + +/*! + \brief configure ADC inserted channel offset + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] inserted_channel : insert channel select + only one parameter can be selected which is shown as below: + \arg ADC_INSERTED_CHANNEL_0: inserted channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted channel3 + \param[in] offset : the offset data + \param[out] none + \retval none +*/ +void adc_inserted_channel_offset_config(uint32_t adc_periph, uint8_t inserted_channel, uint16_t offset) +{ + uint8_t inserted_length; + uint32_t num = 0U; + + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph), 20U, 21U); + num = ((uint32_t)ADC_OFFSET_LENGTH - ((uint32_t)inserted_length - (uint32_t)inserted_channel)); + + if(num <= ADC_OFFSET_LENGTH) { + /* calculate the offset of the register */ + num = num * ADC_OFFSET_SHIFT_LENGTH; + /* config the offset of the selected channels */ + REG32((adc_periph) + 0x14U + num) = IOFFX_IOFF((uint32_t)offset); + } +} + +/*! + \brief configure ADC external trigger source + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: select the sequence + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \param[in] external_trigger_source: routine or inserted sequence trigger source + for routine sequence: + only one parameter can be selected which is shown as below: + \arg ADC_EXTTRIG_ROUTINE_T0_CH0: external trigger timer 0 CC0 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T0_CH1: external trigger timer 0 CC1 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T0_CH2: external trigger timer 0 CC2 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T1_CH1: external trigger timer 1 CC1 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T1_CH2: external trigger timer 1 CC2 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T1_CH3: external trigger timer 1 CC3 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T1_TRGO: external trigger timer 1 TRGO event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T2_CH0 : external trigger timer 2 CC0 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T2_TRGO : external trigger timer 2 TRGO event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T3_CH3: external trigger timer 3 CC3 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T4_CH0: external trigger timer 4 CC0 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T4_CH1: external trigger timer 4 CC1 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T4_CH2: external trigger timer 4 CC2 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T7_CH0: external trigger timer 7 CC0 event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_T7_TRGO: external trigger timer 7 TRGO event select for routine sequence + \arg ADC_EXTTRIG_ROUTINE_EXTI_11: external trigger extiline 11 select for routine sequence + for inserted sequence: + only one parameter can be selected which is shown as below: + \arg ADC_EXTTRIG_INSERTED_T0_CH3: timer0 capture compare 3 + \arg ADC_EXTTRIG_INSERTED_T0_TRGO: timer0 TRGO event + \arg ADC_EXTTRIG_INSERTED_T1_CH0: timer1 capture compare 0 + \arg ADC_EXTTRIG_INSERTED_T1_TRGO: timer1 TRGO event + \arg ADC_EXTTRIG_INSERTED_T2_CH1: timer2 capture compare 1 + \arg ADC_EXTTRIG_INSERTED_T2_CH3: timer2 capture compare 3 + \arg ADC_EXTTRIG_INSERTED_T3_CH0: timer3 capture compare 0 + \arg ADC_EXTTRIG_INSERTED_T3_CH1: timer3 capture compare 1 + \arg ADC_EXTTRIG_INSERTED_T3_CH2: timer3 capture compare 2 + \arg ADC_EXTTRIG_INSERTED_T3_TRGO: timer3 capture compare TRGO + \arg ADC_EXTTRIG_INSERTED_T4_CH3: timer4 capture compare 3 + \arg ADC_EXTTRIG_INSERTED_T4_TRGO: timer4 capture compare TRGO + \arg ADC_EXTTRIG_INSERTED_T7_CH1: timer7 capture compare 1 + \arg ADC_EXTTRIG_INSERTED_T7_CH2: timer7 capture compare 2 + \arg ADC_EXTTRIG_INSERTED_T7_CH3: timer7 capture compare 3 + \arg ADC_EXTTRIG_INSERTED_EXTI_15: external interrupt line 15 + \param[out] none + \retval none +*/ +void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t external_trigger_source) +{ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* configure ADC routine sequence external trigger source */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSRC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + case ADC_INSERTED_CHANNEL: + /* configure ADC inserted sequence external trigger source */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSIC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + default: + break; + } +} + +/*! + \brief enable ADC external trigger + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: select the sequence + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \param[in] trigger_mode: external trigger mode + only one parameter can be selected which is shown as below: + \arg EXTERNAL_TRIGGER_DISABLE: external trigger disable + \arg EXTERNAL_TRIGGER_RISING: rising edge of external trigger + \arg EXTERNAL_TRIGGER_FALLING: falling edge of external trigger + \arg EXTERNAL_TRIGGER_RISING_FALLING: rising and falling edge of external trigger + \param[out] none + \retval none +*/ +void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t trigger_mode) +{ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* configure ADC routine sequence external trigger mode */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETMRC); + ADC_CTL1(adc_periph) |= (uint32_t)(trigger_mode << ROUTINE_TRIGGER_MODE); + break; + case ADC_INSERTED_CHANNEL: + /* configure ADC inserted sequence external trigger mode */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETMIC); + ADC_CTL1(adc_periph) |= (uint32_t)(trigger_mode << INSERTED_TRIGGER_MODE); + break; + default: + break; + } +} + +/*! + \brief enable ADC software trigger + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: select the sequence + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \param[out] none + \retval none +*/ +void adc_software_trigger_enable(uint32_t adc_periph, uint8_t adc_sequence) +{ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* enable ADC routine sequence software trigger */ + ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_SWRCST; + break; + case ADC_INSERTED_CHANNEL: + /* enable ADC inserted sequence software trigger */ + ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_SWICST; + break; + default: + break; + } +} + +/*! + \brief configure end of conversion mode + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] end_selection: end of conversion mode + only one parameter can be selected which is shown as below: + \arg ADC_EOC_SET_SEQUENCE: only at the end of a sequence of routine conversions, the EOC bit is set.Overflow detection is disabled unless DMA=1. + \arg ADC_EOC_SET_CONVERSION: at the end of each routine conversion, the EOC bit is set.Overflow is detected automatically. + \param[out] none + \retval none +*/ +void adc_end_of_conversion_config(uint32_t adc_periph, uint8_t end_selection) +{ + switch(end_selection) { + case ADC_EOC_SET_SEQUENCE: + /* only at the end of a sequence of routine conversions, the EOC bit is set */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_EOCM); + break; + case ADC_EOC_SET_CONVERSION: + /* at the end of each routine conversion, the EOC bit is set.Overflow is detected automatically */ + ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_EOCM); + break; + default: + break; + } +} + +/*! + \brief read ADC routine data register + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] none + \param[out] none + \retval the conversion value +*/ +uint16_t adc_routine_data_read(uint32_t adc_periph) +{ + return (uint16_t)(ADC_RDATA(adc_periph)); +} + +/*! + \brief read ADC inserted data register + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] inserted_channel : insert channel select + only one parameter can be selected which is shown as below: + \arg ADC_INSERTED_CHANNEL_0: inserted channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted channel3 + \param[out] none + \retval the conversion value +*/ +uint16_t adc_inserted_data_read(uint32_t adc_periph, uint8_t inserted_channel) +{ + uint32_t idata; + /* read the data of the selected channel */ + switch(inserted_channel) { + case ADC_INSERTED_CHANNEL_0: + /* read the data of channel 0 */ + idata = ADC_IDATA0(adc_periph); + break; + case ADC_INSERTED_CHANNEL_1: + /* read the data of channel 1 */ + idata = ADC_IDATA1(adc_periph); + break; + case ADC_INSERTED_CHANNEL_2: + /* read the data of channel 2 */ + idata = ADC_IDATA2(adc_periph); + break; + case ADC_INSERTED_CHANNEL_3: + /* read the data of channel 3 */ + idata = ADC_IDATA3(adc_periph); + break; + default: + idata = 0U; + break; + } + return (uint16_t)idata; +} + +/*! + \brief disable ADC analog watchdog single channel + \param[in] adc_periph: ADCx, x=0,1,2 + \param[out] none + \retval none +*/ +void adc_watchdog_single_channel_disable(uint32_t adc_periph) +{ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDSC); +} + +/*! + \brief enable ADC analog watchdog single channel + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x: ADC Channelx(x=0..18) + \param[out] none + \retval none +*/ +void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel) +{ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDCHSEL); + + /* analog watchdog channel select */ + ADC_CTL0(adc_periph) |= (uint32_t)adc_channel; + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDSC; +} + +/*! + \brief configure ADC analog watchdog sequence channel + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: the sequence use analog watchdog + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \arg ADC_ROUTINE_INSERTED_CHANNEL: both routine and inserted sequence + \param[out] none + \retval none +*/ +void adc_watchdog_sequence_channel_enable(uint32_t adc_periph, uint8_t adc_sequence) +{ + ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC)); + /* select the sequence */ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* routine channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_RWDEN; + break; + case ADC_INSERTED_CHANNEL: + /* inserted channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_IWDEN; + break; + case ADC_ROUTINE_INSERTED_CHANNEL: + /* routine and inserted channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN); + break; + default: + break; + } +} + +/*! + \brief disable ADC analog watchdog + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_sequence: the sequence use analog watchdog + only one parameter can be selected which is shown as below: + \arg ADC_ROUTINE_CHANNEL: routine sequence + \arg ADC_INSERTED_CHANNEL: inserted sequence + \arg ADC_ROUTINE_INSERTED_CHANNEL: both routine and inserted sequence + \param[out] none + \retval none +*/ +void adc_watchdog_disable(uint32_t adc_periph, uint8_t adc_sequence) +{ + /* select the sequence */ + switch(adc_sequence) { + case ADC_ROUTINE_CHANNEL: + /* disable ADC analog watchdog routine sequence */ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_RWDEN); + break; + case ADC_INSERTED_CHANNEL: + /* disable ADC analog watchdog inserted sequence */ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_IWDEN); + break; + case ADC_ROUTINE_INSERTED_CHANNEL: + /* disable ADC analog watchdog routine and inserted sequence */ + ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN)); + break; + default: + break; + } +} + +/*! + \brief configure ADC analog watchdog threshold + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] low_threshold: analog watchdog low threshold,0..4095 + \param[in] high_threshold: analog watchdog high threshold,0..4095 + \param[out] none + \retval none +*/ +void adc_watchdog_threshold_config(uint32_t adc_periph, uint16_t low_threshold, uint16_t high_threshold) +{ + /* configure ADC analog watchdog low threshold */ + ADC_WDLT(adc_periph) = (uint32_t)WDLT_WDLT(low_threshold); + /* configure ADC analog watchdog high threshold */ + ADC_WDHT(adc_periph) = (uint32_t)WDHT_WDHT(high_threshold); +} + +/*! + \brief configure the ADC sync mode + \param[in] sync_mode: ADC sync mode + only one parameter can be selected which is shown as below: + \arg ADC_SYNC_MODE_INDEPENDENT: all the ADCs work independently + \arg ADC_DAUL_ROUTINE_PARALLEL_INSERTED_PARALLEL: ADC0 and ADC1 work in combined routine parallel & inserted parallel mode + \arg ADC_DAUL_ROUTINE_PARALLEL_INSERTED_ROTATION: ADC0 and ADC1 work in combined routine parallel & trigger rotation mode + \arg ADC_DAUL_INSERTED_PARALLEL: ADC0 and ADC1 work in inserted parallel mode + \arg ADC_DAUL_ROUTINE_PARALLEL: ADC0 and ADC1 work in routine parallel mode + \arg ADC_DAUL_ROUTINE_FOLLOW_UP: ADC0 and ADC1 work in follow-up mode + \arg ADC_DAUL_INSERTED_TRRIGGER_ROTATION: ADC0 and ADC1 work in trigger rotation mode + \arg ADC_ALL_ROUTINE_PARALLEL_INSERTED_PARALLEL: all ADCs work in combined routine parallel & inserted parallel mode + \arg ADC_ALL_ROUTINE_PARALLEL_INSERTED_ROTATION: all ADCs work in combined routine parallel & trigger rotation mode + \arg ADC_ALL_INSERTED_PARALLEL: all ADCs work in inserted parallel mode + \arg ADC_ALL_ROUTINE_PARALLEL: all ADCs work in routine parallel mode + \arg ADC_ALL_ROUTINE_FOLLOW_UP: all ADCs work in follow-up mode + \arg ADC_ALL_INSERTED_TRRIGGER_ROTATION: all ADCs work in trigger rotation mode + \param[out] none + \retval none +*/ +void adc_sync_mode_config(uint32_t sync_mode) +{ + ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCM); + ADC_SYNCCTL |= sync_mode; +} + +/*! + \brief configure the delay between 2 sampling phases in ADC sync modes + \param[in] sample_delay: the delay between 2 sampling phases in ADC sync modes + only one parameter can be selected which is shown as below: + \arg ADC_SYNC_DELAY_xCYCLE: x=5..20,the delay between 2 sampling phases in ADC sync modes is x ADC clock cycles + \param[out] none + \retval none +*/ +void adc_sync_delay_config(uint32_t sample_delay) +{ + ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDLY); + ADC_SYNCCTL |= sample_delay; +} + +/*! + \brief configure ADC sync DMA mode selection + \param[in] dma_mode: ADC sync DMA mode + only one parameter can be selected which is shown as below: + \arg ADC_SYNC_DMA_DISABLE: ADC sync DMA disabled + \arg ADC_SYNC_DMA_MODE0: ADC sync DMA mode 0 + \arg ADC_SYNC_DMA_MODE1: ADC sync DMA mode 1 + \param[out] none + \retval none +*/ +void adc_sync_dma_config(uint32_t dma_mode) +{ + ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDMA); + ADC_SYNCCTL |= dma_mode; +} + +/*! + \brief configure ADC sync DMA engine is disabled after the end of transfer signal from DMA controller is detected + \param[in] none + \param[out] none + \retval none +*/ +void adc_sync_dma_request_after_last_enable(void) +{ + ADC_SYNCCTL |= ADC_SYNCCTL_SYNCDDM; +} + +/*! + \brief configure ADC sync DMA engine issues requests according to the SYNCDMA bits + \param[in] none + \param[out] none + \retval none +*/ +void adc_sync_dma_request_after_last_disable(void) +{ + ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDDM); +} + +/*! + \brief read ADC sync routine data register + \param[in] none + \param[out] none + \retval sync routine data +*/ +uint32_t adc_sync_routine_data_read(void) +{ + return (uint32_t)ADC_SYNCDATA; +} + +/*! + \brief get the bit state of ADCx software start conversion + \param[in] adc_periph: ADCx, x=0,1,2 only one among these parameters can be selected + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_routine_software_startconv_flag_get(uint32_t adc_periph) +{ + FlagStatus reval = RESET; + if((uint32_t)RESET != (ADC_STAT(adc_periph) & ADC_STAT_STRC)) { + reval = SET; + } + return reval; +} + +/*! + \brief get the bit state of ADCx software inserted channel start conversion + \param[in] adc_periph: ADCx, x=0,1,2 only one among these parameters can be selected + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph) +{ + FlagStatus reval = RESET; + if((uint32_t)RESET != (ADC_STAT(adc_periph) & ADC_STAT_STIC)) { + reval = SET; + } + return reval; +} + +/*! + \brief get the ADC flag bits + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_flag: the adc flag bits + only one parameter can be selected which is shown as below: + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of sequence conversion flag + \arg ADC_FLAG_EOIC: end of inserted sequence conversion flag + \arg ADC_FLAG_STIC: start flag of inserted sequence + \arg ADC_FLAG_STRC: start flag of routine sequence + \arg ADC_FLAG_ROVF: routine data register overflow flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_flag_get(uint32_t adc_periph, uint32_t adc_flag) +{ + FlagStatus reval = RESET; + if(ADC_STAT(adc_periph) & adc_flag) { + reval = SET; + } + return reval; + +} + +/*! + \brief clear the ADC flag bits + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_flag: the adc flag bits + only one parameter can be selected which is shown as below: + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of sequence conversion flag + \arg ADC_FLAG_EOIC: end of inserted sequence conversion flag + \arg ADC_FLAG_STIC: start flag of inserted sequence + \arg ADC_FLAG_STRC: start flag of routine sequence + \arg ADC_FLAG_ROVF: routine data register overflow flag + \param[out] none + \retval none +*/ +void adc_flag_clear(uint32_t adc_periph, uint32_t adc_flag) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_flag); +} + +/*! + \brief enable ADC interrupt + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_interrupt: the adc interrupt flag + only one parameter can be selected which is shown as below: + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of sequence conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted sequence conversion interrupt flag + \arg ADC_INT_ROVF: routine data register overflow interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_enable(uint32_t adc_periph, uint32_t adc_interrupt) +{ + switch(adc_interrupt) { + case ADC_INT_WDE: + /* enable analog watchdog interrupt */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDEIE; + break; + case ADC_INT_EOC: + /* enable end of sequence conversion interrupt */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOCIE; + break; + case ADC_INT_EOIC: + /* enable end of inserted sequence conversion interrupt */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOICIE; + break; + case ADC_INT_ROVF: + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_ROVFIE; + break; + default: + break; + } +} + +/*! + \brief disable ADC interrupt + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_flag: the adc interrupt flag + only one parameter can be selected which is shown as below: + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of sequence conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted sequence conversion interrupt flag + \arg ADC_INT_ROVF: routine data register overflow interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_disable(uint32_t adc_periph, uint32_t adc_interrupt) +{ + switch(adc_interrupt) { + /* select the interrupt source */ + case ADC_INT_WDE: + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDEIE); + break; + case ADC_INT_EOC: + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_EOCIE); + break; + case ADC_INT_EOIC: + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_EOICIE); + break; + case ADC_INT_ROVF: + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_ROVFIE); + break; + default: + break; + } +} + +/*! + \brief get the ADC interrupt bits + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_interrupt: the adc interrupt bits + only one parameter can be selected which is shown as below: + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of sequence conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted sequence conversion interrupt + \arg ADC_INT_FLAG_ROVF: routine data register overflow interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph, uint32_t adc_interrupt) +{ + FlagStatus interrupt_flag = RESET; + uint32_t state; + /* check the interrupt bits */ + switch(adc_interrupt) { + case ADC_INT_FLAG_WDE: + /* get the ADC analog watchdog interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_WDE; + if((ADC_CTL0(adc_periph) & ADC_CTL0_WDEIE) && state) { + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOC: + /* get the ADC end of sequence conversion interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_EOC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOCIE) && state) { + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOIC: + /* get the ADC end of inserted sequence conversion interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_EOIC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOICIE) && state) { + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_ROVF: + /* get the ADC routine data register overflow interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_ROVF; + if((ADC_CTL0(adc_periph) & ADC_CTL0_ROVFIE) && state) { + interrupt_flag = SET; + } + break; + default: + break; + } + return interrupt_flag; +} + +/*! + \brief clear the ADC flag + \param[in] adc_periph: ADCx, x=0,1,2 + \param[in] adc_interrupt: the adc status flag + only one parameter can be selected which is shown as below: + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of sequence conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted sequence conversion interrupt + \arg ADC_INT_FLAG_ROVF: routine data register overflow interrupt + \param[out] none + \retval none +*/ +void adc_interrupt_flag_clear(uint32_t adc_periph, uint32_t adc_interrupt) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_interrupt); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c new file mode 100644 index 00000000000..dcc94c54d6f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c @@ -0,0 +1,1431 @@ +/*! + \file gd32f5xx_can.c + \brief CAN driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_can.h" +#include + +#define CAN_ERROR_HANDLE(s) do{}while(1) + +/* This table can be used to calculate data length in FD mode */ +const uint8_t g_can_fdlength_table[] = {12, 16, 20, 24, 32, 48, 64}; + +/*! + \brief deinitialize CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_deinit(uint32_t can_periph) +{ + if(CAN0 == can_periph) { + rcu_periph_reset_enable(RCU_CAN0RST); + rcu_periph_reset_disable(RCU_CAN0RST); + } else { + rcu_periph_reset_enable(RCU_CAN1RST); + rcu_periph_reset_disable(RCU_CAN1RST); + } +} + +/*! + \brief initialize CAN parameter struct with a default value + \param[in] type: the type of CAN parameter struct + only one parameter can be selected which is shown as below: + \arg CAN_INIT_STRUCT: the CAN initial struct + \arg CAN_FILTER_STRUCT: the CAN filter struct + \arg CAN_FD_FRAME_STRUCT: the CAN FD initial struct + \arg CAN_TX_MESSAGE_STRUCT: the CAN TX message struct + \arg CAN_RX_MESSAGE_STRUCT: the CAN RX message struct + \param[in] p_struct: the pointer of the specific struct + \param[out] none + \retval none +*/ +void can_struct_para_init(can_struct_type_enum type, void *p_struct) +{ + uint8_t i; + + if(NULL == p_struct) { + CAN_ERROR_HANDLE("struct parameter can not be NULL \r\n"); + } + + /* get type of the struct */ + switch(type) { + /* used for can_init() */ + case CAN_INIT_STRUCT: + ((can_parameter_struct *)p_struct)->auto_bus_off_recovery = DISABLE; + ((can_parameter_struct *)p_struct)->auto_retrans = DISABLE; + ((can_parameter_struct *)p_struct)->auto_wake_up = DISABLE; + ((can_parameter_struct *)p_struct)->prescaler = 0x03FFU; + ((can_parameter_struct *)p_struct)->rec_fifo_overwrite = DISABLE; + ((can_parameter_struct *)p_struct)->resync_jump_width = CAN_BT_SJW_1TQ; + ((can_parameter_struct *)p_struct)->time_segment_1 = CAN_BT_BS1_3TQ; + ((can_parameter_struct *)p_struct)->time_segment_2 = CAN_BT_BS2_1TQ; + ((can_parameter_struct *)p_struct)->time_triggered = DISABLE; + ((can_parameter_struct *)p_struct)->trans_fifo_order = DISABLE; + ((can_parameter_struct *)p_struct)->working_mode = CAN_NORMAL_MODE; + + break; + /* used for can_filter_init() */ + case CAN_FILTER_STRUCT: + ((can_filter_parameter_struct *)p_struct)->filter_bits = CAN_FILTERBITS_32BIT; + ((can_filter_parameter_struct *)p_struct)->filter_enable = DISABLE; + ((can_filter_parameter_struct *)p_struct)->filter_fifo_number = CAN_FIFO0; + ((can_filter_parameter_struct *)p_struct)->filter_list_high = 0x0000U; + ((can_filter_parameter_struct *)p_struct)->filter_list_low = 0x0000U; + ((can_filter_parameter_struct *)p_struct)->filter_mask_high = 0x0000U; + ((can_filter_parameter_struct *)p_struct)->filter_mask_low = 0x0000U; + ((can_filter_parameter_struct *)p_struct)->filter_mode = CAN_FILTERMODE_MASK; + ((can_filter_parameter_struct *)p_struct)->filter_number = 0U; + + break; + /* used for can_fd_init() */ + case CAN_FD_FRAME_STRUCT: + ((can_fdframe_struct *)p_struct)->data_prescaler = 0x0400U; + ((can_fdframe_struct *)p_struct)->data_resync_jump_width = 1U - 1U; + ((can_fdframe_struct *)p_struct)->data_time_segment_1 = 3U - 1U; + ((can_fdframe_struct *)p_struct)->data_time_segment_2 = 2U - 1U; + ((can_fdframe_struct *)p_struct)->delay_compensation = DISABLE; + ((can_fdframe_struct *)p_struct)->esi_mode = CAN_ESIMOD_HARDWARE; + ((can_fdframe_struct *)p_struct)->excp_event_detect = ENABLE; + ((can_fdframe_struct *)p_struct)->fd_frame = DISABLE; + ((can_fdframe_struct *)p_struct)->iso_bosch = CAN_FDMOD_ISO; + ((can_fdframe_struct *)p_struct)->p_delay_compensation = 0U; + + break; + /* used for can_message_transmit() */ + case CAN_TX_MESSAGE_STRUCT: + ((can_trasnmit_message_struct *)p_struct)->fd_brs = CAN_BRS_DISABLE; + ((can_trasnmit_message_struct *)p_struct)->fd_esi = CAN_ESI_DOMINANT; + ((can_trasnmit_message_struct *)p_struct)->fd_flag = CAN_FDF_CLASSIC; + + for(i = 0U; i < 64U; i++) { + ((can_trasnmit_message_struct *)p_struct)->tx_data[i] = 0U; + } + + ((can_trasnmit_message_struct *)p_struct)->tx_dlen = 0u; + ((can_trasnmit_message_struct *)p_struct)->tx_efid = 0U; + ((can_trasnmit_message_struct *)p_struct)->tx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_trasnmit_message_struct *)p_struct)->tx_ft = (uint8_t)CAN_FT_DATA; + ((can_trasnmit_message_struct *)p_struct)->tx_sfid = 0U; + + break; + /* used for can_message_receive() */ + case CAN_RX_MESSAGE_STRUCT: + ((can_receive_message_struct *)p_struct)->fd_brs = CAN_BRS_DISABLE; + ((can_receive_message_struct *)p_struct)->fd_esi = CAN_ESI_DOMINANT; + ((can_receive_message_struct *)p_struct)->fd_flag = CAN_FDF_CLASSIC; + + for(i = 0U; i < 64U; i++) { + ((can_receive_message_struct *)p_struct)->rx_data[i] = 0U; + } + + ((can_receive_message_struct *)p_struct)->rx_dlen = 0U; + ((can_receive_message_struct *)p_struct)->rx_efid = 0U; + ((can_receive_message_struct *)p_struct)->rx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_receive_message_struct *)p_struct)->rx_fi = 0U; + ((can_receive_message_struct *)p_struct)->rx_ft = (uint8_t)CAN_FT_DATA; + ((can_receive_message_struct *)p_struct)->rx_sfid = 0U; + + break; + + default: + CAN_ERROR_HANDLE("parameter is invalid \r\n"); + } +} + +/*! + \brief initialize CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] can_parameter_init: parameters for CAN initialization + \arg working_mode: CAN_NORMAL_MODE, CAN_LOOPBACK_MODE, CAN_SILENT_MODE, CAN_SILENT_LOOPBACK_MODE + \arg resync_jump_width: 0x00 - 0x07 + \arg time_segment_1: 0x00 - 0x7F + \arg time_segment_2: 0x00 - 0x1F + \arg time_triggered: ENABLE or DISABLE + \arg auto_bus_off_recovery: ENABLE or DISABLE + \arg auto_wake_up: ENABLE or DISABLE + \arg auto_retrans: ENABLE or DISABLE + \arg rec_fifo_overwrite: ENABLE or DISABLE + \arg trans_fifo_order: ENABLE or DISABLE + \arg prescaler: 0x0001 - 0x0400 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_init(uint32_t can_periph, can_parameter_struct *can_parameter_init) +{ + uint32_t timeout = CAN_TIMEOUT; + ErrStatus flag = ERROR; + uint32_t fdctl_status; + + /* disable sleep mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + /* enable initialize mode */ + CAN_CTL(can_periph) |= CAN_CTL_IWMOD; + /* wait ACK */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + /* check initialize working success */ + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { + flag = ERROR; + } else { + /* set the bit timing register */ + fdctl_status = CAN_FDCTL(can_periph); + if(CAN_FDCTL_FDEN != (fdctl_status & CAN_FDCTL_FDEN)) { + /* CAN FD disable, should first enable, then write */ + fdctl_status = fdctl_status | CAN_FDCTL_FDEN; + CAN_FDCTL(can_periph) = fdctl_status; + CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ + BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ + BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ + BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ + BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); + fdctl_status = fdctl_status & (~CAN_FDCTL_FDEN); + CAN_FDCTL(can_periph) = fdctl_status; + } else { + /* CAN FD enable */ + CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ + BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ + BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ + BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ + BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); + } + + /* time trigger communication mode */ + if(ENABLE == can_parameter_init->time_triggered) { + CAN_CTL(can_periph) |= CAN_CTL_TTC; + } else { + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + } + /* automatic bus-off management */ + if(ENABLE == can_parameter_init->auto_bus_off_recovery) { + CAN_CTL(can_periph) |= CAN_CTL_ABOR; + } else { + CAN_CTL(can_periph) &= ~CAN_CTL_ABOR; + } + /* automatic wakeup mode */ + if(ENABLE == can_parameter_init->auto_wake_up) { + CAN_CTL(can_periph) |= CAN_CTL_AWU; + } else { + CAN_CTL(can_periph) &= ~CAN_CTL_AWU; + } + /* automatic retransmission mode */ + if(ENABLE == can_parameter_init->auto_retrans) { + CAN_CTL(can_periph) &= ~CAN_CTL_ARD; + } else { + CAN_CTL(can_periph) |= CAN_CTL_ARD; + } + /* receive FIFO overwrite mode */ + if(ENABLE == can_parameter_init->rec_fifo_overwrite) { + CAN_CTL(can_periph) &= ~CAN_CTL_RFOD; + } else { + CAN_CTL(can_periph) |= CAN_CTL_RFOD; + } + /* transmit FIFO order */ + if(ENABLE == can_parameter_init->trans_fifo_order) { + CAN_CTL(can_periph) |= CAN_CTL_TFO; + } else { + CAN_CTL(can_periph) &= ~CAN_CTL_TFO; + } + /* disable initialize mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; + timeout = CAN_TIMEOUT; + /* wait the ACK */ + while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + /* check exit initialize mode */ + if(0U != timeout) { + flag = SUCCESS; + } + } + return flag; +} + +/*! + \brief initialize CAN FD function + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] can_fdframe_init: parameters for CAN FD initialization + \arg fd_frame: ENABLE or DISABLE + \arg excp_event_detect: ENABLE or DISABLE + \arg delay_compensation: ENABLE or DISABLE + \arg p_delay_compensation: the pointer of tdc struct + can_fd_tdc_struct: + tdc_mode: CAN_TDCMOD_CALC_AND_OFFSET or CAN_TDCMOD_OFFSET + tdc_filter: 0x00 - 0x07 + tdc_offset: 0x00 - 0x07 + \arg iso_bosch: CAN_FDMOD_ISO or CAN_FDMOD_BOSCH + \arg esi_mode: CAN_ESIMOD_HARDWARE or CAN_ESIMOD_SOFTWARE + \arg data_resync_jump_width: 0x00 - 0x07 + \arg data_time_segment_1: 0x00 - 0x0F + \arg data_time_segment_2: 0x00 - 0x07 + \arg data_prescaler: 0x0001 - 0x0400 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init) +{ + uint32_t timeout = CAN_TIMEOUT; + uint32_t tempreg = 0U; + + /* check null pointer */ + if(0 == can_fdframe_init) { + return ERROR; + } + /* disable sleep mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + /* enable initialize mode */ + CAN_CTL(can_periph) |= CAN_CTL_IWMOD; + /* wait ACK */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + /* check initialize working success */ + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { + return ERROR; + } else { + /* set the data bit timing register */ + CAN_DBT(can_periph) = (BT_DSJW((uint32_t)can_fdframe_init->data_resync_jump_width) | \ + BT_DBS1((uint32_t)can_fdframe_init->data_time_segment_1) | \ + BT_DBS2((uint32_t)can_fdframe_init->data_time_segment_2) | \ + BT_BAUDPSC(((uint32_t)can_fdframe_init->data_prescaler) - 1U)); + + tempreg = can_fdframe_init->esi_mode | can_fdframe_init->iso_bosch; + + /* Protocol exception event detection */ + if(ENABLE == can_fdframe_init->excp_event_detect) { + tempreg &= ~CAN_FDCTL_PRED; + } else { + tempreg |= CAN_FDCTL_PRED; + } + + /* Transmitter delay compensation mode */ + if(ENABLE == can_fdframe_init->delay_compensation) { + tempreg |= CAN_FDCTL_TDCEN; + /* p_delay_compensation pointer should be config when TDC mode is enabled */ + if(0 != can_fdframe_init->p_delay_compensation) { + tempreg |= (can_fdframe_init->p_delay_compensation->tdc_mode & CAN_FDCTL_TDCMOD); + CAN_FDTDC(can_periph) = (FDTDC_TDCF(can_fdframe_init->p_delay_compensation->tdc_filter) | FDTDC_TDCO( + can_fdframe_init->p_delay_compensation->tdc_offset)); + } else { + return ERROR; + } + } else { + /* Transmitter delay compensation mode is disabled */ + tempreg &= ~CAN_FDCTL_TDCEN; + } + + /* FD operation mode */ + if(ENABLE == can_fdframe_init->fd_frame) { + tempreg |= CAN_FDCTL_FDEN; + } else { + tempreg &= ~CAN_FDCTL_FDEN; + } + CAN_FDCTL(can_periph) = tempreg; + + /* disable initialize mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; + timeout = CAN_TIMEOUT; + /* wait the ACK */ + while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + /* check exit initialize mode */ + if(0U == timeout) { + return ERROR; + } + } + + return SUCCESS; +} + +/*! + \brief initialize CAN filter + \param[in] can_filter_parameter_init: struct for CAN filter initialization + \arg filter_list_high: 0x0000 - 0xFFFF + \arg filter_list_low: 0x0000 - 0xFFFF + \arg filter_mask_high: 0x0000 - 0xFFFF + \arg filter_mask_low: 0x0000 - 0xFFFF + \arg filter_fifo_number: CAN_FIFO0, CAN_FIFO1 + \arg filter_number: 0 - 27 + \arg filter_mode: CAN_FILTERMODE_MASK, CAN_FILTERMODE_LIST + \arg filter_bits: CAN_FILTERBITS_32BIT, CAN_FILTERBITS_16BIT + \arg filter_enable: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void can_filter_init(can_filter_parameter_struct *can_filter_parameter_init) +{ + uint32_t val = 0U; + + val = ((uint32_t)1) << (can_filter_parameter_init->filter_number); + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* disable filter */ + CAN_FW(CAN0) &= ~(uint32_t)val; + + /* filter 16 bits */ + if(CAN_FILTERBITS_16BIT == can_filter_parameter_init->filter_bits) { + /* set filter 16 bits */ + CAN_FSCFG(CAN0) &= ~(uint32_t)val; + /* first 16 bits list and first 16 bits mask or first 16 bits list and second 16 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* second 16 bits list and second 16 bits mask or third 16 bits list and fourth 16 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS); + } + /* filter 32 bits */ + if(CAN_FILTERBITS_32BIT == can_filter_parameter_init->filter_bits) { + /* set filter 32 bits */ + CAN_FSCFG(CAN0) |= (uint32_t)val; + /* 32 bits list or first 32 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* 32 bits mask or second 32 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS); + } + + /* filter mode */ + if(CAN_FILTERMODE_MASK == can_filter_parameter_init->filter_mode) { + /* mask mode */ + CAN_FMCFG(CAN0) &= ~(uint32_t)val; + } else { + /* list mode */ + CAN_FMCFG(CAN0) |= (uint32_t)val; + } + + /* filter FIFO */ + if(CAN_FIFO0 == (can_filter_parameter_init->filter_fifo_number)) { + /* FIFO0 */ + CAN_FAFIFO(CAN0) &= ~(uint32_t)val; + } else { + /* FIFO1 */ + CAN_FAFIFO(CAN0) |= (uint32_t)val; + } + + /* filter working */ + if(ENABLE == can_filter_parameter_init->filter_enable) { + + CAN_FW(CAN0) |= (uint32_t)val; + } + + /* filter lock enable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief CAN filter mask mode initialization + \param[in] id: extended(11-bits) or standard(29-bits) identifier + \arg 0x00000000 - 0x1FFFFFFF + \param[in] mask: extended(11-bits) or standard(29-bits) identifier mask + \arg 0x00000000 - 0x1FFFFFFF + \param[in] format_fifo: format and FIFO states + only one parameter can be selected which is shown as below: + \arg CAN_STANDARD_FIFO0 + \arg CAN_STANDARD_FIFO1 + \arg CAN_EXTENDED_FIFO0 + \arg CAN_EXTENDED_FIFO1 + \param[in] filter_number: filter sequence number + \arg 0x00 - 0x1B + \param[out] none + \retval none +*/ +void can_filter_mask_mode_init(uint32_t id, uint32_t mask, can_format_fifo_enum format_fifo, uint16_t filter_number) +{ + can_filter_parameter_struct can_filter; + + /* Initialize the filter structure */ + can_struct_para_init(CAN_FILTER_STRUCT, &can_filter); + + /* filter config */ + can_filter.filter_number = filter_number; + can_filter.filter_mode = CAN_FILTERMODE_MASK; + can_filter.filter_bits = CAN_FILTERBITS_32BIT; + can_filter.filter_enable = ENABLE; + + switch(format_fifo) { + /* standard FIFO 0 */ + case CAN_STANDARD_FIFO0: + can_filter.filter_fifo_number = CAN_FIFO0; + /* configure SFID[10:0] */ + can_filter.filter_list_high = (uint16_t)id << 5; + can_filter.filter_list_low = 0x0000U; + /* configure SFID[10:0] mask */ + can_filter.filter_mask_high = (uint16_t)mask << 5; + /* both data and remote frames can be received */ + can_filter.filter_mask_low = (uint16_t)(1U << 2U); + + break; + /* standard FIFO 1 */ + case CAN_STANDARD_FIFO1: + can_filter.filter_fifo_number = CAN_FIFO1; + /* configure SFID[10:0] */ + can_filter.filter_list_high = (uint16_t)id << 5; + can_filter.filter_list_low = 0x0000U; + /* configure SFID[10:0] mask */ + can_filter.filter_mask_high = (uint16_t)mask << 5; + /* both data and remote frames can be received */ + can_filter.filter_mask_low = (uint16_t)(1U << 2U); + + break; + /* extended FIFO 0 */ + case CAN_EXTENDED_FIFO0: + can_filter.filter_fifo_number = CAN_FIFO0; + /* configure EFID[28:13] */ + can_filter.filter_list_high = (uint16_t)(id >> 13); + /* configure EFID[12:0] and frame format bit set */ + can_filter.filter_list_low = ((uint16_t)(id << 3)) | (1U << 2); + /* configure EFID[28:13] mask */ + can_filter.filter_mask_high = (uint16_t)(mask >> 13); + /* configure EFID[12:0] and frame format bit mask */ + /* both data and remote frames can be received */ + can_filter.filter_mask_low = ((uint16_t)(mask << 3)) | (1U << 2); + + break; + /* extended FIFO 1 */ + case CAN_EXTENDED_FIFO1: + can_filter.filter_fifo_number = CAN_FIFO1; + /* configure EFID[28:13] */ + can_filter.filter_list_high = (uint16_t)(id >> 13); + /* configure EFID[12:0] and frame format bit set */ + can_filter.filter_list_low = ((uint16_t)(id << 3)) | (1U << 2); + /* configure EFID[28:13] mask */ + can_filter.filter_mask_high = (uint16_t)(mask >> 13); + /* configure EFID[12:0] and frame format bit mask */ + /* both data and remote frames can be received */ + can_filter.filter_mask_low = ((uint16_t)(mask << 3)) | (1U << 2); + + break; + default: + CAN_ERROR_HANDLE("parameter is invalid \r\n"); + } + + can_filter_init(&can_filter); +} + +/*! + \brief CAN communication mode configure + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] mode: communication mode + only one parameter can be selected which is shown as below: + \arg CAN_NORMAL_MODE + \arg CAN_LOOPBACK_MODE + \arg CAN_SILENT_MODE + \arg CAN_SILENT_LOOPBACK_MODE + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_monitor_mode_set(uint32_t can_periph, uint8_t mode) +{ + ErrStatus reval = SUCCESS; + uint32_t timeout = CAN_TIMEOUT; + + if(mode == (mode & CAN_SILENT_LOOPBACK_MODE)) { + /* disable sleep mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); + /* set initialize mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; + /* wait the acknowledge */ + timeout = CAN_TIMEOUT; + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { + reval = ERROR; + } else { + CAN_BT(can_periph) &= ~BT_MODE(3); + CAN_BT(can_periph) |= BT_MODE(mode); + + timeout = CAN_TIMEOUT; + /* enter normal mode */ + CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); + /* wait the acknowledge */ + while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)) { + timeout--; + } + if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) { + reval = ERROR; + } + } + } else { + reval = ERROR; + } + + return reval; +} + +/*! + \brief CAN FD frame function enable + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_fd_function_enable(uint32_t can_periph) +{ + CAN_FDCTL(can_periph) |= CAN_FDCTL_FDEN; +} + +/*! + \brief CAN FD frame function disable + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_fd_function_disable(uint32_t can_periph) +{ + CAN_FDCTL(can_periph) &= ~CAN_FDCTL_FDEN; +} + +/*! + \brief set CAN1 filter start bank number + \param[in] start_bank: CAN1 start bank number + only one parameter can be selected which is shown as below: + \arg (1..27) + \param[out] none + \retval none +*/ +void can1_filter_start_bank(uint8_t start_bank) +{ + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* set CAN1 filter start number */ + CAN_FCTL(CAN0) &= ~(uint32_t)CAN_FCTL_HBC1F; + CAN_FCTL(CAN0) |= FCTL_HBC1F(start_bank); + /* filter lock enable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief enable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_debug_freeze_enable(uint32_t can_periph) +{ + /* set DFZ bit */ + CAN_CTL(can_periph) |= CAN_CTL_DFZ; + + if(CAN0 == can_periph) { + dbg_periph_enable(DBG_CAN0_HOLD); + } else { + dbg_periph_enable(DBG_CAN1_HOLD); + } +} + +/*! + \brief disable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_debug_freeze_disable(uint32_t can_periph) +{ + /* set DFZ bit */ + CAN_CTL(can_periph) &= ~CAN_CTL_DFZ; + + if(CAN0 == can_periph) { + dbg_periph_disable(DBG_CAN0_HOLD); + } else { + dbg_periph_disable(DBG_CAN1_HOLD); + } +} + +/*! + \brief enable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_time_trigger_mode_enable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* enable the TTC mode */ + CAN_CTL(can_periph) |= CAN_CTL_TTC; + /* enable time stamp */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++) { + CAN_TMP(can_periph, mailbox_number) |= CAN_TMP_TSEN; + } +} + +/*! + \brief disable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_time_trigger_mode_disable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* disable the TTC mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + /* reset TSEN bits */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++) { + CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_TSEN; + } +} + +/*! + \brief transmit CAN message + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] transmit_message: struct for CAN transmit message + \arg tx_sfid: 0x00000000 - 0x000007FF + \arg tx_efid: 0x00000000 - 0x1FFFFFFF + \arg tx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg tx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg tx_dlen: 0 - 8 (FD mode: 0 - 8, or 12, 16, 20, 24, 32, 48, 64) + \arg tx_data[]: 0x00 - 0xFF + \param[out] none + \retval mailbox_number +*/ +uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct *transmit_message) +{ + uint8_t mailbox_number = CAN_MAILBOX0; + uint8_t i = 0U; + uint8_t hit = 0U; + uint32_t canfd_en = 0U; + volatile uint32_t p_temp; + uint32_t reg_temp = 0U; + + /* select one empty mailbox */ + if(CAN_TSTAT_TME0 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME0)) { + mailbox_number = CAN_MAILBOX0; + } else if(CAN_TSTAT_TME1 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME1)) { + mailbox_number = CAN_MAILBOX1; + } else if(CAN_TSTAT_TME2 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME2)) { + mailbox_number = CAN_MAILBOX2; + } else { + mailbox_number = CAN_NOMAILBOX; + } + /* return no mailbox empty */ + if(CAN_NOMAILBOX == mailbox_number) { + return CAN_NOMAILBOX; + } + + CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN; + if(CAN_FF_STANDARD == transmit_message->tx_ff) { + /* set transmit mailbox standard identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \ + transmit_message->tx_ft); + } else { + /* set transmit mailbox extended identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \ + transmit_message->tx_ff | \ + transmit_message->tx_ft); + } + + if(CAN_FDF_CLASSIC == transmit_message->fd_flag) { + /* set the data length */ + CAN_TMP(can_periph, mailbox_number) &= ~(CAN_TMP_DLENC | CAN_TMP_ESI | CAN_TMP_BRS | CAN_TMP_FDF); + CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen; + /* set the data */ + CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \ + TMDATA0_DB2(transmit_message->tx_data[2]) | \ + TMDATA0_DB1(transmit_message->tx_data[1]) | \ + TMDATA0_DB0(transmit_message->tx_data[0]); + CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \ + TMDATA1_DB6(transmit_message->tx_data[6]) | \ + TMDATA1_DB5(transmit_message->tx_data[5]) | \ + TMDATA1_DB4(transmit_message->tx_data[4]); + } else { + canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN; + /* check FD function has been enabled */ + if(canfd_en) { + if(transmit_message->tx_dlen <= 8U) { + /* set the data length */ + reg_temp |= transmit_message->tx_dlen; + } else { + /* data length greater than 8 */ + for(i = 0U; i < 7U; i++) { + if(transmit_message->tx_dlen == g_can_fdlength_table[i]) { + hit = 1U; + break; + } + } + /* data length is valid */ + if(1U == hit) { + reg_temp |= 9U + i; + } else { + CAN_ERROR_HANDLE("dlen is invalid \r\n"); + } + } + reg_temp |= (((uint32_t)transmit_message->fd_brs << 5U) | ((uint32_t)transmit_message->fd_esi << 4U) | (( + uint32_t)transmit_message->fd_flag << 7U)); + CAN_TMP(can_periph, mailbox_number) = reg_temp; + + /* set the data */ + i = transmit_message->tx_dlen / 4U; + + /* data length is 5-7 need send 2 word */ + if((1U == i) && (4U != transmit_message->tx_dlen)) { + i++; + } + p_temp = (uint32_t)transmit_message->tx_data; + if((0U == i)) { + CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp; + } else { + for(; i > 0U; i--) { + CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp; + p_temp = ((uint32_t)((uint32_t)p_temp + 4U)); + } + } + + } else { + CAN_ERROR_HANDLE("CAN FD function disabled \r\n"); + } + } + + /* enable transmission */ + CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN; + + return mailbox_number; +} + +/*! + \brief get CAN transmit state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOX(x=0,1,2) + \param[out] none + \retval can_transmit_state_enum +*/ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number) +{ + can_transmit_state_enum state = CAN_TRANSMIT_FAILED; + uint32_t val = 0U; + + /* check selected mailbox state */ + switch(mailbox_number) { + /* mailbox0 */ + case CAN_MAILBOX0: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0); + break; + /* mailbox1 */ + case CAN_MAILBOX1: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1); + break; + /* mailbox2 */ + case CAN_MAILBOX2: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2); + break; + default: + val = CAN_TRANSMIT_FAILED; + break; + } + + switch(val) { + /* transmit pending */ + case(CAN_STATE_PENDING): + state = CAN_TRANSMIT_PENDING; + break; + /* mailbox0 transmit succeeded */ + case(CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0): + state = CAN_TRANSMIT_OK; + break; + /* mailbox1 transmit succeeded */ + case(CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1): + state = CAN_TRANSMIT_OK; + break; + /* mailbox2 transmit succeeded */ + case(CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2): + state = CAN_TRANSMIT_OK; + break; + /* transmit failed */ + default: + state = CAN_TRANSMIT_FAILED; + break; + } + return state; +} + +/*! + \brief stop CAN transmission + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOXx(x=0,1,2) + \param[out] none + \retval none +*/ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number) +{ + if(CAN_MAILBOX0 == mailbox_number) { + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0; + while(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)) { + } + } else if(CAN_MAILBOX1 == mailbox_number) { + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1; + while(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)) { + } + } else if(CAN_MAILBOX2 == mailbox_number) { + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2; + while(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)) { + } + } else { + /* illegal parameters */ + } +} + +/*! + \brief CAN receive message + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + \arg CAN_FIFOx(x=0,1) + \param[out] receive_message: struct for CAN receive message + \arg rx_sfid: 0x00000000 - 0x000007FF + \arg rx_efid: 0x00000000 - 0x1FFFFFFF + \arg rx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg rx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg rx_dlen: 0 - 8 (FD mode: 0 - 8, or 12, 16, 20, 24, 32, 48, 64) + \arg rx_data[]: 0x00 - 0xFF + \arg rx_fi: 0 - 27 + \retval none +*/ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct *receive_message) +{ + uint32_t canfd_en = 0U; + volatile uint32_t p_temp; + uint32_t data_temp; + uint8_t canfd_recv_cnt = 0U; + uint8_t i; + + /* get the frame format */ + receive_message->rx_ff = (uint8_t)(CAN_RFIFOMI_FF & CAN_RFIFOMI(can_periph, fifo_number)); + if(CAN_FF_STANDARD == receive_message->rx_ff) { + /* get standard identifier */ + receive_message->rx_sfid = (uint32_t)(GET_RFIFOMI_SFID(CAN_RFIFOMI(can_periph, fifo_number))); + } else { + /* get extended identifier */ + receive_message->rx_efid = (uint32_t)(GET_RFIFOMI_EFID(CAN_RFIFOMI(can_periph, fifo_number))); + } + + /* get frame type */ + receive_message->rx_ft = (uint8_t)(CAN_RFIFOMI_FT & CAN_RFIFOMI(can_periph, fifo_number)); + /* filtering index */ + receive_message->rx_fi = (uint8_t)(GET_RFIFOMP_FI(CAN_RFIFOMP(can_periph, fifo_number))); + receive_message->fd_flag = (uint8_t)((CAN_RFIFOMP_FDF & CAN_RFIFOMP(can_periph, fifo_number)) >> 7); + + canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN; + if(!canfd_en) { + if(CAN_FDF_CLASSIC == receive_message->fd_flag) { + /* get receive data length */ + receive_message->rx_dlen = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); + /* receive data */ + receive_message->rx_data[0] = (uint8_t)(GET_RFIFOMDATA0_DB0(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message->rx_data[1] = (uint8_t)(GET_RFIFOMDATA0_DB1(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message->rx_data[2] = (uint8_t)(GET_RFIFOMDATA0_DB2(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message->rx_data[3] = (uint8_t)(GET_RFIFOMDATA0_DB3(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message->rx_data[4] = (uint8_t)(GET_RFIFOMDATA1_DB4(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message->rx_data[5] = (uint8_t)(GET_RFIFOMDATA1_DB5(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message->rx_data[6] = (uint8_t)(GET_RFIFOMDATA1_DB6(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message->rx_data[7] = (uint8_t)(GET_RFIFOMDATA1_DB7(CAN_RFIFOMDATA1(can_periph, fifo_number))); + } else { + CAN_ERROR_HANDLE("CAN FD function disabled \r\n"); + } + } else { + /* check FD function has been enabled */ + /* get receive data length */ + canfd_recv_cnt = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); + + if(canfd_recv_cnt <= 8U) { + /* set the data length */ + receive_message->rx_dlen = canfd_recv_cnt; + } else { + receive_message->rx_dlen = g_can_fdlength_table[canfd_recv_cnt - 9U]; + } + + receive_message->fd_brs = (uint8_t)((CAN_RFIFOMP(can_periph, fifo_number) & CAN_RFIFOMP_BRS) >> 5); + receive_message->fd_esi = (uint8_t)((CAN_RFIFOMP(can_periph, fifo_number) & CAN_RFIFOMP_ESI) >> 4); + + /* get the data */ + i = receive_message->rx_dlen / 4U; + + /* data length is 5-7 need receive 2 word */ + if((1U == i) && (4U != receive_message->rx_dlen)) { + i++; + } + p_temp = (uint32_t)(uint32_t)receive_message->rx_data; + if(0U == i) { + data_temp = CAN_RFIFOMDATA0(can_periph, fifo_number); + *(uint32_t *)p_temp = data_temp; + } else { + /* get the data by reading from CAN_RFIFOMDATA0 register*/ + for(; i > 0U; i--) { + data_temp = CAN_RFIFOMDATA0(can_periph, fifo_number); + *(uint32_t *)p_temp = data_temp; + p_temp = ((uint32_t)((uint32_t)p_temp + 4U)); + } + } + } + + /* release FIFO */ + if(CAN_FIFO0 == fifo_number) { + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + } else { + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + } +} + +/*! + \brief release FIFO + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval none +*/ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number) +{ + if(CAN_FIFO0 == fifo_number) { + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + } else if(CAN_FIFO1 == fifo_number) { + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + } else { + /* illegal parameters */ + CAN_ERROR_HANDLE("CAN FIFO NUM is invalid \r\n"); + } +} + +/*! + \brief CAN receive message length + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval message length +*/ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number) +{ + uint8_t val = 0U; + + if(CAN_FIFO0 == fifo_number) { + /* FIFO0 */ + val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIF_RFL_MASK); + } else if(CAN_FIFO1 == fifo_number) { + /* FIFO1 */ + val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIF_RFL_MASK); + } else { + /* illegal parameters */ + } + return val; +} + +/*! + \brief set CAN working mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] can_working_mode + only one parameter can be selected which is shown as below: + \arg CAN_MODE_INITIALIZE + \arg CAN_MODE_NORMAL + \arg CAN_MODE_SLEEP + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode) +{ + ErrStatus flag = ERROR; + /* timeout for IWS or also for SLPWS bits */ + uint32_t timeout = CAN_TIMEOUT; + + if(CAN_MODE_INITIALIZE == working_mode) { + /* disable sleep mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); + /* set initialize mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; + /* wait the acknowledge */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { + timeout--; + } + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { + flag = ERROR; + } else { + flag = SUCCESS; + } + } else if(CAN_MODE_NORMAL == working_mode) { + /* enter normal mode */ + CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); + /* wait the acknowledge */ + while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)) { + timeout--; + } + if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) { + flag = ERROR; + } else { + flag = SUCCESS; + } + } else if(CAN_MODE_SLEEP == working_mode) { + /* disable initialize mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_IWMOD); + /* set sleep mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_SLPWMOD; + /* wait the acknowledge */ + while((CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0U != timeout)) { + timeout--; + } + if(CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) { + flag = ERROR; + } else { + flag = SUCCESS; + } + } else { + flag = ERROR; + } + return flag; +} + +/*! + \brief wake up CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_wakeup(uint32_t can_periph) +{ + ErrStatus flag = ERROR; + uint32_t timeout = CAN_TIMEOUT; + + /* wakeup */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + + while((0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0x00U != timeout)) { + timeout--; + } + /* check state */ + if(0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) { + flag = ERROR; + } else { + flag = SUCCESS; + } + return flag; +} + +/*! + \brief get CAN error type + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval can_error_enum + \arg CAN_ERROR_NONE: no error + \arg CAN_ERROR_FILL: fill error + \arg CAN_ERROR_FORMATE: format error + \arg CAN_ERROR_ACK: ACK error + \arg CAN_ERROR_BITRECESSIVE: bit recessive + \arg CAN_ERROR_BITDOMINANTER: bit dominant error + \arg CAN_ERROR_CRC: CRC error + \arg CAN_ERROR_SOFTWARECFG: software configure +*/ +can_error_enum can_error_get(uint32_t can_periph) +{ + can_error_enum error; + error = CAN_ERROR_NONE; + + /* get error type */ + error = (can_error_enum)(GET_ERR_ERRN(CAN_ERR(can_periph))); + return error; +} + +/*! + \brief get CAN receive error number + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval error number +*/ +uint8_t can_receive_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + /* get error count */ + val = (uint8_t)(GET_ERR_RECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief get CAN transmit error number + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval error number +*/ +uint8_t can_transmit_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + val = (uint8_t)(GET_ERR_TECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief get CAN flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_RXL: RX level + \arg CAN_FLAG_LASTRX: last sample value of RX pin + \arg CAN_FLAG_RS: receiving state + \arg CAN_FLAG_TS: transmitting state + \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode + \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode + \arg CAN_FLAG_ERRIF: error flag + \arg CAN_FLAG_SLPWS: sleep working state + \arg CAN_FLAG_IWS: initial working state + \arg CAN_FLAG_TMLS2: transmit mailbox 2 last sending in TX FIFO + \arg CAN_FLAG_TMLS1: transmit mailbox 1 last sending in TX FIFO + \arg CAN_FLAG_TMLS0: transmit mailbox 0 last sending in TX FIFO + \arg CAN_FLAG_TME2: transmit mailbox 2 empty + \arg CAN_FLAG_TME1: transmit mailbox 1 empty + \arg CAN_FLAG_TME0: transmit mailbox 0 empty + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost + \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost + \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost + \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error + \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error + \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \arg CAN_FLAG_BOERR: bus-off error + \arg CAN_FLAG_PERR: passive error + \arg CAN_FLAG_WERR: warning error + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag) +{ + /* get flag and interrupt enable state */ + if(RESET != (CAN_REG_VAL(can_periph, flag) & BIT(CAN_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear CAN flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode + \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode + \arg CAN_FLAG_ERRIF: error flag + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost + \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost + \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost + \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error + \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error + \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \param[out] none + \retval none +*/ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag) +{ + CAN_REG_VAL(can_periph, flag) = BIT(CAN_BIT_POS(flag)); +} + +/*! + \brief enable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WAKEUP: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) |= interrupt; +} + +/*! + \brief disable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WAKEUP: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) &= ~interrupt; +} + +/*! + \brief get CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFL0: receive FIFO0 not empty interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \arg CAN_INT_FLAG_RFL1: receive FIFO1 not empty interrupt flag + \arg CAN_INT_FLAG_ERRN: error number interrupt flag + \arg CAN_INT_FLAG_BOERR: bus-off error interrupt flag + \arg CAN_INT_FLAG_PERR: passive error interrupt flag + \arg CAN_INT_FLAG_WERR: warning error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + uint32_t ret1 = RESET; + uint32_t ret2 = RESET; + + /* get the status of interrupt flag */ + if(flag == CAN_INT_FLAG_RFL0) { + ret1 = can_receive_message_length_get(can_periph, CAN_FIFO0); + } else if(flag == CAN_INT_FLAG_RFL1) { + ret1 = can_receive_message_length_get(can_periph, CAN_FIFO1); + } else if(flag == CAN_INT_FLAG_ERRN) { + ret1 = can_error_get(can_periph); + } else { + ret1 = CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag)); + } + /* get the status of interrupt enable bit */ + ret2 = CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag)); + if(ret1 && ret2) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \param[out] none + \retval none +*/ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + CAN_REG_VALS(can_periph, flag) = BIT(CAN_BIT_POS0(flag)); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c new file mode 100644 index 00000000000..ea6dfcb326c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c @@ -0,0 +1,718 @@ +/*! + \file gd32f5xx_cau.c + \brief CAU driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_cau.h" +#include "gd32f5xx_rcu.h" + +#define STAT0_AESDES_MASK ((uint32_t)0x00000015U) +#define STAT0_TDES_MASK ((uint32_t)0x00000014U) + +/*! + \brief reset the CAU peripheral + \param[in] none + \param[out] none + \retval none +*/ +void cau_deinit(void) +{ + /* enable CAU reset state */ + rcu_periph_reset_enable(RCU_CAURST); + /* release CAU from reset state */ + rcu_periph_reset_disable(RCU_CAURST); +} + + +/*! + \brief initialize the CAU encrypt and decrypt parameter struct with the default values + \param[in] none + \param[out] cau_parameter: + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bytes + iv: initialization vector + iv_size: iv size in bytes + input: input data + in_length: input data length in bytes + aad: additional authentication data + aad_size: header size + \retval none +*/ +void cau_struct_para_init(cau_parameter_struct *cau_parameter) +{ + /* set the CAU encrypt and decrypt parameters struct with the default values */ + cau_parameter->alg_dir = CAU_ENCRYPT; + cau_parameter->key = 0U; + cau_parameter->key_size = 0U; + cau_parameter->iv = 0U; + cau_parameter->iv_size = 0U; + cau_parameter->input = 0U; + cau_parameter->in_length = 0U; + cau_parameter->aad = 0U; + cau_parameter->aad_size = 0U; +} + +/*! + \brief initialize the key parameter structure with the default values + \param[in] none + \param[out] key_initpara: + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + \retval none +*/ +void cau_key_struct_para_init(cau_key_parameter_struct *key_initpara) +{ + /* set the key parameters struct with the default values */ + key_initpara->key_0_high = 0U; + key_initpara->key_0_low = 0U; + key_initpara->key_1_high = 0U; + key_initpara->key_1_low = 0U; + key_initpara->key_2_high = 0U; + key_initpara->key_2_low = 0U; + key_initpara->key_3_high = 0U; + key_initpara->key_3_low = 0U; +} + +/*! + \brief initialize the vectors parameter struct with the default values + \param[in] none + \param[out] iv_initpara: + iv_0_high: init vector 0 high + iv_0_low: init vector 0 low + iv_1_high: init vector 1 high + iv_1_low: init vector 1 low + \retval none +*/ +void cau_iv_struct_para_init(cau_iv_parameter_struct *iv_initpara) +{ + /* set the vectors parameters struct with the default values */ + iv_initpara->iv_0_high = 0U; + iv_initpara->iv_0_low = 0U; + iv_initpara->iv_1_high = 0U; + iv_initpara->iv_1_low = 0U; +} + +/*! + \brief initialize the context parameter struct with the default values + \param[in] none + \param[out] cau_context: + ctl_config: current configuration + iv_0_high: init vector 0 high + iv_0_low: init vector 0 low + iv_1_high: init vector 1 high + iv_1_low: init vector 1 low + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + gcmccmctxs[8]: GCM or CCM mode context switch + gcmctxs[8]: GCM mode context switch + \retval none +*/ +void cau_context_struct_para_init(cau_context_parameter_struct *cau_context) +{ + cau_context->ctl_config = 0U; + + /* set the vectors parameters with the default values */ + cau_context->iv_0_high = 0U; + cau_context->iv_0_low = 0U; + cau_context->iv_1_high = 0U; + cau_context->iv_1_low = 0U; + + /* set the key parameters with the default values */ + cau_context->key_0_high = 0U; + cau_context->key_0_low = 0U; + cau_context->key_1_high = 0U; + cau_context->key_1_low = 0U; + cau_context->key_2_high = 0U; + cau_context->key_2_low = 0U; + cau_context->key_3_high = 0U; + cau_context->key_3_low = 0U; + + /* set the context switch with the default values */ + cau_context->gcmccmctxs[0] = 0U; + cau_context->gcmccmctxs[1] = 0U; + cau_context->gcmccmctxs[2] = 0U; + cau_context->gcmccmctxs[3] = 0U; + cau_context->gcmccmctxs[4] = 0U; + cau_context->gcmccmctxs[5] = 0U; + cau_context->gcmccmctxs[6] = 0U; + cau_context->gcmccmctxs[7] = 0U; + + cau_context->gcmctxs[0] = 0U; + cau_context->gcmctxs[1] = 0U; + cau_context->gcmctxs[2] = 0U; + cau_context->gcmctxs[3] = 0U; + cau_context->gcmctxs[4] = 0U; + cau_context->gcmctxs[5] = 0U; + cau_context->gcmctxs[6] = 0U; + cau_context->gcmctxs[7] = 0U; +} + +/*! + \brief enable the CAU peripheral + \param[in] none + \param[out] none + \retval none +*/ +void cau_enable(void) +{ + /* enable the CAU processor */ + CAU_CTL |= CAU_CTL_CAUEN; +} + +/*! + \brief disable the CAU peripheral + \param[in] none + \param[out] none + \retval none +*/ +void cau_disable(void) +{ + /* disable the CAU processor */ + CAU_CTL &= ~CAU_CTL_CAUEN; +} + +/*! + \brief enable the CAU DMA interface + \param[in] dma_req: specify the CAU DMA transfer request to be enabled + one or more parameters can be selected which are shown as below: + \arg CAU_DMA_INFIFO: DMA for incoming(Rx) data transfer + \arg CAU_DMA_OUTFIFO: DMA for outgoing(Tx) data transfer + \param[out] none + \retval none +*/ +void cau_dma_enable(uint32_t dma_req) +{ + /* enable the selected CAU DMA request */ + CAU_DMAEN |= dma_req; +} + +/*! + \brief disable the CAU DMA interface + \param[in] dma_req: specify the CAU DMA transfer request to be disabled + one or more parameters can be selected which are shown as below: + \arg CAU_DMA_INFIFO: DMA for incoming(Rx) data transfer + \arg CAU_DMA_OUTFIFO: DMA for outgoing(Tx) data transfer + \param[out] none + \retval none +*/ +void cau_dma_disable(uint32_t dma_req) +{ + /* disable the selected CAU DMA request */ + CAU_DMAEN &= ~(dma_req); +} + +/*! + \brief initialize the CAU peripheral + \param[in] alg_dir: algorithm direction + only one parameter can be selected which is shown as below: + \arg CAU_ENCRYPT: encrypt + \arg CAU_DECRYPT: decrypt + \param[in] algo_mode: algorithm mode selection + only one parameter can be selected which is shown as below: + \arg CAU_MODE_TDES_ECB: TDES-ECB (3DES Electronic codebook) + \arg CAU_MODE_TDES_CBC: TDES-CBC (3DES Cipher block chaining) + \arg CAU_MODE_DES_ECB: DES-ECB (simple DES Electronic codebook) + \arg CAU_MODE_DES_CBC: DES-CBC (simple DES Cipher block chaining) + \arg CAU_MODE_AES_ECB: AES-ECB (AES Electronic codebook) + \arg CAU_MODE_AES_CBC: AES-CBC (AES Cipher block chaining) + \arg CAU_MODE_AES_CTR: AES-CTR (AES counter mode) + \arg CAU_MODE_AES_KEY: AES decryption key preparation mode + \arg CAU_MODE_AES_GCM: AES-GCM (AES Galois/counter mode) + \arg CAU_MODE_AES_CCM: AES-CCM (AES combined cipher machine mode) + \arg CAU_MODE_AES_CFB: AES-CFB (cipher feedback mode) + \arg CAU_MODE_AES_OFB: AES-OFB (output feedback mode) + \param[in] swapping: data swapping selection + only one parameter can be selected which is shown as below: + \arg CAU_SWAPPING_32BIT: no swapping + \arg CAU_SWAPPING_16BIT: half-word swapping + \arg CAU_SWAPPING_8BIT: bytes swapping + \arg CAU_SWAPPING_1BIT: bit swapping + \param[out] none + \retval none +*/ +void cau_init(uint32_t alg_dir, uint32_t algo_mode, uint32_t swapping) +{ + /* select algorithm mode */ + CAU_CTL &= ~CAU_CTL_ALGM; + CAU_CTL |= algo_mode; + + /* select data swapping */ + CAU_CTL &= ~CAU_CTL_DATAM; + CAU_CTL |= swapping; + + /* select algorithm direction */ + CAU_CTL &= ~CAU_CTL_CAUDIR; + CAU_CTL |= alg_dir; +} + +/*! + \brief configure key size if use AES algorithm + \param[in] key_size: key length selection when aes mode + only one parameter can be selected which is shown as below: + \arg CAU_KEYSIZE_128BIT: 128 bit key length + \arg CAU_KEYSIZE_192BIT: 192 bit key length + \arg CAU_KEYSIZE_256BIT: 256 bit key length + \param[out] none + \retval none +*/ +void cau_aes_keysize_config(uint32_t key_size) +{ + CAU_CTL &= ~CAU_CTL_KEYM; + CAU_CTL |= key_size; +} + +/*! + \brief initialize the key parameters + \param[in] key_initpara: key init parameter struct + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + \param[out] none + \retval none +*/ +void cau_key_init(cau_key_parameter_struct *key_initpara) +{ + CAU_KEY0H = key_initpara->key_0_high; + CAU_KEY0L = key_initpara->key_0_low; + CAU_KEY1H = key_initpara->key_1_high; + CAU_KEY1L = key_initpara->key_1_low; + CAU_KEY2H = key_initpara->key_2_high; + CAU_KEY2L = key_initpara->key_2_low; + CAU_KEY3H = key_initpara->key_3_high; + CAU_KEY3L = key_initpara->key_3_low; +} + +/*! + \brief initialize the vectors parameters + \param[in] iv_initpara: vectors init parameter struct + iv_0_high: init vector 0 high + iv_0_low: init vector 0 low + iv_1_high: init vector 1 high + iv_1_low: init vector 1 low + \param[out] none + \retval none +*/ +void cau_iv_init(cau_iv_parameter_struct *iv_initpara) +{ + CAU_IV0H = iv_initpara->iv_0_high; + CAU_IV0L = iv_initpara->iv_0_low; + CAU_IV1H = iv_initpara->iv_1_high; + CAU_IV1L = iv_initpara->iv_1_low; +} + +/*! + \brief configure phase + \param[in] phase: gcm or ccm phase + only one parameter can be selected which is shown as below: + \arg CAU_PREPARE_PHASE: prepare phase + \arg CAU_AAD_PHASE: AAD phase + \arg CAU_ENCRYPT_DECRYPT_PHASE: encryption/decryption phase + \arg CAU_TAG_PHASE: tag phase + \param[out] none + \retval none +*/ +void cau_phase_config(uint32_t phase) +{ + uint32_t temp; + /* Get the CTL register */ + temp = CAU_CTL; + /* Reset the phase configuration bits */ + temp &= ~CAU_CTL_GCM_CCMPH; + /* Set the selected phase */ + temp |= phase; + /* Set the CTL register */ + CAU_CTL = temp; +} + +/*! + \brief flush the IN and OUT FIFOs + \param[in] none + \param[out] none + \retval none +*/ +void cau_fifo_flush(void) +{ + /* reset the read and write pointers of the FIFOs */ + CAU_CTL |= CAU_CTL_FFLUSH; +} + +/*! + \brief return whether CAU peripheral is enabled or disabled + \param[in] none + \param[out] none + \retval ControlStatus: ENABLE or DISABLE +*/ +ControlStatus cau_enable_state_get(void) +{ + ControlStatus ret = DISABLE; + if(RESET != (CAU_CTL & CAU_CTL_CAUEN)) { + ret = ENABLE; + } + return ret; +} + +/*! + \brief write data to the IN FIFO + \param[in] data: data to write (0 - 0xFFFFFFFF) + \param[out] none + \retval none +*/ +void cau_data_write(uint32_t data) +{ + CAU_DI = data; +} + +/*! + \brief return the last data entered into the output FIFO + \param[in] none + \param[out] none + \retval last data entered into the output FIFO +*/ +uint32_t cau_data_read(void) +{ + return CAU_DO; +} + +/*! + \brief save context before context switching + \param[in] key_initpara: key init parameter struct + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + \param[out] cau_context: + ctl_config: current configuration + iv_0_high: init vector 0 high + iv_0_low: init vector 0 low + iv_1_high: init vector 1 high + iv_1_low: init vector 1 low + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + gcmccmctxs[8]: GCM or CCM mode context switch + gcmctxs[8]: GCM mode context switch + \retval none +*/ +void cau_context_save(cau_context_parameter_struct *cau_context, cau_key_parameter_struct *key_initpara) +{ + uint32_t checkmask = 0U; + uint32_t checkbits = 0U; + uint32_t algm_reg = 0U; + + /* stop DMA transfers on the IN FIFO by clearing the DMAIEN bit in the CAU_DMAEN */ + CAU_DMAEN &= ~CAU_DMA_INFIFO; + + algm_reg = CAU_CTL & CAU_CTL_ALGM; + /* AES or DES */ + if((uint32_t)0 != (algm_reg & (~CAU_MODE_TDES_CBC))) { + /* wait until both the IN and OUT FIFOs are empty (IEM=1 and ONE=0 in the CAU_STAT0 register) and BUSY=0 */ + checkbits = CAU_STAT0_IEM; + checkmask = STAT0_AESDES_MASK; + /* TDES */ + } else { + /* wait until OUT FIFO is empty (ONE=0 in the CAU_STAT0 register) and BUSY=0 */ + checkbits = 0U; + checkmask = STAT0_TDES_MASK; + } + + while((CAU_STAT0 & checkmask) != checkbits) { + } + + /* stop DMA transfers on the OUT FIFO by clear CAU_DMAEN_DMAOEN=0 */ + CAU_DMAEN &= ~CAU_DMAEN_DMAOEN; + /* disable CAU */ + CAU_CTL &= ~CAU_CTL_CAUEN; + + /* save the current configuration (bit 19, bit[17:16] and bit[9:2] in the CAU_CTL register) */ + cau_context->ctl_config = CAU_CTL & (CAU_CTL_GCM_CCMPH | + CAU_CTL_KEYM | + CAU_CTL_DATAM | + CAU_CTL_ALGM | + CAU_CTL_CAUDIR | + CAU_CTL_NBPILB); + + /* save the key value */ + cau_context->key_0_high = key_initpara->key_0_high; + cau_context->key_0_low = key_initpara->key_0_low; + cau_context->key_1_high = key_initpara->key_1_high; + cau_context->key_1_low = key_initpara->key_1_low; + cau_context->key_2_high = key_initpara->key_2_high; + cau_context->key_2_low = key_initpara->key_2_low; + cau_context->key_3_high = key_initpara->key_3_high; + cau_context->key_3_low = key_initpara->key_3_low; + + if((CAU_MODE_TDES_ECB != algm_reg) && (CAU_MODE_DES_ECB != algm_reg) && (CAU_MODE_AES_ECB != algm_reg)) { + /* if not in ECB mode, save the initialization vectors */ + cau_context->iv_0_high = CAU_IV0H; + cau_context->iv_0_low = CAU_IV0L; + cau_context->iv_1_high = CAU_IV1H; + cau_context->iv_1_low = CAU_IV1L; + } + + /* if in GCM/CCM mode, save the context switch registers */ + if((CAU_MODE_AES_GCM == algm_reg) || (CAU_MODE_AES_CCM == algm_reg)) { + cau_context->gcmccmctxs[0U] = CAU_GCMCCMCTXSx(0U); + cau_context->gcmccmctxs[1U] = CAU_GCMCCMCTXSx(1U); + cau_context->gcmccmctxs[2U] = CAU_GCMCCMCTXSx(2U); + cau_context->gcmccmctxs[3U] = CAU_GCMCCMCTXSx(3U); + cau_context->gcmccmctxs[4U] = CAU_GCMCCMCTXSx(4U); + cau_context->gcmccmctxs[5U] = CAU_GCMCCMCTXSx(5U); + cau_context->gcmccmctxs[6U] = CAU_GCMCCMCTXSx(6U); + cau_context->gcmccmctxs[7U] = CAU_GCMCCMCTXSx(7U); + } + + /* if in GCM mode, save the context switch registers */ + if(CAU_MODE_AES_GCM == algm_reg) { + cau_context->gcmctxs[0U] = CAU_GCMCTXSx(0U); + cau_context->gcmctxs[1U] = CAU_GCMCTXSx(1U); + cau_context->gcmctxs[2U] = CAU_GCMCTXSx(2U); + cau_context->gcmctxs[3U] = CAU_GCMCTXSx(3U); + cau_context->gcmctxs[4U] = CAU_GCMCTXSx(4U); + cau_context->gcmctxs[5U] = CAU_GCMCTXSx(5U); + cau_context->gcmctxs[6U] = CAU_GCMCTXSx(6U); + cau_context->gcmctxs[7U] = CAU_GCMCTXSx(7U); + } +} + +/*! + \brief restore context after context switching + \param[in] cau_context: + ctl_config: current configuration + iv_0_high: init vector 0 high + iv_0_low: init vector 0 low + iv_1_high: init vector 1 high + iv_1_low: init vector 1 low + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + gcmccmctxs[8]: GCM or CCM mode context switch + gcmctxs[8]: GCM mode context switch + \param[out] none + \retval none +*/ +void cau_context_restore(cau_context_parameter_struct *cau_context) +{ + uint32_t algm_reg, aes_decrypt; + + /* configure the processor with the saved configuration */ + CAU_CTL = cau_context->ctl_config; + + algm_reg = CAU_CTL & CAU_CTL_ALGM; + + /* restore the key value */ + CAU_KEY0H = cau_context->key_0_high; + CAU_KEY0L = cau_context->key_0_low; + CAU_KEY1H = cau_context->key_1_high; + CAU_KEY1L = cau_context->key_1_low; + CAU_KEY2H = cau_context->key_2_high; + CAU_KEY2L = cau_context->key_2_low; + CAU_KEY3H = cau_context->key_3_high; + CAU_KEY3L = cau_context->key_3_low; + + if((CAU_MODE_TDES_ECB != algm_reg) && (CAU_MODE_DES_ECB != algm_reg) && (CAU_MODE_AES_ECB != algm_reg)) { + /* restore the initialization vectors */ + CAU_IV0H = cau_context->iv_0_high; + CAU_IV0L = cau_context->iv_0_low; + CAU_IV1H = cau_context->iv_1_high; + CAU_IV1L = cau_context->iv_1_low; + } + + /* if in GCM/CCM mode, restore the context switch registers */ + if((CAU_MODE_AES_GCM == algm_reg) || (CAU_MODE_AES_CCM == algm_reg)) { + CAU_GCMCCMCTXSx(0U) = cau_context->gcmccmctxs[0U]; + CAU_GCMCCMCTXSx(1U) = cau_context->gcmccmctxs[1U]; + CAU_GCMCCMCTXSx(2U) = cau_context->gcmccmctxs[2U]; + CAU_GCMCCMCTXSx(3U) = cau_context->gcmccmctxs[3U]; + CAU_GCMCCMCTXSx(4U) = cau_context->gcmccmctxs[4U]; + CAU_GCMCCMCTXSx(5U) = cau_context->gcmccmctxs[5U]; + CAU_GCMCCMCTXSx(6U) = cau_context->gcmccmctxs[6U]; + CAU_GCMCCMCTXSx(7U) = cau_context->gcmccmctxs[7U]; + } + + /* if in GCM mode, restore the context switch registers */ + if(CAU_MODE_AES_GCM == algm_reg) { + CAU_GCMCTXSx(0U) = cau_context->gcmctxs[0U]; + CAU_GCMCTXSx(1U) = cau_context->gcmctxs[1U]; + CAU_GCMCTXSx(2U) = cau_context->gcmctxs[2U]; + CAU_GCMCTXSx(3U) = cau_context->gcmctxs[3U]; + CAU_GCMCTXSx(4U) = cau_context->gcmctxs[4U]; + CAU_GCMCTXSx(5U) = cau_context->gcmctxs[5U]; + CAU_GCMCTXSx(6U) = cau_context->gcmctxs[6U]; + CAU_GCMCTXSx(7U) = cau_context->gcmctxs[7U]; + } + + /* if it is AES ECB/CBC decryption, then first prepare key */ + aes_decrypt = CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR); + if(((CAU_MODE_AES_ECB | CAU_DECRYPT) == aes_decrypt) || ((CAU_MODE_AES_CBC | CAU_DECRYPT) == aes_decrypt)) { + uint32_t alg_dir, algo_mode, swapping; + + /* flush IN/OUT FIFOs */ + cau_fifo_flush(); + /* parameters for key preparation for AES decryption */ + alg_dir = CAU_DECRYPT; + algo_mode = CAU_MODE_AES_KEY; + swapping = CAU_SWAPPING_32BIT; + cau_init(alg_dir, algo_mode, swapping); + + /* enable CAU */ + cau_enable(); + + /* wait until BUSY=0 */ + while((uint32_t)0U != cau_flag_get(CAU_FLAG_BUSY)) { + } + + /* parameters for decryption */ + CAU_CTL = cau_context->ctl_config; + } + + /* enable CAU */ + cau_enable(); +} + +/*! + \brief get the CAU flag status + \param[in] flag: CAU flag status + only one parameter can be selected which is shown as below: + \arg CAU_FLAG_INFIFO_EMPTY: input FIFO empty + \arg CAU_FLAG_INFIFO_NO_FULL: input FIFO is not full + \arg CAU_FLAG_OUTFIFO_NO_EMPTY: output FIFO not empty + \arg CAU_FLAG_OUTFIFO_FULL: output FIFO is full + \arg CAU_FLAG_BUSY: the CAU core is busy + \arg CAU_FLAG_INFIFO: input FIFO flag status + \arg CAU_FLAG_OUTFIFO: output FIFO flag status + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus cau_flag_get(uint32_t flag) +{ + uint32_t reg = 0U; + FlagStatus ret_flag = RESET; + + /* check if the flag is in CAU_STAT1 register */ + if(1U == (flag >> 31U)) { + reg = CAU_STAT1; + } else { + /* the flag is in CAU_STAT0 register */ + reg = CAU_STAT0; + } + + /* check the status of the specified CAU flag */ + if(0U != (reg & flag)) { + ret_flag = SET; + } + + return ret_flag; +} + +/*! + \brief enable the CAU interrupts + \param[in] interrupt: specify the CAU interrupt source to be enabled + one or more parameters can be selected which are shown as below: + \arg CAU_INT_INFIFO: input FIFO interrupt + \arg CAU_INT_OUTFIFO: output FIFO interrupt + \param[out] none + \retval none +*/ +void cau_interrupt_enable(uint32_t interrupt) +{ + /* enable the selected CAU interrupt */ + CAU_INTEN |= interrupt; +} + +/*! + \brief disable the CAU interrupts + \param[in] interrupt: specify the CAU interrupt source to be disabled + one or more parameters can be selected which are shown as below: + \arg CAU_INT_INFIFO: input FIFO interrupt + \arg CAU_INT_OUTFIFO: output FIFO interrupt + \param[out] none + \retval none +*/ +void cau_interrupt_disable(uint32_t interrupt) +{ + /* disable the selected CAU interrupt */ + CAU_INTEN &= ~(interrupt); +} + +/*! + \brief get the interrupt flag + \param[in] interrupt: CAU interrupt flag + only one parameter can be selected which is shown as below: + \arg CAU_INT_FLAG_INFIFO: input FIFO interrupt + \arg CAU_INT_FLAG_OUTFIFO: output FIFO interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus cau_interrupt_flag_get(uint32_t interrupt) +{ + FlagStatus flag = RESET; + + /* check the status of the specified CAU interrupt */ + if(RESET != (CAU_INTF & interrupt)) { + flag = SET; + } + + return flag; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c new file mode 100644 index 00000000000..51b731121ff --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c @@ -0,0 +1,915 @@ +/*! + \file gd32f5xx_cau_aes.c + \brief CAU AES driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_cau.h" +#include "string.h" + +#define AESBSY_TIMEOUT ((uint32_t)0x00010000U) +#define BLOCK_B0_MASK ((uint8_t)0x07U) +#define BLOCK_DATA_SIZE 16U +#define MAX_CCM_IV_SIZE 15U + +/* configure AES key structure parameter */ +static void cau_aes_key_config(uint8_t *key, uint32_t keysize, cau_key_parameter_struct *cau_key_initpara); +/* fill data into data input register */ +static ErrStatus cau_fill_data(uint8_t *input, uint32_t in_length); +/* AES calculate process */ +static ErrStatus cau_aes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); + +/*! + \brief encrypt and decrypt using AES in ECB mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* AES decryption */ + if(CAU_DECRYPT == cau_parameter->alg_dir) { + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* initialize the CAU peripheral */ + cau_init(CAU_DECRYPT, CAU_MODE_AES_KEY, CAU_SWAPPING_32BIT); + + /* enable the CAU peripheral */ + cau_enable(); + + /* wait until the busy flag is RESET */ + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } + } + + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_ECB, CAU_SWAPPING_8BIT); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + + /* enable the CAU peripheral */ + cau_enable(); + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in CBC mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + iv: initialization vector, 16 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* AES decryption */ + if(CAU_DECRYPT == cau_parameter->alg_dir) { + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* initialize the CAU peripheral */ + cau_init(CAU_DECRYPT, CAU_MODE_AES_KEY, CAU_SWAPPING_32BIT); + + /* enable the CAU peripheral */ + cau_enable(); + + /* wait until the busy flag is RESET */ + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } + } + + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CBC, CAU_SWAPPING_8BIT); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + + /* enable the CAU peripheral */ + cau_enable(); + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in CTR mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + iv: initialization vector, 16 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_ctr(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CTR, CAU_SWAPPING_8BIT); + + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + + /* enable the CAU peripheral */ + cau_enable(); + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in CFB mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + iv: initialization vector, 16 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_cfb(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CFB, CAU_SWAPPING_8BIT); + + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in OFB mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + iv: initialization vector, 16 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_ofb(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_OFB, CAU_SWAPPING_8BIT); + + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in GCM mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bits, must be either 128, 192 or 256 + iv: initialization vector, 16 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 16 bytes + aad: additional authentication data + aad_size: aad size in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned output data buffer + \param[out] tag: pointer to the returned tag buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_gcm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t *tag) +{ + ErrStatus ret = SUCCESS; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint64_t aadlength = (uint64_t)cau_parameter->aad_size * 8U; + uint64_t inputlength = (uint64_t)cau_parameter->in_length * 8U; + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + uint32_t tagaddr = (uint32_t)tag; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_GCM, CAU_SWAPPING_8BIT); + + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* prepare phase */ + /* select prepare phase */ + cau_phase_config(CAU_PREPARE_PHASE); + /* enable the CAU peripheral */ + cau_enable(); + /* wait for CAUEN bit to be 0 */ + while(ENABLE == cau_enable_state_get()) { + } + + /* aad phase */ + if((uint32_t)0U != cau_parameter->aad_size) { + /* select aad phase */ + cau_phase_config(CAU_AAD_PHASE); + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + + ret = cau_fill_data(cau_parameter->aad, cau_parameter->aad_size); + + if(ERROR == ret) { + return ret; + } + } + + /* encrypt or dcrypt phase */ + if((uint32_t)0U != cau_parameter->in_length) { + /* select encrypt or dcrypt phase */ + cau_phase_config(CAU_ENCRYPT_DECRYPT_PHASE); + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + + /* AES calculate process */ + ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); + + if(ERROR == ret) { + return ret; + } + } + + /* tag phase */ + /* select tag phase */ + cau_phase_config(CAU_TAG_PHASE); + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + cau_data_write(__REV((uint32_t)(aadlength >> 32U))); + cau_data_write(__REV((uint32_t)aadlength)); + cau_data_write(__REV((uint32_t)(inputlength >> 32U))); + cau_data_write(__REV((uint32_t)inputlength)); + + /* wait until the ONE flag is set */ + while(RESET == cau_flag_get(CAU_FLAG_OUTFIFO_NO_EMPTY)) { + } + + /* read the tag in the OUT FIFO */ + *(uint32_t *)(tagaddr) = cau_data_read(); + tagaddr += 4U; + *(uint32_t *)(tagaddr) = cau_data_read(); + tagaddr += 4U; + *(uint32_t *)(tagaddr) = cau_data_read(); + tagaddr += 4U; + *(uint32_t *)(tagaddr) = cau_data_read(); + tagaddr += 4U; + + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using AES in CCM mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key + key_size: key size in bytes + iv: initialization vector + iv_size: iv size in bytes + input: input data + in_length: input data length in bytes + aad: additional authentication data + aad_size: aad size + \param[in] mac_size: mac size (in bytes) + \param[out] output: pointer to the returned output data buffer + \param[out] tag: pointer to the returned tag buffer + \param[out] aad_buf: pointer to the user buffer used when formatting aad block + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_aes_ccm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t tag[], uint32_t tag_size, + uint8_t aad_buf[]) +{ + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + ErrStatus ret = ERROR; + uint32_t inputaddr = (uint32_t)cau_parameter->input; + uint32_t inputsize = cau_parameter->in_length; + uint32_t aadaddr = (uint32_t)cau_parameter->aad; + uint32_t aadsize = cau_parameter->aad_size; + uint32_t aad_block_size = 0U; + uint32_t ivaddr = (uint32_t)cau_parameter->iv; + uint32_t ivsize = cau_parameter->iv_size; + uint32_t outputaddr = (uint32_t)output; + uint32_t i = 0U, plen = 0U; + uint32_t head_index = 0U; + uint8_t blockb0[16U] = {0U}; + uint8_t counter[16U] = {0U}; + uint32_t ctraddr = (uint32_t)counter; + uint32_t b0addr = (uint32_t)blockb0; + uint32_t temp_tag[4U]; + + /* formatting the aad block */ + if((uint32_t)0U != aadsize) { + /* check that the aad length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ + if(aadsize < 65280U) { + aad_buf[head_index++] = (uint8_t)((aadsize >> 8U) & 0xFFU); + aad_buf[head_index++] = (uint8_t)((aadsize) & 0xFFU); + aad_block_size = aadsize + 2U; + } else { + /* aad is encoded as 0xFF || 0xFE || [aadsize]32, i.e., six octets */ + aad_buf[head_index++] = 0xFFU; + aad_buf[head_index++] = 0xFEU; + aad_buf[head_index++] = (uint8_t)((aadsize & 0xFF000000U) >> 24U); + aad_buf[head_index++] = (uint8_t)((aadsize & 0x00FF0000U) >> 16U); + aad_buf[head_index++] = (uint8_t)((aadsize & 0x0000FF00U) >> 8U); + aad_buf[head_index++] = (uint8_t)(aadsize & 0x000000FFU); + aad_block_size = aadsize + 6U; + } + /* copy the aad buffer in internal buffer "HBuffer" */ + for(i = 0U; i < aadsize; i++) { + aad_buf[head_index++] = *(uint8_t *)((uint32_t)(aadaddr + i)); + } + /* check if the aad block size is modulo 16 */ + if(0U != (aad_block_size % 16U)) { + /* Padd the aad buffer with 0s till the HBuffer length is modulo 16 */ + for(i = aad_block_size; i <= ((aad_block_size / 16U) + 1U) * 16U; i++) { + aad_buf[i] = 0U; + } + /* set the aad size to modulo 16 */ + aad_block_size = ((aad_block_size / 16U) + 1U) * 16U; + } + /* set the pointer aadaddr to HBuffer */ + aadaddr = (uint32_t)aad_buf; + } + + /* formatting the block B0 */ + if(0U != aadsize) { + blockb0[0] = 0x40U; + } + /* flags byte */ + blockb0[0] |= (0U | (((((uint8_t) tag_size - 2U) / 2U) & 0x07U) << 3U) | (((uint8_t)(15U - ivsize) - 1U) & 0x07U)); + + if(ivsize > MAX_CCM_IV_SIZE) { + return ERROR; + } + + for(i = 0U; i < ivsize; i++) { + blockb0[i + 1U] = *(uint8_t *)((uint32_t)(ivaddr + i)); + } + + /* the byte length for payload length expressing, which plus the ivsize must equal to 15 bytes */ + plen = 15U - ivsize; + /* if the byte length for payload length expressing is more than 4 bytes */ + if(plen > 4U) { + /* pad the blockb0 after vectors, and before the last 4 bytes */ + for(; i < 11U; i++) { + blockb0[i + 1U] = 0U; + } + blockb0[12U] = (uint8_t)((inputsize >> 24U) & 0xFFU); + blockb0[13U] = (uint8_t)((inputsize >> 16U) & 0xFFU); + blockb0[14U] = (uint8_t)((inputsize >> 8U) & 0xFFU); + blockb0[15U] = (uint8_t)(inputsize & 0xFFU); + } else { + /* the payload length is expressed in plen bytes */ + for(; i < 15U; i++) { + blockb0[i + 1U] = (uint8_t)((inputsize >> ((plen - 1U) * 8U)) & 0xFFU); + plen--; + } + } + + /* formatting the initial counter */ + /* byte 0: bits 0-2 contain the same encoding of q as in B0 */ + counter[0] = blockb0[0] & BLOCK_B0_MASK; + for(i = 1U; i < ivsize + 1U; i++) { + counter[i] = blockb0[i]; + } + /* set the LSB to 1 */ + counter[15] |= 0x01U; + + /* prepare phase */ + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* clear CAUEN bit to ensure CAU is disable */ + cau_disable(); + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CCM, CAU_SWAPPING_8BIT); + /* select prepare phase */ + cau_phase_config(CAU_PREPARE_PHASE); + + /* AES key structure parameter config */ + cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); + /* key initialization */ + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + iv_initpara.iv_1_high = __REV(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + iv_initpara.iv_1_low = __REV(*(uint32_t *)(ctraddr)); + cau_iv_init(&iv_initpara); + + /* enable the CAU peripheral */ + cau_enable(); + + /* write block B0 in the In FIFO */ + cau_data_write(*(uint32_t *)(b0addr)); + b0addr += 4U; + cau_data_write(*(uint32_t *)(b0addr)); + b0addr += 4U; + cau_data_write(*(uint32_t *)(b0addr)); + b0addr += 4U; + cau_data_write(*(uint32_t *)(b0addr)); + + /* wait for CAUEN bit to be 0 */ + while(ENABLE == cau_enable_state_get()) { + } + + /* aad phase */ + if((uint32_t)0U != aadsize) { + /* select aad phase */ + cau_phase_config(CAU_AAD_PHASE); + /* enable the CAU peripheral */ + cau_enable(); + + ret = cau_fill_data((uint8_t *)aadaddr, aad_block_size); + + if(ERROR == ret) { + return ret; + } + } + + /* encrypt or dcrypt phase */ + inputsize = cau_parameter->in_length; + + if((uint32_t)0U != inputsize) { + /* select encrypt or dcrypt phase */ + cau_phase_config(CAU_ENCRYPT_DECRYPT_PHASE); + /* enable the CAU peripheral */ + cau_enable(); + + /* AES calculate process */ + ret = cau_aes_calculate((uint8_t *)inputaddr, inputsize, (uint8_t *)outputaddr); + + if(ERROR == ret) { + return ret; + } + } + + /* tag phase */ + /* select final phase */ + cau_phase_config(CAU_TAG_PHASE); + /* enable the CAU peripheral */ + cau_enable(); + + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + ctraddr = (uint32_t)counter; + + cau_data_write(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + cau_data_write(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + cau_data_write(*(uint32_t *)(ctraddr)); + ctraddr += 4U; + /* reset bit 0 (after 8-bit swap) is equivalent to reset bit 24 (before 8-bit swap) */ + cau_data_write(*(uint32_t *)(ctraddr) & 0xFEFFFFFFU); + + /* wait until the ONE flag is set */ + while(RESET == cau_flag_get(CAU_FLAG_OUTFIFO_NO_EMPTY)) { + } + + /* read the tag in the OUT FIFO */ + temp_tag[0] = cau_data_read(); + temp_tag[1] = cau_data_read(); + temp_tag[2] = cau_data_read(); + temp_tag[3] = cau_data_read(); + + /* disable the CAU peripheral */ + cau_disable(); + + /* Copy temporary authentication TAG in user TAG buffer */ + for(i = 0U; i < tag_size; i++) { + tag[i] = (uint8_t)(temp_tag[i / 4U] >> (8U * (i % 4U))); + } + + return ret; +} +/*! + \brief AES key structure parameter config + \param[in] key: key used for AES algorithm + \param[in] keysize: length of the key in bits, must be either 128, 192 or 256 + \param[out] cau_key_initpara: key init parameter struct + key_0_high: key 0 high + key_0_low: key 0 low + key_1_high: key 1 high + key_1_low: key 1 low + key_2_high: key 2 high + key_2_low: key 2 low + key_3_high: key 3 high + key_3_low: key 3 low + \retval none +*/ +static void cau_aes_key_config(uint8_t *key, uint32_t keysize, cau_key_parameter_struct *cau_key_initpara) +{ + uint32_t keyaddr = (uint32_t)key; + + switch(keysize) { + case 128: + cau_aes_keysize_config(CAU_KEYSIZE_128BIT); + cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); + break; + case 192: + cau_aes_keysize_config(CAU_KEYSIZE_192BIT); + cau_key_initpara->key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_1_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); + break; + case 256: + cau_aes_keysize_config(CAU_KEYSIZE_256BIT); + cau_key_initpara->key_0_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_0_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_1_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); + break; + default: + break; + } +} + +/*! + \brief fill data into data input register + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer in bytes, must be a multiple of 16 bytes + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus cau_fill_data(uint8_t *input, uint32_t in_length) +{ + uint32_t inputaddr = (uint32_t)input; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + for(i = 0U; i < in_length; i += BLOCK_DATA_SIZE) { + /* wait until the IEM flag is set */ + while(RESET == cau_flag_get(CAU_FLAG_INFIFO_EMPTY)) { + } + + if(i + BLOCK_DATA_SIZE > in_length) { + /* the last block data number is less than 128bit */ + uint32_t block_data_temp[4] = {0U}; + + /* fill the remaining bits with zero */ + memcpy(block_data_temp, (uint32_t *)inputaddr, in_length - i); + inputaddr = (uint32_t)block_data_temp; + + /* if GCM encryption or CCM decryption, then configurate NBPILB bits in CTL register */ + if((CAU_CTL & CAU_CTL_GCM_CCMPH) == CAU_ENCRYPT_DECRYPT_PHASE) { + if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_GCM | CAU_ENCRYPT)) { + CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); + } else if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_CCM | CAU_DECRYPT)) { + CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); + } else { + } + } + } + + /* write data to the IN FIFO */ + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + } + /* wait until the complete message has been processed */ + counter = 0U; + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } + + return SUCCESS; +} + +/*! + \brief AES calculate process + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer in bytes, must be a multiple of 16 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus cau_aes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) +{ + uint32_t inputaddr = (uint32_t)input; + uint32_t outputaddr = (uint32_t)output; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + /* the clock is not enabled or there is no embeded CAU peripheral */ + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + for(i = 0U; i < in_length; i += BLOCK_DATA_SIZE) { + /* wait until the IEM flag is set */ + while(RESET == cau_flag_get(CAU_FLAG_INFIFO_EMPTY)) { + } + + /* check if the last input data block */ + if(i + BLOCK_DATA_SIZE > in_length) { + /* the last block data number is less than 128bit */ + uint32_t block_data_temp[4] = {0}; + + /* fill the remaining bits with zero */ + memcpy(block_data_temp, (uint32_t *)inputaddr, in_length - i); + inputaddr = (uint32_t)block_data_temp; + + /* if GCM encryption or CCM decryption, then configurate NBPILB bits in CTL register */ + if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_GCM | CAU_ENCRYPT)) { + CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); + } else if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_CCM | CAU_DECRYPT)) { + CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); + } else { + } + } + + /* write data to the IN FIFO */ + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + + /* wait until the complete message has been processed */ + counter = 0U; + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } else { + /* read the output block from the output FIFO */ + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + } + } + + return SUCCESS; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c new file mode 100644 index 00000000000..22c72fe99cd --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c @@ -0,0 +1,183 @@ +/*! + \file gd32f5xx_cau_des.c + \brief CAU DES driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_cau.h" + +#define DESBUSY_TIMEOUT ((uint32_t)0x00010000U) + +/* DES calculate process */ +static ErrStatus cau_des_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); + +/*! + \brief encrypt and decrypt using DES in ECB mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key, 8 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 8 bytes + \param[out] output: pointer to the output buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_des_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + uint32_t keyaddr = (uint32_t)(cau_parameter->key); + uint32_t inputaddr = (uint32_t)(cau_parameter->input); + uint32_t outputaddr = (uint32_t)output; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_DES_ECB, CAU_SWAPPING_8BIT); + + /* key initialisation */ + key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); + cau_key_init(&key_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + /* DES calculate process */ + ret = cau_des_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using DES in CBC mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key, 8 bytes + iv: initialization vector, 8 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 8 bytes + \param[out] output: pointer to the output structure + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_des_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint32_t keyaddr = (uint32_t)(cau_parameter->key); + uint32_t inputaddr = (uint32_t)(cau_parameter->input); + uint32_t outputaddr = (uint32_t)output; + uint32_t ivaddr = (uint32_t)(cau_parameter->iv); + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_DES_CBC, CAU_SWAPPING_8BIT); + + /* key initialisation */ + key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + + /* enable the CAU peripheral */ + cau_enable(); + /* DES calculate process */ + ret = cau_des_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief DES calculate process + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer in bytes, must be a multiple of 8 bytes + \param[in] output: pointer to the returned buffer + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus cau_des_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) +{ + uint32_t inputaddr = (uint32_t)input; + uint32_t outputaddr = (uint32_t)output; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + /* the clock is not enabled or there is no embeded CAU peripheral */ + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + for(i = 0U; i < in_length; i += 8U) { + /* write data to the IN FIFO */ + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + + /* wait until the complete message has been processed */ + counter = 0U; + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((DESBUSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } else { + /* read the output block from the output FIFO */ + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + } + } + + return SUCCESS; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c new file mode 100644 index 00000000000..02558f85eb6 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c @@ -0,0 +1,198 @@ +/*! + \file gd32f5xx_cau_tdes.c + \brief CAU TDES driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_cau.h" + +#define TDESBSY_TIMEOUT ((uint32_t)0x00010000U) + +/* TDES calculate process */ +static ErrStatus cau_tdes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); + +/*! + \brief encrypt and decrypt using TDES in ECB mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key, 24 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 8 bytes + \param[out] output: pointer to the output structure + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_tdes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + uint32_t keyaddr = (uint32_t)(cau_parameter->key); + uint32_t inputaddr = (uint32_t)(cau_parameter->input); + uint32_t outputaddr = (uint32_t)output; + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_TDES_ECB, CAU_SWAPPING_8BIT); + + /* key initialization */ + key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_2_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_2_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_3_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_3_low = __REV(*(uint32_t *)(keyaddr)); + cau_key_init(&key_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + + /* enable the CAU peripheral */ + cau_enable(); + /* TDES calculate process */ + ret = cau_tdes_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief encrypt and decrypt using TDES in CBC mode + \param[in] cau_parameter: pointer to the input structure + alg_dir: algorithm direction + CAU_ENCRYPT, CAU_DECRYPT + key: key, 24 bytes + iv: initialization vector, 8 bytes + input: input data + in_length: input data length in bytes, must be a multiple of 8 bytes + \param[out] output: pointer to the output structure + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus cau_tdes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) +{ + ErrStatus ret = ERROR; + cau_key_parameter_struct key_initpara; + cau_iv_parameter_struct iv_initpara; + uint32_t keyaddr = (uint32_t)(cau_parameter->key); + uint32_t inputaddr = (uint32_t)(cau_parameter->input); + uint32_t outputaddr = (uint32_t)output; + uint32_t ivaddr = (uint32_t)(cau_parameter->iv); + + /* key structure initialization */ + cau_key_struct_para_init(&key_initpara); + /* initialize the CAU peripheral */ + cau_init(cau_parameter->alg_dir, CAU_MODE_TDES_CBC, CAU_SWAPPING_8BIT); + + /* key initialization */ + key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_2_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_2_low = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_3_high = __REV(*(uint32_t *)(keyaddr)); + keyaddr += 4U; + key_initpara.key_3_low = __REV(*(uint32_t *)(keyaddr)); + cau_key_init(&key_initpara); + + /* vectors initialization */ + iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); + ivaddr += 4U; + iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); + cau_iv_init(&iv_initpara); + + /* flush the IN and OUT FIFOs */ + cau_fifo_flush(); + /* enable the CAU peripheral */ + cau_enable(); + /* TDES calculate process */ + ret = cau_tdes_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); + /* disable the CAU peripheral */ + cau_disable(); + + return ret; +} + +/*! + \brief TDES calculate process + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer in bytes, must be a multiple of 8 bytes + \param[out] output: pointer to the returned buffer + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus cau_tdes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) +{ + uint32_t inputaddr = (uint32_t)input; + uint32_t outputaddr = (uint32_t)output; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + + /* the clock is not enabled or there is no embeded CAU peripheral */ + if(DISABLE == cau_enable_state_get()) { + return ERROR; + } + + for(i = 0U; i < in_length; i += 8U) { + /* write data to the IN FIFO */ + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + cau_data_write(*(uint32_t *)(inputaddr)); + inputaddr += 4U; + + /* wait until the complete message has been processed */ + counter = 0U; + do { + busystatus = cau_flag_get(CAU_FLAG_BUSY); + counter++; + } while((TDESBSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus) { + return ERROR; + } else { + /* read the output block from the output FIFO */ + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + *(uint32_t *)(outputaddr) = cau_data_read(); + outputaddr += 4U; + } + } + + return SUCCESS; +} \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c new file mode 100644 index 00000000000..51507eb4fca --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c @@ -0,0 +1,127 @@ +/*! + \file gd32f5xx_crc.c + \brief CRC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_crc.h" + +#define CRC_DATA_RESET_VALUE ((uint32_t)0xFFFFFFFFU) +#define CRC_FDATA_RESET_VALUE ((uint32_t)0x00000000U) + +/*! + \brief deinit CRC calculation unit + \param[in] none + \param[out] none + \retval none +*/ +void crc_deinit(void) +{ + CRC_DATA = CRC_DATA_RESET_VALUE; + CRC_FDATA = CRC_FDATA_RESET_VALUE; + CRC_CTL = (uint32_t)CRC_CTL_RST; +} + +/*! + \brief reset data register(CRC_DATA) to the value of 0xFFFFFFFF + \param[in] none + \param[out] none + \retval none +*/ +void crc_data_register_reset(void) +{ + CRC_CTL |= (uint32_t)CRC_CTL_RST; +} + +/*! + \brief read the value of the data register + \param[in] none + \param[out] none + \retval 32-bit value of the data register,0-0xFFFFFFFF +*/ +uint32_t crc_data_register_read(void) +{ + uint32_t data; + data = CRC_DATA; + return (data); +} + +/*! + \brief read the value of the free data register + \param[in] none + \param[out] none + \retval 8-bit value of the free data register,0-0xFF +*/ +uint8_t crc_free_data_register_read(void) +{ + uint8_t fdata; + fdata = (uint8_t)CRC_FDATA; + return (fdata); +} + +/*! + \brief write data to the free data register + \param[in] free_data: specified 8-bit data + \param[out] none + \retval none +*/ +void crc_free_data_register_write(uint8_t free_data) +{ + CRC_FDATA = (uint32_t)free_data; +} + +/*! + \brief calculate the CRC value of a 32-bit data + \param[in] sdata: specified 32-bit data + \param[out] none + \retval 32-bit value calculated by CRC,0-0xFFFFFFFF +*/ +uint32_t crc_single_data_calculate(uint32_t sdata) +{ + CRC_DATA = sdata; + return (CRC_DATA); +} + +/*! + \brief calculate the CRC value of an array of 32-bit values + \param[in] array: pointer to an array of 32-bit values + \param[in] size: size of the array + \param[out] none + \retval 32-bit value calculated by CRC,0-0xFFFFFFFF +*/ +uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size) +{ + uint32_t index; + for(index = 0U; index < size; index++) { + CRC_DATA = array[index]; + } + return (CRC_DATA); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c new file mode 100644 index 00000000000..e14c0a1d936 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c @@ -0,0 +1,388 @@ +/*! + \file gd32f5xx_ctc.c + \brief CTC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_ctc.h" + +#define CTC_FLAG_MASK ((uint32_t)0x00000700U) + +/* CTC register bit offset */ +#define CTC_TRIMVALUE_OFFSET ((uint32_t)8U) +#define CTC_TRIM_VALUE_OFFSET ((uint32_t)8U) +#define CTC_REFCAP_OFFSET ((uint32_t)16U) +#define CTC_LIMIT_VALUE_OFFSET ((uint32_t)16U) + +/*! + \brief reset CTC clock trim controller + \param[in] none + \param[out] none + \retval none +*/ +void ctc_deinit(void) +{ + /* reset CTC */ + rcu_periph_reset_enable(RCU_CTCRST); + rcu_periph_reset_disable(RCU_CTCRST); +} + +/*! + \brief enable CTC trim counter + \param[in] none + \param[out] none + \retval none +*/ +void ctc_counter_enable(void) +{ + CTC_CTL0 |= (uint32_t)CTC_CTL0_CNTEN; +} + +/*! + \brief disable CTC trim counter + \param[in] none + \param[out] none + \retval none +*/ +void ctc_counter_disable(void) +{ + CTC_CTL0 &= (uint32_t)(~CTC_CTL0_CNTEN); +} + +/*! + \brief configure the IRC48M trim value + \param[in] ctc_trim_value: 8-bit IRC48M trim value + \arg 0x00 - 0x3F + \param[out] none + \retval none +*/ +void ctc_irc48m_trim_value_config(uint8_t trim_value) +{ + /* clear TRIMVALUE bits */ + CTC_CTL0 &= (~(uint32_t)CTC_CTL0_TRIMVALUE); + /* set TRIMVALUE bits */ + CTC_CTL0 |= ((uint32_t)trim_value << CTC_TRIM_VALUE_OFFSET); +} + +/*! + \brief generate software reference source sync pulse + \param[in] none + \param[out] none + \retval none +*/ +void ctc_software_refsource_pulse_generate(void) +{ + CTC_CTL0 |= (uint32_t)CTC_CTL0_SWREFPUL; +} + +/*! + \brief configure hardware automatically trim mode + \param[in] hardmode: + only one parameter can be selected which is shown as below: + \arg CTC_HARDWARE_TRIM_MODE_ENABLE: hardware automatically trim mode enable + \arg CTC_HARDWARE_TRIM_MODE_DISABLE: hardware automatically trim mode disable + \param[out] none + \retval none +*/ +void ctc_hardware_trim_mode_config(uint32_t hardmode) +{ + CTC_CTL0 &= (uint32_t)(~CTC_CTL0_AUTOTRIM); + CTC_CTL0 |= (uint32_t)hardmode; +} + +/*! + \brief configure reference signal source polarity + \param[in] polarity: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_POLARITY_FALLING: reference signal source polarity is falling edge + \arg CTC_REFSOURCE_POLARITY_RISING: reference signal source polarity is rising edge + \param[out] none + \retval none +*/ +void ctc_refsource_polarity_config(uint32_t polarity) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPOL); + CTC_CTL1 |= (uint32_t)polarity; +} + +/*! + \brief select reference signal source + \param[in] refs: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_GPIO: GPIO is selected + \arg CTC_REFSOURCE_LXTAL: LXTAL is selected + \param[out] none + \retval none +*/ +void ctc_refsource_signal_select(uint32_t refs) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFSEL); + CTC_CTL1 |= (uint32_t)refs; +} + +/*! + \brief configure reference signal source prescaler + \param[in] prescaler: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_PSC_OFF: reference signal not divided + \arg CTC_REFSOURCE_PSC_DIV2: reference signal divided by 2 + \arg CTC_REFSOURCE_PSC_DIV4: reference signal divided by 4 + \arg CTC_REFSOURCE_PSC_DIV8: reference signal divided by 8 + \arg CTC_REFSOURCE_PSC_DIV16: reference signal divided by 16 + \arg CTC_REFSOURCE_PSC_DIV32: reference signal divided by 32 + \arg CTC_REFSOURCE_PSC_DIV64: reference signal divided by 64 + \arg CTC_REFSOURCE_PSC_DIV128: reference signal divided by 128 + \param[out] none + \retval none +*/ +void ctc_refsource_prescaler_config(uint32_t prescaler) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPSC); + CTC_CTL1 |= (uint32_t)prescaler; +} + +/*! + \brief configure clock trim base limit value + \param[in] limit_value: 8-bit clock trim base limit value + \arg 0x00 - 0xFF + \param[out] none + \retval none +*/ +void ctc_clock_limit_value_config(uint8_t limit_value) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_CKLIM); + CTC_CTL1 |= (uint32_t)((uint32_t)limit_value << CTC_LIMIT_VALUE_OFFSET); +} + +/*! + \brief configure CTC counter reload value + \param[in] reload_value: 16-bit CTC counter reload value + \arg 0x0000 - 0xFFFF + \param[out] none + \retval none +*/ +void ctc_counter_reload_value_config(uint16_t reload_value) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_RLVALUE); + CTC_CTL1 |= (uint32_t)reload_value; +} + +/*! + \brief read CTC counter capture value when reference sync pulse occurred + \param[in] none + \param[out] none + \retval the 16-bit CTC counter capture value +*/ +uint16_t ctc_counter_capture_value_read(void) +{ + uint16_t capture_value = 0U; + capture_value = (uint16_t)((CTC_STAT & CTC_STAT_REFCAP) >> CTC_REFCAP_OFFSET); + return (capture_value); +} + +/*! + \brief read CTC trim counter direction when reference sync pulse occurred + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET + \arg SET: CTC trim counter direction is down-counting + \arg RESET: CTC trim counter direction is up-counting +*/ +FlagStatus ctc_counter_direction_read(void) +{ + if(RESET != (CTC_STAT & CTC_STAT_REFDIR)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief read CTC counter reload value + \param[in] none + \param[out] none + \retval the 16-bit CTC counter reload value +*/ +uint16_t ctc_counter_reload_value_read(void) +{ + uint16_t reload_value = 0U; + reload_value = (uint16_t)(CTC_CTL1 & CTC_CTL1_RLVALUE); + return (reload_value); +} + +/*! + \brief read the IRC48M trim value + \param[in] none + \param[out] none + \retval the 8-bit IRC48M trim value +*/ +uint8_t ctc_irc48m_trim_value_read(void) +{ + uint8_t trim_value = 0U; + trim_value = (uint8_t)((CTC_CTL0 & CTC_CTL0_TRIMVALUE) >> CTC_TRIMVALUE_OFFSET); + return (trim_value); +} + +/*! + \brief enable the CTC interrupt + \param[in] interrupt: CTC interrupt enable + one or more parameters can be selected which are shown as below: + \arg CTC_INT_CKOK: clock trim OK interrupt enable + \arg CTC_INT_CKWARN: clock trim warning interrupt enable + \arg CTC_INT_ERR: error interrupt enable + \arg CTC_INT_EREF: expect reference interrupt enable + \param[out] none + \retval none +*/ +void ctc_interrupt_enable(uint32_t interrupt) +{ + CTC_CTL0 |= (uint32_t)interrupt; +} + +/*! + \brief disable the CTC interrupt + \param[in] interrupt: CTC interrupt enable source + one or more parameters can be selected which are shown as below: + \arg CTC_INT_CKOK: clock trim OK interrupt enable + \arg CTC_INT_CKWARN: clock trim warning interrupt enable + \arg CTC_INT_ERR: error interrupt enable + \arg CTC_INT_EREF: expect reference interrupt enable + \param[out] none + \retval none +*/ +void ctc_interrupt_disable(uint32_t interrupt) +{ + CTC_CTL0 &= (uint32_t)(~interrupt); +} + +/*! + \brief get CTC interrupt flag + \param[in] int_flag: the CTC interrupt flag + only one parameter can be selected which is shown as below: + \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt + \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt + \arg CTC_INT_FLAG_ERR: error interrupt + \arg CTC_INT_FLAG_EREF: expect reference interrupt + \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt + \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt + \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ctc_interrupt_flag_get(uint32_t int_flag) +{ + uint32_t interrupt_flag = 0U, intenable = 0U; + + /* check whether the interrupt is enabled */ + if(RESET != (int_flag & CTC_FLAG_MASK)) { + intenable = CTC_CTL0 & CTC_CTL0_ERRIE; + } else { + intenable = CTC_CTL0 & int_flag; + } + + /* get interrupt flag status */ + interrupt_flag = CTC_STAT & int_flag; + + if(interrupt_flag && intenable) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear CTC interrupt flag + \param[in] int_flag: the CTC interrupt flag + only one parameter can be selected which is shown as below: + \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt + \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt + \arg CTC_INT_FLAG_ERR: error interrupt + \arg CTC_INT_FLAG_EREF: expect reference interrupt + \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt + \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt + \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt + \param[out] none + \retval none +*/ +void ctc_interrupt_flag_clear(uint32_t int_flag) +{ + if(RESET != (int_flag & CTC_FLAG_MASK)) { + CTC_INTC |= CTC_INTC_ERRIC; + } else { + CTC_INTC |= int_flag; + } +} + +/*! + \brief get CTC flag + \param[in] flag: the CTC flag + only one parameter can be selected which is shown as below: + \arg CTC_FLAG_CKOK: clock trim OK flag + \arg CTC_FLAG_CKWARN: clock trim warning flag + \arg CTC_FLAG_ERR: error flag + \arg CTC_FLAG_EREF: expect reference flag + \arg CTC_FLAG_CKERR: clock trim error bit + \arg CTC_FLAG_REFMISS: reference sync pulse miss + \arg CTC_FLAG_TRIMERR: trim value error bit + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ctc_flag_get(uint32_t flag) +{ + if(RESET != (CTC_STAT & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear CTC flag + \param[in] flag: the CTC flag + only one parameter can be selected which is shown as below: + \arg CTC_FLAG_CKOK: clock trim OK flag + \arg CTC_FLAG_CKWARN: clock trim warning flag + \arg CTC_FLAG_ERR: error flag + \arg CTC_FLAG_EREF: expect reference flag + \arg CTC_FLAG_CKERR: clock trim error bit + \arg CTC_FLAG_REFMISS: reference sync pulse miss + \arg CTC_FLAG_TRIMERR: trim value error bit + \param[out] none + \retval none +*/ +void ctc_flag_clear(uint32_t flag) +{ + if(RESET != (flag & CTC_FLAG_MASK)) { + CTC_INTC |= CTC_INTC_ERRIC; + } else { + CTC_INTC |= flag; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c new file mode 100644 index 00000000000..816e250afe8 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c @@ -0,0 +1,679 @@ +/*! + \file gd32f5xx_dac.c + \brief DAC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_dac.h" + +/* DAC register bit offset */ +#define OUT1_REG_OFFSET ((uint32_t)0x00000010U) +#define DH_12BIT_OFFSET ((uint32_t)0x00000010U) +#define DH_8BIT_OFFSET ((uint32_t)0x00000008U) + +#define DAC_STAT_FLAG_MASK0 (DAC_FLAG_DDUDR0 | DAC_FLAG_DDUDR1) +#define DAC_INT_EN_MASK0 (DAC_INT_DDUDR0 | DAC_INT_DDUDR1) +#define DAC_INT_FLAG_MASK0 (DAC_INT_FLAG_DDUDR0 | DAC_INT_FLAG_DDUDR1) + +/*! + \brief deinitialize DAC + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_deinit(uint32_t dac_periph) +{ + switch(dac_periph){ + case DAC0: + /* reset DAC0 */ + rcu_periph_reset_enable(RCU_DACRST); + rcu_periph_reset_disable(RCU_DACRST); + break; + default: + break; + } +} + +/*! + \brief enable DAC + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_enable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DEN0; + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DEN1; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief disable DAC + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_disable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DEN0); + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DEN1); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC DMA function + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_dma_enable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DDMAEN0; + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DDMAEN1; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief disable DAC DMA function + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_dma_disable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DDMAEN0); + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DDMAEN1); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC output buffer + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_enable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DBOFF0); + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DBOFF1); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief disable DAC output buffer + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_disable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DBOFF0; + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DBOFF1; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief get DAC output value + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval DAC output data: 0~4095 +*/ +uint16_t dac_output_value_get(uint32_t dac_periph, uint8_t dac_out) +{ + uint16_t data = 0U; + + if(DAC_OUT0 == dac_out){ + /* store the DACx_OUT0 output value */ + data = (uint16_t)DAC_OUT0_DO(dac_periph); + }else if(DAC_OUT1 == dac_out){ + /* store the DACx_OUT1 output value */ + data = (uint16_t)DAC_OUT1_DO(dac_periph); + }else{ + /* illegal parameters */ + } + + return data; +} + +/*! + \brief set DAC data holding register value + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[in] dac_align: DAC data alignment mode + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_12B_R: 12-bit right-aligned data + \arg DAC_ALIGN_12B_L: 12-bit left-aligned data + \arg DAC_ALIGN_8B_R: 8-bit right-aligned data + \param[in] data: data to be loaded(0~4095) + \param[out] none + \retval none +*/ +void dac_data_set(uint32_t dac_periph, uint8_t dac_out, uint32_t dac_align, uint16_t data) +{ + /* DAC_OUT0 data alignment */ + if(DAC_OUT0 == dac_out){ + switch(dac_align){ + /* 12-bit right-aligned data */ + case DAC_ALIGN_12B_R: + DAC_OUT0_R12DH(dac_periph) = data; + break; + /* 12-bit left-aligned data */ + case DAC_ALIGN_12B_L: + DAC_OUT0_L12DH(dac_periph) = data; + break; + /* 8-bit right-aligned data */ + case DAC_ALIGN_8B_R: + DAC_OUT0_R8DH(dac_periph) = data; + break; + default: + break; + } + }else if(DAC_OUT1 == dac_out){ + /* DAC_OUT1 data alignment */ + switch(dac_align){ + /* 12-bit right-aligned data */ + case DAC_ALIGN_12B_R: + DAC_OUT1_R12DH(dac_periph) = data; + break; + /* 12-bit left-aligned data */ + case DAC_ALIGN_12B_L: + DAC_OUT1_L12DH(dac_periph) = data; + break; + /* 8-bit right-aligned data */ + case DAC_ALIGN_8B_R: + DAC_OUT1_R8DH(dac_periph) = data; + break; + default: + break; + } + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC trigger + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_trigger_enable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DTEN0; + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DTEN1; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief disable DAC trigger + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[out] none + \retval none +*/ +void dac_trigger_disable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTEN0); + }else if(DAC_OUT1 == dac_out){ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTEN1); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure DAC trigger source + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[in] triggersource: external trigger of DAC + only one parameter can be selected which is shown as below: + \arg DAC_TRIGGER_T5_TRGO: TIMER5 TRGO + \arg DAC_TRIGGER_T7_TRGO: TIMER7 TRGO + \arg DAC_TRIGGER_T6_TRGO: TIMER6 TRGO + \arg DAC_TRIGGER_T4_TRGO: TIMER4 TRGO + \arg DAC_TRIGGER_T1_TRGO: TIMER1 TRGO + \arg DAC_TRIGGER_T3_TRGO: TIMER3 TRGO + \arg DAC_TRIGGER_EXTI_9: EXTI interrupt line9 event + \arg DAC_TRIGGER_SOFTWARE: software trigger + \param[out] none + \retval none +*/ +void dac_trigger_source_config(uint32_t dac_periph, uint8_t dac_out, uint32_t triggersource) +{ + if(DAC_OUT0 == dac_out){ + /* configure DACx_OUT0 trigger source */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTSEL0); + DAC_CTL0(dac_periph) |= triggersource; + }else if(DAC_OUT1 == dac_out){ + /* configure DACx_OUT1 trigger source */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTSEL1); + DAC_CTL0(dac_periph) |= (triggersource << OUT1_REG_OFFSET); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC software trigger + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \retval none +*/ +void dac_software_trigger_enable(uint32_t dac_periph, uint8_t dac_out) +{ + if(DAC_OUT0 == dac_out){ + DAC_SWT(dac_periph) |= (uint32_t)DAC_SWT_SWTR0; + }else if(DAC_OUT1 == dac_out){ + DAC_SWT(dac_periph) |= (uint32_t)DAC_SWT_SWTR1; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure DAC wave mode + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[in] wave_mode: DAC wave mode + only one parameter can be selected which is shown as below: + \arg DAC_WAVE_DISABLE: wave mode disable + \arg DAC_WAVE_MODE_LFSR: LFSR noise mode + \arg DAC_WAVE_MODE_TRIANGLE: triangle noise mode + \param[out] none + \retval none +*/ +void dac_wave_mode_config(uint32_t dac_periph, uint8_t dac_out, uint32_t wave_mode) +{ + if(DAC_OUT0 == dac_out){ + /* configure DACx_OUT0 wave mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWM0); + DAC_CTL0(dac_periph) |= wave_mode; + }else if(DAC_OUT1 == dac_out){ + /* configure DACx_OUT1 wave mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWM1); + DAC_CTL0(dac_periph) |= (wave_mode << OUT1_REG_OFFSET); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure DAC LFSR noise mode + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[in] unmask_bits: LFSR noise unmask bits + only one parameter can be selected which is shown as below: + \arg DAC_LFSR_BIT0: unmask the LFSR bit0 + \arg DAC_LFSR_BITS1_0: unmask the LFSR bits[1:0] + \arg DAC_LFSR_BITS2_0: unmask the LFSR bits[2:0] + \arg DAC_LFSR_BITS3_0: unmask the LFSR bits[3:0] + \arg DAC_LFSR_BITS4_0: unmask the LFSR bits[4:0] + \arg DAC_LFSR_BITS5_0: unmask the LFSR bits[5:0] + \arg DAC_LFSR_BITS6_0: unmask the LFSR bits[6:0] + \arg DAC_LFSR_BITS7_0: unmask the LFSR bits[7:0] + \arg DAC_LFSR_BITS8_0: unmask the LFSR bits[8:0] + \arg DAC_LFSR_BITS9_0: unmask the LFSR bits[9:0] + \arg DAC_LFSR_BITS10_0: unmask the LFSR bits[10:0] + \arg DAC_LFSR_BITS11_0: unmask the LFSR bits[11:0] + \param[out] none + \retval none +*/ +void dac_lfsr_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t unmask_bits) +{ + if(DAC_OUT0 == dac_out){ + /* configure DACx_OUT0 LFSR noise mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW0); + DAC_CTL0(dac_periph) |= unmask_bits; + }else if(DAC_OUT1 == dac_out){ + /* configure DACx_OUT1 LFSR noise mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW1); + DAC_CTL0(dac_periph) |= (unmask_bits << OUT1_REG_OFFSET); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure DAC triangle noise mode + \param[in] dac_periph: DACx(x=0) + \param[in] dac_out: DAC_OUTx(x=0,1) + \param[in] amplitude: the amplitude of the triangle + only one parameter can be selected which is shown as below: + \arg DAC_TRIANGLE_AMPLITUDE_1: triangle amplitude is 1 + \arg DAC_TRIANGLE_AMPLITUDE_3: triangle amplitude is 3 + \arg DAC_TRIANGLE_AMPLITUDE_7: triangle amplitude is 7 + \arg DAC_TRIANGLE_AMPLITUDE_15: triangle amplitude is 15 + \arg DAC_TRIANGLE_AMPLITUDE_31: triangle amplitude is 31 + \arg DAC_TRIANGLE_AMPLITUDE_63: triangle amplitude is 63 + \arg DAC_TRIANGLE_AMPLITUDE_127: triangle amplitude is 127 + \arg DAC_TRIANGLE_AMPLITUDE_255: triangle amplitude is 255 + \arg DAC_TRIANGLE_AMPLITUDE_511: triangle amplitude is 511 + \arg DAC_TRIANGLE_AMPLITUDE_1023: triangle amplitude is 1023 + \arg DAC_TRIANGLE_AMPLITUDE_2047: triangle amplitude is 2047 + \arg DAC_TRIANGLE_AMPLITUDE_4095: triangle amplitude is 4095 + \param[out] none + \retval none +*/ +void dac_triangle_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t amplitude) +{ + if(DAC_OUT0 == dac_out){ + /* configure DACx_OUT0 triangle noise mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW0); + DAC_CTL0(dac_periph) |= amplitude; + }else if(DAC_OUT1 == dac_out){ + /* configure DACx_OUT1 triangle noise mode */ + DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW1); + DAC_CTL0(dac_periph) |= (amplitude << OUT1_REG_OFFSET); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC concurrent mode + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_concurrent_enable(uint32_t dac_periph) +{ + uint32_t ctl = 0U; + + ctl = (uint32_t)(DAC_CTL0_DEN0 | DAC_CTL0_DEN1); + DAC_CTL0(dac_periph) |= (uint32_t)ctl; +} + +/*! + \brief disable DAC concurrent mode + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_concurrent_disable(uint32_t dac_periph) +{ + uint32_t ctl = 0U; + + ctl = (uint32_t)(DAC_CTL0_DEN0 | DAC_CTL0_DEN1); + DAC_CTL0(dac_periph) &= (uint32_t)(~ctl); +} + +/*! + \brief enable DAC concurrent software trigger + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_concurrent_software_trigger_enable(uint32_t dac_periph) +{ + uint32_t swt = 0U; + + swt = (uint32_t)(DAC_SWT_SWTR0 | DAC_SWT_SWTR1); + DAC_SWT(dac_periph) |= (uint32_t)swt; +} + +/*! + \brief enable DAC concurrent buffer function + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_enable(uint32_t dac_periph) +{ + uint32_t ctl = 0U; + + ctl = (uint32_t)(DAC_CTL0_DBOFF0 | DAC_CTL0_DBOFF1); + DAC_CTL0(dac_periph) &= (uint32_t)(~ctl); +} + +/*! + \brief disable DAC concurrent buffer function + \param[in] dac_periph: DACx(x=0) + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_disable(uint32_t dac_periph) +{ + uint32_t ctl = 0U; + + ctl = (uint32_t)(DAC_CTL0_DBOFF0 | DAC_CTL0_DBOFF1); + DAC_CTL0(dac_periph) |= (uint32_t)ctl; +} + +/*! + \brief set DAC concurrent mode data holding register value + \param[in] dac_periph: DACx(x=0) + \param[in] dac_align: DAC data alignment mode + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_12B_R: 12-bit right-aligned data + \arg DAC_ALIGN_12B_L: 12-bit left-aligned data + \arg DAC_ALIGN_8B_R: 8-bit right-aligned data + \param[in] data0: data to be loaded(0~4095) + \param[in] data1: data to be loaded(0~4095) + \param[out] none + \retval none +*/ +void dac_concurrent_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data0, uint16_t data1) +{ + uint32_t data = 0U; + + switch(dac_align){ + /* 12-bit right-aligned data */ + case DAC_ALIGN_12B_R: + data = (uint32_t)(((uint32_t)data1 << DH_12BIT_OFFSET) | data0); + DACC_R12DH(dac_periph) = (uint32_t)data; + break; + /* 12-bit left-aligned data */ + case DAC_ALIGN_12B_L: + data = (uint32_t)(((uint32_t)data1 << DH_12BIT_OFFSET) | data0); + DACC_L12DH(dac_periph) = (uint32_t)data; + break; + /* 8-bit right-aligned data */ + case DAC_ALIGN_8B_R: + data = (uint32_t)(((uint32_t)data1 << DH_8BIT_OFFSET) | data0); + DACC_R8DH(dac_periph) = (uint32_t)data; + break; + default: + break; + } +} + +/*! + \brief get the DAC flag + \param[in] dac_periph: DACx(x=0) + \param[in] flag: the DAC status flags, only one parameter can be selected which is shown + as below: + \arg DAC_FLAG_DDUDR0: DACx_OUT0 DMA underrun flag + \arg DAC_FLAG_DDUDR1: DACx_OUT1 DMA underrun flag + \param[out] none + \retval the state of DAC bit(SET or RESET) +*/ +FlagStatus dac_flag_get(uint32_t dac_periph, uint32_t flag) +{ + if(flag & DAC_STAT_FLAG_MASK0){ + /* check DAC_STAT0 flag */ + if(RESET != (DAC_STAT0(dac_periph) & flag)){ + return SET; + }else{ + return RESET; + } + }else{ + /* illegal parameters */ + return RESET; + } +} + +/*! + \brief clear the DAC flag + \param[in] dac_periph: DACx(x=0) + \param[in] flag: DAC flag + one or more parameter can be selected which are shown as below: + \arg DAC_FLAG_DDUDR0: DACx_OUT0 DMA underrun flag + \arg DAC_FLAG_DDUDR1: DACx_OUT1 DMA underrun flag + \param[out] none + \retval none +*/ +void dac_flag_clear(uint32_t dac_periph, uint32_t flag) +{ + if(flag & DAC_STAT_FLAG_MASK0){ + /* check DAC_STAT0 flag */ + DAC_STAT0(dac_periph) = (uint32_t)(flag & DAC_STAT_FLAG_MASK0); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable DAC interrupt(DAC DMA underrun interrupt) + \param[in] dac_periph: DACx(x=0) + \param[in] interrupt: the DAC interrupt + one or more parameter can be selected which are shown as below: + \arg DAC_INT_DDUDR0: DACx_OUT0 DMA underrun interrupt + \arg DAC_INT_DDUDR1: DACx_OUT1 DMA underrun interrupt + \param[out] none + \retval none +*/ +void dac_interrupt_enable(uint32_t dac_periph, uint32_t interrupt) +{ + if(interrupt & DAC_INT_EN_MASK0){ + /* enable underrun interrupt */ + DAC_CTL0(dac_periph) |= (uint32_t)(interrupt & DAC_INT_EN_MASK0); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief disable DAC interrupt(DAC DMA underrun interrupt) + \param[in] dac_periph: DACx(x=0) + \param[in] interrupt: the DAC interrupt + one and more parameter can be selected which are shown as below: + \arg DAC_INT_DDUDR0: DACx_OUT0 DMA underrun interrupt + \arg DAC_INT_DDUDR1: DACx_OUT1 DMA underrun interrupt + \param[out] none + \retval none +*/ +void dac_interrupt_disable(uint32_t dac_periph, uint32_t interrupt) +{ + if(interrupt & DAC_INT_EN_MASK0){ + /* disable underrun interrupt */ + DAC_CTL0(dac_periph) &= (uint32_t)(~(interrupt & DAC_INT_EN_MASK0)); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief get the DAC interrupt flag(DAC DMA underrun interrupt flag) + \param[in] dac_periph: DACx(x=0) + \param[in] int_flag: DAC interrupt flag + only one parameter can be selected which is shown as below: + \arg DAC_INT_FLAG_DDUDR0: DACx_OUT0 DMA underrun interrupt flag + \arg DAC_INT_FLAG_DDUDR1: DACx_OUT1 DMA underrun interrupt flag + \param[out] none + \retval the state of DAC interrupt flag(SET or RESET) +*/ +FlagStatus dac_interrupt_flag_get(uint32_t dac_periph, uint32_t int_flag) +{ + uint32_t reg1 = 0U, reg2 = 0U; + + if(int_flag & DAC_INT_FLAG_MASK0){ + /* check underrun interrupt int_flag */ + reg1 = DAC_STAT0(dac_periph) & int_flag; + reg2 = DAC_CTL0(dac_periph) & int_flag; + }else{ + /* illegal parameters */ + } + + /*get DAC interrupt flag status */ + if((RESET != reg1) && (RESET != reg2)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear the DAC interrupt flag(DAC DMA underrun interrupt flag) + \param[in] dac_periph: DACx(x=0) + \param[in] int_flag: DAC interrupt flag + one or more parameter can be selected which are shown as below: + \arg DAC_INT_FLAG_DDUDR0: DACx_OUT0 DMA underrun interrupt flag + \arg DAC_INT_FLAG_DDUDR1: DACx_OUT1 DMA underrun interrupt flag + \param[out] none + \retval none +*/ +void dac_interrupt_flag_clear(uint32_t dac_periph, uint32_t int_flag) +{ + /* clear underrun interrupt int_flag */ + if(int_flag & DAC_INT_FLAG_MASK0){ + DAC_STAT0(dac_periph) = (uint32_t)(int_flag & DAC_INT_FLAG_MASK0); + }else{ + /* illegal parameters */ + } +} + diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c new file mode 100644 index 00000000000..7287918bc93 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c @@ -0,0 +1,209 @@ +/*! + \file gd32f5xx_dbg.c + \brief DBG driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_dbg.h" + +#define DBG_RESET_VAL 0x00000000U +#define DBG_DEVICEID_SET(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +/*! + \brief deinitialize the DBG + \param[in] none + \param[out] none + \retval none +*/ +void dbg_deinit(void) +{ + DBG_CTL0 = DBG_RESET_VAL; + DBG_CTL1 = DBG_RESET_VAL; + DBG_CTL2 = DBG_RESET_VAL; +} + +/*! + \brief read DBG_ID code register + \param[in] none + \param[out] none + \retval DBG_ID code +*/ +uint32_t dbg_id_get(void) +{ + return DBG_ID; +} + +/*! + \brief enable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + this parameter can be any combination of the following values: + \arg DBG_LOW_POWER_SLEEP: keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_enable(uint32_t dbg_low_power) +{ + DBG_CTL0 |= dbg_low_power; +} + +/*! + \brief disable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + this parameter can be any combination of the following values: + \arg DBG_LOW_POWER_SLEEP: donot keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: donot keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: donot keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_disable(uint32_t dbg_low_power) +{ + DBG_CTL0 &= ~dbg_low_power; +} + +/*! + \brief enable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: dbg_periph_enum + only one parameter can be selected which is shown as below: + \arg DBG_TIMER1_HOLD: hold TIMER1 counter when core is halted + \arg DBG_TIMER2_HOLD: hold TIMER2 counter when core is halted + \arg DBG_TIMER3_HOLD: hold TIMER3 counter when core is halted + \arg DBG_TIMER4_HOLD: hold TIMER4 counter when core is halted + \arg DBG_TIMER5_HOLD: hold TIMER5 counter when core is halted + \arg DBG_TIMER6_HOLD: hold TIMER6 counter when core is halted + \arg DBG_TIMER11_HOLD: hold TIMER11 counter when core is halted + \arg DBG_TIMER12_HOLD: hold TIMER12 counter when core is halted + \arg DBG_TIMER13_HOLD: hold TIMER13 counter when core is halted + \arg DBG_RTC_HOLD: hold RTC calendar and wakeup counter when core is halted + \arg DBG_WWDGT_HOLD: debug WWDGT kept when core is halted + \arg DBG_FWDGT_HOLD: debug FWDGT kept when core is halted + \arg DBG_I2C3_HOLD: hold I2C3 smbus when core is halted + \arg DBG_I2C4_HOLD: hold I2C4 smbus when core is halted + \arg DBG_I2C5_HOLD: hold I2C5 smbus when core is halted + \arg DBG_I2C0_HOLD: hold I2C0 smbus when core is halted + \arg DBG_I2C1_HOLD: hold I2C1 smbus when core is halted + \arg DBG_I2C2_HOLD: hold I2C2 smbus when core is halted + \arg DBG_CAN0_HOLD: debug CAN0 kept when core is halted + \arg DBG_CAN1_HOLD: debug CAN1 kept when core is halted + \arg DBG_TIMER0_HOLD: hold TIMER0 counter when core is halted + \arg DBG_TIMER7_HOLD: hold TIMER7 counter when core is halted + \arg DBG_TIMER8_HOLD: hold TIMER8 counter when core is halted + \arg DBG_TIMER9_HOLD: hold TIMER9 counter when core is halted + \arg DBG_TIMER10_HOLD: hold TIMER10 counter when core is halted + \retval none +*/ +void dbg_periph_enable(dbg_periph_enum dbg_periph) +{ + DBG_REG_VAL(dbg_periph) |= BIT(DBG_BIT_POS(dbg_periph)); +} + +/*! + \brief disable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: dbg_periph_enum + only one parameter can be selected which is shown as below: + \arg DBG_TIMER1_HOLD: hold TIMER1 counter when core is halted + \arg DBG_TIMER2_HOLD: hold TIMER2 counter when core is halted + \arg DBG_TIMER3_HOLD: hold TIMER3 counter when core is halted + \arg DBG_TIMER4_HOLD: hold TIMER4 counter when core is halted + \arg DBG_TIMER5_HOLD: hold TIMER5 counter when core is halted + \arg DBG_TIMER6_HOLD: hold TIMER6 counter when core is halted + \arg DBG_TIMER11_HOLD: hold TIMER11 counter when core is halted + \arg DBG_TIMER12_HOLD: hold TIMER12 counter when core is halted + \arg DBG_TIMER13_HOLD: hold TIMER13 counter when core is halted + \arg DBG_RTC_HOLD: hold RTC calendar and wakeup counter when core is halted + \arg DBG_WWDGT_HOLD: debug WWDGT kept when core is halted + \arg DBG_FWDGT_HOLD: debug FWDGT kept when core is halted + \arg DBG_I2C3_HOLD: hold I2C3 smbus when core is halted + \arg DBG_I2C4_HOLD: hold I2C4 smbus when core is halted + \arg DBG_I2C5_HOLD: hold I2C5 smbus when core is halted + \arg DBG_I2C0_HOLD: hold I2C0 smbus when core is halted + \arg DBG_I2C1_HOLD: hold I2C1 smbus when core is halted + \arg DBG_I2C2_HOLD: hold I2C2 smbus when core is halted + \arg DBG_CAN0_HOLD: debug CAN0 kept when core is halted + \arg DBG_CAN1_HOLD: debug CAN1 kept when core is halted + \arg DBG_TIMER0_HOLD: hold TIMER0 counter when core is halted + \arg DBG_TIMER7_HOLD: hold TIMER7 counter when core is halted + \arg DBG_TIMER8_HOLD: hold TIMER8 counter when core is halted + \arg DBG_TIMER9_HOLD: hold TIMER9 counter when core is halted + \arg DBG_TIMER10_HOLD: hold TIMER10 counter when core is halted + \param[out] none + \retval none +*/ +void dbg_periph_disable(dbg_periph_enum dbg_periph) +{ + DBG_REG_VAL(dbg_periph) &= ~BIT(DBG_BIT_POS(dbg_periph)); +} + +/*! + \brief enable trace pin assignment + \param[in] none + \param[out] none + \retval none +*/ +void dbg_trace_pin_enable(void) +{ + DBG_CTL0 |= DBG_CTL0_TRACE_IOEN; +} + +/*! + \brief disable trace pin assignment + \param[in] none + \param[out] none + \retval none +*/ +void dbg_trace_pin_disable(void) +{ + DBG_CTL0 &= ~DBG_CTL0_TRACE_IOEN; +} + + +/*! + \brief read DBG DEVICEID + \param[in] none + \param[out] none + \retval DBG DEVICEID +*/ +uint32_t dbg_deviceid_get(void) +{ + return DBG_CTL3; +} + +/*! + \brief write DBG DEVICEID + \param[in] deviceid: deviceid which connect to MCU instanceid + \param[out] none + \retval none +*/ +void dbg_deviceid_set(uint32_t deviceid) +{ + DBG_CTL3 = (uint32_t)DBG_DEVICEID_SET(deviceid); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c new file mode 100644 index 00000000000..bc2aae23eed --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c @@ -0,0 +1,343 @@ +/*! + \file gd32f5xx_dci.c + \brief DCI driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_dci.h" + +/*! + \brief DCI deinit + \param[in] none + \param[out] none + \retval none +*/ +void dci_deinit(void) +{ + rcu_periph_reset_enable(RCU_DCIRST); + rcu_periph_reset_disable(RCU_DCIRST); +} + +/*! + \brief initialize DCI registers + \param[in] dci_struct: DCI parameter initialization structure + members of the structure and the member values are shown as below: + capture_mode : DCI_CAPTURE_MODE_CONTINUOUS, DCI_CAPTURE_MODE_SNAPSHOT + colck_polarity : DCI_CK_POLARITY_FALLING, DCI_CK_POLARITY_RISING + hsync_polarity : DCI_HSYNC_POLARITY_LOW, DCI_HSYNC_POLARITY_HIGH + vsync_polarity : DCI_VSYNC_POLARITY_LOW, DCI_VSYNC_POLARITY_HIGH + frame_rate : DCI_FRAME_RATE_ALL, DCI_FRAME_RATE_1_2, DCI_FRAME_RATE_1_4 + interface_format: DCI_INTERFACE_FORMAT_8BITS, DCI_INTERFACE_FORMAT_10BITS, + DCI_INTERFACE_FORMAT_12BITS, DCI_INTERFACE_FORMAT_14BITS + \param[out] none + \retval none +*/ +void dci_init(dci_parameter_struct *dci_struct) +{ + uint32_t reg = 0U; + /* disable capture function and DCI */ + DCI_CTL &= ~(DCI_CTL_CAP | DCI_CTL_DCIEN); + /* configure DCI parameter */ + reg |= dci_struct->capture_mode; + reg |= dci_struct->clock_polarity; + reg |= dci_struct->hsync_polarity; + reg |= dci_struct->vsync_polarity; + reg |= dci_struct->frame_rate; + reg |= dci_struct->interface_format; + + DCI_CTL = reg; +} + +/*! + \brief enable DCI function + \param[in] none + \param[out] none + \retval none +*/ +void dci_enable(void) +{ + DCI_CTL |= DCI_CTL_DCIEN; +} + +/*! + \brief disable DCI function + \param[in] none + \param[out] none + \retval none +*/ +void dci_disable(void) +{ + DCI_CTL &= ~DCI_CTL_DCIEN; +} + +/*! + \brief enable DCI capture + \param[in] none + \param[out] none + \retval none +*/ +void dci_capture_enable(void) +{ + DCI_CTL |= DCI_CTL_CAP; +} + +/*! + \brief disable DCI capture + \param[in] none + \param[out] none + \retval none +*/ +void dci_capture_disable(void) +{ + DCI_CTL &= ~DCI_CTL_CAP; +} + +/*! + \brief enable DCI jpeg mode + \param[in] none + \param[out] none + \retval none +*/ +void dci_jpeg_enable(void) +{ + DCI_CTL |= DCI_CTL_JM; +} + +/*! + \brief disable DCI jpeg mode + \param[in] none + \param[out] none + \retval none +*/ +void dci_jpeg_disable(void) +{ + DCI_CTL &= ~DCI_CTL_JM; +} + +/*! + \brief enable cropping window function + \param[in] none + \param[out] none + \retval none +*/ +void dci_crop_window_enable(void) +{ + DCI_CTL |= DCI_CTL_WDEN; +} + +/*! + \brief disable cropping window function + \param[in] none + \param[out] none + \retval none +*/ +void dci_crop_window_disable(void) +{ + DCI_CTL &= ~DCI_CTL_WDEN; +} + +/*! + \brief configure DCI cropping window + \param[in] start_x: window horizontal start position + \param[in] start_y: window vertical start position + \param[in] size_width: window horizontal size + \param[in] size_height: window vertical size + \param[out] none + \retval none +*/ +void dci_crop_window_config(uint16_t start_x, uint16_t start_y, uint16_t size_width, uint16_t size_height) +{ + DCI_CWSPOS = ((uint32_t)start_x | ((uint32_t)start_y << 16)); + DCI_CWSZ = ((uint32_t)size_width | ((uint32_t)size_height << 16)); +} + +/*! + \brief enable embedded synchronous mode + \param[in] none + \param[out] none + \retval none +*/ +void dci_embedded_sync_enable(void) +{ + DCI_CTL |= DCI_CTL_ESM; +} + +/*! + \brief disable embedded synchronous mode + \param[in] none + \param[out] none + \retval none +*/ +void dci_embedded_sync_disable(void) +{ + DCI_CTL &= ~DCI_CTL_ESM; +} +/*! + \brief configure synchronous codes in embedded synchronous mode + \param[in] frame_start: frame start code in embedded synchronous mode + \param[in] line_start: line start code in embedded synchronous mode + \param[in] line_end: line end code in embedded synchronous mode + \param[in] frame_end: frame end code in embedded synchronous mode + \param[out] none + \retval none +*/ +void dci_sync_codes_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end) +{ + DCI_SC = ((uint32_t)frame_start | ((uint32_t)line_start << 8) | ((uint32_t)line_end << 16) | ((uint32_t)frame_end << 24)); +} + +/*! + \brief configure synchronous codes unmask in embedded synchronous mode + \param[in] frame_start: frame start code unmask bits in embedded synchronous mode + \param[in] line_start: line start code unmask bits in embedded synchronous mode + \param[in] line_end: line end code unmask bits in embedded synchronous mode + \param[in] frame_end: frame end code unmask bits in embedded synchronous mode + \param[out] none + \retval none +*/ +void dci_sync_codes_unmask_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end) +{ + DCI_SCUMSK = ((uint32_t)frame_start | ((uint32_t)line_start << 8) | ((uint32_t)line_end << 16) | ((uint32_t)frame_end << 24)); +} + +/*! + \brief read DCI data register + \param[in] none + \param[out] none + \retval data +*/ +uint32_t dci_data_read(void) +{ + return DCI_DATA; +} + +/*! + \brief get specified flag + \param[in] flag: + \arg DCI_FLAG_HS: HS line status + \arg DCI_FLAG_VS: VS line status + \arg DCI_FLAG_FV:FIFO valid + \arg DCI_FLAG_EF: end of frame flag + \arg DCI_FLAG_OVR: FIFO overrun flag + \arg DCI_FLAG_ESE: embedded synchronous error flag + \arg DCI_FLAG_VSYNC: vsync flag + \arg DCI_FLAG_EL: end of line flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dci_flag_get(uint32_t flag) +{ + uint32_t stat = 0U; + + if(flag >> 31) { + /* get flag status from DCI_STAT1 register */ + stat = DCI_STAT1; + } else { + /* get flag status from DCI_STAT0 register */ + stat = DCI_STAT0; + } + + if(flag & stat) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief enable specified DCI interrupt + \param[in] interrupt: + \arg DCI_INT_EF: end of frame interrupt + \arg DCI_INT_OVR: FIFO overrun interrupt + \arg DCI_INT_ESE: embedded synchronous error interrupt + \arg DCI_INT_VSYNC: vsync interrupt + \arg DCI_INT_EL: end of line interrupt + \param[out] none + \retval none +*/ +void dci_interrupt_enable(uint32_t interrupt) +{ + DCI_INTEN |= interrupt; +} + +/*! + \brief disable specified DCI interrupt + \param[in] interrupt: + \arg DCI_INT_EF: end of frame interrupt + \arg DCI_INT_OVR: FIFO overrun interrupt + \arg DCI_INT_ESE: embedded synchronous error interrupt + \arg DCI_INT_VSYNC: vsync interrupt + \arg DCI_INT_EL: end of line interrupt + \param[out] none + \retval none +*/ +void dci_interrupt_disable(uint32_t interrupt) +{ + DCI_INTEN &= ~interrupt; +} + +/*! + \brief clear specified interrupt flag + \param[in] int_flag: + \arg DCI_INT_EF: end of frame interrupt + \arg DCI_INT_OVR: FIFO overrun interrupt + \arg DCI_INT_ESE: embedded synchronous error interrupt + \arg DCI_INT_VSYNC: vsync interrupt + \arg DCI_INT_EL: end of line interrupt + \param[out] none + \retval none +*/ +void dci_interrupt_flag_clear(uint32_t int_flag) +{ + DCI_INTC |= int_flag; +} + +/*! + \brief get specified interrupt flag + \param[in] int_flag: + \arg DCI_INT_FLAG_EF: end of frame interrupt flag + \arg DCI_INT_FLAG_OVR: FIFO overrun interrupt flag + \arg DCI_INT_FLAG_ESE: embedded synchronous error interrupt flag + \arg DCI_INT_FLAG_VSYNC: vsync interrupt flag + \arg DCI_INT_FLAG_EL: end of line interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dci_interrupt_flag_get(uint32_t int_flag) +{ + if(RESET == (DCI_INTF & int_flag)) { + return RESET; + } else { + return SET; + } +} + + diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c new file mode 100644 index 00000000000..df86bfa7c71 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c @@ -0,0 +1,902 @@ +/*! + \file gd32f5xx_dma.c + \brief DMA driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_dma.h" + +/* DMA register bit offset */ +#define CHXCTL_PERIEN_OFFSET ((uint32_t)25U) + +/*! + \brief deinitialize DMA a channel registers + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is deinitialized + \arg DMA_CHx(x=0..7) + \param[out] none + \retval none +*/ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx) +{ + /* disable DMA a channel */ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; + /* reset DMA channel registers */ + DMA_CHCTL(dma_periph, channelx) = DMA_CHCTL_RESET_VALUE; + DMA_CHCNT(dma_periph, channelx) = DMA_CHCNT_RESET_VALUE; + DMA_CHPADDR(dma_periph, channelx) = DMA_CHPADDR_RESET_VALUE; + DMA_CHM0ADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; + DMA_CHM1ADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; + DMA_CHFCTL(dma_periph, channelx) = DMA_CHFCTL_RESET_VALUE; + if(channelx < DMA_CH4) { + DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); + } else { + channelx -= (dma_channel_enum)4; + DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); + } +} + +/*! + \brief initialize the DMA single data mode parameters struct with the default values + \param[in] init_struct: the initialization data needed to initialize DMA channel + \param[out] none + \retval none +*/ +void dma_single_data_para_struct_init(dma_single_data_parameter_struct *init_struct) +{ + /* set the DMA struct with the default values */ + init_struct->periph_addr = 0U; + init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; + init_struct->memory0_addr = 0U; + init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; + init_struct->periph_memory_width = 0U; + init_struct->circular_mode = DMA_CIRCULAR_MODE_DISABLE; + init_struct->direction = DMA_PERIPH_TO_MEMORY; + init_struct->number = 0U; + init_struct->priority = DMA_PRIORITY_LOW; +} + +/*! + \brief initialize the DMA multi data mode parameters struct with the default values + \param[in] init_struct: the initialization data needed to initialize DMA channel + \param[out] none + \retval none +*/ +void dma_multi_data_para_struct_init(dma_multi_data_parameter_struct *init_struct) +{ + /* set the DMA struct with the default values */ + init_struct->periph_addr = 0U; + init_struct->periph_width = 0U; + init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; + init_struct->memory0_addr = 0U; + init_struct->memory_width = 0U; + init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; + init_struct->memory_burst_width = 0U; + init_struct->periph_burst_width = 0U; + init_struct->circular_mode = DMA_CIRCULAR_MODE_DISABLE; + init_struct->direction = DMA_PERIPH_TO_MEMORY; + init_struct->number = 0U; + init_struct->priority = DMA_PRIORITY_LOW; +} + +/*! + \brief initialize DMA single data mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is initialized + \arg DMA_CHx(x=0..7) + \param[in] init_struct: the data needed to initialize DMA single data mode + periph_addr: peripheral base address + periph_inc: DMA_PERIPH_INCREASE_ENABLE,DMA_PERIPH_INCREASE_DISABLE,DMA_PERIPH_INCREASE_FIX + memory0_addr: memory base address + memory_inc: DMA_MEMORY_INCREASE_ENABLE,DMA_MEMORY_INCREASE_DISABLE + periph_memory_width: DMA_PERIPH_WIDTH_8BIT,DMA_PERIPH_WIDTH_16BIT,DMA_PERIPH_WIDTH_32BIT + circular_mode: DMA_CIRCULAR_MODE_ENABLE,DMA_CIRCULAR_MODE_DISABLE + direction: DMA_PERIPH_TO_MEMORY,DMA_MEMORY_TO_PERIPH,DMA_MEMORY_TO_MEMORY + number: the number of remaining data to be transferred by the DMA + priority: DMA_PRIORITY_LOW,DMA_PRIORITY_MEDIUM,DMA_PRIORITY_HIGH,DMA_PRIORITY_ULTRA_HIGH + \param[out] none + \retval none +*/ +void dma_single_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_single_data_parameter_struct *init_struct) +{ + uint32_t ctl; + + /* select single data mode */ + DMA_CHFCTL(dma_periph, channelx) &= ~DMA_CHXFCTL_MDMEN; + + /* configure peripheral base address */ + DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; + + /* configure memory base address */ + DMA_CHM0ADDR(dma_periph, channelx) = init_struct->memory0_addr; + + /* configure the number of remaining data to be transferred */ + DMA_CHCNT(dma_periph, channelx) = init_struct->number; + + /* configure peripheral and memory transfer width,channel priotity,transfer mode */ + ctl = DMA_CHCTL(dma_periph, channelx); + ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO | DMA_CHXCTL_TM); + ctl |= (init_struct->periph_memory_width | (init_struct->periph_memory_width << 2) | init_struct->priority | init_struct->direction); + DMA_CHCTL(dma_periph, channelx) = ctl; + + /* configure peripheral increasing mode */ + if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + } else if(DMA_PERIPH_INCREASE_DISABLE == init_struct->periph_inc) { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; + } + + /* configure memory increasing mode */ + if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; + } + + /* configure DMA circular mode */ + if(DMA_CIRCULAR_MODE_ENABLE == init_struct->circular_mode) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; + } else { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; + } +} + +/*! + \brief initialize DMA multi data mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is initialized + \arg DMA_CHx(x=0..7) + \param[in] dma_multi_data_parameter_struct: the data needed to initialize DMA multi data mode + periph_addr: peripheral base address + periph_width: DMA_PERIPH_WIDTH_8BIT,DMA_PERIPH_WIDTH_16BIT,DMA_PERIPH_WIDTH_32BIT + periph_inc: DMA_PERIPH_INCREASE_ENABLE,DMA_PERIPH_INCREASE_DISABLE,DMA_PERIPH_INCREASE_FIX + memory0_addr: memory0 base address + memory_width: DMA_MEMORY_WIDTH_8BIT,DMA_MEMORY_WIDTH_16BIT,DMA_MEMORY_WIDTH_32BIT + memory_inc: DMA_MEMORY_INCREASE_ENABLE,DMA_MEMORY_INCREASE_DISABLE + memory_burst_width: DMA_MEMORY_BURST_SINGLE,DMA_MEMORY_BURST_4_BEAT,DMA_MEMORY_BURST_8_BEAT,DMA_MEMORY_BURST_16_BEAT + periph_burst_width: DMA_PERIPH_BURST_SINGLE,DMA_PERIPH_BURST_4_BEAT,DMA_PERIPH_BURST_8_BEAT,DMA_PERIPH_BURST_16_BEAT + critical_value: DMA_FIFO_1_WORD,DMA_FIFO_2_WORD,DMA_FIFO_3_WORD,DMA_FIFO_4_WORD + circular_mode: DMA_CIRCULAR_MODE_ENABLE,DMA_CIRCULAR_MODE_DISABLE + direction: DMA_PERIPH_TO_MEMORY,DMA_MEMORY_TO_PERIPH,DMA_MEMORY_TO_MEMORY + number: the number of remaining data to be transferred by the DMA + priority: DMA_PRIORITY_LOW,DMA_PRIORITY_MEDIUM,DMA_PRIORITY_HIGH,DMA_PRIORITY_ULTRA_HIGH + \param[out] none + \retval none +*/ +void dma_multi_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_multi_data_parameter_struct *init_struct) +{ + uint32_t ctl; + + /* select multi data mode and configure FIFO critical value */ + DMA_CHFCTL(dma_periph, channelx) |= (DMA_CHXFCTL_MDMEN | init_struct->critical_value); + + /* configure peripheral base address */ + DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; + + /* configure memory base address */ + DMA_CHM0ADDR(dma_periph, channelx) = init_struct->memory0_addr; + + /* configure the number of remaining data to be transferred */ + DMA_CHCNT(dma_periph, channelx) = init_struct->number; + + /* configure peripheral and memory transfer width,channel priotity,transfer mode,peripheral and memory burst transfer width */ + ctl = DMA_CHCTL(dma_periph, channelx); + ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO | DMA_CHXCTL_TM | DMA_CHXCTL_PBURST | DMA_CHXCTL_MBURST); + ctl |= (init_struct->periph_width | (init_struct->memory_width) | init_struct->priority | init_struct->direction | init_struct->memory_burst_width | + init_struct->periph_burst_width); + DMA_CHCTL(dma_periph, channelx) = ctl; + + /* configure peripheral increasing mode */ + if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + } else if(DMA_PERIPH_INCREASE_DISABLE == init_struct->periph_inc) { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; + } + + /* configure memory increasing mode */ + if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; + } + + /* configure DMA circular mode */ + if(DMA_CIRCULAR_MODE_ENABLE == init_struct->circular_mode) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; + } else { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; + } +} + +/*! + \brief set DMA peripheral base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set peripheral base address + \arg DMA_CHx(x=0..7) + \param[in] address: peripheral base address + \param[out] none + \retval none +*/ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) +{ + DMA_CHPADDR(dma_periph, channelx) = address; +} + +/*! + \brief set DMA Memory0 base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set Memory base address + \arg DMA_CHx(x=0..7) + \param[in] memory_flag: DMA_MEMORY_x(x=0,1) + \param[in] address: Memory base address + \param[out] none + \retval none +*/ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t memory_flag, uint32_t address) +{ + if(memory_flag) { + DMA_CHM1ADDR(dma_periph, channelx) = address; + } else { + DMA_CHM0ADDR(dma_periph, channelx) = address; + } +} + +/*! + \brief set the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + \arg DMA_CHx(x=0..7) + \param[in] number: the number of remaining data to be transferred by the DMA + \param[out] none + \retval none +*/ +void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number) +{ + DMA_CHCNT(dma_periph, channelx) = number; +} + +/*! + \brief get the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + \arg DMA_CHx(x=0..7) + \param[out] none + \retval uint32_t: the number of remaining data to be transferred by the DMA +*/ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx) +{ + return (uint32_t)DMA_CHCNT(dma_periph, channelx); +} + +/*! + \brief configure priority level of DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] priority: priority Level of this channel + only one parameter can be selected which is shown as below: + \arg DMA_PRIORITY_LOW: low priority + \arg DMA_PRIORITY_MEDIUM: medium priority + \arg DMA_PRIORITY_HIGH: high priority + \arg DMA_PRIORITY_ULTRA_HIGH: ultra high priority + \param[out] none + \retval none +*/ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PRIO; + ctl |= priority; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer burst beats of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] mbeat: transfer burst beats + \arg DMA_MEMORY_BURST_SINGLE: memory transfer single burst + \arg DMA_MEMORY_BURST_4_BEAT: memory transfer 4-beat burst + \arg DMA_MEMORY_BURST_8_BEAT: memory transfer 8-beat burst + \arg DMA_MEMORY_BURST_16_BEAT: memory transfer 16-beat burst + \param[out] none + \retval none +*/ +void dma_memory_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mbeat) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_MBURST; + ctl |= mbeat; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer burst beats of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] pbeat: transfer burst beats + only one parameter can be selected which is shown as below: + \arg DMA_PERIPH_BURST_SINGLE: peripheral transfer single burst + \arg DMA_PERIPH_BURST_4_BEAT: peripheral transfer 4-beat burst + \arg DMA_PERIPH_BURST_8_BEAT: peripheral transfer 8-beat burst + \arg DMA_PERIPH_BURST_16_BEAT: peripheral transfer 16-beat burst + \param[out] none + \retval none +*/ +void dma_periph_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t pbeat) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PBURST; + ctl |= pbeat; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] msize: transfer data size of memory + only one parameter can be selected which is shown as below: + \arg DMA_MEMORY_WIDTH_8BIT: transfer data size of memory is 8-bit + \arg DMA_MEMORY_WIDTH_16BIT: transfer data size of memory is 16-bit + \arg DMA_MEMORY_WIDTH_32BIT: transfer data size of memory is 32-bit + \param[out] none + \retval none +*/ +void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t msize) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_MWIDTH; + ctl |= msize; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] msize: transfer data size of peripheral + only one parameter can be selected which is shown as below: + \arg DMA_PERIPHERAL_WIDTH_8BIT: transfer data size of peripheral is 8-bit + \arg DMA_PERIPHERAL_WIDTH_16BIT: transfer data size of peripheral is 16-bit + \arg DMA_PERIPHERAL_WIDTH_32BIT: transfer data size of peripheral is 32-bit + \param[out] none + \retval none +*/ +void dma_periph_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t psize) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PWIDTH; + ctl |= psize; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure memory address generation generation_algorithm + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] generation_algorithm: the address generation algorithm + only one parameter can be selected which is shown as below: + \arg DMA_MEMORY_INCREASE_ENABLE: next address of memory is increasing address mode + \arg DMA_MEMORY_INCREASE_DISABLE: next address of memory is fixed address mode + \param[out] none + \retval none +*/ +void dma_memory_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm) +{ + if(DMA_MEMORY_INCREASE_ENABLE == generation_algorithm) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; + } +} + +/*! + \brief configure peripheral address generation_algorithm + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] generation_algorithm: the address generation algorithm + only one parameter can be selected which is shown as below: + \arg DMA_PERIPH_INCREASE_ENABLE: next address of peripheral is increasing address mode + \arg DMA_PERIPH_INCREASE_DISABLE: next address of peripheral is fixed address mode + \arg DMA_PERIPH_INCREASE_FIX: increasing steps of peripheral address is fixed + \param[out] none + \retval none +*/ +void dma_peripheral_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm) +{ + if(DMA_PERIPH_INCREASE_ENABLE == generation_algorithm) { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + } else if(DMA_PERIPH_INCREASE_DISABLE == generation_algorithm) { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; + } +} + +/*! + \brief enable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval none +*/ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; +} + +/*! + \brief disable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval none +*/ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; +} + +/*! + \brief enable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval none +*/ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CHEN; +} + +/*! + \brief disable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval none +*/ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; +} + +/*! + \brief configure the direction of data transfer on the channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] direction: specify the direction of data transfer + only one parameter can be selected which is shown as below: + \arg DMA_PERIPH_TO_MEMORY: read from peripheral and write to memory + \arg DMA_MEMORY_TO_PERIPH: read from memory and write to peripheral + \arg DMA_MEMORY_TO_MEMORY: read from memory and write to memory + \param[out] none + \retval none +*/ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t direction) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_TM; + ctl |= direction; + + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief DMA switch buffer mode config + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] memory1_addr: memory1 base address + \param[in] memory_select: DMA_MEMORY_0 or DMA_MEMORY_1 + \param[out] none + \retval none +*/ +void dma_switch_buffer_mode_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t memory1_addr, uint32_t memory_select) +{ + /* configure memory1 base address */ + DMA_CHM1ADDR(dma_periph, channelx) = memory1_addr; + + if(DMA_MEMORY_0 == memory_select) { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MBS; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MBS; + } +} + +/*! + \brief DMA using memory get + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval the using memory +*/ +uint32_t dma_using_memory_get(uint32_t dma_periph, dma_channel_enum channelx) +{ + if((DMA_CHCTL(dma_periph, channelx)) & DMA_CHXCTL_MBS) { + return DMA_MEMORY_1; + } else { + return DMA_MEMORY_0; + } +} + +/*! + \brief DMA channel peripheral select + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] sub_periph: specify DMA channel peripheral + \arg DMA_SUBPERIx(x=0..7) + \param[out] none + \retval none +*/ +void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph) +{ + uint32_t ctl; + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PERIEN; + ctl |= ((uint32_t)sub_periph << CHXCTL_PERIEN_OFFSET); + + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief DMA flow controller configure + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] controller: specify DMA flow controler + only one parameter can be selected which is shown as below: + \arg DMA_FLOW_CONTROLLER_DMA: DMA is the flow controller + \arg DMA_FLOW_CONTROLLER_PERI: peripheral is the flow controller + \param[out] none + \retval none +*/ +void dma_flow_controller_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t controller) +{ + if(DMA_FLOW_CONTROLLER_DMA == controller) { + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_TFCS; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_TFCS; + } +} + +/*! + \brief DMA switch buffer mode enable + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void dma_switch_buffer_mode_enable(uint32_t dma_periph, dma_channel_enum channelx, ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + /* switch buffer mode enable */ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_SBMEN; + } else { + /* switch buffer mode disable */ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_SBMEN; + } +} + +/*! + \brief DMA FIFO status get + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[out] none + \retval the using memory +*/ +uint32_t dma_fifo_status_get(uint32_t dma_periph, dma_channel_enum channelx) +{ + return (DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FCNT); +} + +/*! + \brief get DMA flag is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + \arg DMA_CHx(x=0..7) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_FEE: FIFO error and exception flag + \arg DMA_FLAG_SDE: single data mode exception flag + \arg DMA_FLAG_TAE: transfer access error flag + \arg DMA_FLAG_HTF: half transfer finish flag + \arg DMA_FLAG_FTF: full transger finish flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + if(channelx < DMA_CH4) { + if(DMA_INTF0(dma_periph) & DMA_FLAG_ADD(flag, channelx)) { + return SET; + } else { + return RESET; + } + } else { + channelx -= (dma_channel_enum)4; + if(DMA_INTF1(dma_periph) & DMA_FLAG_ADD(flag, channelx)) { + return SET; + } else { + return RESET; + } + } +} + +/*! + \brief clear DMA a channel flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + \arg DMA_CHx(x=0..7) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_FEE: FIFO error and exception flag + \arg DMA_FLAG_SDE: single data mode exception flag + \arg DMA_FLAG_TAE: transfer access error flag + \arg DMA_FLAG_HTF: half transfer finish flag + \arg DMA_FLAG_FTF: full transger finish flag + \param[out] none + \retval none +*/ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + if(channelx < DMA_CH4) { + DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(flag, channelx); + } else { + channelx -= (dma_channel_enum)4; + DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(flag, channelx); + } +} + +/*! + \brief enable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] interrupt: specify which interrupt to enbale + only one parameters can be selected which are shown as below: + \arg DMA_INT_SDE: single data mode exception interrupt enable + \arg DMA_INT_TAE: tranfer access error interrupt enable + \arg DMA_INT_HTF: half transfer finish interrupt enable + \arg DMA_INT_FTF: full transfer finish interrupt enable + \arg DMA_INT_FEE: FIFO exception interrupt enable + \param[out] none + \retval none +*/ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) +{ + if(DMA_INT_FEE != interrupt) { + DMA_CHCTL(dma_periph, channelx) |= interrupt; + } else { + DMA_CHFCTL(dma_periph, channelx) |= interrupt; + } +} + +/*! + \brief disable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + \arg DMA_CHx(x=0..7) + \param[in] interrupt: specify which interrupt to disbale + only one parameters can be selected which are shown as below: + \arg DMA_INT_SDE: single data mode exception interrupt enable + \arg DMA_INT_TAE: tranfer access error interrupt enable + \arg DMA_INT_HTF: half transfer finish interrupt enable + \arg DMA_INT_FTF: full transfer finish interrupt enable + \arg DMA_INT_FEE: FIFO exception interrupt enable + \param[out] none + \retval none +*/ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) +{ + if(DMA_INT_FEE != interrupt) { + DMA_CHCTL(dma_periph, channelx) &= ~interrupt; + } else { + DMA_CHFCTL(dma_periph, channelx) &= ~interrupt; + } +} + +/*! + \brief get DMA interrupt flag is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get interrupt flag + \arg DMA_CHx(x=0..7) + \param[in] interrupt: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_FEE: FIFO error and exception interrupt flag + \arg DMA_INT_FLAG_SDE: single data mode exception interrupt flag + \arg DMA_INT_FLAG_TAE: transfer access error interrupt flag + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag + \arg DMA_INT_FLAG_FTF: full transger finish interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) +{ + uint32_t interrupt_enable = 0U, interrupt_flag = 0U; + dma_channel_enum channel_flag_offset = channelx; + if(channelx < DMA_CH4) { + switch(interrupt) { + case DMA_INTF_FEEIF: + interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); + interrupt_enable = DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FEEIE; + break; + case DMA_INTF_SDEIF: + interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_SDEIE; + break; + case DMA_INTF_TAEIF: + interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_TAEIE; + break; + case DMA_INTF_HTFIF: + interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; + break; + case DMA_INTF_FTFIF: + interrupt_flag = (DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx)); + interrupt_enable = (DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE); + break; + default: + break; + } + } else { + channel_flag_offset -= (dma_channel_enum)4; + switch(interrupt) { + case DMA_INTF_FEEIF: + interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); + interrupt_enable = DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FEEIE; + break; + case DMA_INTF_SDEIF: + interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_SDEIE; + break; + case DMA_INTF_TAEIF: + interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_TAEIE; + break; + case DMA_INTF_HTFIF: + interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; + break; + case DMA_INTF_FTFIF: + interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE; + break; + default: + break; + } + } + + if(interrupt_flag && interrupt_enable) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear DMA a channel interrupt flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to clear interrupt flag + \arg DMA_CHx(x=0..7) + \param[in] interrupt: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_FEE: FIFO error and exception interrupt flag + \arg DMA_INT_FLAG_SDE: single data mode exception interrupt flag + \arg DMA_INT_FLAG_TAE: transfer access error interrupt flag + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag + \arg DMA_INT_FLAG_FTF: full transger finish interrupt flag + \param[out] none + \retval none +*/ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) +{ + if(channelx < DMA_CH4) { + DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(interrupt, channelx); + } else { + channelx -= (dma_channel_enum)4; + DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(interrupt, channelx); + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c new file mode 100644 index 00000000000..99235e3f0c1 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c @@ -0,0 +1,3701 @@ +/*! + \file gd32f5xx_enet.c + \brief ENET driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_enet.h" +#include + +#if defined (__CC_ARM) /*!< ARM compiler */ +__align(4) +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ +__align(4) +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ +__align(4) +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ +__align(4) +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ + +#elif defined ( __ICCARM__ ) /*!< IAR compiler */ +#pragma data_alignment=4 +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ +#pragma data_alignment=4 +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ +#pragma data_alignment=4 +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ +#pragma data_alignment=4 +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ + +#elif defined (__GNUC__) /* GNU Compiler */ +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM] __attribute__((aligned(4))); /*!< ENET RxDMA descriptor */ +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM] __attribute__((aligned(4))); /*!< ENET TxDMA descriptor */ +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__((aligned(4))); /*!< ENET receive buffer */ +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__((aligned(4))); /*!< ENET transmit buffer */ + +#endif /* __CC_ARM */ + +/* global transmit and receive descriptors pointers */ +enet_descriptors_struct *dma_current_txdesc; +enet_descriptors_struct *dma_current_rxdesc; + +/* structure pointer of ptp descriptor for normal mode */ +enet_descriptors_struct *dma_current_ptp_txdesc = NULL; +enet_descriptors_struct *dma_current_ptp_rxdesc = NULL; + +/* init structure parameters for ENET initialization */ +static enet_initpara_struct enet_initpara = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static uint32_t enet_unknow_err = 0U; +/* array of register offset for debug information get */ +static const uint16_t enet_reg_tab[] = { + 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0028, 0x002C, 0x0034, + + 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x1080, + + 0x0100, 0x0104, 0x0108, 0x010C, 0x0110, 0x014C, 0x0150, 0x0168, 0x0194, 0x0198, 0x01C4, + + 0x0700, 0x0704, 0x0708, 0x070C, 0x0710, 0x0714, 0x0718, 0x071C, 0x0720, 0x0728, 0x072C, + + 0x1000, 0x1004, 0x1008, 0x100C, 0x1010, 0x1014, 0x1018, 0x101C, 0x1020, 0x1024, 0x1048, + + 0x104C, 0x1050, 0x1054 +}; + +/* initialize ENET peripheral with generally concerned parameters, call it by enet_init() */ +static void enet_default_init(void); +#ifndef USE_DELAY +/* insert a delay time */ +static void enet_delay(uint32_t ncount); +#endif /* USE_DELAY */ + +/*! + \brief deinitialize the ENET, and reset structure parameters for ENET initialization + \param[in] none + \param[out] none + \retval none +*/ +void enet_deinit(void) +{ + rcu_periph_reset_enable(RCU_ENETRST); + rcu_periph_reset_disable(RCU_ENETRST); + enet_initpara_reset(); +} + +/*! + \brief configure the parameters which are usually less cared for initialization + note -- this function must be called before enet_init(), otherwise + configuration will be no effect + \param[in] option: different function option, which is related to several parameters, + only one parameter can be selected which is shown as below, refer to enet_option_enum + \arg FORWARD_OPTION: choose to configure the frame forward related parameters + \arg DMABUS_OPTION: choose to configure the DMA bus mode related parameters + \arg DMA_MAXBURST_OPTION: choose to configure the DMA max burst related parameters + \arg DMA_ARBITRATION_OPTION: choose to configure the DMA arbitration related parameters + \arg STORE_OPTION: choose to configure the store forward mode related parameters + \arg DMA_OPTION: choose to configure the DMA descriptor related parameters + \arg VLAN_OPTION: choose to configure vlan related parameters + \arg FLOWCTL_OPTION: choose to configure flow control related parameters + \arg HASHH_OPTION: choose to configure hash high + \arg HASHL_OPTION: choose to configure hash low + \arg FILTER_OPTION: choose to configure frame filter related parameters + \arg HALFDUPLEX_OPTION: choose to configure halfduplex mode related parameters + \arg TIMER_OPTION: choose to configure time counter related parameters + \arg INTERFRAMEGAP_OPTION: choose to configure the inter frame gap related parameters + \param[in] para: the related parameters according to the option + all the related parameters should be configured which are shown as below + FORWARD_OPTION related parameters: + - ENET_AUTO_PADCRC_DROP_ENABLE/ ENET_AUTO_PADCRC_DROP_DISABLE ; + - ENET_TYPEFRAME_CRC_DROP_ENABLE/ ENET_TYPEFRAME_CRC_DROP_DISABLE ; + - ENET_FORWARD_ERRFRAMES_ENABLE/ ENET_FORWARD_ERRFRAMES_DISABLE ; + - ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE/ ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE . + DMABUS_OPTION related parameters: + - ENET_ADDRESS_ALIGN_ENABLE/ ENET_ADDRESS_ALIGN_DISABLE ; + - ENET_FIXED_BURST_ENABLE/ ENET_FIXED_BURST_DISABLE ; + - ENET_MIXED_BURST_ENABLE/ ENET_MIXED_BURST_DISABLE ; + DMA_MAXBURST_OPTION related parameters: + - ENET_RXDP_1BEAT/ ENET_RXDP_2BEAT/ ENET_RXDP_4BEAT/ + ENET_RXDP_8BEAT/ ENET_RXDP_16BEAT/ ENET_RXDP_32BEAT/ + ENET_RXDP_4xPGBL_4BEAT/ ENET_RXDP_4xPGBL_8BEAT/ + ENET_RXDP_4xPGBL_16BEAT/ ENET_RXDP_4xPGBL_32BEAT/ + ENET_RXDP_4xPGBL_64BEAT/ ENET_RXDP_4xPGBL_128BEAT ; + - ENET_PGBL_1BEAT/ ENET_PGBL_2BEAT/ ENET_PGBL_4BEAT/ + ENET_PGBL_8BEAT/ ENET_PGBL_16BEAT/ ENET_PGBL_32BEAT/ + ENET_PGBL_4xPGBL_4BEAT/ ENET_PGBL_4xPGBL_8BEAT/ + ENET_PGBL_4xPGBL_16BEAT/ ENET_PGBL_4xPGBL_32BEAT/ + ENET_PGBL_4xPGBL_64BEAT/ ENET_PGBL_4xPGBL_128BEAT ; + - ENET_RXTX_DIFFERENT_PGBL/ ENET_RXTX_SAME_PGBL ; + DMA_ARBITRATION_OPTION related parameters: + - ENET_ARBITRATION_RXPRIORTX + - ENET_ARBITRATION_RXTX_1_1/ ENET_ARBITRATION_RXTX_2_1/ + ENET_ARBITRATION_RXTX_3_1/ ENET_ARBITRATION_RXTX_4_1/. + STORE_OPTION related parameters: + - ENET_RX_MODE_STOREFORWARD/ ENET_RX_MODE_CUTTHROUGH ; + - ENET_TX_MODE_STOREFORWARD/ ENET_TX_MODE_CUTTHROUGH ; + - ENET_RX_THRESHOLD_64BYTES/ ENET_RX_THRESHOLD_32BYTES/ + ENET_RX_THRESHOLD_96BYTES/ ENET_RX_THRESHOLD_128BYTES ; + - ENET_TX_THRESHOLD_64BYTES/ ENET_TX_THRESHOLD_128BYTES/ + ENET_TX_THRESHOLD_192BYTES/ ENET_TX_THRESHOLD_256BYTES/ + ENET_TX_THRESHOLD_40BYTES/ ENET_TX_THRESHOLD_32BYTES/ + ENET_TX_THRESHOLD_24BYTES/ ENET_TX_THRESHOLD_16BYTES . + DMA_OPTION related parameters: + - ENET_FLUSH_RXFRAME_ENABLE/ ENET_FLUSH_RXFRAME_DISABLE ; + - ENET_SECONDFRAME_OPT_ENABLE/ ENET_SECONDFRAME_OPT_DISABLE ; + - ENET_ENHANCED_DESCRIPTOR/ ENET_NORMAL_DESCRIPTOR . + VLAN_OPTION related parameters: + - ENET_VLANTAGCOMPARISON_12BIT/ ENET_VLANTAGCOMPARISON_16BIT ; + - MAC_VLT_VLTI(regval) . + FLOWCTL_OPTION related parameters: + - MAC_FCTL_PTM(regval) ; + - ENET_ZERO_QUANTA_PAUSE_ENABLE/ ENET_ZERO_QUANTA_PAUSE_DISABLE ; + - ENET_PAUSETIME_MINUS4/ ENET_PAUSETIME_MINUS28/ + ENET_PAUSETIME_MINUS144/ENET_PAUSETIME_MINUS256 ; + - ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT/ ENET_UNIQUE_PAUSEDETECT ; + - ENET_RX_FLOWCONTROL_ENABLE/ ENET_RX_FLOWCONTROL_DISABLE ; + - ENET_TX_FLOWCONTROL_ENABLE/ ENET_TX_FLOWCONTROL_DISABLE ; + - ENET_ACTIVE_THRESHOLD_256BYTES/ ENET_ACTIVE_THRESHOLD_512BYTES ; + - ENET_ACTIVE_THRESHOLD_768BYTES/ ENET_ACTIVE_THRESHOLD_1024BYTES ; + - ENET_ACTIVE_THRESHOLD_1280BYTES/ ENET_ACTIVE_THRESHOLD_1536BYTES ; + - ENET_ACTIVE_THRESHOLD_1792BYTES ; + - ENET_DEACTIVE_THRESHOLD_256BYTES/ ENET_DEACTIVE_THRESHOLD_512BYTES ; + - ENET_DEACTIVE_THRESHOLD_768BYTES/ ENET_DEACTIVE_THRESHOLD_1024BYTES ; + - ENET_DEACTIVE_THRESHOLD_1280BYTES/ ENET_DEACTIVE_THRESHOLD_1536BYTES ; + - ENET_DEACTIVE_THRESHOLD_1792BYTES . + HASHH_OPTION related parameters: + - 0x0~0xFFFF FFFFU + HASHL_OPTION related parameters: + - 0x0~0xFFFF FFFFU + FILTER_OPTION related parameters: + - ENET_SRC_FILTER_NORMAL_ENABLE/ ENET_SRC_FILTER_INVERSE_ENABLE/ + ENET_SRC_FILTER_DISABLE ; + - ENET_DEST_FILTER_INVERSE_ENABLE/ ENET_DEST_FILTER_INVERSE_DISABLE ; + - ENET_MULTICAST_FILTER_HASH_OR_PERFECT/ ENET_MULTICAST_FILTER_HASH/ + ENET_MULTICAST_FILTER_PERFECT/ ENET_MULTICAST_FILTER_NONE ; + - ENET_UNICAST_FILTER_EITHER/ ENET_UNICAST_FILTER_HASH/ + ENET_UNICAST_FILTER_PERFECT ; + - ENET_PCFRM_PREVENT_ALL/ ENET_PCFRM_PREVENT_PAUSEFRAME/ + ENET_PCFRM_FORWARD_ALL/ ENET_PCFRM_FORWARD_FILTERED . + HALFDUPLEX_OPTION related parameters: + - ENET_CARRIERSENSE_ENABLE/ ENET_CARRIERSENSE_DISABLE ; + - ENET_RECEIVEOWN_ENABLE/ ENET_RECEIVEOWN_DISABLE ; + - ENET_RETRYTRANSMISSION_ENABLE/ ENET_RETRYTRANSMISSION_DISABLE ; + - ENET_BACKOFFLIMIT_10/ ENET_BACKOFFLIMIT_8/ + ENET_BACKOFFLIMIT_4/ ENET_BACKOFFLIMIT_1 ; + - ENET_DEFERRALCHECK_ENABLE/ ENET_DEFERRALCHECK_DISABLE . + TIMER_OPTION related parameters: + - ENET_WATCHDOG_ENABLE/ ENET_WATCHDOG_DISABLE ; + - ENET_JABBER_ENABLE/ ENET_JABBER_DISABLE ; + INTERFRAMEGAP_OPTION related parameters: + - ENET_INTERFRAMEGAP_96BIT/ ENET_INTERFRAMEGAP_88BIT/ + ENET_INTERFRAMEGAP_80BIT/ ENET_INTERFRAMEGAP_72BIT/ + ENET_INTERFRAMEGAP_64BIT/ ENET_INTERFRAMEGAP_56BIT/ + ENET_INTERFRAMEGAP_48BIT/ ENET_INTERFRAMEGAP_40BIT . + \param[out] none + \retval none +*/ +void enet_initpara_config(enet_option_enum option, uint32_t para) +{ + switch(option) { + case FORWARD_OPTION: + /* choose to configure forward_frame, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FORWARD_OPTION; + enet_initpara.forward_frame = para; + break; + case DMABUS_OPTION: + /* choose to configure dmabus_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMABUS_OPTION; + enet_initpara.dmabus_mode = para; + break; + case DMA_MAXBURST_OPTION: + /* choose to configure dma_maxburst, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_MAXBURST_OPTION; + enet_initpara.dma_maxburst = para; + break; + case DMA_ARBITRATION_OPTION: + /* choose to configure dma_arbitration, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_ARBITRATION_OPTION; + enet_initpara.dma_arbitration = para; + break; + case STORE_OPTION: + /* choose to configure store_forward_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)STORE_OPTION; + enet_initpara.store_forward_mode = para; + break; + case DMA_OPTION: + /* choose to configure dma_function, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_OPTION; + +#ifndef SELECT_DESCRIPTORS_ENHANCED_MODE + para &= ~ENET_ENHANCED_DESCRIPTOR; +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + + enet_initpara.dma_function = para; + break; + case VLAN_OPTION: + /* choose to configure vlan_config, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)VLAN_OPTION; + enet_initpara.vlan_config = para; + break; + case FLOWCTL_OPTION: + /* choose to configure flow_control, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FLOWCTL_OPTION; + enet_initpara.flow_control = para; + break; + case HASHH_OPTION: + /* choose to configure hashtable_high, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HASHH_OPTION; + enet_initpara.hashtable_high = para; + break; + case HASHL_OPTION: + /* choose to configure hashtable_low, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HASHL_OPTION; + enet_initpara.hashtable_low = para; + break; + case FILTER_OPTION: + /* choose to configure framesfilter_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FILTER_OPTION; + enet_initpara.framesfilter_mode = para; + break; + case HALFDUPLEX_OPTION: + /* choose to configure halfduplex_param, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HALFDUPLEX_OPTION; + enet_initpara.halfduplex_param = para; + break; + case TIMER_OPTION: + /* choose to configure timer_config, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)TIMER_OPTION; + enet_initpara.timer_config = para; + break; + case INTERFRAMEGAP_OPTION: + /* choose to configure interframegap, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)INTERFRAMEGAP_OPTION; + enet_initpara.interframegap = para; + break; + default: + break; + } +} + +/*! + \brief initialize ENET peripheral with generally concerned parameters and the less cared + parameters + \param[in] mediamode: PHY mode and mac loopback configurations, only one parameter can be selected + which is shown as below, refer to enet_mediamode_enum + \arg ENET_AUTO_NEGOTIATION: PHY auto negotiation + \arg ENET_100M_FULLDUPLEX: 100Mbit/s, full-duplex + \arg ENET_100M_HALFDUPLEX: 100Mbit/s, half-duplex + \arg ENET_10M_FULLDUPLEX: 10Mbit/s, full-duplex + \arg ENET_10M_HALFDUPLEX: 10Mbit/s, half-duplex + \arg ENET_LOOPBACKMODE: MAC in loopback mode at the MII + \param[in] checksum: IP frame checksum offload function, only one parameter can be selected + which is shown as below, refer to enet_mediamode_enum + \arg ENET_NO_AUTOCHECKSUM: disable IP frame checksum function + \arg ENET_AUTOCHECKSUM_DROP_FAILFRAMES: enable IP frame checksum function + \arg ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES: enable IP frame checksum function, and the received frame + with only payload error but no other errors will not be dropped + \param[in] recept: frame filter function, only one parameter can be selected + which is shown as below, refer to enet_frmrecept_enum + \arg ENET_PROMISCUOUS_MODE: promiscuous mode enabled + \arg ENET_RECEIVEALL: all received frame are forwarded to application + \arg ENET_BROADCAST_FRAMES_PASS: the address filters pass all received broadcast frames + \arg ENET_BROADCAST_FRAMES_DROP: the address filters filter all incoming broadcast frames + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept) +{ + uint32_t reg_value = 0U, reg_temp = 0U, temp = 0U; + uint32_t media_temp = 0U; + uint32_t timeout = 0U; + uint16_t phy_value = 0U; + ErrStatus phy_state = ERROR, enet_state = ERROR; + + /* PHY interface configuration, configure SMI clock and reset PHY chip */ + if(ERROR == enet_phy_config()) { + _ENET_DELAY_(PHY_RESETDELAY); + if(ERROR == enet_phy_config()) { + return enet_state; + } + } + /* initialize ENET peripheral with generally concerned parameters */ + enet_default_init(); + + /* 1st, configure mediamode */ + media_temp = (uint32_t)mediamode; + /* if is PHY auto negotiation */ + if((uint32_t)ENET_AUTO_NEGOTIATION == media_temp) { + /* wait for PHY_LINKED_STATUS bit be set */ + do { + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); + phy_value &= PHY_LINKED_STATUS; + timeout++; + } while((RESET == phy_value) && (timeout < PHY_READ_TO)); + /* return ERROR due to timeout */ + if(PHY_READ_TO == timeout) { + return enet_state; + } + /* reset timeout counter */ + timeout = 0U; + + /* enable auto-negotiation */ + phy_value = PHY_AUTONEGOTIATION; + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); + if(!phy_state) { + /* return ERROR due to write timeout */ + return enet_state; + } + + /* wait for the PHY_AUTONEGO_COMPLETE bit be set */ + do { + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); + phy_value &= PHY_AUTONEGO_COMPLETE; + timeout++; + } while((RESET == phy_value) && (timeout < (uint32_t)PHY_READ_TO)); + /* return ERROR due to timeout */ + if(PHY_READ_TO == timeout) { + return enet_state; + } + /* reset timeout counter */ + timeout = 0U; + + /* read the result of the auto-negotiation */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_SR, &phy_value); + /* configure the duplex mode of MAC following the auto-negotiation result */ + if((uint16_t)RESET != (phy_value & PHY_DUPLEX_STATUS)) { + media_temp = ENET_MODE_FULLDUPLEX; + } else { + media_temp = ENET_MODE_HALFDUPLEX; + } + /* configure the communication speed of MAC following the auto-negotiation result */ + if((uint16_t)RESET != (phy_value & PHY_SPEED_STATUS)) { + media_temp |= ENET_SPEEDMODE_10M; + } else { + media_temp |= ENET_SPEEDMODE_100M; + } + } else { + phy_value = (uint16_t)((media_temp & ENET_MAC_CFG_DPM) >> 3); + phy_value |= (uint16_t)((media_temp & ENET_MAC_CFG_SPD) >> 1); + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); + if(!phy_state) { + /* return ERROR due to write timeout */ + return enet_state; + } + /* PHY configuration need some time */ + _ENET_DELAY_(PHY_CONFIGDELAY); + } + /* after configuring the PHY, use mediamode to configure registers */ + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= (~(ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM | ENET_MAC_CFG_LBM)); + reg_value |= media_temp; + ENET_MAC_CFG = reg_value; + + + /* 2st, configure checksum */ + if(RESET != ((uint32_t)checksum & ENET_CHECKSUMOFFLOAD_ENABLE)) { + ENET_MAC_CFG |= ENET_CHECKSUMOFFLOAD_ENABLE; + + reg_value = ENET_DMA_CTL; + /* configure ENET_DMA_CTL register */ + reg_value &= ~ENET_DMA_CTL_DTCERFD; + reg_value |= ((uint32_t)checksum & ENET_DMA_CTL_DTCERFD); + ENET_DMA_CTL = reg_value; + } + + /* 3rd, configure recept */ + ENET_MAC_FRMF |= (uint32_t)recept; + + /* 4th, configure different function options */ + /* configure forward_frame related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FORWARD_OPTION)) { + reg_temp = enet_initpara.forward_frame; + + reg_value = ENET_MAC_CFG; + temp = reg_temp; + /* configure ENET_MAC_CFG register */ + reg_value &= (~(ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD)); + temp &= (ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD); + reg_value |= temp; + ENET_MAC_CFG = reg_value; + + reg_value = ENET_DMA_CTL; + temp = reg_temp; + /* configure ENET_DMA_CTL register */ + reg_value &= (~(ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF)); + temp &= ((ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF) << 2); + reg_value |= (temp >> 2); + ENET_DMA_CTL = reg_value; + } + + /* configure dmabus_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMABUS_OPTION)) { + temp = enet_initpara.dmabus_mode; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_AA | ENET_DMA_BCTL_FB \ + | ENET_DMA_BCTL_FPBL | ENET_DMA_BCTL_MB); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure dma_maxburst related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_MAXBURST_OPTION)) { + temp = enet_initpara.dma_maxburst; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_RXDP | ENET_DMA_BCTL_PGBL | ENET_DMA_BCTL_UIP); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure dma_arbitration related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_ARBITRATION_OPTION)) { + temp = enet_initpara.dma_arbitration; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_RTPR | ENET_DMA_BCTL_DAB); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure store_forward_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)STORE_OPTION)) { + temp = enet_initpara.store_forward_mode; + + reg_value = ENET_DMA_CTL; + /* configure ENET_DMA_CTL register */ + reg_value &= ~(ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD | ENET_DMA_CTL_RTHC | ENET_DMA_CTL_TTHC); + reg_value |= temp; + ENET_DMA_CTL = reg_value; + } + + /* configure dma_function related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_OPTION)) { + reg_temp = enet_initpara.dma_function; + + reg_value = ENET_DMA_CTL; + temp = reg_temp; + /* configure ENET_DMA_CTL register */ + reg_value &= (~(ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF)); + temp &= (ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF); + reg_value |= temp; + ENET_DMA_CTL = reg_value; + + reg_value = ENET_DMA_BCTL; + temp = reg_temp; + /* configure ENET_DMA_BCTL register */ + reg_value &= (~ENET_DMA_BCTL_DFM); + temp &= ENET_DMA_BCTL_DFM; + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure vlan_config related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)VLAN_OPTION)) { + reg_temp = enet_initpara.vlan_config; + + reg_value = ENET_MAC_VLT; + /* configure ENET_MAC_VLT register */ + reg_value &= ~(ENET_MAC_VLT_VLTI | ENET_MAC_VLT_VLTC); + reg_value |= reg_temp; + ENET_MAC_VLT = reg_value; + } + + /* configure flow_control related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FLOWCTL_OPTION)) { + reg_temp = enet_initpara.flow_control; + + reg_value = ENET_MAC_FCTL; + temp = reg_temp; + /* configure ENET_MAC_FCTL register */ + reg_value &= ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ + | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); + temp &= (ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ + | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); + reg_value |= temp; + ENET_MAC_FCTL = reg_value; + + reg_value = ENET_MAC_FCTH; + temp = reg_temp; + /* configure ENET_MAC_FCTH register */ + reg_value &= ~(ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD); + temp &= ((ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD) << 8); + reg_value |= (temp >> 8); + ENET_MAC_FCTH = reg_value; + } + + /* configure hashtable_high related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HASHH_OPTION)) { + ENET_MAC_HLH = enet_initpara.hashtable_high; + } + + /* configure hashtable_low related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HASHL_OPTION)) { + ENET_MAC_HLL = enet_initpara.hashtable_low; + } + + /* configure framesfilter_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FILTER_OPTION)) { + reg_temp = enet_initpara.framesfilter_mode; + + reg_value = ENET_MAC_FRMF; + /* configure ENET_MAC_FRMF register */ + reg_value &= ~(ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT | ENET_MAC_FRMF_DAIFLT \ + | ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_MFD \ + | ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_PCFRM); + reg_value |= reg_temp; + ENET_MAC_FRMF = reg_value; + } + + /* configure halfduplex_param related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HALFDUPLEX_OPTION)) { + reg_temp = enet_initpara.halfduplex_param; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~(ENET_MAC_CFG_CSD | ENET_MAC_CFG_ROD | ENET_MAC_CFG_RTD \ + | ENET_MAC_CFG_BOL | ENET_MAC_CFG_DFC); + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + /* configure timer_config related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)TIMER_OPTION)) { + reg_temp = enet_initpara.timer_config; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~(ENET_MAC_CFG_WDD | ENET_MAC_CFG_JBD); + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + /* configure interframegap related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)INTERFRAMEGAP_OPTION)) { + reg_temp = enet_initpara.interframegap; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~ENET_MAC_CFG_IGBS; + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + enet_state = SUCCESS; + return enet_state; +} + +/*! + \brief reset all core internal registers located in CLK_TX and CLK_RX + \param[in] none + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_software_reset(void) +{ + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + uint32_t dma_flag; + + /* reset all core internal registers located in CLK_TX and CLK_RX */ + ENET_DMA_BCTL |= ENET_DMA_BCTL_SWR; + + /* wait for reset operation complete */ + do { + dma_flag = (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR); + timeout++; + } while((RESET != dma_flag) && (ENET_DELAY_TO != timeout)); + + /* reset operation complete */ + if(RESET == (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR)) { + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief check receive frame valid and return frame size + \param[in] none + \param[out] none + \retval size of received frame: 0x0 - 0x3FFF +*/ +uint32_t enet_rxframe_size_get(void) +{ + uint32_t size = 0U; + uint32_t status; + + /* get rdes0 information of current RxDMA descriptor */ + status = dma_current_rxdesc->status; + + /* if the desciptor is owned by DMA */ + if((uint32_t)RESET != (status & ENET_RDES0_DAV)) { + return 0U; + } + + /* if has any error, or the frame uses two or more descriptors */ + if((((uint32_t)RESET) != (status & ENET_RDES0_ERRS)) || + (((uint32_t)RESET) == (status & ENET_RDES0_LDES)) || + (((uint32_t)RESET) == (status & ENET_RDES0_FDES))) { + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + /* if is an ethernet-type frame, and IP frame payload error occurred */ + if(((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FRMT) && + ((uint32_t)RESET) != (dma_current_rxdesc->extended_status & ENET_RDES4_IPPLDERR)) { + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#else + /* if is an ethernet-type frame, and IP frame payload error occurred */ + if((((uint32_t)RESET) != (status & ENET_RDES0_FRMT)) && + (((uint32_t)RESET) != (status & ENET_RDES0_PCERR))) { + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#endif + /* if CPU owns current descriptor, no error occured, the frame uses only one descriptor */ + if((((uint32_t)RESET) == (status & ENET_RDES0_DAV)) && + (((uint32_t)RESET) == (status & ENET_RDES0_ERRS)) && + (((uint32_t)RESET) != (status & ENET_RDES0_LDES)) && + (((uint32_t)RESET) != (status & ENET_RDES0_FDES))) { + /* get the size of the received data including CRC */ + size = GET_RDES0_FRML(status); + /* substract the CRC size */ + size = size - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (status & ENET_RDES0_FRMT))) { + size = size + 4U; + } + } else { + enet_unknow_err++; + enet_rxframe_drop(); + + return 1U; + } + + /* return packet size */ + return size; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in chain mode + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_descriptors_chain_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode */ + desc_status = ENET_TDES0_TCHM; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + dma_current_ptp_rxdesc = NULL; + dma_current_ptp_txdesc = NULL; + + /* configure each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)) { + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + } else { + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t) desc_tab; + } + } +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in ring mode + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_descriptors_ring_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc; + enet_descriptors_struct *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* set buffer1 size */ + desc_bufsize = ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + dma_current_ptp_rxdesc = NULL; + dma_current_ptp_txdesc = NULL; + + /* configure each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)) { + if(ENET_DMA_TX == direction) { + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + } else { + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + } +} + +/*! + \brief handle current received frame data to application buffer + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] buffer: pointer to the received frame data + note -- if the input is NULL, user should copy data in application by himself + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize) +{ + uint32_t offset = 0U, size = 0U; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { + return ERROR; + } + + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer) { + /* if no error occurs, and the frame uses only one descriptor */ + if((((uint32_t)RESET) == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status); + size = size - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize) { + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0U; offset < size; offset++) { + (*(buffer + offset)) = (*(__IO uint8_t *)(uint32_t)((dma_current_rxdesc->buffer1_addr) + offset)); + } + + } else { + /* return ERROR */ + return ERROR; + } + } + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { + /* clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0U; + } + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { + dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + + (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); + } + } + + return SUCCESS; +} + +/*! + \brief handle application buffer data to transmit it + \param[in] buffer: pointer to the frame data to be transmitted, + note -- if the input is NULL, user should handle the data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length) +{ + uint32_t offset = 0U; + uint32_t dma_tbu_flag, dma_tu_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE) { + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer) { + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0U; offset < length; offset++) { + (*(__IO uint8_t *)(uint32_t)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + + /* set the frame length */ + dma_current_txdesc->control_buffer_size = length; + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { + /* clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0U; + } + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { + dma_current_txdesc = (enet_descriptors_struct *)(dma_current_txdesc->buffer2_next_desc_addr); + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + + (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); + } + } + + return SUCCESS; +} + +/*! + \brief configure the transmit IP frame checksum offload calculation and insertion + \param[in] desc: the descriptor pointer which users want to configure + \param[in] checksum: IP frame checksum configuration + only one parameter can be selected which is shown as below + \arg ENET_CHECKSUM_DISABLE: checksum insertion disabled + \arg ENET_CHECKSUM_IPV4HEADER: only IP header checksum calculation and insertion are enabled + \arg ENET_CHECKSUM_TCPUDPICMP_SEGMENT: TCP/UDP/ICMP checksum insertion calculated but pseudo-header + \arg ENET_CHECKSUM_TCPUDPICMP_FULL: TCP/UDP/ICMP checksum insertion fully calculated + \param[out] none + \retval ErrStatus: ERROR, SUCCESS +*/ +ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum) +{ + if(NULL != desc) { + desc->status &= ~ENET_TDES0_CM; + desc->status |= checksum; + return SUCCESS; + } else { + return ERROR; + } +} + +/*! + \brief ENET Tx and Rx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_enable(void) +{ + enet_tx_enable(); + enet_rx_enable(); +} + +/*! + \brief ENET Tx and Rx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_disable(void) +{ + enet_tx_disable(); + enet_rx_disable(); +} + +/*! + \brief configure MAC address + \param[in] mac_addr: select which MAC address will be set, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS0: set MAC address 0 filter + \arg ENET_MAC_ADDRESS1: set MAC address 1 filter + \arg ENET_MAC_ADDRESS2: set MAC address 2 filter + \arg ENET_MAC_ADDRESS3: set MAC address 3 filter + \param[in] paddr: the buffer pointer which stores the MAC address + (little-ending store, such as MAC address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) + \param[out] none + \retval none +*/ +void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]) +{ + REG32(ENET_ADDRH_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRH(paddr); + REG32(ENET_ADDRL_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRL(paddr); +} + +/*! + \brief get MAC address + \param[in] mac_addr: select which MAC address will be get, refer to enet_macaddress_enum + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS0: get MAC address 0 filter + \arg ENET_MAC_ADDRESS1: get MAC address 1 filter + \arg ENET_MAC_ADDRESS2: get MAC address 2 filter + \arg ENET_MAC_ADDRESS3: get MAC address 3 filter + \param[out] paddr: the buffer pointer which is stored the MAC address + (little-ending store, such as mac address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) + \param[in] bufsize: refer to the size of the buffer which stores the MAC address + \arg 6 - 255 + \retval ErrStatus: ERROR, SUCCESS +*/ +ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize) +{ + if(bufsize < 6U) { + return ERROR; + } + paddr[0] = ENET_GET_MACADDR(mac_addr, 0U); + paddr[1] = ENET_GET_MACADDR(mac_addr, 1U); + paddr[2] = ENET_GET_MACADDR(mac_addr, 2U); + paddr[3] = ENET_GET_MACADDR(mac_addr, 3U); + paddr[4] = ENET_GET_MACADDR(mac_addr, 4U); + paddr[5] = ENET_GET_MACADDR(mac_addr, 5U); + return SUCCESS; +} + +/*! + \brief get the ENET MAC/MSC/PTP/DMA status flag + \param[in] enet_flag: ENET status flag, refer to enet_flag_enum, + only one parameter can be selected which is shown as below + \arg ENET_MAC_FLAG_MPKR: magic packet received flag + \arg ENET_MAC_FLAG_WUFR: wakeup frame received flag + \arg ENET_MAC_FLAG_FLOWCONTROL: flow control status flag + \arg ENET_MAC_FLAG_WUM: WUM status flag + \arg ENET_MAC_FLAG_MSC: MSC status flag + \arg ENET_MAC_FLAG_MSCR: MSC receive status flag + \arg ENET_MAC_FLAG_MSCT: MSC transmit status flag + \arg ENET_MAC_FLAG_TMST: time stamp trigger status flag + \arg ENET_PTP_FLAG_TSSCO: timestamp second counter overflow flag + \arg ENET_PTP_FLAG_TTM: target time match flag + \arg ENET_MSC_FLAG_RFCE: received frames CRC error flag + \arg ENET_MSC_FLAG_RFAE: received frames alignment error flag + \arg ENET_MSC_FLAG_RGUF: received good unicast frames flag + \arg ENET_MSC_FLAG_TGFSC: transmitted good frames single collision flag + \arg ENET_MSC_FLAG_TGFMSC: transmitted good frames more single collision flag + \arg ENET_MSC_FLAG_TGF: transmitted good frames flag + \arg ENET_DMA_FLAG_TS: transmit status flag + \arg ENET_DMA_FLAG_TPS: transmit process stopped status flag + \arg ENET_DMA_FLAG_TBU: transmit buffer unavailable status flag + \arg ENET_DMA_FLAG_TJT: transmit jabber timeout status flag + \arg ENET_DMA_FLAG_RO: receive overflow status flag + \arg ENET_DMA_FLAG_TU: transmit underflow status flag + \arg ENET_DMA_FLAG_RS: receive status flag + \arg ENET_DMA_FLAG_RBU: receive buffer unavailable status flag + \arg ENET_DMA_FLAG_RPS: receive process stopped status flag + \arg ENET_DMA_FLAG_RWT: receive watchdog timeout status flag + \arg ENET_DMA_FLAG_ET: early transmit status flag + \arg ENET_DMA_FLAG_FBE: fatal bus error status flag + \arg ENET_DMA_FLAG_ER: early receive status flag + \arg ENET_DMA_FLAG_AI: abnormal interrupt summary flag + \arg ENET_DMA_FLAG_NI: normal interrupt summary flag + \arg ENET_DMA_FLAG_EB_DMA_ERROR: DMA error flag + \arg ENET_DMA_FLAG_EB_TRANSFER_ERROR: transfer error flag + \arg ENET_DMA_FLAG_EB_ACCESS_ERROR: access error flag + \arg ENET_DMA_FLAG_MSC: MSC status flag + \arg ENET_DMA_FLAG_WUM: WUM status flag + \arg ENET_DMA_FLAG_TST: timestamp trigger status flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_flag_get(enet_flag_enum enet_flag) +{ + if(RESET != (ENET_REG_VAL(enet_flag) & BIT(ENET_BIT_POS(enet_flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the ENET DMA status flag + \param[in] enet_flag: ENET DMA flag clear, refer to enet_flag_clear_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_FLAG_TS_CLR: transmit status flag clear + \arg ENET_DMA_FLAG_TPS_CLR: transmit process stopped status flag clear + \arg ENET_DMA_FLAG_TBU_CLR: transmit buffer unavailable status flag clear + \arg ENET_DMA_FLAG_TJT_CLR: transmit jabber timeout status flag clear + \arg ENET_DMA_FLAG_RO_CLR: receive overflow status flag clear + \arg ENET_DMA_FLAG_TU_CLR: transmit underflow status flag clear + \arg ENET_DMA_FLAG_RS_CLR: receive status flag clear + \arg ENET_DMA_FLAG_RBU_CLR: receive buffer unavailable status flag clear + \arg ENET_DMA_FLAG_RPS_CLR: receive process stopped status flag clear + \arg ENET_DMA_FLAG_RWT_CLR: receive watchdog timeout status flag clear + \arg ENET_DMA_FLAG_ET_CLR: early transmit status flag clear + \arg ENET_DMA_FLAG_FBE_CLR: fatal bus error status flag clear + \arg ENET_DMA_FLAG_ER_CLR: early receive status flag clear + \arg ENET_DMA_FLAG_AI_CLR: abnormal interrupt summary flag clear + \arg ENET_DMA_FLAG_NI_CLR: normal interrupt summary flag clear + \param[out] none + \retval none +*/ +void enet_flag_clear(enet_flag_clear_enum enet_flag) +{ + /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ + ENET_REG_VAL(enet_flag) = BIT(ENET_BIT_POS(enet_flag)); +} + +/*! + \brief enable ENET MAC/MSC/DMA interrupt + \param[in] enet_int: ENET interrupt,, refer to enet_int_enum + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_WUMIM: WUM interrupt mask + \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask + \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask + \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask + \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask + \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask + \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask + \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask + \arg ENET_DMA_INT_TIE: transmit interrupt enable + \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable + \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable + \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable + \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable + \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable + \arg ENET_DMA_INT_RIE: receive interrupt enable + \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable + \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable + \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable + \arg ENET_DMA_INT_ETIE: early transmit interrupt enable + \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable + \arg ENET_DMA_INT_ERIE: early receive interrupt enable + \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable + \arg ENET_DMA_INT_NIE: normal interrupt summary enable + \param[out] none + \retval none +*/ +void enet_interrupt_enable(enet_int_enum enet_int) +{ + if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)) { + /* ENET_DMA_INTEN register interrupt */ + ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); + } else { + /* other INTMSK register interrupt */ + ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); + } +} + +/*! + \brief disable ENET MAC/MSC/DMA interrupt + \param[in] enet_int: ENET interrupt, + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_WUMIM: WUM interrupt mask + \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask + \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask + \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask + \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask + \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask + \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask + \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask + \arg ENET_DMA_INT_TIE: transmit interrupt enable + \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable + \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable + \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable + \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable + \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable + \arg ENET_DMA_INT_RIE: receive interrupt enable + \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable + \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable + \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable + \arg ENET_DMA_INT_ETIE: early transmit interrupt enable + \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable + \arg ENET_DMA_INT_ERIE: early receive interrupt enable + \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable + \arg ENET_DMA_INT_NIE: normal interrupt summary enable + \param[out] none + \retval none +*/ +void enet_interrupt_disable(enet_int_enum enet_int) +{ + if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)) { + /* ENET_DMA_INTEN register interrupt */ + ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); + } else { + /* other INTMSK register interrupt */ + ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); + } +} + +/*! + \brief get ENET MAC/MSC/DMA interrupt flag + \param[in] int_flag: ENET interrupt flag, + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_FLAG_WUM: WUM status flag + \arg ENET_MAC_INT_FLAG_MSC: MSC status flag + \arg ENET_MAC_INT_FLAG_MSCR: MSC receive status flag + \arg ENET_MAC_INT_FLAG_MSCT: MSC transmit status flag + \arg ENET_MAC_INT_FLAG_TMST: time stamp trigger status flag + \arg ENET_MSC_INT_FLAG_RFCE: received frames CRC error flag + \arg ENET_MSC_INT_FLAG_RFAE: received frames alignment error flag + \arg ENET_MSC_INT_FLAG_RGUF: received good unicast frames flag + \arg ENET_MSC_INT_FLAG_TGFSC: transmitted good frames single collision flag + \arg ENET_MSC_INT_FLAG_TGFMSC: transmitted good frames more single collision flag + \arg ENET_MSC_INT_FLAG_TGF: transmitted good frames flag + \arg ENET_DMA_INT_FLAG_TS: transmit status flag + \arg ENET_DMA_INT_FLAG_TPS: transmit process stopped status flag + \arg ENET_DMA_INT_FLAG_TBU: transmit buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_TJT: transmit jabber timeout status flag + \arg ENET_DMA_INT_FLAG_RO: receive overflow status flag + \arg ENET_DMA_INT_FLAG_TU: transmit underflow status flag + \arg ENET_DMA_INT_FLAG_RS: receive status flag + \arg ENET_DMA_INT_FLAG_RBU: receive buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_RPS: receive process stopped status flag + \arg ENET_DMA_INT_FLAG_RWT: receive watchdog timeout status flag + \arg ENET_DMA_INT_FLAG_ET: early transmit status flag + \arg ENET_DMA_INT_FLAG_FBE: fatal bus error status flag + \arg ENET_DMA_INT_FLAG_ER: early receive status flag + \arg ENET_DMA_INT_FLAG_AI: abnormal interrupt summary flag + \arg ENET_DMA_INT_FLAG_NI: normal interrupt summary flag + \arg ENET_DMA_INT_FLAG_MSC: MSC status flag + \arg ENET_DMA_INT_FLAG_WUM: WUM status flag + \arg ENET_DMA_INT_FLAG_TST: timestamp trigger status flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag) +{ + if(RESET != (ENET_REG_VAL(int_flag) & BIT(ENET_BIT_POS(int_flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear ENET DMA interrupt flag + \param[in] int_flag_clear: clear ENET interrupt flag, + only one parameter can be selected which is shown as below + \arg ENET_DMA_INT_FLAG_TS_CLR: transmit status flag + \arg ENET_DMA_INT_FLAG_TPS_CLR: transmit process stopped status flag + \arg ENET_DMA_INT_FLAG_TBU_CLR: transmit buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_TJT_CLR: transmit jabber timeout status flag + \arg ENET_DMA_INT_FLAG_RO_CLR: receive overflow status flag + \arg ENET_DMA_INT_FLAG_TU_CLR: transmit underflow status flag + \arg ENET_DMA_INT_FLAG_RS_CLR: receive status flag + \arg ENET_DMA_INT_FLAG_RBU_CLR: receive buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_RPS_CLR: receive process stopped status flag + \arg ENET_DMA_INT_FLAG_RWT_CLR: receive watchdog timeout status flag + \arg ENET_DMA_INT_FLAG_ET_CLR: early transmit status flag + \arg ENET_DMA_INT_FLAG_FBE_CLR: fatal bus error status flag + \arg ENET_DMA_INT_FLAG_ER_CLR: early receive status flag + \arg ENET_DMA_INT_FLAG_AI_CLR: abnormal interrupt summary flag + \arg ENET_DMA_INT_FLAG_NI_CLR: normal interrupt summary flag + \param[out] none + \retval none +*/ +void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear) +{ + /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ + ENET_REG_VAL(int_flag_clear) = BIT(ENET_BIT_POS(int_flag_clear)); +} + +/*! + \brief ENET Tx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_tx_enable(void) +{ + ENET_MAC_CFG |= ENET_MAC_CFG_TEN; + enet_txfifo_flush(); + ENET_DMA_CTL |= ENET_DMA_CTL_STE; +} + +/*! + \brief ENET Tx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_tx_disable(void) +{ + ENET_DMA_CTL &= ~ENET_DMA_CTL_STE; + enet_txfifo_flush(); + ENET_MAC_CFG &= ~ENET_MAC_CFG_TEN; +} + +/*! + \brief ENET Rx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_rx_enable(void) +{ + ENET_MAC_CFG |= ENET_MAC_CFG_REN; + ENET_DMA_CTL |= ENET_DMA_CTL_SRE; +} + +/*! + \brief ENET Rx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_rx_disable(void) +{ + ENET_DMA_CTL &= ~ENET_DMA_CTL_SRE; + ENET_MAC_CFG &= ~ENET_MAC_CFG_REN; +} + +/*! + \brief put registers value into the application buffer + \param[in] type: register type which will be get, refer to enet_registers_type_enum, + only one parameter can be selected which is shown as below + \arg ALL_MAC_REG: get the registers within the offset scope between ENET_MAC_CFG and ENET_MAC_FCTH + \arg ALL_MSC_REG: get the registers within the offset scope between ENET_MSC_CTL and ENET_MSC_RGUFCNT + \arg ALL_PTP_REG: get the registers within the offset scope between ENET_PTP_TSCTL and ENET_PTP_PPSCTL + \arg ALL_DMA_REG: get the registers within the offset scope between ENET_DMA_BCTL and ENET_DMA_CRBADDR + \param[in] num: the number of registers that the user want to get + \param[out] preg: the application buffer pointer for storing the register value + \retval none +*/ +void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num) +{ + uint32_t offset = 0U, max = 0U, limit = 0U; + + offset = (uint32_t)type; + max = (uint32_t)type + num; + limit = sizeof(enet_reg_tab) / sizeof(uint16_t); + + /* prevent element in this array is out of range */ + if(max > limit) { + max = limit; + } + + for(; offset < max; offset++) { + /* get value of the corresponding register */ + *preg = REG32((ENET) + enet_reg_tab[offset]); + preg++; + } +} + +/*! + \brief get the enet debug status from the debug register + \param[in] mac_debug: enet debug status + only one parameter can be selected which is shown as below + \arg ENET_MAC_RECEIVER_NOT_IDLE: MAC receiver is not in idle state + \arg ENET_RX_ASYNCHRONOUS_FIFO_STATE: Rx asynchronous FIFO status + \arg ENET_RXFIFO_WRITING: RxFIFO is doing write operation + \arg ENET_RXFIFO_READ_STATUS: RxFIFO read operation status + \arg ENET_RXFIFO_STATE: RxFIFO state + \arg ENET_MAC_TRANSMITTER_NOT_IDLE: MAC transmitter is not in idle state + \arg ENET_MAC_TRANSMITTER_STATUS: status of MAC transmitter + \arg ENET_PAUSE_CONDITION_STATUS: pause condition status + \arg ENET_TXFIFO_READ_STATUS: TxFIFO read operation status + \arg ENET_TXFIFO_WRITING: TxFIFO is doing write operation + \arg ENET_TXFIFO_NOT_EMPTY: TxFIFO is not empty + \arg ENET_TXFIFO_FULL: TxFIFO is full + \param[out] none + \retval value of the status users want to get +*/ +uint32_t enet_debug_status_get(uint32_t mac_debug) +{ + uint32_t temp_state = 0U; + + switch(mac_debug) { + case ENET_RX_ASYNCHRONOUS_FIFO_STATE: + temp_state = GET_MAC_DBG_RXAFS(ENET_MAC_DBG); + break; + case ENET_RXFIFO_READ_STATUS: + temp_state = GET_MAC_DBG_RXFRS(ENET_MAC_DBG); + break; + case ENET_RXFIFO_STATE: + temp_state = GET_MAC_DBG_RXFS(ENET_MAC_DBG); + break; + case ENET_MAC_TRANSMITTER_STATUS: + temp_state = GET_MAC_DBG_SOMT(ENET_MAC_DBG); + break; + case ENET_TXFIFO_READ_STATUS: + temp_state = GET_MAC_DBG_TXFRS(ENET_MAC_DBG); + break; + default: + if(RESET != (ENET_MAC_DBG & mac_debug)) { + temp_state = 0x1U; + } + break; + } + return temp_state; +} + +/*! + \brief enable the MAC address filter + \param[in] mac_addr: select which MAC address will be enable + \arg ENET_MAC_ADDRESS1: enable MAC address 1 filter + \arg ENET_MAC_ADDRESS2: enable MAC address 2 filter + \arg ENET_MAC_ADDRESS3: enable MAC address 3 filter + \param[out] none + \retval none +*/ +void enet_address_filter_enable(enet_macaddress_enum mac_addr) +{ + REG32(ENET_ADDRH_BASE + mac_addr) |= ENET_MAC_ADDR1H_AFE; +} + +/*! + \brief disable the MAC address filter + \param[in] mac_addr: select which MAC address will be disable, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS1: disable MAC address 1 filter + \arg ENET_MAC_ADDRESS2: disable MAC address 2 filter + \arg ENET_MAC_ADDRESS3: disable MAC address 3 filter + \param[out] none + \retval none +*/ +void enet_address_filter_disable(enet_macaddress_enum mac_addr) +{ + REG32(ENET_ADDRH_BASE + mac_addr) &= ~ENET_MAC_ADDR1H_AFE; +} + +/*! + \brief configure the MAC address filter + \param[in] mac_addr: select which MAC address will be configured, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS1: configure MAC address 1 filter + \arg ENET_MAC_ADDRESS2: configure MAC address 2 filter + \arg ENET_MAC_ADDRESS3: configure MAC address 3 filter + \param[in] addr_mask: select which MAC address bytes will be mask, + one or more parameters can be selected which are shown as below + \arg ENET_ADDRESS_MASK_BYTE0: mask ENET_MAC_ADDR1L[7:0] bits + \arg ENET_ADDRESS_MASK_BYTE1: mask ENET_MAC_ADDR1L[15:8] bits + \arg ENET_ADDRESS_MASK_BYTE2: mask ENET_MAC_ADDR1L[23:16] bits + \arg ENET_ADDRESS_MASK_BYTE3: mask ENET_MAC_ADDR1L [31:24] bits + \arg ENET_ADDRESS_MASK_BYTE4: mask ENET_MAC_ADDR1H [7:0] bits + \arg ENET_ADDRESS_MASK_BYTE5: mask ENET_MAC_ADDR1H [15:8] bits + \param[in] filter_type: select which MAC address filter type will be selected, + only one parameter can be selected which is shown as below + \arg ENET_ADDRESS_FILTER_SA: The MAC address is used to compared with the SA field of the received frame + \arg ENET_ADDRESS_FILTER_DA: The MAC address is used to compared with the DA field of the received frame + \param[out] none + \retval none +*/ +void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type) +{ + uint32_t reg; + + /* get the address filter register value which is to be configured */ + reg = REG32(ENET_ADDRH_BASE + mac_addr); + + /* clear and configure the address filter register */ + reg &= ~(ENET_MAC_ADDR1H_MB | ENET_MAC_ADDR1H_SAF); + reg |= (addr_mask | filter_type); + REG32(ENET_ADDRH_BASE + mac_addr) = reg; +} + +/*! + \brief PHY interface configuration (configure SMI clock and reset PHY chip) + \param[in] none + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_phy_config(void) +{ + uint32_t ahbclk; + uint32_t reg; + uint16_t phy_value; + ErrStatus enet_state = ERROR; + + /* clear the previous MDC clock */ + reg = ENET_MAC_PHY_CTL; + reg &= ~ENET_MAC_PHY_CTL_CLR; + + /* get the HCLK frequency */ + ahbclk = rcu_clock_freq_get(CK_AHB); + + /* configure MDC clock according to HCLK frequency range */ + if(ENET_RANGE(ahbclk, 20000000U, 35000000U)) { + reg |= ENET_MDC_HCLK_DIV16; + } else if(ENET_RANGE(ahbclk, 35000000U, 60000000U)) { + reg |= ENET_MDC_HCLK_DIV26; + } else if(ENET_RANGE(ahbclk, 60000000U, 100000000U)) { + reg |= ENET_MDC_HCLK_DIV42; + } else if(ENET_RANGE(ahbclk, 100000000U, 150000000U)) { + reg |= ENET_MDC_HCLK_DIV62; + } else if((ENET_RANGE(ahbclk, 150000000U, 200000000U)) || (200000000U == ahbclk)) { + reg |= ENET_MDC_HCLK_DIV102; + } else { + return enet_state; + } + ENET_MAC_PHY_CTL = reg; + + /* reset PHY */ + phy_value = PHY_RESET; + if(ERROR == (enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value))) { + return enet_state; + } + /* PHY reset need some time */ + _ENET_DELAY_(ENET_DELAY_TO); + + /* check whether PHY reset is complete */ + if(ERROR == (enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &phy_value))) { + return enet_state; + } + + /* PHY reset complete */ + if(RESET == (phy_value & PHY_RESET)) { + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief write to / read from a PHY register + \param[in] direction: only one parameter can be selected which is shown as below, refer to enet_phydirection_enum + \arg ENET_PHY_WRITE: write data to phy register + \arg ENET_PHY_READ: read data from phy register + \param[in] phy_address: 0x0 - 0x1F + \param[in] phy_reg: 0x0 - 0x1F + \param[in] pvalue: the value will be written to the PHY register in ENET_PHY_WRITE direction + \param[out] pvalue: the value will be read from the PHY register in ENET_PHY_READ direction + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, + uint16_t *pvalue) +{ + uint32_t reg, phy_flag; + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + + /* configure ENET_MAC_PHY_CTL with write/read operation */ + reg = ENET_MAC_PHY_CTL; + reg &= ~(ENET_MAC_PHY_CTL_PB | ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PR | ENET_MAC_PHY_CTL_PA); + reg |= (direction | MAC_PHY_CTL_PR(phy_reg) | MAC_PHY_CTL_PA(phy_address) | ENET_MAC_PHY_CTL_PB); + + /* if do the write operation, write value to the register */ + if(ENET_PHY_WRITE == direction) { + ENET_MAC_PHY_DATA = *pvalue; + } + + /* do PHY write/read operation, and wait the operation complete */ + ENET_MAC_PHY_CTL = reg; + do { + phy_flag = (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB); + timeout++; + } while((RESET != phy_flag) && (ENET_DELAY_TO != timeout)); + + /* write/read operation complete */ + if(RESET == (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB)) { + enet_state = SUCCESS; + } + + /* if do the read operation, get value from the register */ + if(ENET_PHY_READ == direction) { + *pvalue = (uint16_t)ENET_MAC_PHY_DATA; + } + + return enet_state; +} + +/*! + \brief enable the loopback function of PHY chip + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_phyloopback_enable(void) +{ + uint16_t temp_phy = 0U; + ErrStatus phy_state = ERROR; + + /* get the PHY configuration to update it */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + /* enable the PHY loopback mode */ + temp_phy |= PHY_LOOPBACK; + + /* update the PHY control register with the new configuration */ + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + return phy_state; +} + +/*! + \brief disable the loopback function of PHY chip + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_phyloopback_disable(void) +{ + uint16_t temp_phy = 0U; + ErrStatus phy_state = ERROR; + + /* get the PHY configuration to update it */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + /* disable the PHY loopback mode */ + temp_phy &= (uint16_t)~PHY_LOOPBACK; + + /* update the PHY control register with the new configuration */ + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + return phy_state; +} + +/*! + \brief enable ENET forward feature + \param[in] feature: the feature of ENET forward mode + one or more parameters can be selected which are shown as below + \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames + \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding + \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory + \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames + \param[out] none + \retval none +*/ +void enet_forward_feature_enable(uint32_t feature) +{ + uint32_t mask; + + mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); + ENET_MAC_CFG |= mask; + + mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); + ENET_DMA_CTL |= (mask >> 2); +} + +/*! + \brief disable ENET forward feature + \param[in] feature: the feature of ENET forward mode + one or more parameters can be selected which are shown as below + \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames + \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding + \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory + \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames + \param[out] none + \retval none +*/ +void enet_forward_feature_disable(uint32_t feature) +{ + uint32_t mask; + + mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); + ENET_MAC_CFG &= ~mask; + + mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); + ENET_DMA_CTL &= ~(mask >> 2); +} + +/*! + \brief enable ENET fliter feature + \param[in] feature: the feature of ENET fliter mode + one or more parameters can be selected which are shown as below + \arg ENET_SRC_FILTER: filter source address function + \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function + \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function + \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function + \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function + \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function + \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function + \param[out] none + \retval none +*/ +void enet_fliter_feature_enable(uint32_t feature) +{ + ENET_MAC_FRMF |= feature; +} + +/*! + \brief disable ENET fliter feature + \param[in] feature: the feature of ENET fliter mode + one or more parameters can be selected which are shown as below + \arg ENET_SRC_FILTER: filter source address function + \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function + \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function + \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function + \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function + \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function + \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function + \param[out] none + \retval none +*/ +void enet_fliter_feature_disable(uint32_t feature) +{ + ENET_MAC_FRMF &= ~feature; +} + +/*! + \brief generate the pause frame, ENET will send pause frame after enable transmit flow control + this function only use in full-dulex mode + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_pauseframe_generate(void) +{ + ErrStatus enet_state = ERROR; + uint32_t temp = 0U; + + /* in full-duplex mode, must make sure this bit is 0 before writing register */ + temp = ENET_MAC_FCTL & ENET_MAC_FCTL_FLCBBKPA; + if(RESET == temp) { + ENET_MAC_FCTL |= ENET_MAC_FCTL_FLCBBKPA; + enet_state = SUCCESS; + } + return enet_state; +} + +/*! + \brief configure the pause frame detect type + \param[in] detect: pause frame detect type + only one parameter can be selected which is shown as below + \arg ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT: besides the unique multicast address, MAC can also + use the MAC0 address to detecting pause frame + \arg ENET_UNIQUE_PAUSEDETECT: only the unique multicast address for pause frame which is specified + in IEEE802.3 can be detected + \param[out] none + \retval none +*/ +void enet_pauseframe_detect_config(uint32_t detect) +{ + ENET_MAC_FCTL &= ~ENET_MAC_FCTL_UPFDT; + ENET_MAC_FCTL |= detect; +} + +/*! + \brief configure the pause frame parameters + \param[in] pausetime: pause time in transmit pause control frame + \param[in] pause_threshold: the threshold of the pause timer for retransmitting frames automatically, + this value must make sure to be less than configured pause time, only one parameter can be + selected which is shown as below + \arg ENET_PAUSETIME_MINUS4: pause time minus 4 slot times + \arg ENET_PAUSETIME_MINUS28: pause time minus 28 slot times + \arg ENET_PAUSETIME_MINUS144: pause time minus 144 slot times + \arg ENET_PAUSETIME_MINUS256: pause time minus 256 slot times + \param[out] none + \retval none +*/ +void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold) +{ + ENET_MAC_FCTL &= ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_PLTS); + ENET_MAC_FCTL |= (MAC_FCTL_PTM(pausetime) | pause_threshold); +} + +/*! + \brief configure the threshold of the flow control(deactive and active threshold) + \param[in] deactive: the threshold of the deactive flow control, this value + should always be less than active flow control value, only one + parameter can be selected which is shown as below + \arg ENET_DEACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes + \arg ENET_DEACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes + \arg ENET_DEACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes + \arg ENET_DEACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes + \arg ENET_DEACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes + \arg ENET_DEACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes + \arg ENET_DEACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes + \param[in] active: the threshold of the active flow control, only one parameter + can be selected which is shown as below + \arg ENET_ACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes + \arg ENET_ACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes + \arg ENET_ACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes + \arg ENET_ACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes + \arg ENET_ACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes + \arg ENET_ACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes + \arg ENET_ACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes + \param[out] none + \retval none +*/ +void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active) +{ + ENET_MAC_FCTH = ((deactive | active) >> 8); +} + +/*! + \brief enable ENET flow control feature + \param[in] feature: the feature of ENET flow control mode + one or more parameters can be selected which are shown as below + \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function + \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC + \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it + \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) + \param[out] none + \retval none +*/ +void enet_flowcontrol_feature_enable(uint32_t feature) +{ + if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)) { + ENET_MAC_FCTL &= ~ENET_ZERO_QUANTA_PAUSE; + } + feature &= ~ENET_ZERO_QUANTA_PAUSE; + ENET_MAC_FCTL |= feature; +} + +/*! + \brief disable ENET flow control feature + \param[in] feature: the feature of ENET flow control mode + one or more parameters can be selected which are shown as below + \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function + \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC + \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it + \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) + \param[out] none + \retval none +*/ +void enet_flowcontrol_feature_disable(uint32_t feature) +{ + if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)) { + ENET_MAC_FCTL |= ENET_ZERO_QUANTA_PAUSE; + } + feature &= ~ENET_ZERO_QUANTA_PAUSE; + ENET_MAC_FCTL &= ~feature; +} + +/*! + \brief get the dma transmit/receive process state + \param[in] direction: choose the direction of dma process which users want to check, + refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: dma transmit process + \arg ENET_DMA_RX: dma receive process + \param[out] none + \retval state of dma process, the value range shows below: + ENET_RX_STATE_STOPPED, ENET_RX_STATE_FETCHING, ENET_RX_STATE_WAITING, + ENET_RX_STATE_SUSPENDED, ENET_RX_STATE_CLOSING, ENET_RX_STATE_QUEUING, + ENET_TX_STATE_STOPPED, ENET_TX_STATE_FETCHING, ENET_TX_STATE_WAITING, + ENET_TX_STATE_READING, ENET_TX_STATE_SUSPENDED, ENET_TX_STATE_CLOSING +*/ +uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction) +{ + uint32_t reval; + reval = (uint32_t)(ENET_DMA_STAT & (uint32_t)direction); + return reval; +} + +/*! + \brief poll the DMA transmission/reception enable by writing any value to the + ENET_DMA_TPEN/ENET_DMA_RPEN register, this will make the DMA to resume transmission/reception + \param[in] direction: choose the direction of DMA process which users want to resume, + refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA transmit process + \arg ENET_DMA_RX: DMA receive process + \param[out] none + \retval none +*/ +void enet_dmaprocess_resume(enet_dmadirection_enum direction) +{ + if(ENET_DMA_TX == direction) { + ENET_DMA_TPEN = 0U; + } else { + ENET_DMA_RPEN = 0U; + } +} + +/*! + \brief check and recover the Rx process + \param[in] none + \param[out] none + \retval none +*/ +void enet_rxprocess_check_recovery(void) +{ + uint32_t status; + + /* get DAV information of current RxDMA descriptor */ + status = dma_current_rxdesc->status; + status &= ENET_RDES0_DAV; + + /* if current descriptor is owned by DMA, but the descriptor address mismatches with + receive descriptor address pointer updated by RxDMA controller */ + if((ENET_DMA_CRDADDR != ((uint32_t)dma_current_rxdesc)) && + (ENET_RDES0_DAV == status)) { + dma_current_rxdesc = (enet_descriptors_struct *)ENET_DMA_CRDADDR; + } +} + +/*! + \brief flush the ENET transmit FIFO, and wait until the flush operation completes + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_txfifo_flush(void) +{ + uint32_t flush_state; + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + + /* set the FTF bit for flushing transmit FIFO */ + ENET_DMA_CTL |= ENET_DMA_CTL_FTF; + /* wait until the flush operation completes */ + do { + flush_state = ENET_DMA_CTL & ENET_DMA_CTL_FTF; + timeout++; + } while((RESET != flush_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(RESET == flush_state) { + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief get the transmit/receive address of current descriptor, or current buffer, or descriptor table + \param[in] addr_get: choose the address which users want to get, refer to enet_desc_reg_enum + only one parameter can be selected which is shown as below + \arg ENET_RX_DESC_TABLE: the start address of the receive descriptor table + \arg ENET_RX_CURRENT_DESC: the start descriptor address of the current receive descriptor read by + the RxDMA controller + \arg ENET_RX_CURRENT_BUFFER: the current receive buffer address being read by the RxDMA controller + \arg ENET_TX_DESC_TABLE: the start address of the transmit descriptor table + \arg ENET_TX_CURRENT_DESC: the start descriptor address of the current transmit descriptor read by + the TxDMA controller + \arg ENET_TX_CURRENT_BUFFER: the current transmit buffer address being read by the TxDMA controller + \param[out] none + \retval address value +*/ +uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get) +{ + uint32_t reval = 0U; + + reval = REG32((ENET) + (uint32_t)addr_get); + return reval; +} + +/*! + \brief get the Tx or Rx descriptor information + \param[in] desc: the descriptor pointer which users want to get information + \param[in] info_get: the descriptor information type which is selected, + only one parameter can be selected which is shown as below + \arg RXDESC_BUFFER_1_SIZE: receive buffer 1 size + \arg RXDESC_BUFFER_2_SIZE: receive buffer 2 size + \arg RXDESC_FRAME_LENGTH: the byte length of the received frame that was transferred to the buffer + \arg TXDESC_COLLISION_COUNT: the number of collisions occurred before the frame was transmitted + \arg RXDESC_BUFFER_1_ADDR: the buffer1 address of the Rx frame + \arg TXDESC_BUFFER_1_ADDR: the buffer1 address of the Tx frame + \param[out] none + \retval descriptor information, if value is 0xFFFFFFFFU, means the false input parameter +*/ +uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get) +{ + uint32_t reval = 0xFFFFFFFFU; + + switch(info_get) { + case RXDESC_BUFFER_1_SIZE: + reval = GET_RDES1_RB1S(desc->control_buffer_size); + break; + case RXDESC_BUFFER_2_SIZE: + reval = GET_RDES1_RB2S(desc->control_buffer_size); + break; + case RXDESC_FRAME_LENGTH: + reval = GET_RDES0_FRML(desc->status); + if(reval > 4U) { + reval = reval - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (desc->status & ENET_RDES0_FRMT))) { + reval = reval + 4U; + } + } else { + reval = 0U; + } + + break; + case RXDESC_BUFFER_1_ADDR: + reval = desc->buffer1_addr; + break; + case TXDESC_BUFFER_1_ADDR: + reval = desc->buffer1_addr; + break; + case TXDESC_COLLISION_COUNT: + reval = GET_TDES0_COCNT(desc->status); + break; + default: + break; + } + return reval; +} + +/*! + \brief get the number of missed frames during receiving + \param[in] none + \param[out] rxfifo_drop: pointer to the number of frames dropped by RxFIFO + \param[out] rxdma_drop: pointer to the number of frames missed by the RxDMA controller + \retval none +*/ +void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop) +{ + uint32_t temp_counter = 0U; + + temp_counter = ENET_DMA_MFBOCNT; + *rxfifo_drop = GET_DMA_MFBOCNT_MSFA(temp_counter); + *rxdma_drop = GET_DMA_MFBOCNT_MSFC(temp_counter); +} + +/*! + \brief get the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to get flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor + only one parameter can be selected which is shown as below + \arg ENET_TDES0_DB: deferred + \arg ENET_TDES0_UFE: underflow error + \arg ENET_TDES0_EXD: excessive deferral + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_ECO: excessive collision + \arg ENET_TDES0_LCO: late collision + \arg ENET_TDES0_NCA: no carrier + \arg ENET_TDES0_LCA: loss of carrier + \arg ENET_TDES0_IPPE: IP payload error + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_JT: jabber timeout + \arg ENET_TDES0_ES: error summary + \arg ENET_TDES0_IPHE: IP header error + \arg ENET_TDES0_TTMSS: transmit timestamp status + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + + \arg ENET_RDES0_PCERR: payload checksum error + \arg ENET_RDES0_EXSV: extended status valid + \arg ENET_RDES0_CERR: CRC error + \arg ENET_RDES0_DBERR: dribble bit error + \arg ENET_RDES0_RERR: receive error + \arg ENET_RDES0_RWDT: receive watchdog timeout + \arg ENET_RDES0_FRMT: frame type + \arg ENET_RDES0_LCO: late collision + \arg ENET_RDES0_IPHERR: IP frame header error + \arg ENET_RDES0_TSV: timestamp valid + \arg ENET_RDES0_LDES: last descriptor + \arg ENET_RDES0_FDES: first descriptor + \arg ENET_RDES0_VTAG: VLAN tag + \arg ENET_RDES0_OERR: overflow error + \arg ENET_RDES0_LERR: length error + \arg ENET_RDES0_SAFF: SA filter fail + \arg ENET_RDES0_DERR: descriptor error + \arg ENET_RDES0_ERRS: error summary + \arg ENET_RDES0_DAFF: destination address filter fail + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + FlagStatus enet_flag = RESET; + + if((uint32_t)RESET != (desc->status & desc_flag)) { + enet_flag = SET; + } + + return enet_flag; +} + +/*! + \brief set the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to set flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor + only one parameter can be selected which is shown as below + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval none +*/ +void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + desc->status |= desc_flag; +} + +/*! + \brief clear the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to clear flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor + only one parameter can be selected which is shown as below + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval none +*/ +void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + desc->status &= ~desc_flag; +} + +/*! + \brief when receiving completed, set RS bit in ENET_DMA_STAT register will immediately set + \param[in] desc: the descriptor pointer which users want to configure + \param[out] none + \retval none +*/ +void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc) +{ + desc->control_buffer_size &= ~ENET_RDES1_DINTC; +} + +/*! + \brief when receiving completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time + \param[in] desc: the descriptor pointer which users want to configure + \param[in] delay_time: delay a time of 256*delay_time HCLK, this value must be between 0 and 0xFF + \param[out] none + \retval none +*/ +void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time) +{ + desc->control_buffer_size |= ENET_RDES1_DINTC; + ENET_DMA_RSWDC = DMA_RSWDC_WDCFRS(delay_time); +} + +/*! + \brief drop current receive frame + \param[in] none + \param[out] none + \retval none +*/ +void enet_rxframe_drop(void) +{ + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { + if(NULL != dma_current_ptp_rxdesc) { + dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_rxdesc->status) { + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); + } else { + /* ponter to the next ptp descriptor */ + dma_current_ptp_rxdesc++; + } + } else { + dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); + } + + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); + if(NULL != dma_current_ptp_rxdesc) { + dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); + } + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + if(NULL != dma_current_ptp_rxdesc) { + dma_current_ptp_rxdesc++; + } + } + } +} + +/*! + \brief enable DMA feature + \param[in] feature: the feature of DMA mode + one or more parameters can be selected which are shown as below + \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function + \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function + \param[out] none + \retval none +*/ +void enet_dma_feature_enable(uint32_t feature) +{ + ENET_DMA_CTL |= feature; +} + +/*! + \brief disable DMA feature + \param[in] feature: the feature of DMA mode + one or more parameters can be selected which are shown as below + \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function + \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function + \param[out] none + \retval none +*/ +void enet_dma_feature_disable(uint32_t feature) +{ + ENET_DMA_CTL &= ~feature; +} + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/*! + \brief get the bit of extended status flag in ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to get the extended status flag + \param[in] desc_status: the extended status want to get + only one parameter can be selected which is shown as below + \arg ENET_RDES4_IPPLDT: IP frame payload type + \arg ENET_RDES4_IPHERR: IP frame header error + \arg ENET_RDES4_IPPLDERR: IP frame payload error + \arg ENET_RDES4_IPCKSB: IP frame checksum bypassed + \arg ENET_RDES4_IPF4: IP frame in version 4 + \arg ENET_RDES4_IPF6: IP frame in version 6 + \arg ENET_RDES4_PTPMT: PTP message type + \arg ENET_RDES4_PTPOEF: PTP on ethernet frame + \arg ENET_RDES4_PTPVF: PTP version format + \param[out] none + \retval value of extended status +*/ +uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status) +{ + uint32_t reval = 0xFFFFFFFFU; + + switch(desc_status) { + case ENET_RDES4_IPPLDT: + reval = GET_RDES4_IPPLDT(desc->extended_status); + break; + case ENET_RDES4_PTPMT: + reval = GET_RDES4_PTPMT(desc->extended_status); + break; + default: + if((uint32_t)RESET != (desc->extended_status & desc_status)) { + reval = 1U; + } else { + reval = 0U; + } + } + + return reval; +} + +/*! + \brief configure descriptor to work in enhanced mode + \param[in] none + \param[out] none + \retval none +*/ +void enet_desc_select_enhanced_mode(void) +{ + ENET_DMA_BCTL |= ENET_DMA_BCTL_DFM; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced chain mode with ptp function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + + /* configuration each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)) { + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + } else { + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t)desc_tab; + } + } +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced ring mode with ptp function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc; + enet_descriptors_struct *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select ring mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* set buffer1 size */ + desc_bufsize = ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + + /* configure each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)) { + if(ENET_DMA_TX == direction) { + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + } else { + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + } +} + +/*! + \brief receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] buffer: pointer to the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) +{ + uint32_t offset = 0U, size = 0U; + uint32_t timeout = 0U; + uint32_t rdes0_tsv_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { + return ERROR; + } + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer) { + /* if no error occurs, and the frame uses only one descriptor */ + if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize) { + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0; offset < size; offset++) { + (*(buffer + offset)) = (*(__IO uint8_t *)((dma_current_rxdesc->buffer1_addr) + offset)); + } + } else { + return ERROR; + } + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp) { + /* wait for ENET_RDES0_TSV flag to be set, the timestamp value is taken and + write to the RDES6 and RDES7 */ + do { + rdes0_tsv_flag = (dma_current_rxdesc->status & ENET_RDES0_TSV); + timeout++; + } while((RESET == rdes0_tsv_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + return ERROR; + } + + /* clear the ENET_RDES0_TSV flag */ + dma_current_rxdesc->status &= ~ENET_RDES0_TSV; + /* get the timestamp value of the received frame */ + timestamp[0] = dma_current_rxdesc->timestamp_low; + timestamp[1] = dma_current_rxdesc->timestamp_high; + } + + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { + /* Clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0; + } + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { + dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct *)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + GET_DMA_BCTL_DPSL( + ENET_DMA_BCTL)); + } + } + + return SUCCESS; +} + +/*! + \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode + \param[in] buffer: pointer on the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) +{ + uint32_t offset = 0; + uint32_t dma_tbu_flag, dma_tu_flag; + uint32_t tdes0_ttmss_flag; + uint32_t timeout = 0; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE) { + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer) { + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0; offset < length; offset++) { + (*(__IO uint8_t *)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + /* set the frame length */ + dma_current_txdesc->control_buffer_size = length; + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { + /* Clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0; + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp) { + /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ + do { + tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); + timeout++; + } while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + return ERROR; + } + + /* clear the ENET_TDES0_TTMSS flag */ + dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; + /* get the timestamp value of the transmit frame */ + timestamp[0] = dma_current_txdesc->timestamp_low; + timestamp[1] = dma_current_txdesc->timestamp_high; + } + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { + dma_current_txdesc = (enet_descriptors_struct *)(dma_current_txdesc->buffer2_next_desc_addr); + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct *)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + GET_DMA_BCTL_DPSL( + ENET_DMA_BCTL)); + } + } + + return SUCCESS; +} + +#else + +/*! + \brief configure descriptor to work in normal mode + \param[in] none + \param[out] none + \retval none +*/ +void enet_desc_select_normal_mode(void) +{ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DFM; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in normal chain mode with PTP function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table + \param[out] none + \retval none +*/ +void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + dma_current_ptp_txdesc = desc_ptptab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + dma_current_ptp_rxdesc = desc_ptptab; + } + + /* configure each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)) { + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + } else { + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t)desc_tab; + } + /* set desc_ptptab equal to desc_tab */ + (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; + (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; + } + /* when it is the last ptp descriptor, preserve the first descriptor + address of desc_ptptab in ptp descriptor status */ + (&desc_ptptab[num - 1U])->status = (uint32_t)desc_ptptab; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in normal ring mode with PTP function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table + \param[out] none + \retval none +*/ +void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction) { + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select ring mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + dma_current_ptp_txdesc = desc_ptptab; + } else { + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive ring mode and set buffer1 size */ + desc_bufsize = (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + dma_current_ptp_rxdesc = desc_ptptab; + } + + /* configure each descriptor */ + for(num = 0U; num < count; num++) { + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)) { + if(ENET_DMA_TX == direction) { + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + } else { + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + /* set desc_ptptab equal to desc_tab */ + (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; + (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; + } + /* when it is the last ptp descriptor, preserve the first descriptor + address of desc_ptptab in ptp descriptor status */ + (&desc_ptptab[num - 1U])->status = (uint32_t)desc_ptptab; +} + +/*! + \brief receive a packet data with timestamp values to application buffer, when the DMA is in normal mode + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] buffer: pointer to the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[out] timestamp: pointer to the table which stores the timestamp high and low + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) +{ + uint32_t offset = 0U, size = 0U; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { + return ERROR; + } + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer) { + /* if no error occurs, and the frame uses only one descriptor */ + if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { + + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize) { + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0U; offset < size; offset++) { + (*(buffer + offset)) = (*(__IO uint8_t *)(uint32_t)((dma_current_ptp_rxdesc->buffer1_addr) + offset)); + } + + } else { + return ERROR; + } + } + /* copy timestamp value from Rx descriptor to application array */ + timestamp[0] = dma_current_rxdesc->buffer1_addr; + timestamp[1] = dma_current_rxdesc->buffer2_next_desc_addr; + + dma_current_rxdesc->buffer1_addr = dma_current_ptp_rxdesc ->buffer1_addr ; + dma_current_rxdesc->buffer2_next_desc_addr = dma_current_ptp_rxdesc ->buffer2_next_desc_addr; + + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { + /* clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0U; + } + + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { + dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_rxdesc->status) { + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); + } else { + /* ponter to the next ptp descriptor */ + dma_current_ptp_rxdesc++; + } + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); + /* RDES2 and RDES3 will not be covered by buffer address, so do not need to preserve a new table, + use the same table with RxDMA descriptor */ + dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + dma_current_ptp_rxdesc ++; + } + } + + return SUCCESS; +} + +/*! + \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode + \param[in] buffer: pointer on the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) +{ + uint32_t offset = 0U, timeout = 0U; + uint32_t dma_tbu_flag, dma_tu_flag, tdes0_ttmss_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE) { + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer) { + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0U; offset < length; offset++) { + (*(__IO uint8_t *)(uint32_t)((dma_current_ptp_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + /* set the frame length */ + dma_current_txdesc->control_buffer_size = (length & (uint32_t)0x1FFF); + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { + /* clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0U; + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp) { + /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ + do { + tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); + timeout++; + } while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + return ERROR; + } + + /* clear the ENET_TDES0_TTMSS flag */ + dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; + /* get the timestamp value of the transmit frame */ + timestamp[0] = dma_current_txdesc->buffer1_addr; + timestamp[1] = dma_current_txdesc->buffer2_next_desc_addr; + } + dma_current_txdesc->buffer1_addr = dma_current_ptp_txdesc ->buffer1_addr ; + dma_current_txdesc->buffer2_next_desc_addr = dma_current_ptp_txdesc ->buffer2_next_desc_addr; + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { + dma_current_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_txdesc->status) { + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->status); + } else { + /* ponter to the next ptp descriptor */ + dma_current_ptp_txdesc++; + } + } else { + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); + /* TDES2 and TDES3 will not be covered by buffer address, so do not need to preserve a new table, + use the same table with TxDMA descriptor */ + dma_current_ptp_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->status); + } else { + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + dma_current_ptp_txdesc ++; + } + } + return SUCCESS; +} + +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/*! + \brief wakeup frame filter register pointer reset + \param[in] none + \param[out] none + \retval none +*/ +void enet_wum_filter_register_pointer_reset(void) +{ + ENET_MAC_WUM |= ENET_MAC_WUM_WUFFRPR; +} + +/*! + \brief set the remote wakeup frame registers + \param[in] pdata: pointer to buffer data which is written to remote wakeup frame registers (8 words total) + \param[out] none + \retval none +*/ +void enet_wum_filter_config(uint32_t pdata[]) +{ + uint32_t num = 0U; + + /* configure ENET_MAC_RWFF register */ + for(num = 0U; num < ETH_WAKEUP_REGISTER_LENGTH; num++) { + ENET_MAC_RWFF = pdata[num]; + } +} + +/*! + \brief enable wakeup management features + \param[in] feature: the wake up type which is selected + one or more parameters can be selected which are shown as below + \arg ENET_WUM_POWER_DOWN: power down mode + \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception + \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception + \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame + \param[out] none + \retval none +*/ +void enet_wum_feature_enable(uint32_t feature) +{ + ENET_MAC_WUM |= feature; +} + +/*! + \brief disable wakeup management features + \param[in] feature: the wake up type which is selected + one or more parameters can be selected which are shown as below + \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception + \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception + \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame + \param[out] none + \retval none +*/ +void enet_wum_feature_disable(uint32_t feature) +{ + ENET_MAC_WUM &= (~feature); +} + +/*! + \brief reset the MAC statistics counters + \param[in] none + \param[out] none + \retval none +*/ +void enet_msc_counters_reset(void) +{ + /* reset all counters */ + ENET_MSC_CTL |= ENET_MSC_CTL_CTR; +} + +/*! + \brief enable the MAC statistics counter features + \param[in] feature: the feature of MAC statistics counter + one or more parameters can be selected which are shown as below + \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover + \arg ENET_MSC_RESET_ON_READ: reset on read + \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze + \param[out] none + \retval none +*/ +void enet_msc_feature_enable(uint32_t feature) +{ + ENET_MSC_CTL |= feature; +} + +/*! + \brief disable the MAC statistics counter features + \param[in] feature: the feature of MAC statistics counter + one or more parameters can be selected which are shown as below + \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover + \arg ENET_MSC_RESET_ON_READ: reset on read + \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze + \param[out] none + \retval none +*/ +void enet_msc_feature_disable(uint32_t feature) +{ + ENET_MSC_CTL &= (~feature); +} + +/*! + \brief configure MAC statistics counters preset mode + \param[in] mode: MSC counters preset mode, refer to enet_msc_preset_enum + only one parameter can be selected which is shown as below + \arg ENET_MSC_PRESET_NONE: do not preset MSC counter + \arg ENET_MSC_PRESET_HALF: preset all MSC counters to almost-half(0x7FFF FFF0) value + \arg ENET_MSC_PRESET_FULL: preset all MSC counters to almost-full(0xFFFF FFF0) value + \param[out] none + \retval none +*/ +void enet_msc_counters_preset_config(enet_msc_preset_enum mode) +{ + ENET_MSC_CTL &= ENET_MSC_PRESET_MASK; + ENET_MSC_CTL |= (uint32_t)mode; +} + +/*! + \brief get MAC statistics counter + \param[in] counter: MSC counters which is selected, refer to enet_msc_counter_enum + only one parameter can be selected which is shown as below + \arg ENET_MSC_TX_SCCNT: MSC transmitted good frames after a single collision counter + \arg ENET_MSC_TX_MSCCNT: MSC transmitted good frames after more than a single collision counter + \arg ENET_MSC_TX_TGFCNT: MSC transmitted good frames counter + \arg ENET_MSC_RX_RFCECNT: MSC received frames with CRC error counter + \arg ENET_MSC_RX_RFAECNT: MSC received frames with alignment error counter + \arg ENET_MSC_RX_RGUFCNT: MSC received good unicast frames counter + \param[out] none + \retval the MSC counter value +*/ +uint32_t enet_msc_counters_get(enet_msc_counter_enum counter) +{ + uint32_t reval; + + reval = REG32((ENET + (uint32_t)counter)); + + return reval; +} + +/*! + \brief change subsecond to nanosecond + \param[in] subsecond: subsecond value + \param[out] none + \retval the nanosecond value +*/ +uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond) +{ + uint64_t val = subsecond * 1000000000Ull; + val >>= 31; + return (uint32_t)val; +} + +/*! + \brief change nanosecond to subsecond + \param[in] nanosecond: nanosecond value + \param[out] none + \retval the subsecond value +*/ +uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond) +{ + uint64_t val = nanosecond * 0x80000000Ull; + val /= 1000000000U; + return (uint32_t)val; +} + +/*! + \brief enable the PTP features + \param[in] feature: the feature of ENET PTP mode + one or more parameters can be selected which are shown as below + \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames + \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger + \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot + \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame + \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame + \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame + \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame + \param[out] none + \retval none +*/ +void enet_ptp_feature_enable(uint32_t feature) +{ + ENET_PTP_TSCTL |= feature; +} + +/*! + \brief disable the PTP features + \param[in] feature: the feature of ENET PTP mode + one or more parameters can be selected which are shown as below + \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames + \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger + \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot + \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame + \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame + \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame + \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame + \param[out] none + \retval none +*/ +void enet_ptp_feature_disable(uint32_t feature) +{ + ENET_PTP_TSCTL &= ~feature; +} + +/*! + \brief configure the PTP timestamp function + \param[in] func: the function of PTP timestamp + only one parameter can be selected which is shown as below + \arg ENET_CKNT_ORDINARY: type of ordinary clock node type for timestamp + \arg ENET_CKNT_BOUNDARY: type of boundary clock node type for timestamp + \arg ENET_CKNT_END_TO_END: type of end-to-end transparent clock node type for timestamp + \arg ENET_CKNT_PEER_TO_PEER: type of peer-to-peer transparent clock node type for timestamp + \arg ENET_PTP_ADDEND_UPDATE: addend register update + \arg ENET_PTP_SYSTIME_UPDATE: timestamp update + \arg ENET_PTP_SYSTIME_INIT: timestamp initialize + \arg ENET_PTP_FINEMODE: the system timestamp uses the fine method for updating + \arg ENET_PTP_COARSEMODE: the system timestamp uses the coarse method for updating + \arg ENET_SUBSECOND_DIGITAL_ROLLOVER: digital rollover mode + \arg ENET_SUBSECOND_BINARY_ROLLOVER: binary rollover mode + \arg ENET_SNOOPING_PTP_VERSION_2: version 2 + \arg ENET_SNOOPING_PTP_VERSION_1: version 1 + \arg ENET_EVENT_TYPE_MESSAGES_SNAPSHOT: only event type messages are taken snapshot + \arg ENET_ALL_TYPE_MESSAGES_SNAPSHOT: all type messages are taken snapshot except announce, + management and signaling message + \arg ENET_MASTER_NODE_MESSAGE_SNAPSHOT: snapshot is only take for master node message + \arg ENET_SLAVE_NODE_MESSAGE_SNAPSHOT: snapshot is only taken for slave node message + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func) +{ + uint32_t temp_config = 0U, temp_state = 0U; + uint32_t timeout = 0U; + ErrStatus enet_state = SUCCESS; + + switch(func) { + case ENET_CKNT_ORDINARY: + case ENET_CKNT_BOUNDARY: + case ENET_CKNT_END_TO_END: + case ENET_CKNT_PEER_TO_PEER: + ENET_PTP_TSCTL &= ~ENET_PTP_TSCTL_CKNT; + ENET_PTP_TSCTL |= (uint32_t)func; + break; + case ENET_PTP_ADDEND_UPDATE: + /* this bit must be read as zero before application set it */ + do { + temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSARU; + timeout++; + } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + enet_state = ERROR; + } else { + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSARU; + } + break; + case ENET_PTP_SYSTIME_UPDATE: + /* both the TMSSTU and TMSSTI bits must be read as zero before application set this bit */ + do { + temp_state = ENET_PTP_TSCTL & (ENET_PTP_TSCTL_TMSSTU | ENET_PTP_TSCTL_TMSSTI); + timeout++; + } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + enet_state = ERROR; + } else { + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTU; + } + break; + case ENET_PTP_SYSTIME_INIT: + /* this bit must be read as zero before application set it */ + do { + temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSSTI; + timeout++; + } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout) { + enet_state = ERROR; + } else { + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTI; + } + break; + default: + temp_config = (uint32_t)func & (~BIT(31)); + if(RESET != ((uint32_t)func & BIT(31))) { + ENET_PTP_TSCTL |= temp_config; + } else { + ENET_PTP_TSCTL &= ~temp_config; + } + break; + } + + return enet_state; +} + +/*! + \brief configure system time subsecond increment value + \param[in] subsecond: the value will be added to the subsecond value of system time, + this value must be between 0 and 0xFF + \param[out] none + \retval none +*/ +void enet_ptp_subsecond_increment_config(uint32_t subsecond) +{ + ENET_PTP_SSINC = PTP_SSINC_STMSSI(subsecond); +} + +/*! + \brief adjusting the clock frequency only in fine update mode + \param[in] add: the value will be added to the accumulator register to achieve time synchronization + \param[out] none + \retval none +*/ +void enet_ptp_timestamp_addend_config(uint32_t add) +{ + ENET_PTP_TSADDEND = add; +} + +/*! + \brief initialize or add/subtract to second of the system time + \param[in] sign: timestamp update positive or negative sign + only one parameter can be selected which is shown as below + \arg ENET_PTP_ADD_TO_TIME: timestamp update value is added to system time + \arg ENET_PTP_SUBSTRACT_FROM_TIME: timestamp update value is subtracted from system time + \param[in] second: initializing or adding/subtracting to second of the system time + \param[in] subsecond: the current subsecond of the system time + with 0.46 ns accuracy if required accuracy is 20 ns + \param[out] none + \retval none +*/ +void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond) +{ + ENET_PTP_TSUH = second; + ENET_PTP_TSUL = sign | PTP_TSUL_TMSUSS(subsecond); +} + +/*! + \brief configure the expected target time + \param[in] second: the expected target second time + \param[in] nanosecond: the expected target nanosecond time (signed) + \param[out] none + \retval none +*/ +void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond) +{ + ENET_PTP_ETH = second; + ENET_PTP_ETL = nanosecond; +} + +/*! + \brief get the current system time + \param[in] none + \param[out] systime_struct: pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + subsecond: 0x0 - 0x7FFF FFFF + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \retval none +*/ +void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct) +{ + uint32_t temp_sec = 0U, temp_subs = 0U; + + /* get the value of sysytem time registers */ + temp_sec = (uint32_t)ENET_PTP_TSH; + temp_subs = (uint32_t)ENET_PTP_TSL; + + /* get sysytem time and construct the enet_ptp_systime_struct structure */ + systime_struct->second = temp_sec; + systime_struct->nanosecond = GET_PTP_TSL_STMSS(temp_subs); + systime_struct->nanosecond = enet_ptp_subsecond_2_nanosecond(systime_struct->nanosecond); + systime_struct->sign = GET_PTP_TSL_STS(temp_subs); +} + +/*! + \brief configure the PPS output frequency + \param[in] freq: PPS output frequency + only one parameter can be selected which is shown as below + \arg ENET_PPSOFC_1HZ: PPS output 1Hz frequency + \arg ENET_PPSOFC_2HZ: PPS output 2Hz frequency + \arg ENET_PPSOFC_4HZ: PPS output 4Hz frequency + \arg ENET_PPSOFC_8HZ: PPS output 8Hz frequency + \arg ENET_PPSOFC_16HZ: PPS output 16Hz frequency + \arg ENET_PPSOFC_32HZ: PPS output 32Hz frequency + \arg ENET_PPSOFC_64HZ: PPS output 64Hz frequency + \arg ENET_PPSOFC_128HZ: PPS output 128Hz frequency + \arg ENET_PPSOFC_256HZ: PPS output 256Hz frequency + \arg ENET_PPSOFC_512HZ: PPS output 512Hz frequency + \arg ENET_PPSOFC_1024HZ: PPS output 1024Hz frequency + \arg ENET_PPSOFC_2048HZ: PPS output 2048Hz frequency + \arg ENET_PPSOFC_4096HZ: PPS output 4096Hz frequency + \arg ENET_PPSOFC_8192HZ: PPS output 8192Hz frequency + \arg ENET_PPSOFC_16384HZ: PPS output 16384Hz frequency + \arg ENET_PPSOFC_32768HZ: PPS output 32768Hz frequency + \param[out] none + \retval none +*/ +void enet_ptp_pps_output_frequency_config(uint32_t freq) +{ + ENET_PTP_PPSCTL = freq; +} + +/*! + \brief configure and start PTP timestamp counter + \param[in] updatemethod: method for updating + \arg ENET_PTP_FINEMODE: fine correction method + \arg ENET_PTP_COARSEMODE: coarse correction method + \param[in] init_sec: second value for initializing system time + \param[in] init_subsec: subsecond value for initializing system time + \param[in] carry_cfg: the value to be added to the accumulator register (in fine method is used) + \param[in] accuracy_cfg: the value to be added to the subsecond value of system time + \param[out] none + \retval none +*/ +void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, + uint32_t accuracy_cfg) +{ + /* mask the timestamp trigger interrupt */ + enet_interrupt_disable(ENET_MAC_INT_TMSTIM); + + /* enable timestamp */ + enet_ptp_feature_enable(ENET_ALL_RX_TIMESTAMP | ENET_RXTX_TIMESTAMP); + + /* configure system time subsecond increment based on the PTP clock frequency */ + enet_ptp_subsecond_increment_config(accuracy_cfg); + + if(ENET_PTP_FINEMODE == updatemethod) { + /* fine correction method: configure the timestamp addend, then update */ + enet_ptp_timestamp_addend_config(carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); + /* wait until update is completed */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_ADDEND_UPDATE)) { + } + } + + /* choose the fine correction method */ + enet_ptp_timestamp_function_config((enet_ptp_function_enum)updatemethod); + + /* initialize the system time */ + enet_ptp_timestamp_update_config(ENET_PTP_ADD_TO_TIME, init_sec, init_subsec); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + enet_desc_select_enhanced_mode(); +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ +} + +/*! + \brief adjust frequency in fine method by configure addend register + \param[in] carry_cfg: the value to be added to the accumulator register + \param[out] none + \retval none +*/ +void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg) +{ + /* re-configure the timestamp addend, then update */ + enet_ptp_timestamp_addend_config((uint32_t)carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); +} + +/*! + \brief update system time in coarse method + \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \param[out] none + \retval none +*/ +void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct) +{ + uint32_t subsecond_val; + uint32_t carry_cfg; + + subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); + + /* save the carry_cfg value */ + carry_cfg = ENET_PTP_TSADDEND_TMSA; + + /* update the system time */ + enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_UPDATE); + + /* wait until the update is completed */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_UPDATE)) { + } + + /* write back the carry_cfg value, then update */ + enet_ptp_timestamp_addend_config(carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); +} + +/*! + \brief set system time in fine method + \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \param[out] none + \retval none +*/ +void enet_ptp_finecorrection_settime(enet_ptp_systime_struct *systime_struct) +{ + uint32_t subsecond_val; + + subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); + + /* initialize the system time */ + enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); + + /* wait until the system time initialzation finished */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_INIT)) { + } +} + +/*! + \brief get the ptp flag status + \param[in] flag: ptp flag status to be checked + \arg ENET_PTP_ADDEND_UPDATE: addend register update + \arg ENET_PTP_SYSTIME_UPDATE: timestamp update + \arg ENET_PTP_SYSTIME_INIT: timestamp initialize + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_ptp_flag_get(uint32_t flag) +{ + FlagStatus bitstatus = RESET; + + if((uint32_t)RESET != (ENET_PTP_TSCTL & flag)) { + bitstatus = SET; + } + + return bitstatus; +} + +/*! + \brief reset the ENET initpara struct, call it before using enet_initpara_config() + \param[in] none + \param[out] none + \retval none +*/ +void enet_initpara_reset(void) +{ + enet_initpara.option_enable = 0U; + enet_initpara.forward_frame = 0U; + enet_initpara.dmabus_mode = 0U; + enet_initpara.dma_maxburst = 0U; + enet_initpara.dma_arbitration = 0U; + enet_initpara.store_forward_mode = 0U; + enet_initpara.dma_function = 0U; + enet_initpara.vlan_config = 0U; + enet_initpara.flow_control = 0U; + enet_initpara.hashtable_high = 0U; + enet_initpara.hashtable_low = 0U; + enet_initpara.framesfilter_mode = 0U; + enet_initpara.halfduplex_param = 0U; + enet_initpara.timer_config = 0U; + enet_initpara.interframegap = 0U; +} + +/*! + \brief initialize ENET peripheral with generally concerned parameters, call it by enet_init() + \param[in] none + \param[out] none + \retval none +*/ +static void enet_default_init(void) +{ + uint32_t reg_value = 0U; + + /* MAC */ + /* configure ENET_MAC_CFG register */ + reg_value = ENET_MAC_CFG; + reg_value &= MAC_CFG_MASK; + reg_value |= ENET_WATCHDOG_ENABLE | ENET_JABBER_ENABLE | ENET_INTERFRAMEGAP_96BIT \ + | ENET_SPEEDMODE_10M | ENET_MODE_HALFDUPLEX | ENET_LOOPBACKMODE_DISABLE \ + | ENET_CARRIERSENSE_DISABLE | ENET_RECEIVEOWN_ENABLE \ + | ENET_RETRYTRANSMISSION_ENABLE | ENET_BACKOFFLIMIT_10 \ + | ENET_DEFERRALCHECK_DISABLE \ + | ENET_TYPEFRAME_CRC_DROP_DISABLE \ + | ENET_AUTO_PADCRC_DROP_DISABLE \ + | ENET_CHECKSUMOFFLOAD_DISABLE; + ENET_MAC_CFG = reg_value; + + /* configure ENET_MAC_FRMF register */ + ENET_MAC_FRMF = ENET_SRC_FILTER_DISABLE | ENET_DEST_FILTER_INVERSE_DISABLE \ + | ENET_MULTICAST_FILTER_PERFECT | ENET_UNICAST_FILTER_PERFECT \ + | ENET_PCFRM_PREVENT_ALL | ENET_BROADCASTFRAMES_ENABLE \ + | ENET_PROMISCUOUS_DISABLE | ENET_RX_FILTER_ENABLE; + + /* configure ENET_MAC_HLH, ENET_MAC_HLL register */ + ENET_MAC_HLH = 0x0U; + + ENET_MAC_HLL = 0x0U; + + /* configure ENET_MAC_FCTL, ENET_MAC_FCTH register */ + reg_value = ENET_MAC_FCTL; + reg_value &= MAC_FCTL_MASK; + reg_value |= MAC_FCTL_PTM(0) | ENET_ZERO_QUANTA_PAUSE_DISABLE \ + | ENET_PAUSETIME_MINUS4 | ENET_UNIQUE_PAUSEDETECT \ + | ENET_RX_FLOWCONTROL_DISABLE | ENET_TX_FLOWCONTROL_DISABLE; + ENET_MAC_FCTL = reg_value; + + /* configure ENET_MAC_VLT register */ + ENET_MAC_VLT = ENET_VLANTAGCOMPARISON_16BIT | MAC_VLT_VLTI(0); + + /* disable MAC interrupt */ + ENET_MAC_INTMSK |= ENET_MAC_INTMSK_TMSTIM | ENET_MAC_INTMSK_WUMIM; + + /* MSC */ + /* disable MSC Rx interrupt */ + ENET_MSC_RINTMSK |= ENET_MSC_RINTMSK_RFAEIM | ENET_MSC_RINTMSK_RFCEIM \ + | ENET_MSC_RINTMSK_RGUFIM; + + /* disable MSC Tx interrupt */ + ENET_MSC_TINTMSK |= ENET_MSC_TINTMSK_TGFIM | ENET_MSC_TINTMSK_TGFMSCIM \ + | ENET_MSC_TINTMSK_TGFSCIM; + + /* DMA */ + /* configure ENET_DMA_CTL register */ + reg_value = ENET_DMA_CTL; + reg_value &= DMA_CTL_MASK; + reg_value |= ENET_TCPIP_CKSUMERROR_DROP | ENET_RX_MODE_STOREFORWARD \ + | ENET_FLUSH_RXFRAME_ENABLE | ENET_TX_MODE_STOREFORWARD \ + | ENET_TX_THRESHOLD_64BYTES | ENET_RX_THRESHOLD_64BYTES \ + | ENET_SECONDFRAME_OPT_DISABLE; + ENET_DMA_CTL = reg_value; + + /* configure ENET_DMA_BCTL register */ + reg_value = ENET_DMA_BCTL; + reg_value &= DMA_BCTL_MASK; + reg_value = ENET_ADDRESS_ALIGN_ENABLE | ENET_ARBITRATION_RXTX_2_1 \ + | ENET_RXDP_32BEAT | ENET_PGBL_32BEAT | ENET_RXTX_DIFFERENT_PGBL \ + | ENET_FIXED_BURST_ENABLE | ENET_MIXED_BURST_DISABLE \ + | ENET_NORMAL_DESCRIPTOR; + ENET_DMA_BCTL = reg_value; +} + +#ifndef USE_DELAY +/*! + \brief insert a delay time + \param[in] ncount: specifies the delay time length + \param[out] none + \param[out] none +*/ +static void enet_delay(uint32_t ncount) +{ + __IO uint32_t delay_time = 0U; + + for(delay_time = ncount; delay_time != 0U; delay_time--) { + } +} +#endif /* USE_DELAY */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c new file mode 100644 index 00000000000..03db6db8ce9 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c @@ -0,0 +1,1264 @@ +/*! + \file gd32f5xx_exmc.c + \brief EXMC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_exmc.h" + +/* EXMC bank0 register reset value */ +#define BANK0_SNCTL_RESET ((uint32_t)0x000030DAU) +#define BANK0_SNTCFG_RESET ((uint32_t)0x0FFFFFFFU) +#define BANK0_SNWTCFG_RESET ((uint32_t)0x0FFFFFFFU) + +/* EXMC bank1/2 register reset mask */ +#define BANK1_2_NPCTL_RESET ((uint32_t)0x00000008U) +#define BANK1_2_NPINTEN_RESET ((uint32_t)0x00000042U) +#define BANK1_2_NPCTCFG_RESET ((uint32_t)0xFFFFFFFFU) +#define BANK1_2_NPATCFG_RESET ((uint32_t)0xFFFFFFFFU) + +/* EXMC bank3 register reset mask */ +#define BANK3_NPCTL_RESET ((uint32_t)0x00000008U) +#define BANK3_NPINTEN_RESET ((uint32_t)0x00000040U) +#define BANK3_NPCTCFG_RESET ((uint32_t)0xFFFFFFFFU) +#define BANK3_NPATCFG_RESET ((uint32_t)0xFFFFFFFFU) +#define BANK3_PIOTCFG3_RESET ((uint32_t)0xFFFFFFFFU) + +/* EXMC SDRAM device register reset mask */ +#define SDRAM_DEVICE_SDCTL_RESET ((uint32_t)0x000002D0U) +#define SDRAM_DEVICE_SDTCFG_RESET ((uint32_t)0x0FFFFFFFU) +#define SDRAM_DEVICE_SDCMD_RESET ((uint32_t)0x00000000U) +#define SDRAM_DEVICE_SDARI_RESET ((uint32_t)0x00000000U) +#define SDRAM_DEVICE_SDSTAT_RESET ((uint32_t)0x00000000U) +#define SDRAM_DEVICE_SDRSCTL_RESET ((uint32_t)0x00000000U) + +/* EXMC bank0 SQPI-PSRAM register reset mask */ +#define BANK0_SQPI_SINIT_RESET ((uint32_t)0x18010000U) +#define BANK0_SQPI_SRCMD_RESET ((uint32_t)0x00000000U) +#define BANK0_SQPI_SWCMD_RESET ((uint32_t)0x00000000U) +#define BANK0_SQPI_SIDL_RESET ((uint32_t)0x00000000U) +#define BANK0_SQPI_SIDH_RESET ((uint32_t)0x00000000U) + +/* EXMC register bit offset */ +/* SNCTL offset */ +#define SNCTL_NRMUX_OFFSET ((uint32_t)1U) +#define SNCTL_SBRSTEN_OFFSET ((uint32_t)8U) +#define SNCTL_WRAPEN_OFFSET ((uint32_t)10U) +#define SNCTL_WREN_OFFSET ((uint32_t)12U) +#define SNCTL_NRWTEN_OFFSET ((uint32_t)13U) +#define SNCTL_EXMODEN_OFFSET ((uint32_t)14U) +#define SNCTL_ASYNCWAIT_OFFSET ((uint32_t)15U) + +/* SNTCFG offset */ +#define SNTCFG_AHLD_OFFSET ((uint32_t)4U) +#define SNTCFG_DSET_OFFSET ((uint32_t)8U) +#define SNTCFG_BUSLAT_OFFSET ((uint32_t)16U) + +/* NPCTL offset */ +#define NPCTL_NDWTEN_OFFSET ((uint32_t)1U) +#define NPCTL_ECCEN_OFFSET ((uint32_t)6U) + +/* NPCTCFG offset */ +#define NPCTCFG_COMWAIT_OFFSET ((uint32_t)8U) +#define NPCTCFG_COMHLD_OFFSET ((uint32_t)16U) +#define NPCTCFG_COMHIZ_OFFSET ((uint32_t)24U) + +/* NPATCFG offset */ +#define NPATCFG_ATTWAIT_OFFSET ((uint32_t)8U) +#define NPATCFG_ATTHLD_OFFSET ((uint32_t)16U) +#define NPATCFG_ATTHIZ_OFFSET ((uint32_t)24U) + +/* PIOTCFG offset */ +#define PIOTCFG_IOWAIT_OFFSET ((uint32_t)8U) +#define PIOTCFG_IOHLD_OFFSET ((uint32_t)16U) +#define PIOTCFG_IOHIZ_OFFSET ((uint32_t)24U) + +/* SDCTL offset */ +#define SDCTL_WPEN_OFFSET ((uint32_t)9U) +#define SDCTL_BRSTRD_OFFSET ((uint32_t)12U) + +/* SDTCFG offset */ +#define SDTCFG_XSRD_OFFSET ((uint32_t)4U) +#define SDTCFG_RASD_OFFSET ((uint32_t)8U) +#define SDTCFG_ARFD_OFFSET ((uint32_t)12U) +#define SDTCFG_WRD_OFFSET ((uint32_t)16U) +#define SDTCFG_RPD_OFFSET ((uint32_t)20U) +#define SDTCFG_RCD_OFFSET ((uint32_t)24U) + +/* SDCMD offset */ +#define SDCMD_NARF_OFFSET ((uint32_t)5U) +#define SDCMD_MRC_OFFSET ((uint32_t)9U) + +/* SDARI offset */ +#define SDARI_ARINTV_OFFSET ((uint32_t)1U) + +/* SDSTAT offset */ +#define SDSTAT_STA0_OFFSET ((uint32_t)1U) +#define SDSTAT_STA1_OFFSET ((uint32_t)3U) + +/* SRCMD offset */ +#define SRCMD_RWAITCYCLE_OFFSET ((uint32_t)16U) +#define SWCMD_WWAITCYCLE_OFFSET ((uint32_t)16U) + +/* INTEN offset */ +#define INTEN_INTS_OFFSET ((uint32_t)3U) + +/*! + \brief deinitialize EXMC NOR/SRAM region + \param[in] exmc_norsram_region: select the region of bank0 + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_deinit(uint32_t exmc_norsram_region) +{ + /* reset the registers */ + EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_RESET; + EXMC_SNTCFG(exmc_norsram_region) = BANK0_SNTCFG_RESET; + EXMC_SNWTCFG(exmc_norsram_region) = BANK0_SNWTCFG_RESET; +} + +/*! + \brief initialize exmc_norsram_parameter_struct with the default values + \param[in] none + \param[out] exmc_norsram_init_struct: the initialized struct exmc_norsram_parameter_struct pointer + \retval none +*/ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct) +{ + /* configure the structure with default values */ + exmc_norsram_init_struct->norsram_region = EXMC_BANK0_NORSRAM_REGION0; + exmc_norsram_init_struct->address_data_mux = ENABLE; + exmc_norsram_init_struct->memory_type = EXMC_MEMORY_TYPE_SRAM; + exmc_norsram_init_struct->databus_width = EXMC_NOR_DATABUS_WIDTH_8B; + exmc_norsram_init_struct->burst_mode = DISABLE; + exmc_norsram_init_struct->nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + exmc_norsram_init_struct->wrap_burst_mode = DISABLE; + exmc_norsram_init_struct->nwait_config = EXMC_NWAIT_CONFIG_BEFORE; + exmc_norsram_init_struct->memory_write = ENABLE; + exmc_norsram_init_struct->nwait_signal = ENABLE; + exmc_norsram_init_struct->extended_mode = DISABLE; + exmc_norsram_init_struct->asyn_wait = DISABLE; + exmc_norsram_init_struct->write_mode = EXMC_ASYN_WRITE; + + /* configure read/write timing */ + exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime = 0xFFU; + exmc_norsram_init_struct->read_write_timing->bus_latency = 0xFU; + exmc_norsram_init_struct->read_write_timing->syn_clk_division = EXMC_SYN_CLOCK_RATIO_16_CLK; + exmc_norsram_init_struct->read_write_timing->syn_data_latency = EXMC_DATALAT_17_CLK; + exmc_norsram_init_struct->read_write_timing->syn_data_latency_dec = 0x0U; + exmc_norsram_init_struct->read_write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; + + /* configure write timing, when extended mode is used */ + exmc_norsram_init_struct->write_timing->asyn_address_setuptime = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_address_holdtime = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_data_setuptime = 0xFFU; + exmc_norsram_init_struct->write_timing->bus_latency = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; +} + +/*! + \brief initialize EXMC NOR/SRAM region + \param[in] exmc_norsram_init_struct: configure the EXMC NOR/SRAM parameter + norsram_region: EXMC_BANK0_NORSRAM_REGIONx, x=0..3 + write_mode: EXMC_ASYN_WRITE, EXMC_SYN_WRITE + extended_mode: ENABLE or DISABLE + asyn_wait: ENABLE or DISABLE + nwait_signal: ENABLE or DISABLE + memory_write: ENABLE or DISABLE + nwait_config: EXMC_NWAIT_CONFIG_BEFORE, EXMC_NWAIT_CONFIG_DURING + wrap_burst_mode: ENABLE or DISABLE + nwait_polarity: EXMC_NWAIT_POLARITY_LOW, EXMC_NWAIT_POLARITY_HIGH + burst_mode: ENABLE or DISABLE + databus_width: EXMC_NOR_DATABUS_WIDTH_8B, EXMC_NOR_DATABUS_WIDTH_16B + memory_type: EXMC_MEMORY_TYPE_SRAM, EXMC_MEMORY_TYPE_PSRAM, EXMC_MEMORY_TYPE_NOR + address_data_mux: ENABLE or DISABLE + read_write_timing: struct exmc_norsram_timing_parameter_struct set the time + asyn_access_mode: EXMC_ACCESS_MODE_A, EXMC_ACCESS_MODE_B, EXMC_ACCESS_MODE_C, EXMC_ACCESS_MODE_D + syn_data_latency: EXMC_DATALAT_x_CLK, x=2..17 + syn_data_latency_dec: 0x1U~0x7U + syn_clk_division: EXMC_SYN_CLOCK_RATIO_DISABLE, EXMC_SYN_CLOCK_RATIO_x_CLK, x=2..16 + bus_latency: 0x0U~0xFU + asyn_data_setuptime: 0x01U~0xFFU + asyn_address_holdtime: 0x1U~0xFU + asyn_address_setuptime: 0x0U~0xFU + write_timing: struct exmc_norsram_timing_parameter_struct set the time + asyn_access_mode: EXMC_ACCESS_MODE_A, EXMC_ACCESS_MODE_B, EXMC_ACCESS_MODE_C, EXMC_ACCESS_MODE_D + bus_latency: 0x0U~0xFU + asyn_data_setuptime: 0x01U~0xFFU + asyn_address_holdtime: 0x1U~0xFU + asyn_address_setuptime: 0x0U~0xFU + \param[out] none + \retval none +*/ +void exmc_norsram_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct) +{ + uint32_t snctl = 0x00000000U, sntcfg = 0x00000000U, snwtcfg = 0x00000000U, snlatdec = 0x00000000U; + + /* get the register value */ + snctl = EXMC_SNCTL(exmc_norsram_init_struct->norsram_region); + + /* clear relative bits */ + snctl &= ((uint32_t)~(EXMC_SNCTL_NREN | EXMC_SNCTL_NRTP | EXMC_SNCTL_NRW | EXMC_SNCTL_SBRSTEN | + EXMC_SNCTL_NRWTPOL | EXMC_SNCTL_WRAPEN | EXMC_SNCTL_NRWTCFG | EXMC_SNCTL_WEN | + EXMC_SNCTL_NRWTEN | EXMC_SNCTL_EXMODEN | EXMC_SNCTL_ASYNCWTEN | EXMC_SNCTL_SYNCWR | + EXMC_SNCTL_NRMUX)); + + /* configure control bits */ + snctl |= (uint32_t)(exmc_norsram_init_struct->address_data_mux << SNCTL_NRMUX_OFFSET) | + exmc_norsram_init_struct->memory_type | + exmc_norsram_init_struct->databus_width | + (exmc_norsram_init_struct->burst_mode << SNCTL_SBRSTEN_OFFSET) | + exmc_norsram_init_struct->nwait_polarity | + (exmc_norsram_init_struct->wrap_burst_mode << SNCTL_WRAPEN_OFFSET) | + exmc_norsram_init_struct->nwait_config | + (exmc_norsram_init_struct->memory_write << SNCTL_WREN_OFFSET) | + (exmc_norsram_init_struct->nwait_signal << SNCTL_NRWTEN_OFFSET) | + (exmc_norsram_init_struct->extended_mode << SNCTL_EXMODEN_OFFSET) | + (exmc_norsram_init_struct->asyn_wait << SNCTL_ASYNCWAIT_OFFSET) | + exmc_norsram_init_struct->write_mode; + + /* configure timing */ + sntcfg = (uint32_t)exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime | + (exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime << SNTCFG_AHLD_OFFSET) | + (exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime << SNTCFG_DSET_OFFSET) | + (exmc_norsram_init_struct->read_write_timing->bus_latency << SNTCFG_BUSLAT_OFFSET) | + exmc_norsram_init_struct->read_write_timing->syn_clk_division | + exmc_norsram_init_struct->read_write_timing->syn_data_latency | + exmc_norsram_init_struct->read_write_timing->asyn_access_mode; + + /* configure data latency decreasing value */ + snlatdec = (uint32_t)(exmc_norsram_init_struct->read_write_timing->syn_data_latency_dec & EXMC_SNLATDEC_LATDEC); + + /* enable nor flash access */ + if(EXMC_MEMORY_TYPE_NOR == exmc_norsram_init_struct->memory_type) { + snctl |= (uint32_t)EXMC_SNCTL_NREN; + } + + /* configure extended mode */ + if(ENABLE == exmc_norsram_init_struct->extended_mode) { + snwtcfg = (uint32_t)exmc_norsram_init_struct->write_timing->asyn_address_setuptime | + (exmc_norsram_init_struct->write_timing->asyn_address_holdtime << SNTCFG_AHLD_OFFSET) | + (exmc_norsram_init_struct->write_timing->asyn_data_setuptime << SNTCFG_DSET_OFFSET) | + (exmc_norsram_init_struct->write_timing->bus_latency << SNTCFG_BUSLAT_OFFSET) | + exmc_norsram_init_struct->write_timing->asyn_access_mode; + } else { + snwtcfg = BANK0_SNWTCFG_RESET; + } + + /* configure the registers */ + EXMC_SNCTL(exmc_norsram_init_struct->norsram_region) = snctl; + EXMC_SNTCFG(exmc_norsram_init_struct->norsram_region) = sntcfg; + EXMC_SNWTCFG(exmc_norsram_init_struct->norsram_region) = snwtcfg; + EXMC_SNLATDEC(exmc_norsram_init_struct->norsram_region) = snlatdec; +} + +/*! + \brief enable EXMC NOR/PSRAM bank region + \param[in] exmc_norsram_region: specify the region of NOR/PSRAM bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_enable(uint32_t exmc_norsram_region) +{ + EXMC_SNCTL(exmc_norsram_region) |= (uint32_t)EXMC_SNCTL_NRBKEN; +} + +/*! + \brief disable EXMC NOR/PSRAM bank region + \param[in] exmc_norsram_region: specify the region of NOR/PSRAM Bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_disable(uint32_t exmc_norsram_region) +{ + EXMC_SNCTL(exmc_norsram_region) &= ~(uint32_t)EXMC_SNCTL_NRBKEN; +} + +/*! + \brief deinitialize EXMC NAND bank + \param[in] exmc_nand_bank: select the bank of NAND + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval none +*/ +void exmc_nand_deinit(uint32_t exmc_nand_bank) +{ + /* EXMC_BANK1_NAND or EXMC_BANK2_NAND */ + EXMC_NPCTL(exmc_nand_bank) = BANK1_2_NPCTL_RESET; + EXMC_NPINTEN(exmc_nand_bank) = BANK1_2_NPINTEN_RESET; + EXMC_NPCTCFG(exmc_nand_bank) = BANK1_2_NPCTCFG_RESET; + EXMC_NPATCFG(exmc_nand_bank) = BANK1_2_NPATCFG_RESET; +} + +/*! + \brief initialize exmc_norsram_parameter_struct with the default values + \param[in] none + \param[out] the initialized struct exmc_nand_parameter_struct pointer + \retval none +*/ +void exmc_nand_struct_para_init(exmc_nand_parameter_struct *exmc_nand_init_struct) +{ + /* configure the structure with default values */ + exmc_nand_init_struct->nand_bank = EXMC_BANK1_NAND; + exmc_nand_init_struct->wait_feature = DISABLE; + exmc_nand_init_struct->databus_width = EXMC_NAND_DATABUS_WIDTH_8B; + exmc_nand_init_struct->ecc_logic = DISABLE; + exmc_nand_init_struct->ecc_size = EXMC_ECC_SIZE_256BYTES; + exmc_nand_init_struct->ctr_latency = 0x0U; + exmc_nand_init_struct->atr_latency = 0x0U; + exmc_nand_init_struct->common_space_timing->setuptime = 0xFCU; + exmc_nand_init_struct->common_space_timing->waittime = 0xFCU; + exmc_nand_init_struct->common_space_timing->holdtime = 0xFCU; + exmc_nand_init_struct->common_space_timing->databus_hiztime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->setuptime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->waittime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->holdtime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; +} + +/*! + \brief initialize EXMC NAND bank + \param[in] exmc_nand_init_struct: configure the EXMC NAND parameter + nand_bank: EXMC_BANK1_NAND,EXMC_BANK2_NAND + ecc_size: EXMC_ECC_SIZE_xBYTES,x=256,512,1024,2048,4096 + atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 + ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 + ecc_logic: ENABLE or DISABLE + databus_width: EXMC_NAND_DATABUS_WIDTH_8B,EXMC_NAND_DATABUS_WIDTH_16B + wait_feature: ENABLE or DISABLE + common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + databus_hiztime: 0x01U~0xFFU + holdtime: 0x01U~0xFEU + waittime: 0x02U~0xFFU + setuptime: 0x01U~0xFFU + attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + databus_hiztime: 0x00U~0xFEU + holdtime: 0x01U~0xFEU + waittime: 0x02U~0xFFU + setuptime: 0x01U~0xFFU + \param[out] none + \retval none +*/ +void exmc_nand_init(exmc_nand_parameter_struct *exmc_nand_init_struct) +{ + uint32_t npctl = 0x00000000U, npctcfg = 0x00000000U, npatcfg = 0x00000000U; + + npctl = (uint32_t)(exmc_nand_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) | + EXMC_NPCTL_NDTP | + exmc_nand_init_struct->databus_width | + (exmc_nand_init_struct->ecc_logic << NPCTL_ECCEN_OFFSET) | + exmc_nand_init_struct->ecc_size | + exmc_nand_init_struct->ctr_latency | + exmc_nand_init_struct->atr_latency; + + npctcfg = (uint32_t)((exmc_nand_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET) | + (((exmc_nand_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT) | + ((exmc_nand_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD) | + (((exmc_nand_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ); + + npatcfg = (uint32_t)((exmc_nand_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET) | + (((exmc_nand_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT) | + ((exmc_nand_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD) | + ((exmc_nand_init_struct->attribute_space_timing->databus_hiztime << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ); + + /* initialize EXMC_BANK1_NAND or EXMC_BANK2_NAND */ + EXMC_NPCTL(exmc_nand_init_struct->nand_bank) = npctl; + EXMC_NPCTCFG(exmc_nand_init_struct->nand_bank) = npctcfg; + EXMC_NPATCFG(exmc_nand_init_struct->nand_bank) = npatcfg; +} + +/*! + \brief enable NAND bank + \param[in] exmc_nand_bank: specify the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval none +*/ +void exmc_nand_enable(uint32_t exmc_nand_bank) +{ + EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_NDBKEN; +} + +/*! + \brief disable NAND bank + \param[in] exmc_nand_bank: specify the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval none +*/ +void exmc_nand_disable(uint32_t exmc_nand_bank) +{ + EXMC_NPCTL(exmc_nand_bank) &= ~EXMC_NPCTL_NDBKEN; +} + +/*! + \brief deinitialize EXMC PC card bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_deinit(void) +{ + /* EXMC_BANK3_PCCARD */ + EXMC_NPCTL3 = BANK3_NPCTL_RESET; + EXMC_NPINTEN3 = BANK3_NPINTEN_RESET; + EXMC_NPCTCFG3 = BANK3_NPCTCFG_RESET; + EXMC_NPATCFG3 = BANK3_NPATCFG_RESET; + EXMC_PIOTCFG3 = BANK3_PIOTCFG3_RESET; +} + +/*! + \brief initialize exmc_pccard_parameter_struct with the default values + \param[in] none + \param[out] the initialized struct exmc_pccard_parameter_struct pointer + \retval none +*/ +void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct) +{ + /* configure the structure with default values */ + exmc_pccard_init_struct->wait_feature = DISABLE; + exmc_pccard_init_struct->ctr_latency = 0x0U; + exmc_pccard_init_struct->atr_latency = 0x0U; + exmc_pccard_init_struct->common_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->databus_hiztime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->databus_hiztime = 0xFCU; +} + +/*! + \brief initialize EXMC PC card bank + \param[in] exmc_pccard_init_struct: configure the EXMC NAND parameter + atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 + ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 + wait_feature: ENABLE or DISABLE + common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + databus_hiztime: 0x01U~0xFFU + holdtime: 0x01U~0xFEU + waittime: 0x02U~0xFFU + setuptime: 0x01U~0xFFU + attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + databus_hiztime: 0x00U~0xFEU + holdtime: 0x01U~0xFEU + waittime: 0x02U~0xFFU + setuptime: 0x01U~0xFFU + io_space_timing: exmc_nand_pccard_timing_parameter_struct set the time + databus_hiztime: 0x00U~0xFFU + holdtime: 0x01U~0xFFU + waittime: 0x02U~0x100U + setuptime: 0x01U~0x100U + \param[out] none + \retval none +*/ +void exmc_pccard_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct) +{ + /* configure the EXMC bank3 PC card control register */ + EXMC_NPCTL3 = (uint32_t)(exmc_pccard_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) | + EXMC_NAND_DATABUS_WIDTH_16B | + exmc_pccard_init_struct->ctr_latency | + exmc_pccard_init_struct->atr_latency ; + + /* configure the EXMC bank3 PC card common space timing configuration register */ + EXMC_NPCTCFG3 = (uint32_t)((exmc_pccard_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET) | + (((exmc_pccard_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT) | + ((exmc_pccard_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD) | + (((exmc_pccard_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ); + + /* configure the EXMC bank3 PC card attribute space timing configuration register */ + EXMC_NPATCFG3 = (uint32_t)((exmc_pccard_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET) | + (((exmc_pccard_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT) | + ((exmc_pccard_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD) | + ((exmc_pccard_init_struct->attribute_space_timing->databus_hiztime << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ); + + /* configure the EXMC bank3 PC card io space timing configuration register */ + EXMC_PIOTCFG3 = (uint32_t)((exmc_pccard_init_struct->io_space_timing->setuptime - 1U) & EXMC_PIOTCFG3_IOSET) | + (((exmc_pccard_init_struct->io_space_timing->waittime - 1U) << PIOTCFG_IOWAIT_OFFSET) & EXMC_PIOTCFG3_IOWAIT) | + ((exmc_pccard_init_struct->io_space_timing->holdtime << PIOTCFG_IOHLD_OFFSET) & EXMC_PIOTCFG3_IOHLD) | + ((exmc_pccard_init_struct->io_space_timing->databus_hiztime << PIOTCFG_IOHIZ_OFFSET) & EXMC_PIOTCFG3_IOHIZ); +} + +/*! + \brief enable PC Card Bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_enable(void) +{ + EXMC_NPCTL3 |= EXMC_NPCTL_NDBKEN; +} + +/*! + \brief disable PC Card Bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_disable(void) +{ + EXMC_NPCTL3 &= ~EXMC_NPCTL_NDBKEN; +} + +/*! + \brief deinitialize EXMC SDRAM device + \param[in] exmc_sdram_device: select the SRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_SDRAM_DEVICEx(x=0, 1) + \param[in] none + \param[out] none + \retval none +*/ +void exmc_sdram_deinit(uint32_t exmc_sdram_device) +{ + /* reset SDRAM registers */ + EXMC_SDCTL(exmc_sdram_device) = SDRAM_DEVICE_SDCTL_RESET; + EXMC_SDTCFG(exmc_sdram_device) = SDRAM_DEVICE_SDTCFG_RESET; + EXMC_SDCMD = SDRAM_DEVICE_SDCMD_RESET; + EXMC_SDARI = SDRAM_DEVICE_SDARI_RESET; + EXMC_SDRSCTL = SDRAM_DEVICE_SDRSCTL_RESET; +} + +/*! + \brief initialize exmc_sdram_parameter_struct with the default values + \param[in] none + \param[out] the initialized struct exmc_sdram_parameter_struct pointer + \retval none +*/ +void exmc_sdram_struct_para_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct) +{ + /* configure the structure with default values */ + exmc_sdram_init_struct->sdram_device = EXMC_SDRAM_DEVICE0; + exmc_sdram_init_struct->column_address_width = EXMC_SDRAM_COW_ADDRESS_8; + exmc_sdram_init_struct->row_address_width = EXMC_SDRAM_ROW_ADDRESS_11; + exmc_sdram_init_struct->data_width = EXMC_SDRAM_DATABUS_WIDTH_16B; + exmc_sdram_init_struct->internal_bank_number = EXMC_SDRAM_4_INTER_BANK; + exmc_sdram_init_struct->cas_latency = EXMC_CAS_LATENCY_1_SDCLK; + exmc_sdram_init_struct->write_protection = ENABLE; + exmc_sdram_init_struct->sdclock_config = EXMC_SDCLK_DISABLE; + exmc_sdram_init_struct->burst_read_switch = DISABLE; + exmc_sdram_init_struct->pipeline_read_delay = EXMC_PIPELINE_DELAY_0_HCLK; + + exmc_sdram_init_struct->timing->load_mode_register_delay = 16U; + exmc_sdram_init_struct->timing->exit_selfrefresh_delay = 16U; + exmc_sdram_init_struct->timing->row_address_select_delay = 16U; + exmc_sdram_init_struct->timing->auto_refresh_delay = 16U; + exmc_sdram_init_struct->timing->write_recovery_delay = 16U; + exmc_sdram_init_struct->timing->row_precharge_delay = 16U; + exmc_sdram_init_struct->timing->row_to_column_delay = 16U; +} + +/*! + \brief initialize EXMC SDRAM device + \param[in] exmc_sdram_init_struct: configure the EXMC SDRAM parameter + sdram_device: EXMC_SDRAM_DEVICE0,EXMC_SDRAM_DEVICE1 + pipeline_read_delay: EXMC_PIPELINE_DELAY_x_HCLK,x=0..2 + burst_read_switch: ENABLE or DISABLE + sdclock_config: EXMC_SDCLK_DISABLE,EXMC_SDCLK_PERIODS_2_HCLK,EXMC_SDCLK_PERIODS_3_HCLK + write_protection: ENABLE or DISABLE + cas_latency: EXMC_CAS_LATENCY_x_SDCLK,x=1..3 + internal_bank_number: EXMC_SDRAM_2_INTER_BANK,EXMC_SDRAM_4_INTER_BANK + data_width: EXMC_SDRAM_DATABUS_WIDTH_8B,EXMC_SDRAM_DATABUS_WIDTH_16B,EXMC_SDRAM_DATABUS_WIDTH_32B + row_address_width: EXMC_SDRAM_ROW_ADDRESS_x,x=11..13 + column_address_width: EXMC_SDRAM_COW_ADDRESS_x,x=8..11 + timing: exmc_sdram_timing_parameter_struct set the time + row_to_column_delay: 1U~16U + row_precharge_delay: 1U~16U + write_recovery_delay: 1U~16U + auto_refresh_delay: 1U~16U + row_address_select_delay: 1U~16U + exit_selfrefresh_delay: 1U~16U + load_mode_register_delay: 1U~16U + \param[out] none + \retval none +*/ +void exmc_sdram_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct) +{ + uint32_t sdctl0, sdctl1, sdtcfg0, sdtcfg1; + + /* configure EXMC_SDCTL0 or EXMC_SDCTL1 */ + if(EXMC_SDRAM_DEVICE0 == exmc_sdram_init_struct->sdram_device) { + /* configure EXMC_SDCTL0 */ + EXMC_SDCTL(EXMC_SDRAM_DEVICE0) = (uint32_t)(exmc_sdram_init_struct->column_address_width | + exmc_sdram_init_struct->row_address_width | + exmc_sdram_init_struct->data_width | + exmc_sdram_init_struct->internal_bank_number | + exmc_sdram_init_struct->cas_latency | + (exmc_sdram_init_struct->write_protection << SDCTL_WPEN_OFFSET) | + exmc_sdram_init_struct->sdclock_config | + (exmc_sdram_init_struct->burst_read_switch << SDCTL_BRSTRD_OFFSET) | + exmc_sdram_init_struct->pipeline_read_delay); + + /* configure EXMC_SDTCFG0 */ + EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) = (uint32_t)((exmc_sdram_init_struct->timing->load_mode_register_delay) - 1U) | + (((exmc_sdram_init_struct->timing->exit_selfrefresh_delay) - 1U) << SDTCFG_XSRD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_address_select_delay) - 1U) << SDTCFG_RASD_OFFSET) | + (((exmc_sdram_init_struct->timing->auto_refresh_delay) - 1U) << SDTCFG_ARFD_OFFSET) | + (((exmc_sdram_init_struct->timing->write_recovery_delay) - 1U) << SDTCFG_WRD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_precharge_delay) - 1U) << SDTCFG_RPD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_to_column_delay) - 1U) << SDTCFG_RCD_OFFSET); + } else { + /* configure EXMC_SDCTL0 and EXMC_SDCTL1 */ + /* some bits in the EXMC_SDCTL1 register are reserved */ + sdctl0 = EXMC_SDCTL(EXMC_SDRAM_DEVICE0) & (~(EXMC_SDCTL_PIPED | EXMC_SDCTL_BRSTRD | EXMC_SDCTL_SDCLK)); + + sdctl0 |= (uint32_t)(exmc_sdram_init_struct->sdclock_config | + (exmc_sdram_init_struct->burst_read_switch << SDCTL_BRSTRD_OFFSET) | + exmc_sdram_init_struct->pipeline_read_delay); + + sdctl1 = (uint32_t)(exmc_sdram_init_struct->column_address_width | + exmc_sdram_init_struct->row_address_width | + exmc_sdram_init_struct->data_width | + exmc_sdram_init_struct->internal_bank_number | + exmc_sdram_init_struct->cas_latency | + (exmc_sdram_init_struct->write_protection << SDCTL_WPEN_OFFSET)); + + EXMC_SDCTL(EXMC_SDRAM_DEVICE0) = sdctl0; + EXMC_SDCTL(EXMC_SDRAM_DEVICE1) = sdctl1; + + /* configure EXMC_SDTCFG0 and EXMC_SDTCFG1 */ + /* some bits in the EXMC_SDTCFG1 register are reserved */ + sdtcfg0 = EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) & (~(EXMC_SDTCFG_RPD | EXMC_SDTCFG_WRD | EXMC_SDTCFG_ARFD)); + + sdtcfg0 |= (uint32_t)((((exmc_sdram_init_struct->timing->auto_refresh_delay) - 1U) << SDTCFG_ARFD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_precharge_delay) - 1U) << SDTCFG_RPD_OFFSET) | + (((exmc_sdram_init_struct->timing->write_recovery_delay) - 1U) << SDTCFG_WRD_OFFSET)); + + sdtcfg1 = (uint32_t)(((exmc_sdram_init_struct->timing->load_mode_register_delay) - 1U) | + (((exmc_sdram_init_struct->timing->exit_selfrefresh_delay) - 1U) << SDTCFG_XSRD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_address_select_delay) - 1U) << SDTCFG_RASD_OFFSET) | + (((exmc_sdram_init_struct->timing->row_to_column_delay) - 1U) << SDTCFG_RCD_OFFSET)); + + EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) = sdtcfg0; + EXMC_SDTCFG(EXMC_SDRAM_DEVICE1) = sdtcfg1; + } +} + +/*! + \brief initialize exmc_sdram_struct_command_para_init with the default values + \param[in] none + \param[out] the initialized struct exmc_sdram_struct_command_para_init pointer + \retval none +*/ +void exmc_sdram_struct_command_para_init(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct) +{ + /* configure the structure with default value */ + exmc_sdram_command_init_struct->mode_register_content = 0U; + exmc_sdram_command_init_struct->auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK; + exmc_sdram_command_init_struct->bank_select = EXMC_SDRAM_DEVICE0_SELECT; + exmc_sdram_command_init_struct->command = EXMC_SDRAM_NORMAL_OPERATION; +} + +/*! + \brief deinitialize exmc SQPIPSRAM + \param[in] none + \param[out] none + \retval none +*/ +void exmc_sqpipsram_deinit(void) +{ + /* reset the registers */ + EXMC_SINIT = BANK0_SQPI_SINIT_RESET; + EXMC_SRCMD = BANK0_SQPI_SRCMD_RESET; + EXMC_SWCMD = BANK0_SQPI_SWCMD_RESET; + EXMC_SIDL = BANK0_SQPI_SIDL_RESET; + EXMC_SIDH = BANK0_SQPI_SIDH_RESET; +} + +/*! + \brief initialize exmc_sqpipsram_parameter_struct with the default values + \param[in] none + \param[out] the struct exmc_sqpipsram_parameter_struct pointer + \retval none +*/ +void exmc_sqpipsram_struct_para_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct) +{ + /* configure the structure with default values */ + exmc_sqpipsram_init_struct->sample_polarity = EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE; + exmc_sqpipsram_init_struct->id_length = EXMC_SQPIPSRAM_ID_LENGTH_64B; + exmc_sqpipsram_init_struct->address_bits = EXMC_SQPIPSRAM_ADDR_LENGTH_24B; + exmc_sqpipsram_init_struct->command_bits = EXMC_SQPIPSRAM_COMMAND_LENGTH_8B; +} + +/*! + \brief initialize EXMC SQPIPSRAM + \param[in] exmc_sqpipsram_init_struct: configure the EXMC SQPIPSRAM parameter + sample_polarity: EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE,EXMC_SQPIPSRAM_SAMPLE_FALLING_EDGE + id_length: EXMC_SQPIPSRAM_ID_LENGTH_xB,x=8,16,32,64 + address_bits: EXMC_SQPIPSRAM_ADDR_LENGTH_xB,x=1..26 + command_bits: EXMC_SQPIPSRAM_COMMAND_LENGTH_xB,x=4,8,16 + \param[out] none + \retval none +*/ +void exmc_sqpipsram_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct) +{ + /* initialize SQPI controller */ + EXMC_SINIT = (uint32_t)exmc_sqpipsram_init_struct->sample_polarity | + exmc_sqpipsram_init_struct->id_length | + exmc_sqpipsram_init_struct->address_bits | + exmc_sqpipsram_init_struct->command_bits; +} + +/*! + \brief configure consecutive clock + \param[in] clock_mode: specify when the clock is generated + only one parameter can be selected which is shown as below: + \arg EXMC_CLOCK_SYN_MODE: the clock is generated only during synchronous access + \arg EXMC_CLOCK_UNCONDITIONALLY: the clock is generated unconditionally + \param[out] none + \retval none +*/ +void exmc_norsram_consecutive_clock_config(uint32_t clock_mode) +{ + if(EXMC_CLOCK_UNCONDITIONALLY == clock_mode) { + EXMC_SNCTL(EXMC_BANK0_NORSRAM_REGION0) |= EXMC_CLOCK_UNCONDITIONALLY; + } else { + EXMC_SNCTL(EXMC_BANK0_NORSRAM_REGION0) &= ~EXMC_CLOCK_UNCONDITIONALLY; + } +} + +/*! + \brief configure CRAM page size + \param[in] exmc_norsram_region: select the region of bank0 + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[in] page_size: CRAM page size + only one parameter can be selected which is shown as below: + \arg EXMC_CRAM_AUTO_SPLIT: the clock is generated only during synchronous access + \arg EXMC_CRAM_PAGE_SIZE_128_BYTES: page size is 128 bytes + \arg EXMC_CRAM_PAGE_SIZE_256_BYTES: page size is 256 bytes + \arg EXMC_CRAM_PAGE_SIZE_512_BYTES: page size is 512 bytes + \arg EXMC_CRAM_PAGE_SIZE_1024_BYTES: page size is 1024 bytes + \param[out] none + \retval none +*/ +void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size) +{ + /* reset the bits */ + EXMC_SNCTL(exmc_norsram_region) &= ~EXMC_SNCTL_CPS; + + /* set the CPS bits */ + EXMC_SNCTL(exmc_norsram_region) |= page_size; +} + +/*! + \brief enable or disable the EXMC NAND ECC function + \param[in] exmc_nand_bank: specify the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + /* enable the selected NAND bank ECC function */ + EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_ECCEN; + } else { + /* disable the selected NAND bank ECC function */ + EXMC_NPCTL(exmc_nand_bank) &= ~EXMC_NPCTL_ECCEN; + } +} + +/*! + \brief get the EXMC ECC value + \param[in] exmc_nand_bank: specify the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval the error correction code(ECC) value +*/ +uint32_t exmc_ecc_get(uint32_t exmc_nand_bank) +{ + return(EXMC_NECC(exmc_nand_bank)); +} + +/*! + \brief enable or disable read sample + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void exmc_sdram_readsample_enable(ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + EXMC_SDRSCTL |= EXMC_SDRSCTL_RSEN; + } else { + EXMC_SDRSCTL &= (uint32_t)(~EXMC_SDRSCTL_RSEN); + } +} + +/*! + \brief configure the delayed sample clock of read data + \param[in] delay_cell: SDRAM the delayed sample clock of read data + only one parameter can be selected which is shown as below: + \arg EXMC_SDRAM_x_DELAY_CELL(x=0..15) + \param[in] extra_hclk: sample cycle of read data + only one parameter can be selected which is shown as below: + \arg EXMC_SDRAM_READSAMPLE_x_EXTRAHCLK(x=0,1) + \param[out] none + \retval none +*/ +void exmc_sdram_readsample_config(uint32_t delay_cell, uint32_t extra_hclk) +{ + uint32_t sdrsctl = 0U; + + /* reset the bits */ + sdrsctl = EXMC_SDRSCTL & (~(EXMC_SDRSCTL_SDSC | EXMC_SDRSCTL_SSCR)); + /* set the bits */ + sdrsctl |= (uint32_t)(delay_cell | extra_hclk); + EXMC_SDRSCTL = sdrsctl; +} + +/*! + \brief configure the SDRAM memory command + \param[in] exmc_sdram_command_init_struct: initialize EXMC SDRAM command + mode_register_content: + auto_refresh_number: EXMC_SDRAM_AUTO_REFLESH_x_SDCLK, x=1..15 + bank_select: EXMC_SDRAM_DEVICE0_SELECT, EXMC_SDRAM_DEVICE1_SELECT, EXMC_SDRAM_DEVICE0_1_SELECT + command: EXMC_SDRAM_NORMAL_OPERATION, EXMC_SDRAM_CLOCK_ENABLE, EXMC_SDRAM_PRECHARGE_ALL, + EXMC_SDRAM_AUTO_REFRESH, EXMC_SDRAM_LOAD_MODE_REGISTER, EXMC_SDRAM_SELF_REFRESH, + EXMC_SDRAM_POWERDOWN_ENTRY + \param[out] none + \retval none +*/ +void exmc_sdram_command_config(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct) +{ + /* configure command register */ + EXMC_SDCMD = (uint32_t)((exmc_sdram_command_init_struct->command) | + (exmc_sdram_command_init_struct->bank_select) | + ((exmc_sdram_command_init_struct->auto_refresh_number)) | + ((exmc_sdram_command_init_struct->mode_register_content) << SDCMD_MRC_OFFSET)); +} + +/*! + \brief set auto-refresh interval + \param[in] exmc_count: the number SDRAM clock cycles unit between two successive auto-refresh commands, 0x0000~0x1FFF + \param[out] none + \retval none +*/ +void exmc_sdram_refresh_count_set(uint32_t exmc_count) +{ + uint32_t sdari; + sdari = EXMC_SDARI & (~EXMC_SDARI_ARINTV); + EXMC_SDARI = sdari | (uint32_t)((exmc_count << SDARI_ARINTV_OFFSET) & EXMC_SDARI_ARINTV); +} + +/*! + \brief set the number of successive auto-refresh command + \param[in] exmc_number: the number of successive Auto-refresh cycles will be send, 1~15 + \param[out] none + \retval none +*/ +void exmc_sdram_autorefresh_number_set(uint32_t exmc_number) +{ + uint32_t sdcmd; + sdcmd = EXMC_SDCMD & (~EXMC_SDCMD_NARF); + EXMC_SDCMD = sdcmd | (uint32_t)((exmc_number << SDCMD_NARF_OFFSET) & EXMC_SDCMD_NARF) ; +} + +/*! + \brief configure the write protection function + \param[in] exmc_sdram_device: specify the SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_SDRAM_DEVICEx(x=0,1) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void exmc_sdram_write_protection_config(uint32_t exmc_sdram_device, ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + EXMC_SDCTL(exmc_sdram_device) |= (uint32_t)EXMC_SDCTL_WPEN; + } else { + EXMC_SDCTL(exmc_sdram_device) &= ~((uint32_t)EXMC_SDCTL_WPEN); + } +} + +/*! + \brief get the status of SDRAM device0 or device1 + \param[in] exmc_sdram_device: specify the SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_SDRAM_DEVICEx(x=0,1) + \param[out] none + \retval the status of SDRAM device +*/ +uint32_t exmc_sdram_bankstatus_get(uint32_t exmc_sdram_device) +{ + uint32_t sdstat = 0U; + + if(EXMC_SDRAM_DEVICE0 == exmc_sdram_device) { + sdstat = ((uint32_t)(EXMC_SDSTAT & EXMC_SDSDAT_STA0) >> SDSTAT_STA0_OFFSET); + } else { + sdstat = ((uint32_t)(EXMC_SDSTAT & EXMC_SDSDAT_STA1) >> SDSTAT_STA1_OFFSET); + } + + return sdstat; +} + +/*! + \brief set the read command + \param[in] read_command_mode: configure SPI PSRAM read command mode + only one parameter can be selected which is shown as below: + \arg EXMC_SQPIPSRAM_READ_MODE_DISABLE: not SPI mode + \arg EXMC_SQPIPSRAM_READ_MODE_SPI: SPI mode + \arg EXMC_SQPIPSRAM_READ_MODE_SQPI: SQPI mode + \arg EXMC_SQPIPSRAM_READ_MODE_QPI: QPI mode + \param[in] read_wait_cycle: wait cycle number after address phase,0..15 + \param[in] read_command_code: read command for AHB read transfer + \param[out] none + \retval none +*/ +void exmc_sqpipsram_read_command_set(uint32_t read_command_mode, uint32_t read_wait_cycle, uint32_t read_command_code) +{ + uint32_t srcmd; + + srcmd = (uint32_t) read_command_mode | + ((read_wait_cycle << SRCMD_RWAITCYCLE_OFFSET) & EXMC_SRCMD_RWAITCYCLE) | + ((read_command_code & EXMC_SRCMD_RCMD)); + EXMC_SRCMD = srcmd; +} + +/*! + \brief set the write command + \param[in] write_command_mode: configure SPI PSRAM write command mode + only one parameter can be selected which is shown as below: + \arg EXMC_SQPIPSRAM_WRITE_MODE_DISABLE: not SPI mode + \arg EXMC_SQPIPSRAM_WRITE_MODE_SPI: SPI mode + \arg EXMC_SQPIPSRAM_WRITE_MODE_SQPI: SQPI mode + \arg EXMC_SQPIPSRAM_WRITE_MODE_QPI: QPI mode + \param[in] write_wait_cycle: wait cycle number after address phase,0..15 + \param[in] write_command_code: read command for AHB read transfer + \param[out] none + \retval none +*/ +void exmc_sqpipsram_write_command_set(uint32_t write_command_mode, uint32_t write_wait_cycle, uint32_t write_command_code) +{ + uint32_t swcmd; + + swcmd = (uint32_t) write_command_mode | + ((write_wait_cycle << SWCMD_WWAITCYCLE_OFFSET) & EXMC_SWCMD_WWAITCYCLE) | + ((write_command_code & EXMC_SWCMD_WCMD)); + EXMC_SWCMD = swcmd; +} + +/*! + \brief send SPI read ID command + \param[in] none + \param[out] none + \retval none +*/ +void exmc_sqpipsram_read_id_command_send(void) +{ + EXMC_SRCMD |= EXMC_SRCMD_RDID; +} + +/*! + \brief send SPI special command which does not have address and data phase + \param[in] none + \param[out] none + \retval none +*/ +void exmc_sqpipsram_write_cmd_send(void) +{ + EXMC_SWCMD |= EXMC_SWCMD_SC; +} + +/*! + \brief get the EXMC SPI ID low data + \param[in] none + \param[out] none + \retval the ID low data +*/ +uint32_t exmc_sqpipsram_low_id_get(void) +{ + return (EXMC_SIDL); +} + +/*! + \brief get the EXMC SPI ID high data + \param[in] none + \param[out] none + \retval the ID high data +*/ +uint32_t exmc_sqpipsram_high_id_get(void) +{ + return (EXMC_SIDH); +} + +/*! + \brief get the bit value of EXMC send write command bit or read ID command + \param[in] send_command_flag: the send command flag + only one parameter can be selected which is shown as below: + \arg EXMC_SEND_COMMAND_FLAG_RDID: EXMC_SRCMD_RDID flag bit + \arg EXMC_SEND_COMMAND_FLAG_SC: EXMC_SWCMD_SC flag bit + \param[out] none + \retval the new value of send command flag +*/ +FlagStatus exmc_sqpipsram_send_command_state_get(uint32_t send_command_flag) +{ + uint32_t flag = 0x00000000U; + + if(EXMC_SEND_COMMAND_FLAG_RDID == send_command_flag) { + flag = EXMC_SRCMD; + } else if(EXMC_SEND_COMMAND_FLAG_SC == send_command_flag) { + flag = EXMC_SWCMD; + } else { + } + + if(flag & send_command_flag) { + /* flag is set */ + return SET; + } else { + /* flag is reset */ + return RESET; + } +} + +/*! + \brief enable EXMC interrupt + \param[in] exmc_bank: specify the NAND bank,PC card bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] interrupt: specify EXMC interrupt flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_enable(uint32_t exmc_bank, uint32_t interrupt) +{ + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) |= interrupt; + } else { + /* SDRAM device0 or device1 */ + EXMC_SDARI |= EXMC_SDARI_REIE; + } +} + +/*! + \brief disable EXMC interrupt + \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] interrupt: specify EXMC interrupt flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_disable(uint32_t exmc_bank, uint32_t interrupt) +{ + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= ~interrupt; + } else { + /* SDRAM device0 or device1 */ + EXMC_SDARI &= ~EXMC_SDARI_REIE; + } +} + +/*! + \brief get EXMC flag status + \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC Card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] flag: EXMC status and flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status + \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status + \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status + \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag + \arg EXMC_SDRAM_FLAG_REFRESH: refresh error interrupt flag + \arg EXMC_SDRAM_FLAG_NREADY: not ready status + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus exmc_flag_get(uint32_t exmc_bank, uint32_t flag) +{ + uint32_t status = 0x00000000U; + + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1,bank2 or PC card bank3 */ + status = EXMC_NPINTEN(exmc_bank); + } else { + /* SDRAM device0 or device1 */ + status = EXMC_SDSTAT; + } + + if((status & flag) != (uint32_t)flag) { + /* flag is reset */ + return RESET; + } else { + /* flag is set */ + return SET; + } +} + +/*! + \brief clear EXMC flag status + \param[in] exmc_bank: specify the NAND bank , PCCARD bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] flag: EXMC status and flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status + \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status + \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status + \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag + \arg EXMC_SDRAM_FLAG_REFRESH: refresh error interrupt flag + \arg EXMC_SDRAM_FLAG_NREADY: not ready status + \param[out] none + \retval none +*/ +void exmc_flag_clear(uint32_t exmc_bank, uint32_t flag) +{ + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= ~flag; + } else { + /* SDRAM device0 or device1 */ + EXMC_SDSTAT &= ~flag; + } +} + +/*! + \brief get EXMC interrupt flag + \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] int_flag: EXMC interrupt flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank, uint32_t int_flag) +{ + uint32_t status = 0x00000000U, interrupt_enable = 0x00000000U, interrupt_state = 0x00000000U; + + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1,bank2 or PC card bank3 */ + status = EXMC_NPINTEN(exmc_bank); + interrupt_state = (status & (int_flag >> INTEN_INTS_OFFSET)); + } else { + /* SDRAM device0 or device1 */ + status = EXMC_SDARI; + interrupt_state = (EXMC_SDSTAT & EXMC_SDSDAT_REIF); + } + + interrupt_enable = (status & int_flag); + + if((interrupt_enable) && (interrupt_state)) { + /* interrupt flag is set */ + return SET; + } else { + /* interrupt flag is reset */ + return RESET; + } +} + +/*! + \brief clear EXMC interrupt flag + \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 + \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 + \param[in] int_flag: EXMC interrupt flag + only one parameter can be selected which is shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_flag_clear(uint32_t exmc_bank, uint32_t int_flag) +{ + if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { + /* NAND bank1, bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= ~(int_flag >> INTEN_INTS_OFFSET); + } else { + /* SDRAM device0 or device1 */ + EXMC_SDARI |= EXMC_SDARI_REC; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c new file mode 100644 index 00000000000..7407e1d79fa --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c @@ -0,0 +1,251 @@ +/*! + \file gd32f5xx_exti.c + \brief EXTI driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_exti.h" + +#define EXTI_REG_RESET_VALUE ((uint32_t)0x00000000U) + +/*! + \brief deinitialize the EXTI + \param[in] none + \param[out] none + \retval none +*/ +void exti_deinit(void) +{ + /* reset the value of all the EXTI registers */ + EXTI_INTEN = EXTI_REG_RESET_VALUE; + EXTI_EVEN = EXTI_REG_RESET_VALUE; + EXTI_RTEN = EXTI_REG_RESET_VALUE; + EXTI_FTEN = EXTI_REG_RESET_VALUE; + EXTI_SWIEV = EXTI_REG_RESET_VALUE; +} + +/*! + \brief initialize the EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[in] mode: interrupt or event mode, refer to exti_mode_enum + only one parameter can be selected which is shown as below: + \arg EXTI_INTERRUPT: interrupt mode + \arg EXTI_EVENT: event mode + \param[in] trig_type: interrupt trigger type, refer to exti_trig_type_enum + only one parameter can be selected which is shown as below: + \arg EXTI_TRIG_RISING: rising edge trigger + \arg EXTI_TRIG_FALLING: falling trigger + \arg EXTI_TRIG_BOTH: rising and falling trigger + \arg EXTI_TRIG_NONE: without rising edge or falling edge trigger + \param[out] none + \retval none +*/ +void exti_init(exti_line_enum linex, \ + exti_mode_enum mode, \ + exti_trig_type_enum trig_type) +{ + /* reset the EXTI line x */ + EXTI_INTEN &= ~(uint32_t)linex; + EXTI_EVEN &= ~(uint32_t)linex; + EXTI_RTEN &= ~(uint32_t)linex; + EXTI_FTEN &= ~(uint32_t)linex; + + /* set the EXTI mode and enable the interrupts or events from EXTI line x */ + switch(mode) { + case EXTI_INTERRUPT: + EXTI_INTEN |= (uint32_t)linex; + break; + case EXTI_EVENT: + EXTI_EVEN |= (uint32_t)linex; + break; + default: + break; + } + + /* set the EXTI trigger type */ + switch(trig_type) { + case EXTI_TRIG_RISING: + EXTI_RTEN |= (uint32_t)linex; + EXTI_FTEN &= ~(uint32_t)linex; + break; + case EXTI_TRIG_FALLING: + EXTI_RTEN &= ~(uint32_t)linex; + EXTI_FTEN |= (uint32_t)linex; + break; + case EXTI_TRIG_BOTH: + EXTI_RTEN |= (uint32_t)linex; + EXTI_FTEN |= (uint32_t)linex; + break; + case EXTI_TRIG_NONE: + default: + break; + } +} + +/*! + \brief enable the interrupts from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_enable(exti_line_enum linex) +{ + EXTI_INTEN |= (uint32_t)linex; +} + +/*! + \brief disable the interrupt from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_disable(exti_line_enum linex) +{ + EXTI_INTEN &= ~(uint32_t)linex; +} + +/*! + \brief enable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_enable(exti_line_enum linex) +{ + EXTI_EVEN |= (uint32_t)linex; +} + +/*! + \brief disable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_disable(exti_line_enum linex) +{ + EXTI_EVEN &= ~(uint32_t)linex; +} + +/*! + \brief enable the software interrupt event from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_enable(exti_line_enum linex) +{ + EXTI_SWIEV |= (uint32_t)linex; +} + +/*! + \brief disable the software interrupt event from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_disable(exti_line_enum linex) +{ + EXTI_SWIEV &= ~(uint32_t)linex; +} + +/*! + \brief get EXTI line x interrupt pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_flag_get(exti_line_enum linex) +{ + if(RESET != (EXTI_PD & (uint32_t)linex)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EXTI line x interrupt pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t)linex; +} + +/*! + \brief get EXTI line x interrupt pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex) +{ + if(RESET != (EXTI_PD & (uint32_t)linex)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EXTI line x interrupt pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..25): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t)linex; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c new file mode 100644 index 00000000000..ab52f5bf06a --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c @@ -0,0 +1,1592 @@ +/*! + \file gd32f5xx_fmc.c + \brief FMC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f5xx_fmc.h" + +/* write protection/CBUS read protection sector mask */ +#define WP0_DRP_LOW_12BITS_MASK ((uint64_t)0x0000000000000FFFU) +#define WP0_DRP_HIGH_8BITS_MASK ((uint64_t)0x00000000000FF000U) +#define WP1_DRP_LOW_12BITS_MASK ((uint64_t)0x00000000FFF00000U) +#define WP1_DRP_HIGH_8BITS_MASK ((uint64_t)0x000000FF00000000U) + +/* write protection/CBUS read protection sector offset */ +#define WP0_DRP_LOW_12BITS_OFFSET ((uint32_t)0x00000000U) +#define WP0_DRP_HIGH_8BITS_OFFSET ((uint32_t)0x0000000CU) +#define WP1_DRP_LOW_12BITS_OFFSET ((uint32_t)0x00000014U) +#define WP1_DRP_HIGH_8BITS_OFFSET ((uint32_t)0x00000020U) + +/* FMC register bit offset */ +#define OBCTL0_WP0_L_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of WP0[11:0] in OBCTL1 */ +#define OBCTL1_WP0_H_OFFSET ((uint32_t)0x00000000U) /*!< bit offset of WP0[19:12] in OBCTL1 */ +#define OBCTL1_WP1_L_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of WP1[11:0] in OBCTL1 */ +#define OBCTL1_WP1_H_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of WP1[19:12] in OBCTL1 */ + +/* EFUSE register bit offset */ +#define EFUSE_ADDR_EFSIZE_OFFSET ((uint32_t)(0x00000008U)) /*!< EFSIZE OFFSET in register EFUSE_ADDR */ + + +/*! + \brief unlock the main FMC operation + \param[in] none + \param[out] none + \retval none +*/ +void fmc_unlock(void) +{ + if((RESET != (FMC_CTL & FMC_CTL_LK))) { + /* write the FMC key */ + FMC_KEY = UNLOCK_KEY0; + FMC_KEY = UNLOCK_KEY1; + } +} + +/*! + \brief lock the main FMC operation + \param[in] none + \param[out] none + \retval none +*/ +void fmc_lock(void) +{ + /* set the LK bit*/ + FMC_CTL |= FMC_CTL_LK; +} + +/*! + \brief FMC erase page + \param[in] page_addr: the page address to be erased. + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_page_erase(uint32_t page_addr) +{ + fmc_state_enum fmc_state = FMC_READY; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + /* unlock page erase operation */ + FMC_PEKEY = UNLOCK_PE_KEY; + + /* start page erase */ + FMC_PECFG = FMC_PECFG_PE_EN | page_addr; + FMC_CTL |= FMC_CTL_SER; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + FMC_PECFG &= ~FMC_PECFG_PE_EN; + FMC_CTL &= ~FMC_CTL_SER; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief FMC erase sector + \param[in] fmc_sector: select the sector to erase + only one parameter can be selected which is shown as below: + \arg CTL_SECTOR_NUMBER_x: sector x(x = 0,1,2...53) + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_sector_erase(uint32_t fmc_sector) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + /* start sector erase */ + FMC_CTL &= ~FMC_CTL_SER; + FMC_CTL &= ~(FMC_CTL_SN | FMC_CTL_SN_5); + FMC_CTL |= FMC_CTL_SER | fmc_sector; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the SER bit */ + FMC_CTL &= ~FMC_CTL_SER; + FMC_CTL &= ~(FMC_CTL_SN | FMC_CTL_SN_5); + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief FMC erase whole chip + \param[in] none + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_mass_erase(void) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + /* start whole chip erase */ + FMC_CTL |= (FMC_CTL_MER0 | FMC_CTL_MER1); + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the MER bits */ + FMC_CTL &= ~(FMC_CTL_MER0 | FMC_CTL_MER1); + } + + /* return the fmc state */ + return fmc_state; +} + +/*! + \brief FMC erase whole bank0 + \param[in] none + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_bank0_erase(void) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + /* start FMC bank0 erase */ + FMC_CTL |= FMC_CTL_MER0; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the MER0 bit */ + FMC_CTL &= (~FMC_CTL_MER0); + } + + /* return the fmc state */ + return fmc_state; +} + +/*! + \brief FMC erase whole bank1(include bank1_ex) + \param[in] none + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_bank1_erase(void) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + /* start FMC bank1 erase */ + FMC_CTL |= FMC_CTL_MER1; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the MER1 bit */ + FMC_CTL &= (~FMC_CTL_MER1); + } + + /* return the fmc state */ + return fmc_state; +} + +/*! + \brief program a doubleword at the corresponding address + \param[in] address: address to program + \param[in] data: doubleword to program(0x0000000000000000 - 0xFFFFFFFFFFFFFFFF) + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_doubleword_program(uint32_t address, uint64_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + FMC_CTL |= FMC_CTL_DWPGE; + + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + + REG32(address) = (uint32_t)(data & 0xFFFFFFFFU); + REG32(address + 4U) = (uint32_t)((data >> 32U) & 0xFFFFFFFFU); + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + /* reset the DWPGE bit */ + FMC_CTL &= ~FMC_CTL_DWPGE; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program a word at the corresponding address + \param[in] address: address to program + \param[in] data: word to program(0x00000000 - 0xFFFFFFFF) + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + FMC_CTL &= ~FMC_CTL_DWPGE; + FMC_CTL &= ~FMC_CTL_PSZ; + FMC_CTL |= CTL_PSZ_WORD; + + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + + REG32(address) = data; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program a half word at the corresponding address + \param[in] address: address to program + \param[in] data: halfword to program(0x0000 - 0xFFFF) + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + FMC_CTL &= ~FMC_CTL_DWPGE; + FMC_CTL &= ~FMC_CTL_PSZ; + FMC_CTL |= CTL_PSZ_HALF_WORD; + + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + + REG16(address) = data; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program a byte at the corresponding address + \param[in] address: address to program + \param[in] data: byte to program(0x00 - 0xFF) + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_byte_program(uint32_t address, uint8_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + FMC_CTL &= ~FMC_CTL_DWPGE; + FMC_CTL &= ~FMC_CTL_PSZ; + FMC_CTL |= CTL_PSZ_BYTE; + + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + + REG8(address) = data; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief enable no waiting time area load after system reset + \param[in] none + \param[out] none + \retval none +*/ +void fmc_nwa_enable(void) +{ + FMC_CTL |= FMC_CTL_NWLDE; +} + +/*! + \brief disable no waiting time area load after system reset + \param[in] none + \param[out] none + \retval none +*/ +void fmc_nwa_disable(void) +{ + FMC_CTL &= ~FMC_CTL_NWLDE; +} + +/*! + \brief set OTP1 data block not be read + \param[in] block: specify OTP1 data block x not be read + one or more parameters can be selected which are shown as below: + \arg OTP1_DATA_BLOCK_x: data blcok x(x = 0,1,2...15) + \arg OTP1_DATA_BLOCK_ALL: all data blcok + \param[out] none + \retval none +*/ +void otp1_read_disable(uint32_t block) +{ + FMC_OTP1CFG &= ~block; +} + +/*! + \brief enable read lock block protection for OTP2 + \param[in] none + \param[out] none + \retval none +*/ +void otp2_rlock_enable(void) +{ + FMC_CTL |= FMC_CTL_RLBP; +} + +/*! + \brief unlock the option byte operation + \param[in] none + \param[out] none + \retval none +*/ +void ob_unlock(void) +{ + if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_OB_LK)) { + /* write the FMC key */ + FMC_OBKEY = OB_UNLOCK_KEY0; + FMC_OBKEY = OB_UNLOCK_KEY1; + } +} + +/*! + \brief lock the option byte operation + \param[in] none + \param[out] none + \retval none +*/ +void ob_lock(void) +{ + /* reset the OB_LK bit */ + FMC_OBCTL0 |= FMC_OBCTL0_OB_LK; +} + +/*! + \brief send option byte change command + \param[in] none + \param[out] none + \retval none +*/ +void ob_start(void) +{ + /* set the OB_START bit in OBCTL0 register */ + FMC_OBCTL0 |= FMC_OBCTL0_OB_START; +} + +/*! + \brief erase option byte + \param[in] none + \param[out] none + \retval none +*/ +void ob_erase(void) +{ + uint32_t reg, reg1; + fmc_state_enum fmc_state = FMC_READY; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + reg = FMC_OBCTL0; + reg1 = FMC_OBCTL1; + + if(FMC_READY == fmc_state) { + /* reset the OB_FWDGT, OB_DEEPSLEEP and OB_STDBY, set according to ob_fwdgt, ob_deepsleep and ob_stdby */ + reg |= (FMC_OBCTL0_NWDG_HW | FMC_OBCTL0_NRST_DPSLP | FMC_OBCTL0_NRST_STDBY); + /* reset the BOR level */ + reg |= FMC_OBCTL0_BOR_TH; + /* reset option byte boot bank value */ + reg &= ~FMC_OBCTL0_BB; + /* set option byte eccen value */ + reg |= FMC_OBCTL0_ECCEN; + /* reset drp and wp value */ + reg |= FMC_OBCTL0_WP0; + reg &= (~FMC_OBCTL0_DRP); + /* set option byte nwa value */ + reg |= FMC_OBCTL0_NWA; + FMC_OBCTL0 = reg; + + reg1 |= FMC_OBCTL1_WP0_H | FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H; + FMC_OBCTL1 = reg1; + } +} + +/*! + \brief enable write protection + \param[in] ob_wp: specify sector to be write protected + one or more parameters can be selected which are shown as below: + \arg OB_WP_x(x=0..38):sector x(x = 0,1,2...38) + \arg OB_WP_39_53: sector39~53 + \arg OB_WP_ALL: all sector + \param[out] none + \retval SUCCESS or ERROR +*/ +ErrStatus ob_write_protection_enable(uint64_t ob_wp) +{ + uint32_t reg0 = FMC_OBCTL0; + uint32_t reg1 = FMC_OBCTL1; + uint32_t wp0_low; + uint32_t wp0_high; + uint32_t wp1_low; + uint32_t wp1_high; + fmc_state_enum fmc_state = FMC_READY; + + if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_DRP)) { + return ERROR; + } + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + wp0_low = (uint32_t)(((ob_wp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); + wp0_high = (uint32_t)(((ob_wp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); + wp1_low = (uint32_t)(((ob_wp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); + wp1_high = (uint32_t)(((ob_wp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); + + reg0 &= ~wp0_low; + reg1 &= ~(wp0_high | wp1_low | wp1_high); + FMC_OBCTL0 = reg0; + FMC_OBCTL1 = reg1; + + return SUCCESS; + } else { + return ERROR; + } +} + +/*! + \brief disable write protection + \param[in] ob_wp: specify sector to be write protected + one or more parameters can be selected which are shown as below: + \arg OB_WP_x(x=0..38): sector x(x = 0,1,2...38) + \arg OB_WP_39_53: sector39~53 + \arg OB_WP_ALL: all sector + \param[out] none + \retval SUCCESS or ERROR +*/ +ErrStatus ob_write_protection_disable(uint64_t ob_wp) +{ + uint32_t reg0 = FMC_OBCTL0; + uint32_t reg1 = FMC_OBCTL1; + uint32_t wp0_low; + uint32_t wp0_high; + uint32_t wp1_low; + uint32_t wp1_high; + fmc_state_enum fmc_state = FMC_READY; + + if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_DRP)) { + return ERROR; + } + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + wp0_low = (uint32_t)(((ob_wp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); + wp0_high = (uint32_t)(((ob_wp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); + wp1_low = (uint32_t)(((ob_wp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); + wp1_high = (uint32_t)(((ob_wp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); + + reg0 |= wp0_low; + reg1 |= wp0_high | wp1_low | wp1_high; + + FMC_OBCTL0 = reg0; + FMC_OBCTL1 = reg1; + + return SUCCESS; + } else { + return ERROR; + } +} + +/*! + \brief enable erase/program protection and CBUS read protection + \param[in] ob_drp: enable the WPx bits used as erase/program protection and CBUS read protection of each sector + one or more parameters can be selected which are shown as below: + \arg OB_DRP_x(x=0..38): sector x(x = 0,1,2...38) + \arg OB_DRP_39_53: sector39~53 + \arg OB_DRP_ALL: all sector + \param[out] none + \retval none +*/ +void ob_drp_enable(uint64_t ob_drp) +{ + uint32_t reg0 = FMC_OBCTL0; + uint32_t reg1 = FMC_OBCTL1; + fmc_state_enum fmc_state = FMC_READY; + uint32_t drp_state = FMC_OBCTL0 & FMC_OBCTL0_DRP; + uint32_t drp0_low; + uint32_t drp0_high; + uint32_t drp1_low; + uint32_t drp1_high; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + if(RESET == drp_state) { + reg0 &= ~FMC_OBCTL0_WP0; + reg1 &= ~(FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H | FMC_OBCTL1_WP0_H); + } + + drp0_low = (uint32_t)(((ob_drp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); + drp0_high = (uint32_t)(((ob_drp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); + drp1_low = (uint32_t)(((ob_drp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); + drp1_high = (uint32_t)(((ob_drp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); + + reg0 |= drp0_low; + reg0 |= FMC_OBCTL0_DRP; + reg1 |= drp0_high | drp1_low | drp1_high; + + FMC_OBCTL0 = reg0; + FMC_OBCTL1 = reg1; + } +} + +/*! + \brief disable all erase/program protection and CBUS read protection + \param[in] none + \param[out] none + \retval none +*/ +void ob_drp_disable(void) +{ + uint32_t reg0 = FMC_OBCTL0; + uint32_t reg1 = FMC_OBCTL1; + fmc_state_enum fmc_state = FMC_READY; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + if(((uint8_t)(reg0 >> 8U)) == (uint8_t)FMC_NSPC) { + /* security protection should be set as low level protection before disable CBUS read protection */ + reg0 &= ~FMC_OBCTL0_SPC; + reg0 |= ((uint32_t)FMC_LSPC << 8U); + FMC_OBCTL0 = reg0; + + /* set the OB_START bit in OBCTL0 register */ + FMC_OBCTL0 |= FMC_OBCTL0_OB_START; + } + + /* it is necessary to disable the security protection at the same time when CBUS read protection is disabled */ + reg0 &= ~FMC_OBCTL0_SPC; + reg0 |= ((uint32_t)FMC_NSPC << 8U); + reg0 |= FMC_OBCTL0_WP0; + reg0 &= (~FMC_OBCTL0_DRP); + FMC_OBCTL0 = reg0; + + reg1 |= FMC_OBCTL1_WP0_H | FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H; + FMC_OBCTL1 = reg1; + } +} + +/*! + \brief configure security protection level + \param[in] ob_spc: specify security protection level + only one parameter can be selected which is shown as below: + \arg FMC_NSPC: no security protection + \arg FMC_LSPC: low security protection + \arg FMC_HSPC: high security protection + \param[out] none + \retval none +*/ +void ob_security_protection_config(uint8_t ob_spc) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + uint32_t reg; + + reg = FMC_OBCTL0; + /* reset the OBCTL0_SPC, set according to ob_spc */ + reg &= ~FMC_OBCTL0_SPC; + reg |= ((uint32_t)ob_spc << 8U); + FMC_OBCTL0 = reg; + } +} + +/*! + \brief program the FMC user option byte + \param[in] ob_fwdgt: option byte watchdog value + only one parameter can be selected which is shown as below: + \arg OB_FWDGT_SW: software free watchdog + \arg OB_FWDGT_HW: hardware free watchdog + \param[in] ob_deepsleep: option byte deepsleep reset value + only one parameter can be selected which is shown as below: + \arg OB_DEEPSLEEP_NRST: no reset when entering deepsleep mode + \arg OB_DEEPSLEEP_RST: generate a reset instead of entering deepsleep mode + \param[in] ob_stdby:option byte standby reset value + only one parameter can be selected which is shown as below: + \arg OB_STDBY_NRST: no reset when entering standby mode + \arg OB_STDBY_RST: generate a reset instead of entering standby mode + \param[out] none + \retval none +*/ +void ob_user_write(uint32_t ob_fwdgt, uint32_t ob_deepsleep, uint32_t ob_stdby) +{ + fmc_state_enum fmc_state = FMC_READY; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state) { + uint32_t reg; + + reg = FMC_OBCTL0; + /* reset the OB_FWDGT, OB_DEEPSLEEP and OB_STDBY, set according to ob_fwdgt ,ob_deepsleep and ob_stdby */ + reg &= ~(FMC_OBCTL0_NWDG_HW | FMC_OBCTL0_NRST_DPSLP | FMC_OBCTL0_NRST_STDBY); + FMC_OBCTL0 = (reg | ob_fwdgt | ob_deepsleep | ob_stdby); + } +} + +/*! + \brief program the option byte BOR threshold value + \param[in] ob_bor_th: user option byte + only one parameter can be selected which is shown as below: + \arg OB_BOR_TH_VALUE3: BOR threshold value 3 + \arg OB_BOR_TH_VALUE2: BOR threshold value 2 + \arg OB_BOR_TH_VALUE1: BOR threshold value 1 + \arg OB_BOR_TH_OFF: no BOR function + \param[out] none + \retval none +*/ +void ob_user_bor_threshold(uint32_t ob_bor_th) +{ + uint32_t reg; + + reg = FMC_OBCTL0; + /* set the BOR level */ + reg &= ~FMC_OBCTL0_BOR_TH; + FMC_OBCTL0 = (reg | ob_bor_th); +} + +/*! + \brief configure the option byte boot bank value + \param[in] boot_mode: specifies the option byte boot bank value + only one parameter can be selected which is shown as below: + \arg OB_BB_DISABLE: boot from bank0 + \arg OB_BB_ENABLE: boot from bank1 or bank0 if bank1 is void + \param[out] none + \retval none +*/ +void ob_boot_mode_config(uint32_t boot_mode) +{ + uint32_t reg; + + reg = FMC_OBCTL0; + + /* set option byte boot bank value */ + reg &= ~FMC_OBCTL0_BB; + FMC_OBCTL0 = (reg | boot_mode); +} + +/*! + \brief configure FMC/SRAM ECC checking, only valid after power reset. + \param[in] ecc_config: specifies the option byte FMC/SRAM ECC checking + only one parameter can be selected which is shown as below: + \arg OB_ECC_DISABLE: disable FMC/SRAM ECC checking + \arg OB_ECC_ENABLE: enable FMC/SRAM ECC checking + \param[out] none + \retval none +*/ +void ob_ecc_config(uint32_t ecc_config) +{ + uint32_t reg; + + reg = FMC_OBCTL0; + + /* set option byte boot bank value */ + reg &= ~FMC_OBCTL0_ECCEN; + FMC_OBCTL0 = (reg | ecc_config); +} + +/*! + \brief select no waiting time area, only valid after power reset, only for 4MB dual bank series. + \param[in] nwa_select: specifies the option byte no waiting time area + only one parameter can be selected which is shown as below: + \arg OB_NWA_BANK1: bank1 is no waiting time area + \arg OB_NWA_BANK0: bank0 is no waiting time area + \param[out] none + \retval none +*/ +void ob_nwa_select(uint32_t nwa_select) +{ + uint32_t reg; + + reg = FMC_OBCTL0; + + /* set option byte boot bank value */ + reg &= ~FMC_OBCTL0_NWA; + FMC_OBCTL0 = (reg | nwa_select); +} + +/*! + \brief get the FMC user option byte + \param[in] none + \param[out] none + \retval the FMC user option byte values: ob_fwdgt(Bit0), ob_deepsleep(Bit1), ob_stdby(Bit2) +*/ +uint8_t ob_user_get(void) +{ + return (uint8_t)((uint8_t)(FMC_OBCTL0 >> 5U) & 0x07U); +} + +/*! + \brief get the FMC option byte write protection of bank0 + \param[in] none + \param[out] none + \retval the FMC write protection option byte value +*/ +uint32_t ob_write_protection0_get(void) +{ + uint32_t wp0_value; + + wp0_value = (uint32_t)(((uint32_t)(FMC_OBCTL0 & FMC_OBCTL0_WP0)) >> OBCTL0_WP0_L_OFFSET); + wp0_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP0_H)) >> OBCTL1_WP0_H_OFFSET) << 12U); + + return wp0_value; +} + +/*! + \brief get the FMC option byte write protection of bank1 + \param[in] none + \param[out] none + \retval the FMC write protection option byte value +*/ +uint32_t ob_write_protection1_get(void) +{ + uint32_t wp1_value; + + wp1_value = (uint32_t)(((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_L)) >> OBCTL1_WP1_L_OFFSET); + wp1_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_H)) >> OBCTL1_WP1_H_OFFSET) << 12U); + + return wp1_value; +} + +/*! + \brief get the FMC erase/program protection and CBUS read protection option bytes value of bank0 + \param[in] none + \param[out] none + \retval the FMC erase/program protection and CBUS read protection option bytes value +*/ +uint32_t ob_drp0_get(void) +{ + uint32_t drp0_value; + + /* return the FMC erase/program protection and CBUS read protection option bytes value */ + if(FMC_OBCTL0 & FMC_OBCTL0_DRP) { + drp0_value = (uint32_t)(((uint32_t)(FMC_OBCTL0 & FMC_OBCTL0_WP0)) >> OBCTL0_WP0_L_OFFSET); + drp0_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP0_H)) >> OBCTL1_WP0_H_OFFSET) << 12U); + } else { + drp0_value = 0U; + } + return drp0_value; +} + +/*! + \brief get the FMC erase/program protection and CBUS read protection option bytes value of bank1 + \param[in] none + \param[out] none + \retval the FMC erase/program protection and CBUS read protection option bytes value +*/ +uint32_t ob_drp1_get(void) +{ + uint32_t drp1_value; + + /* return the FMC erase/program protection and CBUS read protection option bytes value */ + if(FMC_OBCTL0 & FMC_OBCTL0_DRP) { + drp1_value = (uint32_t)(((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_L)) >> OBCTL1_WP1_L_OFFSET); + drp1_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_H)) >> OBCTL1_WP1_H_OFFSET) << 12U); + } else { + drp1_value = 0U; + } + return drp1_value; +} + +/*! + \brief get option byte security protection code value + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ob_spc_get(void) +{ + FlagStatus spc_state = RESET; + + if(((uint8_t)(FMC_OBCTL0 >> 8U)) != FMC_NSPC) { + spc_state = SET; + } else { + spc_state = RESET; + } + return spc_state; +} + +/*! + \brief get the FMC option byte BOR threshold value + \param[in] none + \param[out] none + \retval the FMC BOR threshold value:OB_BOR_TH_OFF,OB_BOR_TH_VALUE1,OB_BOR_TH_VALUE2,OB_BOR_TH_VALUE3 +*/ +uint32_t ob_user_bor_threshold_get(void) +{ + /* return the FMC BOR threshold value */ + return (FMC_OBCTL0 & FMC_OBCTL0_BOR_TH); +} + +/*! + \brief get the boot mode + \param[in] none + \param[out] none + \retval the FMC boot bank value:OB_BB_DISABLE,OB_BB_ENABLE +*/ +uint32_t ob_boot_mode_get(void) +{ + /* return the boot mode */ + return (FMC_OBCTL0 & FMC_OBCTL0_BB); +} + +/*! + \brief get FMC/SRAM ECC checking + \param[in] none + \param[out] none + \retval the FMC ECCEN value:OB_ECC_DISABLE,OB_ECC_ENABLE +*/ +uint32_t ob_ecc_get(void) +{ + /* return the FMC/SRAM ECC checking */ + return (FMC_OBCTL0 & FMC_OBCTL0_ECCEN); +} + +/*! + \brief get no waiting time area + \param[in] none + \param[out] none + \retval the no waiting time area:OB_NWA_BANK1,OB_NWA_BANK0 +*/ +uint32_t ob_nwa_get(void) +{ + /* return the no waiting time area */ + return (FMC_OBCTL0 & FMC_OBCTL0_NWA); +} + +/*! + \brief get flag set or reset + \param[in] fmc_flag: check FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_END: FMC end of operation flag bit + \arg FMC_FLAG_OPERR: FMC operation error flag bit + \arg FMC_FLAG_LDECCDET: FMC multi bit ECC error when load code from flash flag bit + \arg FMC_FLAG_WPERR: FMC Erase/Program protection error flag bit + \arg FMC_FLAG_PGAERR: FMC program alignment error flag bit + \arg FMC_FLAG_PGMERR: FMC program size not match error flag bit + \arg FMC_FLAG_PGSERR: FMC program sequence error flag bit + \arg FMC_FLAG_RDCERR: FMC CBUS data read protection error flag bit + \arg FMC_FLAG_BUSY: FMC busy flag bit + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fmc_flag_get(uint32_t fmc_flag) +{ + if(FMC_STAT & fmc_flag) { + return SET; + } + /* return the state of corresponding FMC flag */ + return RESET; +} + +/*! + \brief clear the FMC pending flag + \param[in] FMC_flag: clear FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_END: FMC end of operation flag bit + \arg FMC_FLAG_OPERR: FMC operation error flag bit + \arg FMC_FLAG_LDECCDET: FMC multi bit ECC error when load code from flash flag bit + \arg FMC_FLAG_WPERR: FMC Erase/Program protection error flag bit + \arg FMC_FLAG_PGAERR: FMC program alignment error flag bit + \arg FMC_FLAG_PGMERR: FMC program size not match error flag bit + \arg FMC_FLAG_PGSERR: FMC program sequence error flag bit + \arg FMC_FLAG_RDCERR: FMC CBUS data read protection error flag bit + \arg FMC_FLAG_BUSY: FMC busy flag bit + \param[out] none + \retval none +*/ +void fmc_flag_clear(uint32_t fmc_flag) +{ + /* clear the flags */ + FMC_STAT = fmc_flag; +} + +/*! + \brief enable FMC interrupt + \param[in] fmc_int: the FMC interrupt source + only one parameter can be selected which is shown as below: + \arg FMC_INT_END: enable FMC end of program interrupt + \arg FMC_INT_ERR: enable FMC error interrupt + \arg FMC_INT_LDECC: enable FMC load code ECC error interrupt + \param[out] none + \retval none +*/ +void fmc_interrupt_enable(uint32_t fmc_int) +{ + FMC_CTL |= fmc_int; +} + +/*! + \brief disable FMC interrupt + \param[in] fmc_int: the FMC interrupt source + only one parameter can be selected which is shown as below: + \arg FMC_INT_END: disable FMC end of program interrupt + \arg FMC_INT_ERR: disable FMC error interrupt + \arg FMC_INT_LDECC: enable FMC load code ECC error interrupt + \param[out] none + \retval none +*/ +void fmc_interrupt_disable(uint32_t fmc_int) +{ + FMC_CTL &= ~fmc_int; +} + +/*! + \brief get FMC interrupt flag set or reset + \param[in] fmc_int_flag: FMC interrupt flag + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag + \arg FMC_INT_FLAG_OPERR: FMC operation error interrupt flag + \arg FMC_INT_FLAG_LDECCDET: FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag + \arg FMC_INT_FLAG_WPERR: FMC Erase/Program protection error interrupt flag + \arg FMC_INT_FLAG_PGAERR: FMC program alignment error interrupt flag + \arg FMC_INT_FLAG_PGMERR: FMC program size not match error interrupt flag + \arg FMC_INT_FLAG_PGSERR: FMC program sequence error interrupt flag + \arg FMC_INT_FLAG_RDCERR: FMC CBUS data read protection error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fmc_interrupt_flag_get(uint32_t fmc_int_flag) +{ + if(FMC_FLAG_END == fmc_int_flag) { + /* end of operation interrupt flag */ + if(FMC_CTL & FMC_CTL_ENDIE) { + if(FMC_STAT & fmc_int_flag) { + return SET; + } + } + } else { + /* error interrupt flags */ + if(FMC_CTL & FMC_CTL_ERRIE) { + if(FMC_STAT & fmc_int_flag) { + return SET; + } + } + } + return RESET; +} + +/*! + \brief clear the FMC interrupt flag + \param[in] fmc_int_flag: FMC interrupt flag + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag + \arg FMC_INT_FLAG_OPERR: FMC operation error interrupt flag + \arg FMC_INT_FLAG_LDECCDET: FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag + \arg FMC_INT_FLAG_WPERR: FMC Erase/Program protection error interrupt flag + \arg FMC_INT_FLAG_PGAERR: FMC program alignment error interrupt flag + \arg FMC_INT_FLAG_PGMERR: FMC program size not match error interrupt flag + \arg FMC_INT_FLAG_PGSERR: FMC program sequence error interrupt flag + \arg FMC_INT_FLAG_RDCERR: FMC CBUS data read protection error interrupt flag + \param[out] none + \retval none +*/ +void fmc_interrupt_flag_clear(uint32_t fmc_int_flag) +{ + /* clear the interrupt flag */ + FMC_STAT = fmc_int_flag; +} + +/*! + \brief get the FMC state + \param[in] none + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader +*/ +fmc_state_enum fmc_state_get(void) +{ + fmc_state_enum fmc_state = FMC_READY; + uint32_t temp_val = FMC_STAT; + + if(RESET != (temp_val & FMC_FLAG_BUSY)) { + fmc_state = FMC_BUSY; + } else if(RESET != (temp_val & FMC_FLAG_RDCERR)) { + fmc_state = FMC_RDCERR; + } else if(RESET != (temp_val & FMC_FLAG_PGSERR)) { + fmc_state = FMC_PGSERR; + } else if(RESET != (temp_val & FMC_FLAG_PGMERR)) { + fmc_state = FMC_PGMERR; + } else if(RESET != (temp_val & FMC_FLAG_PGAERR)) { + fmc_state = FMC_PGAERR; + } else if(RESET != (temp_val & FMC_FLAG_WPERR)) { + fmc_state = FMC_WPERR; + } else if(RESET != (temp_val & FMC_FLAG_OPERR)) { + fmc_state = FMC_OPERR; + } else if(RESET != (temp_val & FMC_FLAG_LDECCDET)) { + fmc_state = FMC_LDECCDET; + } else { + fmc_state = FMC_READY; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief check whether FMC is ready or not + \param[in] timeout: timeout value + \param[out] none + \retval state of FMC + \arg FMC_READY: the operation has been completed + \arg FMC_BUSY: the operation is in progress + \arg FMC_RDCERR: CBUS data read protection error + \arg FMC_PGSERR: program sequence error + \arg FMC_PGMERR: program size not match error + \arg FMC_PGAERR: program alignment error + \arg FMC_WPERR: erase/program protection error + \arg FMC_OPERR: operation error + \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader + \arg FMC_TOERR: timeout error +*/ +fmc_state_enum fmc_ready_wait(uint32_t timeout) +{ + fmc_state_enum fmc_state = FMC_BUSY; + + /* wait for FMC ready */ + do { + /* get FMC state */ + fmc_state = fmc_state_get(); + timeout--; + } while((FMC_BUSY == fmc_state) && (0U != timeout)); + + if(0U == timeout) { + fmc_state = FMC_TOERR; + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief unlock the EFUSE_CTL register + \param[in] none + \param[out] none + \retval none +*/ +void efuse_ctrl_unlock(void) +{ + /* clear the LK bit */ + EFUSE_CTL &= ~EFUSE_CTL_LK; +} + +/*! + \brief lock the EFUSE_CTL register + \param[in] none + \param[out] none + \retval none +*/ +void efuse_ctrl_lock(void) +{ + /* set the LK bit */ + EFUSE_CTL |= EFUSE_CTL_LK; +} + +/*! + \brief unlock the EFUSE_USER_DATA register + \param[in] none + \param[out] none + \retval none +*/ +void efuse_user_data_unlock(void) +{ + /* clear the UDLK bit */ + EFUSE_CTL &= ~EFUSE_CTL_UDLK; +} + +/*! + \brief lock the EFUSE_USER_DATA register + \param[in] none + \param[out] none + \retval none +*/ +void efuse_user_data_lock(void) +{ + /* set the UDLK bit */ + EFUSE_CTL |= EFUSE_CTL_UDLK; +} + +/*! + \brief read EFUSE value + \param[in] ef_addr: EFUSE address + \arg EFUSE_CTL_EFADDR: efuse controladdress + \arg USER_DATA_EFADDR: user data address + \param[in] size: byte count to read + \param[out] buf: the buffer for storing read-out EFUSE data + \retval state of EFUSE: + \arg EFUSE_READY: EFUSE operation has been completed + \arg EFUSE_BUSY: EFUSE operation is in progress + \arg EFUSE_OBER: overstep boundary error + \arg EFUSE_TOERR: EFUSE timeout error +*/ +efuse_state_enum efuse_read(uint32_t ef_addr, uint32_t size, uint32_t buf[]) +{ + uint32_t reg_addr = 0U; + efuse_state_enum efuse_state = EFUSE_READY; + + if(1U != size) { + return EFUSE_OBER; + } + + if(EFUSE_CTL_EFADDR == ef_addr) { + /* read efuse control*/ + reg_addr = (uint32_t)(FMC + EFUSE_CTL_OFFSET); + } else if(USER_DATA_EFADDR == ef_addr) { + /* read user data */ + reg_addr = (uint32_t)(FMC + EFUSE_USER_DATA_OFFSET); + } else { + return EFUSE_OBER; + } + + /* clear the RDIF bit if it is SET */ + efuse_flag_clear(EFUSE_RDIC); + + /* make sure no overstep boundary errors */ + if(RESET != efuse_flag_get(EFUSE_OBERIF)) { + return EFUSE_OBER; + } + + /* EFUSE read operation */ + EFUSE_CS &= (~EFUSE_CS_EFRW); + + /* write the desired efuse address and size to the EFUSE_ADDR register */ + EFUSE_ADDR = (uint32_t)((1U << EFUSE_ADDR_EFSIZE_OFFSET) | ef_addr); + + /* start read EFUSE operation */ + EFUSE_CS |= EFUSE_CS_EFSTR; + + /* wait for the operation to complete */ + efuse_state = efuse_ready_wait(EFUSE_RDIF, EFUSE_TIMEOUT_COUNT); + if(EFUSE_READY == efuse_state) { + /* read EFUSE data to buffer */ + buf[0] = REG32(reg_addr); + } + + return efuse_state; +} + +/*! + \brief write EFUSE + \param[in] ef_addr: EFUSE address + \arg EFUSE_CTL_EFADDR: efuse controladdress + \arg USER_DATA_EFADDR: user data address + \param[in] size: byte count to write, (1~1) + \param[in] ef_data: data to write EFUSE + \param[out] none + \retval state of EFUSE: + \arg EFUSE_READY: EFUSE operation has been completed + \arg EFUSE_BUSY: EFUSE operation is in progress + \arg EFUSE_OBER: overstep boundary error + \arg EFUSE_TOERR: EFUSE timeout error +*/ +efuse_state_enum efuse_write(uint32_t ef_addr, uint32_t size, uint8_t ef_data) +{ + uint32_t reg_addr = 0U; + efuse_state_enum efuse_state; + + if(1U != size) { + return EFUSE_OBER; + } + + if(EFUSE_CTL_EFADDR == ef_addr) { + /* program efuse control*/ + reg_addr = (uint32_t)(FMC + EFUSE_CTL_OFFSET); + } else if(USER_DATA_EFADDR == ef_addr) { + /* program user data */ + reg_addr = (uint32_t)(FMC + EFUSE_USER_DATA_OFFSET); + } else { + return EFUSE_OBER; + } + + /* clear the PGIF bit if it is SET */ + efuse_flag_clear(EFUSE_PGIC); + + /* make sure no overstep boundary errors */ + if(RESET != efuse_flag_get(EFUSE_OBERIF)) { + return EFUSE_OBER; + } + + /* EFUSE write operation */ + EFUSE_CS |= EFUSE_CS_EFRW; + + /* write the desired efuse address and size to the EFUSE_ADDR register */ + EFUSE_ADDR = (uint32_t)((size << EFUSE_ADDR_EFSIZE_OFFSET) | ef_addr); + + REG32(reg_addr) = (uint32_t)ef_data; + + /* start array write EFUSE operation */ + EFUSE_CS |= EFUSE_CS_EFSTR; + + /* wait for the operation to complete */ + efuse_state = efuse_ready_wait(EFUSE_PGIF, EFUSE_TIMEOUT_COUNT); + + return efuse_state; +} + +/*! + \brief write control data parameter + \param[in] ef_data: EFUSE data to write + \param[out] none + \retval state of EFUSE: + \arg EFUSE_READY: EFUSE operation has been completed + \arg EFUSE_BUSY: EFUSE operation is in progress + \arg EFUSE_OBER: overstep boundary error + \arg EFUSE_TOERR: EFUSE timeout error +*/ +efuse_state_enum efuse_control_write(uint8_t ef_data) +{ + return efuse_write(EFUSE_CTL_EFADDR, 1UL, ef_data); +} + +/*! + \brief write user data parameter + \param[in] ef_data: EFUSE data to write + \param[out] none + \retval state of EFUSE: + \arg EFUSE_READY: EFUSE operation has been completed + \arg EFUSE_BUSY: EFUSE operation is in progress + \arg EFUSE_OBER: overstep boundary error + \arg EFUSE_TOERR: EFUSE timeout error +*/ +efuse_state_enum efuse_user_data_write(uint8_t ef_data) +{ + return efuse_write(USER_DATA_EFADDR, 1UL, ef_data); +} + +/*! + \brief get EFUSE flag is set or not + \param[in] efuse_flag: specifies to get a flag + only one parameter can be selected which is shown as below: + \arg EFUSE_PGIF: programming operation completion flag + \arg EFUSE_RDIF: read operation completion flag + \arg EFUSE_OBERIF: overstep boundary error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus efuse_flag_get(uint32_t efuse_flag) +{ + if(EFUSE_CS & efuse_flag) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EFUSE pending flag + \param[in] flag: specifies to clear a flag + only one parameter can be selected which is shown as below: + \arg EFUSE_PGIC: clear programming operation completion flag + \arg EFUSE_RDIC: clear read operation completion flag + \arg EFUSE_OBERIC: clear overstep boundary error flag + \param[out] none + \retval none +*/ +void efuse_flag_clear(uint32_t efuse_cflag) +{ + EFUSE_CS |= efuse_cflag; +} + +/*! + \brief enable EFUSE interrupt + \param[in] source: specifies an interrupt to enable + one or more parameters can be selected which are shown as below: + \arg EFUSE_INT_PG: programming operation completion interrupt + \arg EFUSE_INT_RD: read operation completion interrupt + \arg EFUSE_INT_OBER: overstep boundary error interrupt + \param[out] none + \retval none +*/ +void efuse_interrupt_enable(uint32_t source) +{ + EFUSE_CS = source; +} + +/*! + \brief disable EFUSE interrupt + \param[in] source: specifies an interrupt to disable + one or more parameters can be selected which are shown as below: + \arg EFUSE_INT_PG: programming operation completion interrupt + \arg EFUSE_INT_RD: read operation completion interrupt + \arg EFUSE_INT_OBER: overstep boundary error interrupt + \param[out] none + \retval none +*/ +void efuse_interrupt_disable(uint32_t source) +{ + EFUSE_CS &= ~source; +} + +/*! + \brief get EFUSE interrupt flag is set or not + \param[in] efuse_flag: specifies to get a flag + only one parameter can be selected which is shown as below: + \arg EFUSE_INT_PGIF: programming operation completion interrupt flag + \arg EFUSE_INT_RDIF: read operation completion interrupt flag + \arg EFUSE_INT_OBERIF: overstep boundary error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus efuse_interrupt_flag_get(uint32_t int_flag) +{ + if(EFUSE_CS & int_flag) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EFUSE pending interrupt flag + \param[in] efuse_flag: specifies to clear a flag + only one parameter can be selected which is shown as below: + \arg EFUSE_INT_PGIC: clear programming operation completion interrupt flag + \arg EFUSE_INT_RDIC: clear operation completion interrupt flag + \arg EFUSE_INT_OBERIC: clear overstep boundary error interrupt flag + \param[out] none + \retval none +*/ +void efuse_interrupt_flag_clear(uint32_t int_cflag) +{ + EFUSE_CS |= int_cflag; +} + +/*! + \brief check whether EFUSE is ready or not + \param[in] efuse_flag: specifies to get a flag + only one parameter can be selected which is shown as below: + \arg EFUSE_PGIF: programming operation completion flag + \arg EFUSE_RDIF: read operation completion flag + \arg EFUSE_OBERIF: overstep boundary error flag + \param[in] timeout: timeout value + \param[out] none + \retval state of EFUSE + \arg EFUSE_READY: EFUSE operation has been completed + \arg EFUSE_BUSY: EFUSE operation is in progress + \arg EFUSE_OBER: overstep boundary error + \arg EFUSE_TOERR: EFUSE timeout error +*/ +efuse_state_enum efuse_ready_wait(uint32_t efuse_flag, uint32_t timeout) +{ + efuse_state_enum efuse_state = EFUSE_BUSY; + + /* wait for EFUSE ready */ + do { + /* get EFUSE flag set or not */ + if(EFUSE_CS & (uint32_t)efuse_flag) { + efuse_state = EFUSE_READY; + } else if(EFUSE_CS & EFUSE_CS_OVBERIF) { + efuse_state = EFUSE_OBER; + } else { + + } + timeout--; + } while((EFUSE_BUSY == efuse_state) && (0U != timeout)); + + if(EFUSE_BUSY == efuse_state) { + efuse_state = EFUSE_TOERR; + } + + /* return the EFUSE state */ + return efuse_state; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c new file mode 100644 index 00000000000..773e693f8fb --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c @@ -0,0 +1,229 @@ +/*! + \file gd32f5xx_fwdgt.c + \brief FWDGT driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_fwdgt.h" + +/*! + \brief enable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_enable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; +} + +/*! + \brief disable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_disable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_DISABLE; +} + +/*! + \brief start the free watchdog timer counter + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_enable(void) +{ + FWDGT_CTL = FWDGT_KEY_ENABLE; +} + +/*! + \brief configure the free watchdog timer counter prescaler value + \param[in] prescaler_value: specify prescaler value + only one parameter can be selected which is shown as below: + \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 + \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 + \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 + \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 + \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 + \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 + \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 + \arg FWDGT_PSC_DIV512: FWDGT prescaler set to 512 + \arg FWDGT_PSC_DIV1024: FWDGT prescaler set to 1024 + \arg FWDGT_PSC_DIV2048: FWDGT prescaler set to 2048 + \arg FWDGT_PSC_DIV4096: FWDGT prescaler set to 4096 + \arg FWDGT_PSC_DIV8192: FWDGT prescaler set to 8192 + \arg FWDGT_PSC_DIV16384: FWDGT prescaler set to 16384 + \arg FWDGT_PSC_DIV32768: FWDGT prescaler set to 32768 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus fwdgt_prescaler_value_config(uint16_t prescaler_value) +{ + uint32_t timeout = FWDGT_PSC_TIMEOUT; + uint32_t flag_status = RESET; + + /* enable write access to FWDGT_PSC */ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; + + /* wait until the PUD flag to be reset */ + do { + flag_status = FWDGT_STAT & FWDGT_STAT_PUD; + } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status) { + return ERROR; + } + + /* configure FWDGT */ + FWDGT_PSC = (uint32_t)prescaler_value; + + return SUCCESS; +} + +/*! + \brief configure the free watchdog timer counter reload value + \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus fwdgt_reload_value_config(uint16_t reload_value) +{ + uint32_t timeout = FWDGT_RLD_TIMEOUT; + uint32_t flag_status = RESET; + + /* enable write access to FWDGT_RLD */ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; + + /* wait until the RUD flag to be reset */ + do { + flag_status = FWDGT_STAT & FWDGT_STAT_RUD; + } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status) { + return ERROR; + } + + FWDGT_RLD = RLD_RLD(reload_value); + + return SUCCESS; +} + +/*! + \brief reload the counter of FWDGT + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_counter_reload(void) +{ + FWDGT_CTL = FWDGT_KEY_RELOAD; +} + +/*! + \brief configure counter reload value, and prescaler divider value + \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) + \param[in] prescaler_div: FWDGT prescaler value + only one parameter can be selected which is shown as below: + \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 + \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 + \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 + \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 + \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 + \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 + \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 + \arg FWDGT_PSC_DIV512 : FWDGT prescaler set to 512 + \arg FWDGT_PSC_DIV1024 : FWDGT prescaler set to 1024 + \arg FWDGT_PSC_DIV2048 : FWDGT prescaler set to 2048 + \arg FWDGT_PSC_DIV4096 : FWDGT prescaler set to 4096 + \arg FWDGT_PSC_DIV8192 : FWDGT prescaler set to 8192 + \arg FWDGT_PSC_DIV16384 : FWDGT prescaler set to 16384 + \arg FWDGT_PSC_DIV32768 : FWDGT prescaler set to 32768 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div) +{ + uint32_t timeout = FWDGT_PSC_TIMEOUT; + uint32_t flag_status = RESET; + + /* enable write access to FWDGT_PSC,and FWDGT_RLD */ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; + + /* wait until the PUD flag to be reset */ + do { + flag_status = FWDGT_STAT & FWDGT_STAT_PUD; + } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status) { + return ERROR; + } + + /* configure FWDGT */ + FWDGT_PSC = (uint32_t)prescaler_div; + + timeout = FWDGT_RLD_TIMEOUT; + /* wait until the RUD flag to be reset */ + do { + flag_status = FWDGT_STAT & FWDGT_STAT_RUD; + } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status) { + return ERROR; + } + + FWDGT_RLD = RLD_RLD(reload_value); + + /* reload the counter */ + FWDGT_CTL = FWDGT_KEY_RELOAD; + + return SUCCESS; +} + +/*! + \brief get flag state of FWDGT + \param[in] flag: flag to get + only one parameter can be selected which is shown as below: + \arg FWDGT_STAT_PUD: a write operation to FWDGT_PSC register is on going + \arg FWDGT_STAT_RUD: a write operation to FWDGT_RLD register is on going + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fwdgt_flag_get(uint16_t flag) +{ + if(RESET != (FWDGT_STAT & flag)) { + return SET; + } + + return RESET; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c new file mode 100644 index 00000000000..368a37d0435 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c @@ -0,0 +1,431 @@ +/*! + \file gd32f5xx_gpio.c + \brief GPIO driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_gpio.h" + +/*! + \brief reset GPIO port + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[out] none + \retval none +*/ +void gpio_deinit(uint32_t gpio_periph) +{ + switch(gpio_periph) { + case GPIOA: + /* reset GPIOA */ + rcu_periph_reset_enable(RCU_GPIOARST); + rcu_periph_reset_disable(RCU_GPIOARST); + break; + case GPIOB: + /* reset GPIOB */ + rcu_periph_reset_enable(RCU_GPIOBRST); + rcu_periph_reset_disable(RCU_GPIOBRST); + break; + case GPIOC: + /* reset GPIOC */ + rcu_periph_reset_enable(RCU_GPIOCRST); + rcu_periph_reset_disable(RCU_GPIOCRST); + break; + case GPIOD: + /* reset GPIOD */ + rcu_periph_reset_enable(RCU_GPIODRST); + rcu_periph_reset_disable(RCU_GPIODRST); + break; + case GPIOE: + /* reset GPIOE */ + rcu_periph_reset_enable(RCU_GPIOERST); + rcu_periph_reset_disable(RCU_GPIOERST); + break; + case GPIOF: + /* reset GPIOF */ + rcu_periph_reset_enable(RCU_GPIOFRST); + rcu_periph_reset_disable(RCU_GPIOFRST); + break; + case GPIOG: + /* reset GPIOG */ + rcu_periph_reset_enable(RCU_GPIOGRST); + rcu_periph_reset_disable(RCU_GPIOGRST); + break; + case GPIOH: + /* reset GPIOH */ + rcu_periph_reset_enable(RCU_GPIOHRST); + rcu_periph_reset_disable(RCU_GPIOHRST); + break; + case GPIOI: + /* reset GPIOI */ + rcu_periph_reset_enable(RCU_GPIOIRST); + rcu_periph_reset_disable(RCU_GPIOIRST); + break; + default: + break; + } +} + +/*! + \brief set GPIO mode + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] mode: GPIO pin mode + \arg GPIO_MODE_INPUT: input mode + \arg GPIO_MODE_OUTPUT: output mode + \arg GPIO_MODE_AF: alternate function mode + \arg GPIO_MODE_ANALOG: analog mode + \param[in] pull_up_down: GPIO pin with pull-up or pull-down resistor + \arg GPIO_PUPD_NONE: floating mode, no pull-up and pull-down resistors + \arg GPIO_PUPD_PULLUP: with pull-up resistor + \arg GPIO_PUPD_PULLDOWN:with pull-down resistor + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) +{ + uint16_t i; + uint32_t ctl, pupd; + + ctl = GPIO_CTL(gpio_periph); + pupd = GPIO_PUD(gpio_periph); + + for(i = 0U; i < 16U; i++) { + if((1U << i) & pin) { + /* clear the specified pin mode bits */ + ctl &= ~GPIO_MODE_MASK(i); + /* set the specified pin mode bits */ + ctl |= GPIO_MODE_SET(i, mode); + + /* clear the specified pin pupd bits */ + pupd &= ~GPIO_PUPD_MASK(i); + /* set the specified pin pupd bits */ + pupd |= GPIO_PUPD_SET(i, pull_up_down); + } + } + + GPIO_CTL(gpio_periph) = ctl; + GPIO_PUD(gpio_periph) = pupd; +} + +/*! + \brief set GPIO output type and speed + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] otype: GPIO pin output mode + \arg GPIO_OTYPE_PP: push pull mode + \arg GPIO_OTYPE_OD: open drain mode + \param[in] speed: GPIO pin output max speed + \arg GPIO_OSPEED_2MHZ: output max speed 2MHz + \arg GPIO_OSPEED_10MHZ: output max speed 10MHz + \arg GPIO_OSPEED_50MHZ: output max speed 50MHz + \arg GPIO_OSPEED_MAX: output max speed more than 50MHz + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin) +{ + uint16_t i; + uint32_t ospeedr; + + if(GPIO_OTYPE_OD == otype) { + GPIO_OMODE(gpio_periph) |= (uint32_t)pin; + } else { + GPIO_OMODE(gpio_periph) &= (uint32_t)(~pin); + } + + /* get the specified pin output speed bits value */ + ospeedr = GPIO_OSPD(gpio_periph); + + for(i = 0U; i < 16U; i++) { + if((1U << i) & pin) { + /* clear the specified pin output speed bits */ + ospeedr &= ~GPIO_OSPEED_MASK(i); + /* set the specified pin output speed bits */ + ospeedr |= GPIO_OSPEED_SET(i, speed); + } + } + GPIO_OSPD(gpio_periph) = ospeedr; +} + +/*! + \brief set GPIO pin bit + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BOP(gpio_periph) = (uint32_t)pin; +} + +/*! + \brief reset GPIO pin bit + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BC(gpio_periph) = (uint32_t)pin; +} + +/*! + \brief write data to the specified GPIO pin + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[in] bit_value: SET or RESET + \arg RESET: clear the port pin + \arg SET: set the port pin + \param[out] none + \retval none +*/ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) +{ + if(RESET != bit_value) { + GPIO_BOP(gpio_periph) = (uint32_t)pin; + } else { + GPIO_BC(gpio_periph) = (uint32_t)pin; + } +} + +/*! + \brief write data to the specified GPIO port + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] data: specify the value to be written to the port output control register + \param[out] none + \retval none +*/ +void gpio_port_write(uint32_t gpio_periph, uint16_t data) +{ + GPIO_OCTL(gpio_periph) = (uint32_t)data; +} + +/*! + \brief get GPIO pin input status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval input status of GPIO pin: SET or RESET +*/ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if((uint32_t)RESET != (GPIO_ISTAT(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO all pins input status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[out] none + \retval input status of GPIO all pins +*/ +uint16_t gpio_input_port_get(uint32_t gpio_periph) +{ + return ((uint16_t)GPIO_ISTAT(gpio_periph)); +} + +/*! + \brief get GPIO pin output status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval output status of GPIO pin: SET or RESET +*/ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if((uint32_t)RESET != (GPIO_OCTL(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO port output status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[out] none + \retval output status of GPIO all pins +*/ +uint16_t gpio_output_port_get(uint32_t gpio_periph) +{ + return ((uint16_t)GPIO_OCTL(gpio_periph)); +} + +/*! + \brief set GPIO alternate function + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] alt_func_num: GPIO pin af function + \arg GPIO_AF_0: SYSTEM + \arg GPIO_AF_1: TIMER0, TIMER1, TIMER7 + \arg GPIO_AF_2: TIMER0, TIMER2, TIMER3, TIMER4 + \arg GPIO_AF_3: TIMER7, TIMER8, TIMER9, TIMER10 + \arg GPIO_AF_4: I2C0, I2C1, I2C2, I2C3, SPI4, TIMER0 + \arg GPIO_AF_5: SPI0, SPI1, SPI2, SPI3, SPI4, SPI5, I2C3 + \arg GPIO_AF_6: SPI1, SPI2, SPI3, SPI4, SAI0, I2C4 + \arg GPIO_AF_7: USART0, USART1, USART2, SPI0, SPI1, SPI2 + \arg GPIO_AF_8: UART3, UART4, USART5, UART6, UART7 + \arg GPIO_AF_9: CAN0, CAN1, TLI, TIMER11, TIMER12, TIMER13, I2C1, I2C2, CTC + \arg GPIO_AF_10: USB_FS, USB_HS + \arg GPIO_AF_11: ENET + \arg GPIO_AF_12: EXMC, SDIO, USB_HS + \arg GPIO_AF_13: DCI + \arg GPIO_AF_14: TLI + \arg GPIO_AF_15: EVENTOUT + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) +{ + uint16_t i; + uint32_t afrl, afrh; + + afrl = GPIO_AFSEL0(gpio_periph); + afrh = GPIO_AFSEL1(gpio_periph); + + for(i = 0U; i < 8U; i++) { + if((1U << i) & pin) { + /* clear the specified pin alternate function bits */ + afrl &= ~GPIO_AFR_MASK(i); + afrl |= GPIO_AFR_SET(i, alt_func_num); + } + } + + for(i = 8U; i < 16U; i++) { + if((1U << i) & pin) { + /* clear the specified pin alternate function bits */ + afrh &= ~GPIO_AFR_MASK(i - 8U); + afrh |= GPIO_AFR_SET(i - 8U, alt_func_num); + } + } + + GPIO_AFSEL0(gpio_periph) = afrl; + GPIO_AFSEL1(gpio_periph) = afrh; +} + +/*! + \brief lock GPIO pin bit + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin) +{ + uint32_t lock = 0x00010000U; + lock |= pin; + + /* lock key writing sequence: write 1->write 0->write 1->read 0->read 1 */ + GPIO_LOCK(gpio_periph) = (uint32_t)lock; + GPIO_LOCK(gpio_periph) = (uint32_t)pin; + GPIO_LOCK(gpio_periph) = (uint32_t)lock; + lock = GPIO_LOCK(gpio_periph); + lock = GPIO_LOCK(gpio_periph); +} + +/*! + \brief toggle GPIO pin status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_TG(gpio_periph) = (uint32_t)pin; +} + +/*! + \brief toggle GPIO port status + \param[in] gpio_periph: GPIO port + only one parameter can be selected which is shown as below: + \arg GPIOx(x = A,B,C,D,E,F,G,H,I) + + \param[out] none + \retval none +*/ +void gpio_port_toggle(uint32_t gpio_periph) +{ + GPIO_TG(gpio_periph) = 0x0000FFFFU; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c new file mode 100644 index 00000000000..d95d1440e83 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c @@ -0,0 +1,402 @@ +/*! + \file gd32f5xx_hau.c + \brief HAU driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_hau.h" + +#define HASH_CONTEXT_INTERNAL_REG 37U +#define HMAC_CONTEXT_INTERNAL_REG 53U + +/*! + \brief reset the HAU peripheral + \param[in] none + \param[out] none + \retval none +*/ +void hau_deinit(void) +{ + /* enable HAU reset state */ + rcu_periph_reset_enable(RCU_HAURST); + /* release HAU from reset state */ + rcu_periph_reset_disable(RCU_HAURST); +} + +/*! + \brief initialize the HAU peripheral parameters + \param[in] none + \param[out] initpara: HAU init parameter struct + members of the structure and the member values are shown as below: + algo: HAU_ALGO_SHA1, HAU_ALGO_SHA224, HAU_ALGO_SHA256, HAU_ALGO_MD5 + mode: HAU_MODE_HASH, HAU_MODE_HMAC + datatype: HAU_SWAPPING_32BIT, HAU_SWAPPING_16BIT, HAU_SWAPPING_8BIT, HAU_SWAPPING_1BIT + keytype: HAU_KEY_SHORTER_64, HAU_KEY_LONGGER_64 + \retval none +*/ +void hau_init(hau_init_parameter_struct* initpara) +{ + /* configure the algorithm, mode and the data type */ + HAU_CTL &= (~(uint32_t)(HAU_CTL_ALGM_0 | HAU_CTL_ALGM_1 | HAU_CTL_DATAM | HAU_CTL_HMS)); + HAU_CTL |= (initpara->algo | initpara->datatype | initpara->mode); + + /* when mode is HMAC, set the key */ + if(HAU_MODE_HMAC == initpara->mode){ + HAU_CTL &= (~(uint32_t)(HAU_CTL_KLM)); + HAU_CTL |= initpara->keytype; + } + + /* start the digest of a new message */ + HAU_CTL |= HAU_CTL_START; +} + +/*! + \brief initialize the sturct hau_initpara + \param[in] initpara: HAU init parameter struct + members of the structure and the member values are shown as below: + algo: HAU_ALGO_SHA1, HAU_ALGO_SHA224, HAU_ALGO_SHA256, HAU_ALGO_MD5 + mode: HAU_MODE_HASH, HAU_MODE_HMAC + datatype: HAU_SWAPPING_32BIT, HAU_SWAPPING_16BIT, HAU_SWAPPING_8BIT, HAU_SWAPPING_1BIT + keytype: HAU_KEY_SHORTER_64, HAU_KEY_LONGGER_64 + \param[out] none + \retval none +*/ +void hau_init_struct_para_init(hau_init_parameter_struct* initpara) +{ + initpara->algo = HAU_ALGO_SHA1; + initpara->mode = HAU_MODE_HASH; + initpara->datatype = HAU_SWAPPING_32BIT; + initpara->keytype = HAU_KEY_SHORTER_64; +} + +/*! + \brief reset the HAU processor core + \param[in] none + \param[out] none + \retval none +*/ +void hau_reset(void) +{ + /* set to 1 to reset the HAU processor core, then it is ready to start the digest calculation */ + HAU_CTL |= HAU_CTL_START; +} + +/*! + \brief configure the number of valid bits in last word of the message + \param[in] valid_num: number of valid bits in last word of the message + only one parameter can be selected which is shown as below: + \arg 0x00: all 32 bits of the last data written are valid + \arg 0x01: only bit [31] of the last data written to HAU_DI after data swapping are valid + \arg 0x02: only bits [31:30] of the last data written to HAU_DI after data swapping are valid + \arg 0x03: only bits [31:29] of the last data written to HAU_DI after data swapping are valid + ... + \arg 0x1F: only bit [0] of the last data written to HAU_DI after data swapping are valid + \param[out] none + \retval none +*/ +void hau_last_word_validbits_num_config(uint32_t valid_num) +{ + HAU_CFG &= (~(uint32_t)(HAU_CFG_VBL)); + HAU_CFG |= CFG_VBL(valid_num); +} + +/*! + \brief write data to the IN FIFO + \param[in] data: data to write + \param[out] none + \retval none +*/ +void hau_data_write(uint32_t data) +{ + HAU_DI = data; +} + +/*! + \brief return the number of words already written into the IN FIFO + \param[in] none + \param[out] none + \retval number of words in the input FIFO +*/ +uint32_t hau_infifo_words_num_get(void) +{ + uint32_t ret = 0U; + ret = GET_CTL_NWIF(HAU_CTL); + return ret; +} + +/*! + \brief read the message digest result + \param[in] none + \param[out] digestpara: HAU digest parameter struct + out[7:0]: message digest result 0-7 + \retval none +*/ +void hau_digest_read(hau_digest_parameter_struct* digestpara) +{ + digestpara->out[0] = HAU_DO0; + digestpara->out[1] = HAU_DO1; + digestpara->out[2] = HAU_DO2; + digestpara->out[3] = HAU_DO3; + digestpara->out[4] = HAU_DO4; + digestpara->out[5] = HAU_DO5; + digestpara->out[6] = HAU_DO6; + digestpara->out[7] = HAU_DO7; +} + +/*! + \brief enable digest calculation + \param[in] none + \param[out] none + \retval none +*/ +void hau_digest_calculation_enable(void) +{ + HAU_CFG |= HAU_CFG_CALEN; +} + +/*! + \brief configure single or multiple DMA is used, and digest calculation at the end of a DMA transfer or not + \param[in] multi_single + only one parameter can be selected which is shown as below + \arg SINGLE_DMA_AUTO_DIGEST: message padding and message digest calculation at the end of a DMA transfer + \arg MULTIPLE_DMA_NO_DIGEST: multiple DMA transfers needed and CALEN bit is not automatically set at the end of a DMA transfer + \param[out] none + \retval none +*/ +void hau_multiple_single_dma_config(uint32_t multi_single) +{ + HAU_CTL &= (~(uint32_t)(HAU_CTL_MDS)); + HAU_CTL |= multi_single; +} + +/*! + \brief enable the HAU DMA interface + \param[in] none + \param[out] none + \retval none +*/ +void hau_dma_enable(void) +{ + HAU_CTL |= HAU_CTL_DMAE; +} + +/*! + \brief disable the HAU DMA interface + \param[in] none + \param[out] none + \retval none +*/ +void hau_dma_disable(void) +{ + HAU_CTL &= (~(uint32_t)(HAU_CTL_DMAE)); +} + +/*! + \brief initialize the struct context + \param[in] context: HAU context parameter struct + \param[out] none + \retval none +*/ +void hau_context_struct_para_init(hau_context_parameter_struct* context) +{ + uint8_t i = 0U; + + /* initialize context parameter struct */ + context->hau_inten_bak = 0U; + context->hau_cfg_bak = 0U; + context->hau_ctl_bak = 0U; + for(i = 0U; i <= HMAC_CONTEXT_INTERNAL_REG; i++){ + context->hau_ctxs_bak[i] = 0U; + } +} + +/*! + \brief save the HAU peripheral context + \param[in] none + \param[out] context_save: pointer to a hau_context structure that contains the repository for current context + \retval none +*/ +void hau_context_save(hau_context_parameter_struct* context_save) +{ + uint8_t i = 0U; + uint8_t i_max = HASH_CONTEXT_INTERNAL_REG; + + hau_context_struct_para_init(context_save); + /* save context registers */ + context_save->hau_inten_bak = HAU_INTEN; + context_save->hau_cfg_bak = HAU_CFG; + context_save->hau_ctl_bak = HAU_CTL; + + if(0U != (HAU_CTL & HAU_CTL_HMS)){ + i_max = HMAC_CONTEXT_INTERNAL_REG; + } + for(i = 0U; i <= i_max; i++){ + context_save->hau_ctxs_bak[i] = HAU_CTXS(i); + } +} + +/*! + \brief restore the HAU peripheral context + \param[in] context_restore: pointer to a hau_context_parameter_struct structure that contains the repository for saved context + \param[out] none + \retval none +*/ +void hau_context_restore(hau_context_parameter_struct* context_restore) +{ + uint8_t i = 0U; + uint8_t i_max = HASH_CONTEXT_INTERNAL_REG; + + /* restore context registers */ + HAU_INTEN = context_restore->hau_inten_bak; + HAU_CFG = context_restore->hau_cfg_bak; + HAU_CTL = context_restore->hau_ctl_bak; + /* Initialize the hash processor */ + HAU_CTL |= HAU_CTL_START; + + /* continue restoring context registers */ + if(0U != (HAU_CTL & HAU_CTL_HMS)){ + i_max = HMAC_CONTEXT_INTERNAL_REG; + } + for(i = 0U; i <= i_max; i++){ + HAU_CTXS(i) = context_restore->hau_ctxs_bak[i]; + } +} + +/*! + \brief get the HAU flag status + \param[in] flag: HAU flag status + only one parameter can be selected which is shown as below: + \arg HAU_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO + \arg HAU_FLAG_CALCULATION_COMPLETE: digest calculation is completed + \arg HAU_FLAG_DMA: DMA is enabled (DMAE =1) or a transfer is processing + \arg HAU_FLAG_BUSY: data block is in process + \arg HAU_FLAG_INFIFO_NO_EMPTY: the input FIFO is not empty + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus hau_flag_get(uint32_t flag) +{ + uint32_t ret = 0U; + FlagStatus ret_flag = RESET; + + /* check if the flag is in HAU_CTL register */ + if(RESET != (flag & HAU_FLAG_INFIFO_NO_EMPTY)){ + ret = HAU_CTL; + }else{ + ret = HAU_STAT; + } + + if (RESET != (ret & flag)){ + ret_flag = SET; + } + + return ret_flag; +} + +/*! + \brief clear the HAU flag status + \param[in] flag: HAU flag status + one or more parameters can be selected which are shown as below + \arg HAU_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO + \arg HAU_FLAG_CALCULATION_COMPLETE: digest calculation is completed + \param[out] none + \retval none +*/ +void hau_flag_clear(uint32_t flag) +{ + HAU_STAT = ~(uint32_t)(flag); +} + +/*! + \brief enable the HAU interrupts + \param[in] interrupt: specify the HAU interrupt source to be enabled + one or more parameters can be selected which are shown as below + \arg HAU_INT_DATA_INPUT: a new block can be entered into the IN buffer + \arg HAU_INT_CALCULATION_COMPLETE: calculation complete + \param[out] none + \retval none +*/ +void hau_interrupt_enable(uint32_t interrupt) +{ + HAU_INTEN |= interrupt; +} + +/*! + \brief disable the HAU interrupts + \param[in] interrupt: specify the HAU interrupt source to be disabled + one or more parameters can be selected which are shown as below + \arg HAU_INT_DATA_INPUT: a new block can be entered into the IN buffer + \arg HAU_INT_CALCULATION_COMPLETE: calculation complete + \param[out] none + \retval none +*/ +void hau_interrupt_disable(uint32_t interrupt) +{ + HAU_INTEN &= ~(uint32_t)(interrupt); +} + +/*! + \brief get the HAU interrupt flag status + \param[in] int_flag: HAU interrupt flag status + only one parameter can be selected which is shown as below + \arg HAU_INT_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO + \arg HAU_INT_FLAG_CALCULATION_COMPLETE: digest calculation is completed + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus hau_interrupt_flag_get(uint32_t int_flag) +{ + uint32_t ret = 0U; + FlagStatus flag = RESET; + + /* return the status of the interrupt */ + ret = HAU_STAT; + + if(RESET != ((HAU_INTEN & ret) & int_flag)){ + flag = SET; + } + + return flag; +} + +/*! + \brief clear the HAU interrupt flag status + \param[in] int_flag: HAU interrupt flag status + one or more parameters can be selected which are shown as below + \arg HAU_INT_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO + \arg HAU_INT_FLAG_CALCULATION_COMPLETE: digest calculation is completed + \param[out] none + \retval none +*/ +void hau_interrupt_flag_clear(uint32_t int_flag) +{ + HAU_STAT = ~(uint32_t)(int_flag); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c new file mode 100644 index 00000000000..5b75e5d5ede --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c @@ -0,0 +1,419 @@ +/*! + \file gd32f5xx_hau_sha_md5.c + \brief HAU_SHA_MD5 driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_hau.h" + +#define SHAMD5_BSY_TIMEOUT ((uint32_t)0x00010000U) + +/* HAU SHA/MD5 digest read in HASH mode */ +static void hau_sha_md5_digest_read(uint32_t algo, uint8_t *output); +/* HAU digest calculate process in HASH mode */ +static ErrStatus hau_hash_calculate(uint32_t algo, uint8_t *input, uint32_t in_length, uint8_t *output); +/* HAU digest calculate process in HMAC mode */ +static ErrStatus hau_hmac_calculate(uint32_t algo, uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t *output); + +/*! + \brief calculate digest using SHA1 in HASH mode + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hash_sha_1(uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hash_calculate(HAU_ALGO_SHA1, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using SHA1 in HMAC mode + \param[in] key: pointer to the key used for HMAC + \param[in] keysize: length of the key used for HMAC + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hmac_sha_1(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hmac_calculate(HAU_ALGO_SHA1, key, keysize, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using SHA224 in HASH mode + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hash_sha_224(uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hash_calculate(HAU_ALGO_SHA224, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using SHA224 in HMAC mode + \param[in] key: pointer to the key used for HMAC + \param[in] keysize: length of the key used for HMAC + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hmac_sha_224(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hmac_calculate(HAU_ALGO_SHA224, key, keysize, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using SHA256 in HASH mode + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hash_sha_256(uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hash_calculate(HAU_ALGO_SHA256, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using SHA256 in HMAC mode + \param[in] key: pointer to the key used for HMAC + \param[in] keysize: length of the key used for HMAC + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hmac_sha_256(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hmac_calculate(HAU_ALGO_SHA256, key, keysize, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using MD5 in HASH mode + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hash_md5(uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hash_calculate(HAU_ALGO_MD5, input, in_length, output); + return ret; +} + +/*! + \brief calculate digest using MD5 in HMAC mode + \param[in] key: pointer to the key used for HMAC + \param[in] keysize: length of the key used for HMAC + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus hau_hmac_md5(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) +{ + ErrStatus ret = ERROR; + ret = hau_hmac_calculate(HAU_ALGO_MD5, key, keysize, input, in_length, output); + return ret; +} + +/*! + \brief HAU SHA/MD5 digest read + \param[in] algo: algorithm selection + \param[out] output: the result digest + \retval none +*/ +static void hau_sha_md5_digest_read(uint32_t algo, uint8_t *output) +{ + hau_digest_parameter_struct digest_para; + uint32_t outputaddr = (uint32_t)output; + + switch(algo){ + case HAU_ALGO_SHA1: + hau_digest_read(&digest_para); + *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); + break; + case HAU_ALGO_SHA224: + hau_digest_read(&digest_para); + *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[5]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[6]); + break; + case HAU_ALGO_SHA256: + hau_digest_read(&digest_para); + *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[5]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[6]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[7]); + break; + case HAU_ALGO_MD5: + hau_digest_read(&digest_para); + *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); + outputaddr += 4U; + *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); + break; + default: + break; + } +} + +/*! + \brief HAU digest calculate process in HASH mode + \param[in] algo: algorithm selection + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus hau_hash_calculate(uint32_t algo, uint8_t *input, uint32_t in_length, uint8_t *output) +{ + hau_init_parameter_struct init_para; + + __IO uint32_t num_last_valid = 0U; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + uint32_t inputaddr = (uint32_t)input; + + /* number of valid bits in last word */ + num_last_valid = 8U * (in_length % 4U); + + /* HAU peripheral initialization */ + hau_deinit(); + + /* HAU configuration */ + init_para.algo = algo; + init_para.mode = HAU_MODE_HASH; + init_para.datatype = HAU_SWAPPING_8BIT; + hau_init(&init_para); + + /* configure the number of valid bits in last word of the message */ + hau_last_word_validbits_num_config(num_last_valid); + + /* write data to the IN FIFO */ + for(i = 0U; i < in_length; i += 4U){ + hau_data_write(*(uint32_t*)inputaddr); + inputaddr += 4U; + } + + /* enable digest calculation */ + hau_digest_calculation_enable(); + + /* wait until the busy flag is reset */ + do{ + busystatus = hau_flag_get(HAU_FLAG_BUSY); + counter++; + }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus){ + return ERROR; + }else{ + /* read the message digest */ + hau_sha_md5_digest_read(algo, output); + } + return SUCCESS; +} + +/*! + \brief HAU digest calculate process in HMAC mode + \param[in] algo: algorithm selection + \param[in] key: pointer to the key used for HMAC + \param[in] keysize: length of the key used for HMAC + \param[in] input: pointer to the input buffer + \param[in] in_length: length of the input buffer + \param[in] output: the result digest + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +static ErrStatus hau_hmac_calculate(uint32_t algo, uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t *output) +{ + hau_init_parameter_struct init_para; + + __IO uint16_t num_last_valid = 0U; + __IO uint16_t num_key_valid = 0U; + uint32_t i = 0U; + __IO uint32_t counter = 0U; + uint32_t busystatus = 0U; + uint32_t keyaddr = (uint32_t)key; + uint32_t inputaddr = (uint32_t)input; + + /* number of valid bits in last word of the message */ + num_last_valid = 8U * (uint16_t)(in_length % 4U); + /* number of valid bits in last word of the key */ + num_key_valid = 8U * (uint16_t)(keysize % 4U); + + /* HAU peripheral initialization */ + hau_deinit(); + + /* HAU configuration */ + init_para.algo = algo; + init_para.mode = HAU_MODE_HMAC; + init_para.datatype = HAU_SWAPPING_8BIT; + if(keysize > 64U){ + init_para.keytype = HAU_KEY_LONGGER_64; + }else{ + init_para.keytype = HAU_KEY_SHORTER_64; + } + hau_init(&init_para); + + /* configure the number of valid bits in last word of the key */ + hau_last_word_validbits_num_config((uint32_t)num_key_valid); + + /* write the key */ + for(i = 0U; i < keysize; i += 4U){ + hau_data_write(*(uint32_t*)keyaddr); + keyaddr += 4U; + } + + /* enable digest calculation */ + hau_digest_calculation_enable(); + + /* wait until the busy flag is reset */ + do{ + busystatus = hau_flag_get(HAU_FLAG_BUSY); + counter++; + }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus){ + return ERROR; + }else{ + /* configure the number of valid bits in last word of the message */ + hau_last_word_validbits_num_config((uint32_t)num_last_valid); + + /* write data to the IN FIFO */ + for(i = 0U; i < in_length; i += 4U){ + hau_data_write(*(uint32_t*)inputaddr); + inputaddr += 4U; + } + + /* enable digest calculation */ + hau_digest_calculation_enable(); + + /* wait until the busy flag is reset */ + counter = 0U; + do{ + busystatus = hau_flag_get(HAU_FLAG_BUSY); + counter++; + }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus){ + return ERROR; + }else{ + /* configure the number of valid bits in last word of the key */ + hau_last_word_validbits_num_config((uint32_t)num_key_valid); + + /* write the key */ + keyaddr = (uint32_t)key; + for(i = 0U; i < keysize; i += 4U){ + hau_data_write(*(uint32_t*)keyaddr); + keyaddr += 4U; + } + + /* enable digest calculation */ + hau_digest_calculation_enable(); + + /* wait until the busy flag is reset */ + counter =0U; + do{ + busystatus = hau_flag_get(HAU_FLAG_BUSY); + counter++; + }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); + + if(RESET != busystatus){ + return ERROR; + }else{ + /* read the message digest */ + hau_sha_md5_digest_read(algo, output); + } + } + } + return SUCCESS; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c new file mode 100644 index 00000000000..b4d7fdc3311 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c @@ -0,0 +1,857 @@ +/*! + \file gd32f5xx_i2c.c + \brief I2C driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_i2c.h" + +/* I2C register bit mask */ +#define I2CCLK_MAX ((uint32_t)0x00000032U) /*!< i2cclk maximum value */ +#define I2CCLK_MIN ((uint32_t)0x00000002U) /*!< i2cclk minimum value */ +#define I2C_FLAG_MASK ((uint32_t)0x0000FFFFU) /*!< i2c flag mask */ +#define I2C_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ +#define I2C_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ + +/* I2C register bit offset */ +#define STAT1_PECV_OFFSET ((uint32_t)0x00000008U) /* bit offset of PECV in I2C_STAT1 */ + +/*! + \brief reset I2C + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_deinit(uint32_t i2c_periph) +{ + switch(i2c_periph) { + case I2C0: + /* reset I2C0 */ + rcu_periph_reset_enable(RCU_I2C0RST); + rcu_periph_reset_disable(RCU_I2C0RST); + break; + case I2C1: + /* reset I2C1 */ + rcu_periph_reset_enable(RCU_I2C1RST); + rcu_periph_reset_disable(RCU_I2C1RST); + break; + case I2C2: + /* reset I2C2 */ + rcu_periph_reset_enable(RCU_I2C2RST); + rcu_periph_reset_disable(RCU_I2C2RST); + break; + default: + break; + } +} + +/*! + \brief configure I2C clock + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] clkspeed: I2C clock speed, supports standard mode (up to 100 kHz), fast mode (up to 400 kHz) + \param[in] dutycyc: duty cycle in fast mode + only one parameter can be selected which is shown as below: + \arg I2C_DTCY_2: T_low/T_high = 2 in fast mode + \arg I2C_DTCY_16_9: T_low/T_high = 16/9 in fast mode + \param[out] none + \retval none +*/ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc) +{ + uint32_t pclk1, clkc, freq, risetime; + uint32_t temp; + + pclk1 = rcu_clock_freq_get(CK_APB1); + /* I2C peripheral clock frequency */ + freq = (uint32_t)(pclk1 / 1000000U); + if(freq >= I2CCLK_MAX) { + freq = I2CCLK_MAX; + } + temp = I2C_CTL1(i2c_periph); + temp &= ~I2C_CTL1_I2CCLK; + temp |= freq; + + I2C_CTL1(i2c_periph) = temp; + + if(100000U >= clkspeed) { + /* the maximum SCL rise time is 1000ns in standard mode */ + risetime = (uint32_t)((pclk1 / 1000000U) + 1U); + if(risetime >= I2CCLK_MAX) { + I2C_RT(i2c_periph) = I2CCLK_MAX; + } else if(risetime <= I2CCLK_MIN) { + I2C_RT(i2c_periph) = I2CCLK_MIN; + } else { + I2C_RT(i2c_periph) = risetime; + } + clkc = (uint32_t)(pclk1 / (clkspeed * 2U)); + if(clkc < 0x04U) { + /* the CLKC in standard mode minmum value is 4 */ + clkc = 0x04U; + } + + I2C_CKCFG(i2c_periph) |= (I2C_CKCFG_CLKC & clkc); + + } else if(400000U >= clkspeed) { + /* the maximum SCL rise time is 300ns in fast mode */ + I2C_RT(i2c_periph) = (uint32_t)(((freq * (uint32_t)300U) / (uint32_t)1000U) + (uint32_t)1U); + if(I2C_DTCY_2 == dutycyc) { + /* I2C duty cycle is 2 */ + clkc = (uint32_t)(pclk1 / (clkspeed * 3U)); + I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; + } else { + /* I2C duty cycle is 16/9 */ + clkc = (uint32_t)(pclk1 / (clkspeed * 25U)); + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; + } + if(0U == (clkc & I2C_CKCFG_CLKC)) { + /* the CLKC in fast mode minmum value is 1 */ + clkc |= 0x0001U; + } + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; + I2C_CKCFG(i2c_periph) |= clkc; + } else { + } +} + +/*! + \brief configure I2C address + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] mode: + only one parameter can be selected which is shown as below: + \arg I2C_I2CMODE_ENABLE: I2C mode + \arg I2C_SMBUSMODE_ENABLE: SMBus mode + \param[in] addformat: 7bits or 10bits + only one parameter can be selected which is shown as below: + \arg I2C_ADDFORMAT_7BITS: address format is 7 bits + \arg I2C_ADDFORMAT_10BITS: address format is 10 bits + \param[in] addr: I2C address + \param[out] none + \retval none +*/ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr) +{ + /* SMBus/I2C mode selected */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SMBEN); + ctl |= mode; + I2C_CTL0(i2c_periph) = ctl; + /* configure address */ + addr = addr & I2C_ADDRESS_MASK; + I2C_SADDR0(i2c_periph) = (addformat | addr); +} + +/*! + \brief select SMBus type + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] type: + only one parameter can be selected which is shown as below: + \arg I2C_SMBUS_DEVICE: SMBus mode device type + \arg I2C_SMBUS_HOST: SMBus mode host type + \param[out] none + \retval none +*/ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type) +{ + if(I2C_SMBUS_HOST == type) { + I2C_CTL0(i2c_periph) |= I2C_CTL0_SMBSEL; + } else { + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_SMBSEL); + } +} + +/*! + \brief whether or not to send an ACK + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] ack: + only one parameter can be selected which is shown as below: + \arg I2C_ACK_ENABLE: ACK will be sent + \arg I2C_ACK_DISABLE: ACK will not be sent + \param[out] none + \retval none +*/ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack) +{ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_ACKEN); + ctl |= ack; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief configure I2C POAP position + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] pos: + only one parameter can be selected which is shown as below: + \arg I2C_ACKPOS_CURRENT: ACKEN bit decides whether or not to send ACK or not for the current byte + \arg I2C_ACKPOS_NEXT: ACKEN bit decides whether or not to send ACK for the next byte + \param[out] none + \retval none +*/ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos) +{ + uint32_t ctl = 0U; + /* configure I2C POAP position */ + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_POAP); + ctl |= pos; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief master sends slave address + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] addr: slave address + \param[in] trandirection: transmitter or receiver + only one parameter can be selected which is shown as below: + \arg I2C_TRANSMITTER: transmitter + \arg I2C_RECEIVER: receiver + \param[out] none + \retval none +*/ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection) +{ + /* master is a transmitter or a receiver */ + if(I2C_TRANSMITTER == trandirection) { + addr = addr & I2C_TRANSMITTER; + } else { + addr = addr | I2C_RECEIVER; + } + /* send slave address */ + I2C_DATA(i2c_periph) = addr; +} + +/*! + \brief enable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] addr: the second address in dual-address mode + \param[out] none + \retval none +*/ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr) +{ + /* configure address */ + addr = addr & I2C_ADDRESS2_MASK; + I2C_SADDR1(i2c_periph) = (I2C_SADDR1_DUADEN | addr); +} + +/*! + \brief disable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_dualaddr_disable(uint32_t i2c_periph) +{ + I2C_SADDR1(i2c_periph) &= ~(I2C_SADDR1_DUADEN); +} + +/*! + \brief enable I2C + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_enable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_I2CEN; +} + +/*! + \brief disable I2C + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_disable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_I2CEN); +} + +/*! + \brief generate a START condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_start_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_START; +} + +/*! + \brief generate a STOP condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_stop_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_STOP; +} + +/*! + \brief I2C transmit data function + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data) +{ + I2C_DATA(i2c_periph) = DATA_TRANS(data); +} + +/*! + \brief I2C receive data function + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval data of received +*/ +uint8_t i2c_data_receive(uint32_t i2c_periph) +{ + return (uint8_t)DATA_RECV(I2C_DATA(i2c_periph)); +} + +/*! + \brief configure I2C DMA mode + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] dmastate: + only one parameter can be selected which is shown as below: + \arg I2C_DMA_ON: enable DMA mode + \arg I2C_DMA_OFF: disable DMA mode + \param[out] none + \retval none +*/ +void i2c_dma_config(uint32_t i2c_periph, uint32_t dmastate) +{ + /* configure I2C DMA function */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMAON); + ctl |= dmastate; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief configure whether next DMA EOT is DMA last transfer or not + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] dmalast: + only one parameter can be selected which is shown as below: + \arg I2C_DMALST_ON: next DMA EOT is the last transfer + \arg I2C_DMALST_OFF: next DMA EOT is not the last transfer + \param[out] none + \retval none +*/ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast) +{ + /* configure DMA last transfer */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMALST); + ctl |= dmalast; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief configure RBNE clear condition + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] rbnecondition: + only one parameter can be selected which is shown as below: + \arg I2C_CFGRBNE_ON: RBNE can be cleared when RDATA is read + \arg I2C_CFGRBNE_OFF: RBNE can be cleared when RDATA is read and BTC is cleared + \param[out] none + \retval none +*/ +void i2c_rbne_clear_config(uint32_t i2c_periph, uint32_t rbnecondition) +{ + /* configure rbne clear condition */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_CFGRBNE); + ctl |= rbnecondition; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief whether to stretch SCL low when data is not ready in slave mode + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] stretchpara: + only one parameter can be selected which is shown as below: + \arg I2C_SCLSTRETCH_ENABLE: enable SCL stretching + \arg I2C_SCLSTRETCH_DISABLE: disable SCL stretching + \param[out] none + \retval none +*/ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara) +{ + /* configure I2C SCL strerching */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SS); + ctl |= stretchpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief whether or not to response to a general call + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] gcallpara: + only one parameter can be selected which is shown as below: + \arg I2C_GCEN_ENABLE: slave will response to a general call + \arg I2C_GCEN_DISABLE: slave will not response to a general call + \param[out] none + \retval none +*/ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara) +{ + /* configure slave response to a general call enable or disable */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_GCEN); + ctl |= gcallpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief configure software reset of I2C + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] sreset: + only one parameter can be selected which is shown as below: + \arg I2C_SRESET_SET: I2C is under reset + \arg I2C_SRESET_RESET: I2C is not under reset + \param[out] none + \retval none +*/ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset) +{ + /* modify CTL0 and configure software reset I2C state */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SRESET); + ctl |= sreset; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief configure I2C PEC calculation + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] pecstate: + only one parameter can be selected which is shown as below: + \arg I2C_PEC_ENABLE: PEC calculation on + \arg I2C_PEC_DISABLE: PEC calculation off + \param[out] none + \retval none +*/ +void i2c_pec_config(uint32_t i2c_periph, uint32_t pecstate) +{ + /* on/off PEC calculation */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECEN); + ctl |= pecstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief configure whether to transfer PEC value + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] pecpara: + only one parameter can be selected which is shown as below: + \arg I2C_PECTRANS_ENABLE: transfer PEC value + \arg I2C_PECTRANS_DISABLE: not transfer PEC value + \param[out] none + \retval none +*/ +void i2c_pec_transfer_config(uint32_t i2c_periph, uint32_t pecpara) +{ + /* whether to transfer PEC */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECTRANS); + ctl |= pecpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief get packet error checking value + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval PEC value +*/ +uint8_t i2c_pec_value_get(uint32_t i2c_periph) +{ + return (uint8_t)((I2C_STAT1(i2c_periph) & I2C_STAT1_PECV) >> STAT1_PECV_OFFSET); +} + +/*! + \brief configure I2C alert through SMBA pin + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] smbuspara: + only one parameter can be selected which is shown as below: + \arg I2C_SALTSEND_ENABLE: issue alert through SMBA pin + \arg I2C_SALTSEND_DISABLE: not issue alert through SMBA pin + \param[out] none + \retval none +*/ +void i2c_smbus_alert_config(uint32_t i2c_periph, uint32_t smbuspara) +{ + /* configure smubus alert through SMBA pin */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SALT); + ctl |= smbuspara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief configure I2C ARP protocol in SMBus + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] arpstate: + only one parameter can be selected which is shown as below: + \arg I2C_ARP_ENABLE: enable ARP + \arg I2C_ARP_DISABLE: disable ARP + \param[out] none + \retval none +*/ +void i2c_smbus_arp_config(uint32_t i2c_periph, uint32_t arpstate) +{ + /* enable or disable I2C ARP protocol*/ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_ARPEN); + ctl |= arpstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief disable analog noise filter + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_analog_noise_filter_disable(uint32_t i2c_periph) +{ + I2C_FCTL(i2c_periph) |= I2C_FCTL_AFD; +} + +/*! + \brief enable analog noise filter + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_analog_noise_filter_enable(uint32_t i2c_periph) +{ + I2C_FCTL(i2c_periph) &= ~(I2C_FCTL_AFD); +} + +/*! + \brief configure digital noise filter + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] dfilterpara: refer to i2c_digital_filter_enum + only one parameter can be selected which is shown as below: + \arg I2C_DF_DISABLE: disable digital noise filter + \arg I2C_DF_1PCLK: enable digital noise filter and the maximum filtered spiker's length 1 PCLK1 + \arg I2C_DF_2PCLK: enable digital noise filter and the maximum filtered spiker's length 2 PCLK1 + \arg I2C_DF_3PCLK: enable digital noise filter and the maximum filtered spiker's length 3 PCLK1 + \arg I2C_DF_4PCLK: enable digital noise filter and the maximum filtered spiker's length 4 PCLK1 + \arg I2C_DF_5PCLK: enable digital noise filter and the maximum filtered spiker's length 5 PCLK1 + \arg I2C_DF_6PCLK: enable digital noise filter and the maximum filtered spiker's length 6 PCLK1 + \arg I2C_DF_7PCLK: enable digital noise filter and the maximum filtered spiker's length 7 PCLK1 + \arg I2C_DF_8PCLK: enable digital noise filter and the maximum filtered spiker's length 8 PCLK1 + \arg I2C_DF_9PCLK: enable digital noise filter and the maximum filtered spiker's length 9 PCLK1 + \arg I2C_DF_10PCLK: enable digital noise filter and the maximum filtered spiker's length 10 PCLK1 + \arg I2C_DF_11CLK: enable digital noise filter and the maximum filtered spiker's length 11 PCLK1 + \arg I2C_DF_12CLK: enable digital noise filter and the maximum filtered spiker's length 12 PCLK1 + \arg I2C_DF_13PCLK: enable digital noise filter and the maximum filtered spiker's length 13 PCLK1 + \arg I2C_DF_14PCLK: enable digital noise filter and the maximum filtered spiker's length 14 PCLK1 + \arg I2C_DF_15PCLK: enable digital noise filter and the maximum filtered spiker's length 15 PCLK1 + \param[out] none + \retval none +*/ +void i2c_digital_noise_filter_config(uint32_t i2c_periph, i2c_digital_filter_enum dfilterpara) +{ + I2C_FCTL(i2c_periph) |= dfilterpara; +} + +/*! + \brief enable SAM_V interface + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_sam_enable(uint32_t i2c_periph) +{ + I2C_SAMCS(i2c_periph) |= I2C_SAMCS_SAMEN; +} + +/*! + \brief disable SAM_V interface + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_sam_disable(uint32_t i2c_periph) +{ + I2C_SAMCS(i2c_periph) &= ~(I2C_SAMCS_SAMEN); +} + +/*! + \brief enable SAM_V interface timeout detect + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_sam_timeout_enable(uint32_t i2c_periph) +{ + I2C_SAMCS(i2c_periph) |= I2C_SAMCS_STOEN; +} + +/*! + \brief disable SAM_V interface timeout detect + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[out] none + \retval none +*/ +void i2c_sam_timeout_disable(uint32_t i2c_periph) +{ + I2C_SAMCS(i2c_periph) &= ~(I2C_SAMCS_STOEN); +} + +/*! + \brief get I2C flag status + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SBSEND: start condition sent out in master mode + \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode + \arg I2C_FLAG_BTC: byte transmission finishes + \arg I2C_FLAG_ADD10SEND: header of 10-bit address is sent in master mode + \arg I2C_FLAG_STPDET: stop condition detected in slave mode + \arg I2C_FLAG_RBNE: I2C_DATA is not empty during receiving + \arg I2C_FLAG_TBE: I2C_DATA is empty during transmitting + \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_SMBALT: SMBus alert status + \arg I2C_FLAG_MASTER: a flag indicating whether I2C block is in master or slave mode + \arg I2C_FLAG_I2CBSY: busy flag + \arg I2C_FLAG_TR: whether the I2C is a transmitter or a receiver + \arg I2C_FLAG_RXGC: general call address (00h) received + \arg I2C_FLAG_DEFSMB: default address of SMBus device + \arg I2C_FLAG_HSTSMB: SMBus host header detected in slave mode + \arg I2C_FLAG_DUMOD: dual flag in slave mode indicating which address is matched in dual-address mode + \arg I2C_FLAG_TFF: txframe fall flag + \arg I2C_FLAG_TFR: txframe rise flag + \arg I2C_FLAG_RFF: rxframe fall flag + \arg I2C_FLAG_RFR: rxframe rise flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag) +{ + if(RESET != (I2C_REG_VAL(i2c_periph, flag) & BIT(I2C_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C flag status + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SMBALT: SMBus alert status + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus + \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode + \arg I2C_FLAG_TFF: txframe fall flag + \arg I2C_FLAG_TFR: txframe rise flag + \arg I2C_FLAG_RFF: rxframe fall flag + \arg I2C_FLAG_RFR: rxframe rise flag + \param[out] none + \retval none +*/ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag) +{ + if(I2C_FLAG_ADDSEND == flag) { + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + I2C_STAT0(i2c_periph); + I2C_STAT1(i2c_periph); + } else { + I2C_REG_VAL(i2c_periph, flag) &= ~BIT(I2C_BIT_POS(flag)); + } +} + +/*! + \brief enable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt + \arg I2C_INT_EV: event interrupt + \arg I2C_INT_BUF: buffer interrupt + \arg I2C_INT_TFF: txframe fall interrupt + \arg I2C_INT_TFR: txframe rise interrupt + \arg I2C_INT_RFF: rxframe fall interrupt + \arg I2C_INT_RFR: rxframe rise interrupt + \param[out] none + \retval none +*/ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) |= BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief disable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt + \arg I2C_INT_EV: event interrupt + \arg I2C_INT_BUF: buffer interrupt + \arg I2C_INT_TFF: txframe fall interrupt + \arg I2C_INT_TFR: txframe rise interrupt + \arg I2C_INT_RFF: rxframe fall interrupt + \arg I2C_INT_RFR: rxframe rise interrupt + \param[out] none + \retval none +*/ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) &= ~BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief get I2C interrupt flag status + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_SBSEND: start condition sent out in master mode interrupt flag + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BTC: byte transmission finishes interrupt flag + \arg I2C_INT_FLAG_ADD10SEND: header of 10-bit address is sent in master mode interrupt flag + \arg I2C_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag + \arg I2C_INT_FLAG_RBNE: I2C_DATA is not Empty during receiving interrupt flag + \arg I2C_INT_FLAG_TBE: I2C_DATA is empty during transmitting interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus alert status interrupt flag + \arg I2C_INT_FLAG_TFF: txframe fall interrupt flag + \arg I2C_INT_FLAG_TFR: txframe rise interrupt flag + \arg I2C_INT_FLAG_RFF: rxframe fall interrupt flag + \arg I2C_INT_FLAG_RFR: rxframe rise interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U, bufie; + + /* check BUFIE */ + bufie = I2C_CTL1(i2c_periph)&I2C_CTL1_BUFIE; + + /* get the interrupt enable bit status */ + intenable = (I2C_REG_VAL(i2c_periph, int_flag) & BIT(I2C_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (I2C_REG_VAL2(i2c_periph, int_flag) & BIT(I2C_BIT_POS2(int_flag))); + + if((I2C_INT_FLAG_RBNE == int_flag) || (I2C_INT_FLAG_TBE == int_flag)) { + if(intenable && bufie) { + intenable = 1U; + } else { + intenable = 0U; + } + } + if((0U != flagstatus) && (0U != intenable)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C interrupt flag status + \param[in] i2c_periph: I2Cx(x=0,1,2) + \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus alert status interrupt flag + \arg I2C_INT_FLAG_TFF: txframe fall interrupt flag + \arg I2C_INT_FLAG_TFR: txframe rise interrupt flag + \arg I2C_INT_FLAG_RFF: rxframe fall interrupt flag + \arg I2C_INT_FLAG_RFR: rxframe rise interrupt flag + \param[out] none + \retval none +*/ +void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) +{ + if(I2C_INT_FLAG_ADDSEND == int_flag) { + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + I2C_STAT0(i2c_periph); + I2C_STAT1(i2c_periph); + } else { + I2C_REG_VAL2(i2c_periph, int_flag) &= ~BIT(I2C_BIT_POS2(int_flag)); + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c new file mode 100644 index 00000000000..504c4360591 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c @@ -0,0 +1,978 @@ +/*! + \file gd32f5xx_i2c.c + \brief I2C driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_i2c_add.h" + +/* I2C register bit mask */ +#define I2C_ADD_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ +#define I2C_ADD_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ + +/* I2C register bit offset */ +#define CTL0_DNF_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of DNF in I2C_ADD_CTL0 */ +#define CTL1_BYTENUM_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of BYTENUM in I2C_ADD_CTL1 */ +#define STAT_READDR_OFFSET ((uint32_t)0x00000011U) /*!< bit offset of READDR in I2C_ADD_STAT */ +#define TIMING_SCLL_OFFSET ((uint32_t)0x00000000U) /*!< bit offset of SCLL in I2C_ADD_TIMING */ +#define TIMING_SCLH_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of SCLH in I2C_ADD_TIMING */ +#define TIMING_SDADELY_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of SDADELY in I2C_ADD_TIMING */ +#define TIMING_SCLDELY_OFFSET ((uint32_t)0x00000014U) /*!< bit offset of SCLDELY in I2C_ADD_TIMING */ +#define TIMING_PSC_OFFSET ((uint32_t)0x0000001CU) /*!< bit offset of PSC in I2C_ADD_TIMING */ +#define SADDR1_ADDMSK_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of ADDMSK in I2C_ADD_SADDR1 */ +#define TIMEOUT_BUSTOB_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of BUSTOB in I2C_ADD_TIMEOUT */ + +/*! + \brief reset I2C + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_deinit(uint32_t i2c_add_periph) +{ + switch(i2c_add_periph) { + /* reset I2C3 */ + case I2C3: + rcu_periph_reset_enable(RCU_I2C3RST); + rcu_periph_reset_disable(RCU_I2C3RST); + break; + /* reset I2C4 */ + case I2C4: + rcu_periph_reset_enable(RCU_I2C4RST); + rcu_periph_reset_disable(RCU_I2C4RST); + break; + /* reset I2C5 */ + case I2C5: + rcu_periph_reset_enable(RCU_I2C5RST); + rcu_periph_reset_disable(RCU_I2C5RST); + break; + default: + break; + } +} + +/*! + \brief configure the timing parameters + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] psc: 0-0x0000000F, timing prescaler + \param[in] scl_dely: 0-0x0000000F, data setup time + \param[in] sda_dely: 0-0x0000000F, data hold time + \param[out] none + \retval none +*/ +void i2c_add_timing_config(uint32_t i2c_add_periph, uint32_t psc, uint32_t scl_dely, uint32_t sda_dely) +{ + /* clear PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ + I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_PSC; + I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLDELY; + I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SDADELY; + /* mask PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ + psc = (uint32_t)(psc << TIMING_PSC_OFFSET) & I2C_ADD_TIMING_PSC; + scl_dely = (uint32_t)(scl_dely << TIMING_SCLDELY_OFFSET) & I2C_ADD_TIMING_SCLDELY; + sda_dely = (uint32_t)(sda_dely << TIMING_SDADELY_OFFSET) & I2C_ADD_TIMING_SDADELY; + /* write PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ + I2C_ADD_TIMING(i2c_add_periph) |= (psc | scl_dely | sda_dely); +} + +/*! + \brief configure digital noise filter + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] filter_length: the length of filter spikes + only one parameter can be selected which is shown as below: + \arg FILTER_DISABLE: digital filter is disabled + \arg FILTER_LENGTH_1: digital filter is enabled and filter spikes with a length of up to 1 tI2CCLK + \arg FILTER_LENGTH_2: digital filter is enabled and filter spikes with a length of up to 2 tI2CCLK + \arg FILTER_LENGTH_3: digital filter is enabled and filter spikes with a length of up to 3 tI2CCLK + \arg FILTER_LENGTH_4: digital filter is enabled and filter spikes with a length of up to 4 tI2CCLK + \arg FILTER_LENGTH_5: digital filter is enabled and filter spikes with a length of up to 5 tI2CCLK + \arg FILTER_LENGTH_6: digital filter is enabled and filter spikes with a length of up to 6 tI2CCLK + \arg FILTER_LENGTH_7: digital filter is enabled and filter spikes with a length of up to 7 tI2CCLK + \arg FILTER_LENGTH_8: digital filter is enabled and filter spikes with a length of up to 8 tI2CCLK + \arg FILTER_LENGTH_9: digital filter is enabled and filter spikes with a length of up to 9 tI2CCLK + \arg FILTER_LENGTH_10: digital filter is enabled and filter spikes with a length of up to 10 tI2CCLK + \arg FILTER_LENGTH_11: digital filter is enabled and filter spikes with a length of up to 11 tI2CCLK + \arg FILTER_LENGTH_12: digital filter is enabled and filter spikes with a length of up to 12 tI2CCLK + \arg FILTER_LENGTH_13: digital filter is enabled and filter spikes with a length of up to 13 tI2CCLK + \arg FILTER_LENGTH_14: digital filter is enabled and filter spikes with a length of up to 14 tI2CCLK + \arg FILTER_LENGTH_15: digital filter is enabled and filter spikes with a length of up to 15 tI2CCLK + \param[out] none + \retval none +*/ +void i2c_add_digital_noise_filter_config(uint32_t i2c_add_periph, uint32_t filter_length) +{ + I2C_ADD_CTL0(i2c_add_periph) &= (uint32_t)(~I2C_ADD_CTL0_DNF); + I2C_ADD_CTL0(i2c_add_periph) |= (uint32_t)(filter_length << CTL0_DNF_OFFSET); +} + +/*! + \brief enable analog noise filter + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_analog_noise_filter_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_ANOFF; +} + +/*! + \brief disable analog noise filter + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_analog_noise_filter_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_ANOFF; +} + +/*! + \brief configure the SCL high and low period of clock in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] sclh: 0-0x000000FF, SCL high period + \param[in] scll: 0-0x000000FF, SCL low period + \param[out] none + \retval none +*/ +void i2c_add_master_clock_config(uint32_t i2c_add_periph, uint32_t sclh, uint32_t scll) +{ + /* clear SCLH, SCLL bits in I2C_ADD_TIMING register */ + I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLH; + I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLL; + /* mask SCLH, SCLL bits in I2C_ADD_TIMING register */ + sclh = (uint32_t)(sclh << TIMING_SCLH_OFFSET) & I2C_ADD_TIMING_SCLH; + scll = (uint32_t)(scll << TIMING_SCLL_OFFSET) & I2C_ADD_TIMING_SCLL; + /* write SCLH, SCLL bits in I2C_ADD_TIMING register */ + I2C_ADD_TIMING(i2c_add_periph) |= (sclh | scll); +} + +/*! + \brief configure i2c slave address and transfer direction in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] address: 0-0x3FF except reserved address, I2C slave address to be sent + \param[in] trans_direction: I2C transfer direction in master mode + only one parameter can be selected which is shown as below: + \arg I2C_ADD_MASTER_TRANSMIT: master transmit + \arg I2C_ADD_MASTER_RECEIVE: master receive + \param[out] none + \retval none +*/ +void i2c_add_master_addressing(uint32_t i2c_add_periph, uint32_t address, uint32_t trans_direction) +{ + /* configure slave address */ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_SADDRESS; + I2C_ADD_CTL1(i2c_add_periph) |= address; + /* configure transfer direction */ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_TRDIR; + I2C_ADD_CTL1(i2c_add_periph) |= trans_direction; +} + +/*! + \brief 10-bit address header executes read direction only in master receive mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_address10_header_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_HEAD10R; +} + +/*! + \brief 10-bit address header executes complete sequence in master receive mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_address10_header_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_HEAD10R; +} + +/*! + \brief enable 10-bit addressing mode in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_address10_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_ADD10EN; +} + +/*! + \brief disable 10-bit addressing mode in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_address10_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_ADD10EN; +} + +/*! + \brief enable I2C automatic end mode in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_automatic_end_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_AUTOEND; +} + +/*! + \brief disable I2C automatic end mode in master mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_automatic_end_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_AUTOEND; +} + +/*! + \brief enable the response to a general call + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_slave_response_to_gcall_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_GCEN; +} + +/*! + \brief disable the response to a general call + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_slave_response_to_gcall_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_GCEN; +} + +/*! + \brief enable to stretch SCL low when data is not ready in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_stretch_scl_low_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SS; +} + +/*! + \brief disable to stretch SCL low when data is not ready in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_stretch_scl_low_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SS; +} + +/*! + \brief configure i2c slave address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] address: I2C address + \param[in] addr_format: 7bits or 10bits + only one parameter can be selected which is shown as below: + \arg I2C_ADD_ADDFORMAT_7BITS: 7bits + \arg I2C_ADD_ADDFORMAT_10BITS: 10bits + \param[out] none + \retval none +*/ +void i2c_add_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_format) +{ + /* configure ADDRESS[7:1] and address format */ + address = address & I2C_ADD_ADDRESS_MASK; + I2C_ADD_SADDR0(i2c_add_periph) = (addr_format | address); + /* enable i2c address in slave mode */ + I2C_ADD_SADDR0(i2c_add_periph) |= I2C_ADD_SADDR0_ADDRESSEN; +} + +/*! + \brief define which bits of ADDRESS[7:1] need to compare with the incoming address byte + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] compare_bits: the bits need to compare + one or more parameters can be selected which are shown as below: + \arg ADDRESS_BIT1_COMPARE: address bit1 needs compare + \arg ADDRESS_BIT2_COMPARE: address bit2 needs compare + \arg ADDRESS_BIT3_COMPARE: address bit3 needs compare + \arg ADDRESS_BIT4_COMPARE: address bit4 needs compare + \arg ADDRESS_BIT5_COMPARE: address bit5 needs compare + \arg ADDRESS_BIT6_COMPARE: address bit6 needs compare + \arg ADDRESS_BIT7_COMPARE: address bit7 needs compare + \param[out] none + \retval none +*/ +void i2c_add_address_bit_compare_config(uint32_t i2c_add_periph, uint32_t compare_bits) +{ + I2C_ADD_CTL2(i2c_add_periph) &= ~I2C_ADD_CTL2_ADDM; + I2C_ADD_CTL2(i2c_add_periph) |= compare_bits; +} + +/*! + \brief disable i2c address in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_address_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_SADDR0(i2c_add_periph) &= ~I2C_ADD_SADDR0_ADDRESSEN; +} + +/*! + \brief configure i2c second slave address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] address: I2C address + \param[in] addr_mask: the bits not need to compare + one or more parameters can be selected which are shown as below: + \arg ADDRESS2_NO_MASK: no mask, all the bits must be compared + \arg ADDRESS2_MASK_BIT1: ADDRESS2[1] is masked, only ADDRESS2[7:2] are compared + \arg ADDRESS2_MASK_BIT1_2: ADDRESS2[2:1] is masked, only ADDRESS2[7:3] are compared + \arg ADDRESS2_MASK_BIT1_3: ADDRESS2[3:1] is masked, only ADDRESS2[7:4] are compared + \arg ADDRESS2_MASK_BIT1_4: ADDRESS2[4:1] is masked, only ADDRESS2[7:5] are compared + \arg ADDRESS2_MASK_BIT1_5: ADDRESS2[5:1] is masked, only ADDRESS2[7:6] are compared + \arg ADDRESS2_MASK_BIT1_6: ADDRESS2[6:1] is masked, only ADDRESS2[7] are compared + \arg ADDRESS2_MASK_ALL: all the ADDRESS2[7:1] bits are masked + \param[out] none + \retval none +*/ +void i2c_add_second_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_mask) +{ + /* configure ADDRESS2[7:1] */ + address = address & I2C_ADD_ADDRESS2_MASK; + I2C_ADD_SADDR1(i2c_add_periph) |= address; + /* configure ADDRESS2[7:1] mask */ + I2C_ADD_SADDR1(i2c_add_periph) &= ~I2C_ADD_SADDR1_ADDMSK2; + I2C_ADD_SADDR1(i2c_add_periph) |= (uint32_t)(addr_mask << SADDR1_ADDMSK_OFFSET); + /* enable i2c second address in slave mode */ + I2C_ADD_SADDR1(i2c_add_periph) |= I2C_ADD_SADDR1_ADDRESS2EN; +} + +/*! + \brief disable i2c second address in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_second_address_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_SADDR1(i2c_add_periph) &= ~I2C_ADD_SADDR1_ADDRESS2EN; +} + +/*! + \brief get received match address in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval received match address +*/ +uint32_t i2c_add_recevied_address_get(uint32_t i2c_add_periph) +{ + return (uint32_t)((I2C_ADD_STAT(i2c_add_periph) & I2C_ADD_STAT_READDR) >> STAT_READDR_OFFSET); +} + +/*! + \brief enable slave byte control + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_slave_byte_control_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SBCTL; +} + +/*! + \brief disable slave byte control + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_slave_byte_control_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SBCTL; +} + +/*! + \brief generate a NACK in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_nack_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_NACKEN; +} + +/*! + \brief generate an ACK in slave mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_nack_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_NACKEN; +} + +/*! + \brief enable wakeup from deep-sleep mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_wakeup_from_deepsleep_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_WUEN; +} + +/*! + \brief disable wakeup from deep-sleep mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_wakeup_from_deepsleep_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_WUEN; +} + +/*! + \brief enable I2C + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_I2CEN; +} + +/*! + \brief disable I2C + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_I2CEN; +} + +/*! + \brief generate a START condition on I2C bus + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_start_on_bus(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_START; +} + +/*! + \brief generate a STOP condition on I2C bus + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_stop_on_bus(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_STOP; +} + +/*! + \brief I2C transmit data + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] data: data to be transmitted + \param[out] none + \retval none +*/ +void i2c_add_data_transmit(uint32_t i2c_add_periph, uint32_t data) +{ + I2C_ADD_TDATA(i2c_add_periph) = (I2C_ADD_TDATA_TDATA & data); +} + +/*! + \brief I2C receive data + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval received data +*/ +uint32_t i2c_add_data_receive(uint32_t i2c_add_periph) +{ + return (I2C_ADD_RDATA(i2c_add_periph) & I2C_ADD_RDATA_RDATA); +} + +/*! + \brief enable I2C reload mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_reload_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_RELOAD; +} + +/*! + \brief disable I2C reload mode + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_reload_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_RELOAD; +} + +/*! + \brief configure number of bytes to be transferred + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] byte_number: 0x0-0xFF, number of bytes to be transferred + \param[out] none + \retval none +*/ +void i2c_add_transfer_byte_number_config(uint32_t i2c_add_periph, uint32_t byte_number) +{ + I2C_ADD_CTL1(i2c_add_periph) &= (uint32_t)(~I2C_ADD_CTL1_BYTENUM); + I2C_ADD_CTL1(i2c_add_periph) |= (uint32_t)(byte_number << CTL1_BYTENUM_OFFSET); +} + +/*! + \brief enable I2C DMA for transmission or reception + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] dma: I2C DMA + only one parameter can be selected which is shown as below: + \arg I2C_ADD_DMA_TRANSMIT: transmit data using DMA + \arg I2C_ADD_DMA_RECEIVE: receive data using DMA + \param[out] none + \retval none +*/ +void i2c_add_dma_enable(uint32_t i2c_add_periph, uint8_t dma) +{ + if(I2C_ADD_DMA_TRANSMIT == dma) { + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_DENT; + } else { + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_DENR; + } +} + +/*! + \brief disable I2C DMA for transmission or reception + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] dma: I2C DMA + only one parameter can be selected which is shown as below: + \arg I2C_ADD_DMA_TRANSMIT: transmit data using DMA + \arg I2C_ADD_DMA_RECEIVE: receive data using DMA + \param[out] none + \retval none +*/ +void i2c_add_dma_disable(uint32_t i2c_add_periph, uint8_t dma) +{ + if(I2C_ADD_DMA_TRANSMIT == dma) { + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_DENT; + } else { + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_DENR; + } +} + +/*! + \brief I2C transfers PEC value + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_pec_transfer(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_PECTRANS; +} + +/*! + \brief enable I2C PEC calculation + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_pec_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_PECEN; +} + +/*! + \brief disable I2C PEC calculation + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_pec_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_PECEN; +} + +/*! + \brief get packet error checking value + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval PEC value +*/ +uint32_t i2c_add_pec_value_get(uint32_t i2c_add_periph) +{ + return (I2C_ADD_PEC(i2c_add_periph) & I2C_ADD_PEC_PECV); +} + +/*! + \brief enable SMBus alert + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_alert_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBALTEN; +} + +/*! + \brief disable SMBus alert + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_alert_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBALTEN; +} + +/*! + \brief enable SMBus device default address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_default_addr_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBDAEN; +} + +/*! + \brief disable SMBus device default address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_default_addr_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBDAEN; +} + +/*! + \brief enable SMBus Host address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_host_addr_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBHAEN; +} + +/*! + \brief disable SMBus Host address + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] none + \param[out] none + \retval none +*/ +void i2c_add_smbus_host_addr_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBHAEN; +} + +/*! + \brief enable extended clock timeout detection + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_extented_clock_timeout_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) |= I2C_ADD_TIMEOUT_EXTOEN; +} + +/*! + \brief disable extended clock timeout detection + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_extented_clock_timeout_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_EXTOEN; +} + +/*! + \brief enable clock timeout detection + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_clock_timeout_enable(uint32_t i2c_add_periph) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) |= I2C_ADD_TIMEOUT_TOEN; +} + +/*! + \brief disable clock timeout detection + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[out] none + \retval none +*/ +void i2c_add_clock_timeout_disable(uint32_t i2c_add_periph) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_TOEN; +} + +/*! + \brief configure bus timeout B + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] timeout: bus timeout B + \param[out] none + \retval none +*/ +void i2c_add_bus_timeout_b_config(uint32_t i2c_add_periph, uint32_t timeout) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_BUSTOB; + I2C_ADD_TIMEOUT(i2c_add_periph) |= (uint32_t)(timeout << TIMEOUT_BUSTOB_OFFSET); +} + +/*! + \brief configure bus timeout A + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] timeout: bus timeout A + \param[out] none + \retval none +*/ +void i2c_add_bus_timeout_a_config(uint32_t i2c_add_periph, uint32_t timeout) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_BUSTOA; + I2C_ADD_TIMEOUT(i2c_add_periph) |= timeout; +} + +/*! + \brief configure idle clock timeout detection + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] timeout: bus timeout A + \arg BUSTOA_DETECT_SCL_LOW: BUSTOA is used to detect SCL low timeout + \arg BUSTOA_DETECT_IDLE: BUSTOA is used to detect both SCL and SDA high timeout when the bus is idle + \param[out] none + \retval none +*/ +void i2c_add_idle_clock_timeout_config(uint32_t i2c_add_periph, uint32_t timeout) +{ + I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_TOIDLE; + I2C_ADD_TIMEOUT(i2c_add_periph) |= timeout; +} + +/*! + \brief get I2C flag status + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] flag: I2C flags + only one parameter can be selected which is shown as below: + \arg I2C_ADD_FLAG_TBE: I2C_ADD_TDATA is empty during transmitting + \arg I2C_ADD_FLAG_TI: transmit interrupt + \arg I2C_ADD_FLAG_RBNE: I2C_ADD_RDATA is not empty during receiving + \arg I2C_ADD_FLAG_ADDSEND: address received matches in slave mode + \arg I2C_ADD_FLAG_NACK: not acknowledge flag + \arg I2C_ADD_FLAG_STPDET: STOP condition detected in slave mode + \arg I2C_ADD_FLAG_TC: transfer complete in master mode + \arg I2C_ADD_FLAG_TCR: transfer complete reload + \arg I2C_ADD_FLAG_BERR: bus error + \arg I2C_ADD_FLAG_LOSTARB: arbitration Lost + \arg I2C_ADD_FLAG_OUERR: overrun/underrun error in slave mode + \arg I2C_ADD_FLAG_PECERR: PEC error + \arg I2C_ADD_FLAG_TIMEOUT: timeout flag + \arg I2C_ADD_FLAG_SMBALT: SMBus Alert + \arg I2C_ADD_FLAG_I2CBSY: busy flag + \arg I2C_ADD_FLAG_TR: whether the I2C is a transmitter or a receiver in slave mode + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_add_flag_get(uint32_t i2c_add_periph, uint32_t flag) +{ + if(RESET != (I2C_ADD_STAT(i2c_add_periph) & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C flag status + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] flag: I2C flags + one or more parameters can be selected which are shown as below: + \arg I2C_ADD_FLAG_ADDSEND: address received matches in slave mode + \arg I2C_ADD_FLAG_NACK: not acknowledge flag + \arg I2C_ADD_FLAG_STPDET: STOP condition detected in slave mode + \arg I2C_ADD_FLAG_BERR: bus error + \arg I2C_ADD_FLAG_LOSTARB: arbitration Lost + \arg I2C_ADD_FLAG_OUERR: overrun/underrun error in slave mode + \arg I2C_ADD_FLAG_PECERR: PEC error + \arg I2C_ADD_FLAG_TIMEOUT: timeout flag + \arg I2C_ADD_FLAG_SMBALT: SMBus Alert + \param[out] none + \retval none +*/ +void i2c_add_flag_clear(uint32_t i2c_add_periph, uint32_t flag) +{ + I2C_ADD_STATC(i2c_add_periph) |= flag; +} + +/*! + \brief enable I2C interrupt + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] interrupt: I2C interrupts + one or more parameters can be selected which are shown as below: + \arg I2C_ADD_INT_ERR: error interrupt + \arg I2C_ADD_INT_TC: transfer complete interrupt + \arg I2C_ADD_INT_STPDET: stop detection interrupt + \arg I2C_ADD_INT_NACK: not acknowledge received interrupt + \arg I2C_ADD_INT_ADDM: address match interrupt + \arg I2C_ADD_INT_RBNE: receive interrupt + \arg I2C_ADD_INT_TI: transmit interrupt + \param[out] none + \retval none +*/ +void i2c_add_interrupt_enable(uint32_t i2c_add_periph, uint32_t interrupt) +{ + I2C_ADD_CTL0(i2c_add_periph) |= interrupt; +} + +/*! + \brief disable I2C interrupt + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] interrupt: I2C interrupts + one or more parameters can be selected which are shown as below: + \arg I2C_ADD_INT_ERR: error interrupt + \arg I2C_ADD_INT_TC: transfer complete interrupt + \arg I2C_ADD_INT_STPDET: stop detection interrupt + \arg I2C_ADD_INT_NACK: not acknowledge received interrupt + \arg I2C_ADD_INT_ADDM: address match interrupt + \arg I2C_ADD_INT_RBNE: receive interrupt + \arg I2C_ADD_INT_TI: transmit interrupt + \param[out] none + \retval none +*/ +void i2c_add_interrupt_disable(uint32_t i2c_add_periph, uint32_t interrupt) +{ + I2C_ADD_CTL0(i2c_add_periph) &= ~interrupt; +} + +/*! + \brief get I2C interrupt flag status + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] int_flag: I2C interrupt flags, refer to i2c_add_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_ADD_INT_FLAG_TI: transmit interrupt flag + \arg I2C_ADD_INT_FLAG_RBNE: I2C_ADD_RDATA is not empty during receiving interrupt flag + \arg I2C_ADD_INT_FLAG_ADDSEND: address received matches in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_NACK: not acknowledge interrupt flag + \arg I2C_ADD_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_TC: transfer complete in master mode interrupt flag + \arg I2C_ADD_INT_FLAG_TCR: transfer complete reload interrupt flag + \arg I2C_ADD_INT_FLAG_BERR: bus error interrupt flag + \arg I2C_ADD_INT_FLAG_LOSTARB: arbitration lost interrupt flag + \arg I2C_ADD_INT_FLAG_OUERR: overrun/underrun error in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_PECERR: PEC error interrupt flag + \arg I2C_ADD_INT_FLAG_TIMEOUT: timeout interrupt flag + \arg I2C_ADD_INT_FLAG_SMBALT: SMBus Alert interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_add_interrupt_flag_get(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag) +{ + uint32_t ret1 = RESET; + uint32_t ret2 = RESET; + + /* get the status of interrupt enable bit */ + ret1 = (I2C_ADD_REG_VAL(i2c_add_periph, int_flag) & BIT(I2C_ADD_BIT_POS(int_flag))); + /* get the status of interrupt flag */ + ret2 = (I2C_ADD_REG_VAL2(i2c_add_periph, int_flag) & BIT(I2C_ADD_BIT_POS2(int_flag))); + if(ret1 && ret2) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C interrupt flag status + \param[in] i2c_add_periph: I2Cx(x=3,4,5) + \param[in] int_flag: I2C interrupt flags, refer to i2c_add_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_ADD_INT_FLAG_ADDSEND: address received matches in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_NACK: not acknowledge interrupt flag + \arg I2C_ADD_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_BERR: bus error interrupt flag + \arg I2C_ADD_INT_FLAG_LOSTARB: arbitration lost interrupt flag + \arg I2C_ADD_INT_FLAG_OUERR: overrun/underrun error in slave mode interrupt flag + \arg I2C_ADD_INT_FLAG_PECERR: PEC error interrupt flag + \arg I2C_ADD_INT_FLAG_TIMEOUT: timeout interrupt flag + \arg I2C_ADD_INT_FLAG_SMBALT: SMBus Alert interrupt flag + \param[out] none + \retval none +*/ +void i2c_add_interrupt_flag_clear(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag) +{ + I2C_ADD_STATC(i2c_add_periph) |= BIT(I2C_ADD_BIT_POS2(int_flag)); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c new file mode 100644 index 00000000000..96de074d9fe --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c @@ -0,0 +1,636 @@ +/*! + \file gd32f5xx_ipa.c + \brief IPA driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_ipa.h" + +#define IPA_DEFAULT_VALUE 0x00000000U + +/*! + \brief deinitialize IPA registers + \param[in] none + \param[out] none + \retval none +*/ +void ipa_deinit(void) +{ + rcu_periph_reset_enable(RCU_IPARST); + rcu_periph_reset_disable(RCU_IPARST); +} + +/*! + \brief enable IPA transfer + \param[in] none + \param[out] none + \retval none +*/ +void ipa_transfer_enable(void) +{ + IPA_CTL |= IPA_CTL_TEN; +} + +/*! + \brief enable IPA transfer hang up + \param[in] none + \param[out] none + \retval none +*/ +void ipa_transfer_hangup_enable(void) +{ + IPA_CTL |= IPA_CTL_THU; +} + +/*! + \brief disable IPA transfer hang up + \param[in] none + \param[out] none + \retval none +*/ +void ipa_transfer_hangup_disable(void) +{ + IPA_CTL &= ~(IPA_CTL_THU); +} + +/*! + \brief enable IPA transfer stop + \param[in] none + \param[out] none + \retval none +*/ +void ipa_transfer_stop_enable(void) +{ + IPA_CTL |= IPA_CTL_TST; +} + +/*! + \brief disable IPA transfer stop + \param[in] none + \param[out] none + \retval none +*/ +void ipa_transfer_stop_disable(void) +{ + IPA_CTL &= ~(IPA_CTL_TST); +} +/*! + \brief enable IPA foreground LUT loading + \param[in] none + \param[out] none + \retval none +*/ +void ipa_foreground_lut_loading_enable(void) +{ + IPA_FPCTL |= IPA_FPCTL_FLLEN; +} + +/*! + \brief enable IPA background LUT loading + \param[in] none + \param[out] none + \retval none +*/ +void ipa_background_lut_loading_enable(void) +{ + IPA_BPCTL |= IPA_BPCTL_BLLEN; +} + +/*! + \brief set pixel format convert mode, the function is invalid when the IPA transfer is enabled + \param[in] pfcm: pixel format convert mode + only one parameter can be selected which is shown as below: + \arg IPA_FGTODE: foreground memory to destination memory without pixel format convert + \arg IPA_FGTODE_PF_CONVERT: foreground memory to destination memory with pixel format convert + \arg IPA_FGBGTODE: blending foreground and background memory to destination memory + \arg IPA_FILL_UP_DE: fill up destination memory with specific color + \param[out] none + \retval none +*/ +void ipa_pixel_format_convert_mode_set(uint32_t pfcm) +{ + IPA_CTL &= ~(IPA_CTL_PFCM); + IPA_CTL |= pfcm; +} + +/*! + \brief initialize the structure of IPA foreground parameter struct with the default values, it is + suggested that call this function after an ipa_foreground_parameter_struct structure is defined + \param[in] none + \param[out] foreground_struct: the data needed to initialize foreground + foreground_memaddr: foreground memory base address + foreground_lineoff: foreground line offset + foreground_prealpha: foreground pre-defined alpha value + foreground_alpha_algorithm: IPA_FG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 + foreground_pf: foreground pixel format(FOREGROUND_PPF_ARGB8888,FOREGROUND_PPF_RGB888,FOREGROUND_PPF_RGB565, + FOREGROUND_PPF_ARG1555,FOREGROUND_PPF_ARGB4444,FOREGROUND_PPF_L8,FOREGROUND_PPF_AL44, + FOREGROUND_PPF_AL88,FOREGROUND_PPF_L4,FOREGROUND_PPF_A8,FOREGROUND_PPF_A4) + foreground_prered: foreground pre-defined red value + foreground_pregreen: foreground pre-defined green value + foreground_preblue: foreground pre-defined blue value + \retval none +*/ +void ipa_foreground_struct_para_init(ipa_foreground_parameter_struct *foreground_struct) +{ + /* initialize the struct parameters with default values */ + foreground_struct->foreground_memaddr = IPA_DEFAULT_VALUE; + foreground_struct->foreground_lineoff = IPA_DEFAULT_VALUE; + foreground_struct->foreground_prealpha = IPA_DEFAULT_VALUE; + foreground_struct->foreground_alpha_algorithm = IPA_FG_ALPHA_MODE_0; + foreground_struct->foreground_pf = FOREGROUND_PPF_ARGB8888; + foreground_struct->foreground_prered = IPA_DEFAULT_VALUE; + foreground_struct->foreground_pregreen = IPA_DEFAULT_VALUE; + foreground_struct->foreground_preblue = IPA_DEFAULT_VALUE; +} + +/*! + \brief initialize foreground parameters + \param[in] foreground_struct: the data needed to initialize foreground + foreground_memaddr: foreground memory base address + foreground_lineoff: foreground line offset + foreground_prealpha: foreground pre-defined alpha value + foreground_alpha_algorithm: IPA_FG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 + foreground_pf: foreground pixel format(FOREGROUND_PPF_ARGB8888,FOREGROUND_PPF_RGB888,FOREGROUND_PPF_RGB565, + FOREGROUND_PPF_ARG1555,FOREGROUND_PPF_ARGB4444,FOREGROUND_PPF_L8,FOREGROUND_PPF_AL44, + FOREGROUND_PPF_AL88,FOREGROUND_PPF_L4,FOREGROUND_PPF_A8,FOREGROUND_PPF_A4) + foreground_prered: foreground pre-defined red value + foreground_pregreen: foreground pre-defined green value + foreground_preblue: foreground pre-defined blue value + \param[out] none + \retval none +*/ +void ipa_foreground_init(ipa_foreground_parameter_struct *foreground_struct) +{ + FlagStatus tempflag = RESET; + if(RESET != (IPA_CTL & IPA_CTL_TEN)) { + tempflag = SET; + /* reset the TEN in order to configure the following bits */ + IPA_CTL &= ~IPA_CTL_TEN; + } + + /* foreground memory base address configuration */ + IPA_FMADDR &= ~(IPA_FMADDR_FMADDR); + IPA_FMADDR = foreground_struct->foreground_memaddr; + /* foreground line offset configuration */ + IPA_FLOFF &= ~(IPA_FLOFF_FLOFF); + IPA_FLOFF = foreground_struct->foreground_lineoff; + /* foreground pixel format pre-defined alpha, alpha calculation algorithm configuration */ + IPA_FPCTL &= ~(IPA_FPCTL_FPDAV | IPA_FPCTL_FAVCA | IPA_FPCTL_FPF); + IPA_FPCTL |= (foreground_struct->foreground_prealpha << 24U); + IPA_FPCTL |= foreground_struct->foreground_alpha_algorithm; + IPA_FPCTL |= foreground_struct->foreground_pf; + /* foreground pre-defined red green blue configuration */ + IPA_FPV &= ~(IPA_FPV_FPDRV | IPA_FPV_FPDGV | IPA_FPV_FPDBV); + IPA_FPV |= ((foreground_struct->foreground_prered << 16U) | (foreground_struct->foreground_pregreen << 8U) + | (foreground_struct->foreground_preblue)); + + if(SET == tempflag) { + /* restore the state of TEN */ + IPA_CTL |= IPA_CTL_TEN; + } +} + +/*! + \brief initialize the structure of IPA background parameter struct with the default values, it is + suggested that call this function after an ipa_background_parameter_struct structure is defined + \param[in] none + \param[out] background_struct: the data needed to initialize background + background_memaddr: background memory base address + background_lineoff: background line offset + background_prealpha: background pre-defined alpha value + background_alpha_algorithm: IPA_BG_ALPHA_MODE_0,IPA_BG_ALPHA_MODE_1,IPA_BG_ALPHA_MODE_2 + background_pf: background pixel format(BACKGROUND_PPF_ARGB8888,BACKGROUND_PPF_RGB888,BACKGROUND_PPF_RGB565, + BACKGROUND_PPF_ARG1555,BACKGROUND_PPF_ARGB4444,BACKGROUND_PPF_L8,BACKGROUND_PPF_AL44, + BACKGROUND_PPF_AL88,BACKGROUND_PPF_L4,BACKGROUND_PPF_A8,BACKGROUND_PPF_A4) + background_prered: background pre-defined red value + background_pregreen: background pre-defined green value + background_preblue: background pre-defined blue value + \retval none +*/ +void ipa_background_struct_para_init(ipa_background_parameter_struct *background_struct) +{ + /* initialize the struct parameters with default values */ + background_struct->background_memaddr = IPA_DEFAULT_VALUE; + background_struct->background_lineoff = IPA_DEFAULT_VALUE; + background_struct->background_prealpha = IPA_DEFAULT_VALUE; + background_struct->background_alpha_algorithm = IPA_BG_ALPHA_MODE_0; + background_struct->background_pf = BACKGROUND_PPF_ARGB8888; + background_struct->background_prered = IPA_DEFAULT_VALUE; + background_struct->background_pregreen = IPA_DEFAULT_VALUE; + background_struct->background_preblue = IPA_DEFAULT_VALUE; +} + +/*! + \brief initialize background parameters + \param[in] background_struct: the data needed to initialize background + background_memaddr: background memory base address + background_lineoff: background line offset + background_prealpha: background pre-defined alpha value + background_alpha_algorithm: IPA_BG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 + background_pf: background pixel format(BACKGROUND_PPF_ARGB8888,BACKGROUND_PPF_RGB888,BACKGROUND_PPF_RGB565, + BACKGROUND_PPF_ARG1555,BACKGROUND_PPF_ARGB4444,BACKGROUND_PPF_L8,BACKGROUND_PPF_AL44, + BACKGROUND_PPF_AL88,BACKGROUND_PPF_L4,BACKGROUND_PPF_A8,BACKGROUND_PPF_A4) + background_prered: background pre-defined red value + background_pregreen: background pre-defined green value + background_preblue: background pre-defined blue value + \param[out] none + \retval none +*/ +void ipa_background_init(ipa_background_parameter_struct *background_struct) +{ + FlagStatus tempflag = RESET; + if(RESET != (IPA_CTL & IPA_CTL_TEN)) { + tempflag = SET; + /* reset the TEN in order to configure the following bits */ + IPA_CTL &= ~IPA_CTL_TEN; + } + + /* background memory base address configuration */ + IPA_BMADDR &= ~(IPA_BMADDR_BMADDR); + IPA_BMADDR = background_struct->background_memaddr; + /* background line offset configuration */ + IPA_BLOFF &= ~(IPA_BLOFF_BLOFF); + IPA_BLOFF = background_struct->background_lineoff; + /* background pixel format pre-defined alpha, alpha calculation algorithm configuration */ + IPA_BPCTL &= ~(IPA_BPCTL_BPDAV | IPA_BPCTL_BAVCA | IPA_BPCTL_BPF); + IPA_BPCTL |= (background_struct->background_prealpha << 24U); + IPA_BPCTL |= background_struct->background_alpha_algorithm; + IPA_BPCTL |= background_struct->background_pf; + /* background pre-defined red green blue configuration */ + IPA_BPV &= ~(IPA_BPV_BPDRV | IPA_BPV_BPDGV | IPA_BPV_BPDBV); + IPA_BPV |= ((background_struct->background_prered << 16U) | (background_struct->background_pregreen << 8U) + | (background_struct->background_preblue)); + + if(SET == tempflag) { + /* restore the state of TEN */ + IPA_CTL |= IPA_CTL_TEN; + } +} + +/*! + \brief initialize the structure of IPA destination parameter struct with the default values, it is + suggested that call this function after an ipa_destination_parameter_struct structure is defined + \param[in] none + \param[out] destination_struct: the data needed to initialize destination parameter + destination_pf: IPA_DPF_ARGB8888,IPA_DPF_RGB888,IPA_DPF_RGB565,IPA_DPF_ARGB1555, + IPA_DPF_ARGB4444,refer to ipa_dpf_enum + destination_lineoff: destination line offset + destination_prealpha: destination pre-defined alpha value + destination_prered: destination pre-defined red value + destination_pregreen: destination pre-defined green value + destination_preblue: destination pre-defined blue value + destination_memaddr: destination memory base address + image_width: width of the image to be processed + image_height: height of the image to be processed + \retval none +*/ +void ipa_destination_struct_para_init(ipa_destination_parameter_struct *destination_struct) +{ + /* initialize the struct parameters with default values */ + destination_struct->destination_pf = IPA_DPF_ARGB8888; + destination_struct->destination_lineoff = IPA_DEFAULT_VALUE; + destination_struct->destination_prealpha = IPA_DEFAULT_VALUE; + destination_struct->destination_prered = IPA_DEFAULT_VALUE; + destination_struct->destination_pregreen = IPA_DEFAULT_VALUE; + destination_struct->destination_preblue = IPA_DEFAULT_VALUE; + destination_struct->destination_memaddr = IPA_DEFAULT_VALUE; + destination_struct->image_width = IPA_DEFAULT_VALUE; + destination_struct->image_height = IPA_DEFAULT_VALUE; +} + +/*! + \brief initialize destination parameters + \param[in] destination_struct: the data needed to initialize destination parameters + destination_pf: IPA_DPF_ARGB8888,IPA_DPF_RGB888,IPA_DPF_RGB565,IPA_DPF_ARGB1555, + IPA_DPF_ARGB4444,refer to ipa_dpf_enum + destination_lineoff: destination line offset + destination_prealpha: destination pre-defined alpha value + destination_prered: destination pre-defined red value + destination_pregreen: destination pre-defined green value + destination_preblue: destination pre-defined blue value + destination_memaddr: destination memory base address + image_width: width of the image to be processed + image_height: height of the image to be processed + \param[out] none + \retval none +*/ +void ipa_destination_init(ipa_destination_parameter_struct *destination_struct) +{ + uint32_t destination_pixelformat; + FlagStatus tempflag = RESET; + if(RESET != (IPA_CTL & IPA_CTL_TEN)) { + tempflag = SET; + /* reset the TEN in order to configure the following bits */ + IPA_CTL &= ~IPA_CTL_TEN; + } + + /* destination pixel format configuration */ + IPA_DPCTL &= ~(IPA_DPCTL_DPF); + IPA_DPCTL = destination_struct->destination_pf; + destination_pixelformat = destination_struct->destination_pf; + /* destination pixel format ARGB8888 */ + switch(destination_pixelformat) { + case IPA_DPF_ARGB8888: + IPA_DPV &= ~(IPA_DPV_DPDBV_0 | (IPA_DPV_DPDGV_0) | (IPA_DPV_DPDRV_0) | (IPA_DPV_DPDAV_0)); + IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 8U) + | (destination_struct->destination_prered << 16U) + | (destination_struct->destination_prealpha << 24U)); + break; + /* destination pixel format RGB888 */ + case IPA_DPF_RGB888: + IPA_DPV &= ~(IPA_DPV_DPDBV_1 | (IPA_DPV_DPDGV_1) | (IPA_DPV_DPDRV_1)); + IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 8U) + | (destination_struct->destination_prered << 16U)); + break; + /* destination pixel format RGB565 */ + case IPA_DPF_RGB565: + IPA_DPV &= ~(IPA_DPV_DPDBV_2 | (IPA_DPV_DPDGV_2) | (IPA_DPV_DPDRV_2)); + IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 5U) + | (destination_struct->destination_prered << 11U)); + break; + /* destination pixel format ARGB1555 */ + case IPA_DPF_ARGB1555: + IPA_DPV &= ~(IPA_DPV_DPDBV_3 | (IPA_DPV_DPDGV_3) | (IPA_DPV_DPDRV_3) | (IPA_DPV_DPDAV_3)); + IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 5U) + | (destination_struct->destination_prered << 10U) + | (destination_struct->destination_prealpha << 15U)); + break; + /* destination pixel format ARGB4444 */ + case IPA_DPF_ARGB4444: + IPA_DPV &= ~(IPA_DPV_DPDBV_4 | (IPA_DPV_DPDGV_4) | (IPA_DPV_DPDRV_4) | (IPA_DPV_DPDAV_4)); + IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 4U) + | (destination_struct->destination_prered << 8U) + | (destination_struct->destination_prealpha << 12U)); + break; + default: + break; + } + /* destination memory base address configuration */ + IPA_DMADDR &= ~(IPA_DMADDR_DMADDR); + IPA_DMADDR = destination_struct->destination_memaddr; + /* destination line offset configuration */ + IPA_DLOFF &= ~(IPA_DLOFF_DLOFF); + IPA_DLOFF = destination_struct->destination_lineoff; + /* image size configuration */ + IPA_IMS &= ~(IPA_IMS_HEIGHT | IPA_IMS_WIDTH); + IPA_IMS |= ((destination_struct->image_width << 16U) | (destination_struct->image_height)); + + if(SET == tempflag) { + /* restore the state of TEN */ + IPA_CTL |= IPA_CTL_TEN; + } +} + +/*! + \brief initialize IPA foreground LUT parameters + \param[in] fg_lut_num: foreground LUT number of pixel + \param[in] fg_lut_pf: foreground LUT pixel format(IPA_LUT_PF_ARGB8888, IPA_LUT_PF_RGB888) + \param[in] fg_lut_addr: foreground LUT memory base address + \param[out] none + \retval none +*/ +void ipa_foreground_lut_init(uint8_t fg_lut_num, uint8_t fg_lut_pf, uint32_t fg_lut_addr) +{ + FlagStatus tempflag = RESET; + if(RESET != (IPA_FPCTL & IPA_FPCTL_FLLEN)) { + tempflag = SET; + /* reset the FLLEN in order to configure the following bits */ + IPA_FPCTL &= ~IPA_FPCTL_FLLEN; + } + + /* foreground LUT number of pixel configuration */ + IPA_FPCTL |= ((uint32_t)fg_lut_num << 8U); + /* foreground LUT pixel format configuration */ + if(IPA_LUT_PF_RGB888 == fg_lut_pf) { + IPA_FPCTL |= IPA_FPCTL_FLPF; + } else { + IPA_FPCTL &= ~(IPA_FPCTL_FLPF); + } + /* foreground LUT memory base address configuration */ + IPA_FLMADDR &= ~(IPA_FLMADDR_FLMADDR); + IPA_FLMADDR = fg_lut_addr; + + if(SET == tempflag) { + /* restore the state of FLLEN */ + IPA_FPCTL |= IPA_FPCTL_FLLEN; + } +} + +/*! + \brief initialize IPA background LUT parameters + \param[in] bg_lut_num: background LUT number of pixel + \param[in] bg_lut_pf: background LUT pixel format(IPA_LUT_PF_ARGB8888, IPA_LUT_PF_RGB888) + \param[in] bg_lut_addr: background LUT memory base address + \param[out] none + \retval none +*/ +void ipa_background_lut_init(uint8_t bg_lut_num, uint8_t bg_lut_pf, uint32_t bg_lut_addr) +{ + FlagStatus tempflag = RESET; + if(RESET != (IPA_BPCTL & IPA_BPCTL_BLLEN)) { + tempflag = SET; + /* reset the BLLEN in order to configure the following bits */ + IPA_BPCTL &= ~IPA_BPCTL_BLLEN; + } + + /* background LUT number of pixel configuration */ + IPA_BPCTL |= ((uint32_t)bg_lut_num << 8U); + /* background LUT pixel format configuration */ + if(IPA_LUT_PF_RGB888 == bg_lut_pf) { + IPA_BPCTL |= IPA_BPCTL_BLPF; + } else { + IPA_BPCTL &= ~(IPA_BPCTL_BLPF); + } + /* background LUT memory base address configuration */ + IPA_BLMADDR &= ~(IPA_BLMADDR_BLMADDR); + IPA_BLMADDR = bg_lut_addr; + + if(SET == tempflag) { + /* restore the state of BLLEN */ + IPA_BPCTL |= IPA_BPCTL_BLLEN; + } +} + +/*! + \brief configure IPA line mark + \param[in] line_num: line number + \param[out] none + \retval none +*/ +void ipa_line_mark_config(uint16_t line_num) +{ + IPA_LM &= ~(IPA_LM_LM); + IPA_LM = line_num; +} + +/*! + \brief inter-timer enable or disable + \param[in] timer_cfg: IPA_INTER_TIMER_ENABLE,IPA_INTER_TIMER_DISABLE + \param[out] none + \retval none +*/ +void ipa_inter_timer_config(uint8_t timer_cfg) +{ + if(IPA_INTER_TIMER_ENABLE == timer_cfg) { + IPA_ITCTL |= IPA_ITCTL_ITEN; + } else { + IPA_ITCTL &= ~(IPA_ITCTL_ITEN); + } +} + +/*! + \brief configure the number of clock cycles interval + \param[in] clk_num: the number of clock cycles + \param[out] none + \retval none +*/ +void ipa_interval_clock_num_config(uint8_t clk_num) +{ + /* NCCI[7:0] bits have no meaning if ITEN is '0' */ + IPA_ITCTL &= ~(IPA_ITCTL_NCCI); + IPA_ITCTL |= ((uint32_t)clk_num << 8U); +} + +/*! + \brief get IPA flag status in IPA_INTF register + \param[in] flag: IPA flags + one or more parameters can be selected which are shown as below: + \arg IPA_FLAG_TAE: transfer access error interrupt flag + \arg IPA_FLAG_FTF: full transfer finish interrupt flag + \arg IPA_FLAG_TLM: transfer line mark interrupt flag + \arg IPA_FLAG_LAC: LUT access conflict interrupt flag + \arg IPA_FLAG_LLF: LUT loading finish interrupt flag + \arg IPA_FLAG_WCF: wrong configuration interrupt flag + \param[out] none + \retval none +*/ +FlagStatus ipa_flag_get(uint32_t flag) +{ + if(RESET != (IPA_INTF & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear IPA flag in IPA_INTF register + \param[in] flag: IPA flags + one or more parameters can be selected which are shown as below: + \arg IPA_FLAG_TAE: transfer access error interrupt flag + \arg IPA_FLAG_FTF: full transfer finish interrupt flag + \arg IPA_FLAG_TLM: transfer line mark interrupt flag + \arg IPA_FLAG_LAC: LUT access conflict interrupt flag + \arg IPA_FLAG_LLF: LUT loading finish interrupt flag + \arg IPA_FLAG_WCF: wrong configuration interrupt flag + \param[out] none + \retval none +*/ +void ipa_flag_clear(uint32_t flag) +{ + IPA_INTC |= (flag); +} + +/*! + \brief enable IPA interrupt + \param[in] int_flag: IPA interrupt flags + one or more parameters can be selected which are shown as below: + \arg IPA_INT_TAE: transfer access error interrupt + \arg IPA_INT_FTF: full transfer finish interrupt + \arg IPA_INT_TLM: transfer line mark interrupt + \arg IPA_INT_LAC: LUT access conflict interrupt + \arg IPA_INT_LLF: LUT loading finish interrupt + \arg IPA_INT_WCF: wrong configuration interrupt + \param[out] none + \retval none +*/ +void ipa_interrupt_enable(uint32_t int_flag) +{ + IPA_CTL |= (int_flag); +} + +/*! + \brief disable IPA interrupt + \param[in] int_flag: IPA interrupt flags + one or more parameters can be selected which are shown as below: + \arg IPA_INT_TAE: transfer access error interrupt + \arg IPA_INT_FTF: full transfer finish interrupt + \arg IPA_INT_TLM: transfer line mark interrupt + \arg IPA_INT_LAC: LUT access conflict interrupt + \arg IPA_INT_LLF: LUT loading finish interrupt + \arg IPA_INT_WCF: wrong configuration interrupt + \param[out] none + \retval none +*/ +void ipa_interrupt_disable(uint32_t int_flag) +{ + IPA_CTL &= ~(int_flag); +} + +/*! + \brief get IPA interrupt flag + \param[in] int_flag: IPA interrupt flag flags + one or more parameters can be selected which are shown as below: + \arg IPA_INT_FLAG_TAE: transfer access error interrupt flag + \arg IPA_INT_FLAG_FTF: full transfer finish interrupt flag + \arg IPA_INT_FLAG_TLM: transfer line mark interrupt flag + \arg IPA_INT_FLAG_LAC: LUT access conflict interrupt flag + \arg IPA_INT_FLAG_LLF: LUT loading finish interrupt flag + \arg IPA_INT_FLAG_WCF: wrong configuration interrupt flag + \param[out] none + \retval none +*/ +FlagStatus ipa_interrupt_flag_get(uint32_t int_flag) +{ + if(0U != (IPA_INTF & int_flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear IPA interrupt flag + \param[in] int_flag: IPA interrupt flag flags + one or more parameters can be selected which are shown as below: + \arg IPA_INT_FLAG_TAE: transfer access error interrupt flag + \arg IPA_INT_FLAG_FTF: full transfer finish interrupt flag + \arg IPA_INT_FLAG_TLM: transfer line mark interrupt flag + \arg IPA_INT_FLAG_LAC: LUT access conflict interrupt flag + \arg IPA_INT_FLAG_LLF: LUT loading finish interrupt flag + \arg IPA_INT_FLAG_WCF: wrong configuration interrupt flag + \param[out] none + \retval none +*/ +void ipa_interrupt_flag_clear(uint32_t int_flag) +{ + IPA_INTC |= (int_flag); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c new file mode 100644 index 00000000000..ce139fb14f7 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c @@ -0,0 +1,124 @@ +/*! + \file gd32f5xx_iref.c + \brief IREF driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_iref.h" + +/*! + \brief deinitialize IREF + \param[in] none + \param[out] none + \retval none +*/ +void iref_deinit(void) +{ + rcu_periph_reset_enable(RCU_IREFRST); + rcu_periph_reset_disable(RCU_IREFRST); +} + +/*! + \brief enable IREF + \param[in] none + \param[out] none + \retval none +*/ +void iref_enable(void) +{ + IREF_CTL |= IREF_CTL_CREN; +} + +/*! + \brief disable IREF + \param[in] none + \param[out] none + \retval none +*/ +void iref_disable(void) +{ + IREF_CTL &= ~IREF_CTL_CREN; +} + +/*! + \brief set IREF mode + \param[in] step + \arg IREF_MODE_LOW_POWER: 1uA step + \arg IREF_MODE_HIGH_CURRENT: 8uA step + \param[out] none + \retval none +*/ +void iref_mode_set(uint32_t step) +{ + IREF_CTL &= ~IREF_CTL_SSEL; + IREF_CTL |= step; +} + +/*! + \brief set IREF current precision trim value + \param[in] precisiontrim + \arg IREF_CUR_PRECISION_TRIM_X(x=0..31): (-15+ x)% + \param[out] none + \retval none +*/ +void iref_precision_trim_value_set(uint32_t precisiontrim) +{ + IREF_CTL &= ~IREF_CTL_CPT; + IREF_CTL |= precisiontrim; +} + +/*! + \brief set IREF sink current mode + \param[in] sinkmode + \arg IREF_SOURCE_CURRENT : source current. + \arg IREF_SINK_CURRENT: sink current + \param[out] none + \retval none +*/ +void iref_sink_set(uint32_t sinkmode) +{ + IREF_CTL &= ~IREF_CTL_SCMOD; + IREF_CTL |= sinkmode; +} + +/*! + \brief set IREF step data + \param[in] stepdata + \arg IREF_CUR_STEP_DATA_X:(x=0..63): step*x + \param[out] none + \retval none +*/ + +void iref_step_data_config(uint32_t stepdata) +{ + IREF_CTL &= ~IREF_CTL_CSDT; + IREF_CTL |= stepdata; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c new file mode 100644 index 00000000000..1c4f51d5162 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c @@ -0,0 +1,184 @@ +/*! + \file gd32f5xx_misc.c + \brief MISC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_misc.h" + +/*! + \brief set the priority group + \param[in] nvic_prigroup: the NVIC priority group + \arg NVIC_PRIGROUP_PRE0_SUB4:0 bits for pre-emption priority 4 bits for subpriority + \arg NVIC_PRIGROUP_PRE1_SUB3:1 bits for pre-emption priority 3 bits for subpriority + \arg NVIC_PRIGROUP_PRE2_SUB2:2 bits for pre-emption priority 2 bits for subpriority + \arg NVIC_PRIGROUP_PRE3_SUB1:3 bits for pre-emption priority 1 bits for subpriority + \arg NVIC_PRIGROUP_PRE4_SUB0:4 bits for pre-emption priority 0 bits for subpriority + \param[out] none + \retval none +*/ +void nvic_priority_group_set(uint32_t nvic_prigroup) +{ + /* set the priority group value */ + SCB->AIRCR = NVIC_AIRCR_VECTKEY_MASK | nvic_prigroup; +} + +/*! + \brief enable NVIC interrupt request + \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type + \param[in] nvic_irq_pre_priority: the pre-emption priority needed to set + \param[in] nvic_irq_sub_priority: the subpriority needed to set + \param[out] none + \retval none +*/ +void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, + uint8_t nvic_irq_sub_priority) +{ + uint32_t temp_priority = 0x00U, temp_pre = 0x00U, temp_sub = 0x00U; + /* use the priority group value to get the temp_pre and the temp_sub */ + if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE0_SUB4) { + temp_pre = 0x0U; + temp_sub = 0x4U; + } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE1_SUB3) { + temp_pre = 0x1U; + temp_sub = 0x3U; + } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE2_SUB2) { + temp_pre = 0x2U; + temp_sub = 0x2U; + } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE3_SUB1) { + temp_pre = 0x3U; + temp_sub = 0x1U; + } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE4_SUB0) { + temp_pre = 0x4U; + temp_sub = 0x0U; + } else { + nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); + temp_pre = 0x2U; + temp_sub = 0x2U; + } + /* get the temp_priority to fill the NVIC->IP register */ + temp_priority = (uint32_t)nvic_irq_pre_priority << (0x4U - temp_pre); + temp_priority |= nvic_irq_sub_priority & (0x0FU >> (0x4U - temp_sub)); + temp_priority = temp_priority << 0x04U; + NVIC->IPR[nvic_irq] = (uint8_t)temp_priority; + /* enable the selected IRQ */ + NVIC->ISER[nvic_irq >> 0x05U] = (uint32_t)0x01U << (nvic_irq & (uint8_t)0x1FU); +} + +/*! + \brief disable NVIC interrupt request + \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type + \param[out] none + \retval none +*/ +void nvic_irq_disable(uint8_t nvic_irq) +{ + /* disable the selected IRQ.*/ + NVIC->ICER[nvic_irq >> 0x05] = (uint32_t)0x01 << (nvic_irq & (uint8_t)0x1F); +} + +/*! + \brief initiates a system reset request to reset the MCU + \param[in] none + \param[out] none + \retval none +*/ +void nvic_system_reset(void) +{ + NVIC_SystemReset(); +} + +/*! + \brief set the NVIC vector table base address + \param[in] nvic_vict_tab: the RAM or FLASH base address + \arg NVIC_VECTTAB_RAM: RAM base address + \are NVIC_VECTTAB_FLASH: Flash base address + \param[in] offset: Vector Table offset + \param[out] none + \retval none +*/ +void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset) +{ + SCB->VTOR = nvic_vict_tab | (offset & NVIC_VECTTAB_OFFSET_MASK); + __DSB(); +} + +/*! + \brief set the state of the low power mode + \param[in] lowpower_mode: the low power mode state + \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system always enter low power + mode by exiting from ISR + \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the DEEPSLEEP mode + \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode can be woke up + by all the enable and disable interrupts + \param[out] none + \retval none +*/ +void system_lowpower_set(uint8_t lowpower_mode) +{ + SCB->SCR |= (uint32_t)lowpower_mode; +} + +/*! + \brief reset the state of the low power mode + \param[in] lowpower_mode: the low power mode state + \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system will exit low power + mode by exiting from ISR + \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the SLEEP mode + \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode only can be + woke up by the enable interrupts + \param[out] none + \retval none +*/ +void system_lowpower_reset(uint8_t lowpower_mode) +{ + SCB->SCR &= (~(uint32_t)lowpower_mode); +} + +/*! + \brief set the systick clock source + \param[in] systick_clksource: the systick clock source needed to choose + \arg SYSTICK_CLKSOURCE_HCLK: systick clock source is from HCLK + \arg SYSTICK_CLKSOURCE_HCLK_DIV8: systick clock source is from HCLK/8 + \param[out] none + \retval none +*/ + +void systick_clksource_set(uint32_t systick_clksource) +{ + if(SYSTICK_CLKSOURCE_HCLK == systick_clksource) { + /* set the systick clock source from HCLK */ + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } else { + /* set the systick clock source from HCLK/8 */ + SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c new file mode 100644 index 00000000000..aa07d5de682 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c @@ -0,0 +1,1270 @@ +/*! + \file gd32f5xx_pkcau.c + \brief PKCAU driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_pkcau.h" + +/* read result from PKCAU RAM */ +static void pkcau_memcpy_value(uint32_t offset, uint32_t value); +/* copy operand with EOS or ROS to PKCAU RAM */ +static void pkcau_memcpy_operand(uint32_t offset, const uint8_t operand[], uint32_t size); +/* read result from PKCAU RAM */ +static void pkcau_memread(uint32_t offset, uint8_t buf[], uint32_t size); + +/*! + \brief reset PKCAU + \param[in] none + \param[out] none + \retval none +*/ +void pkcau_deinit(void) +{ + rcu_periph_reset_enable(RCU_PKCAURST); + rcu_periph_reset_disable(RCU_PKCAURST); +} + +/*! + \brief initialize montgomery parameter structure with a default value + \param[in] none + \param[out] init_para: initialize montgomery parameter struct + \retval none +*/ +void pkcau_mont_struct_para_init(pkcau_mont_parameter_struct *init_para) +{ + /* initialize the member of montgomery parameter structure with the default value */ + init_para->modulus_n = 0U; + init_para->modulus_n_len = 0U; +} + +/*! + \brief initialize modular parameter structure with a default value + \param[in] none + \param[out] init_para: initialize modular parameter struct + \retval none +*/ +void pkcau_mod_struct_para_init(pkcau_mod_parameter_struct *init_para) +{ + /* initialize the member of modular parameter structure with the default value */ + init_para->oprd_a = 0U; + init_para->oprd_a_len = 0U; + init_para->oprd_b = 0U; + init_para->oprd_b_len = 0U; + init_para->modulus_n = 0U; + init_para->modulus_n_len = 0U; +} + +/*! + \brief initialize modular exponentiation parameter structure with a default value + \param[in] none + \param[out] init_para: initialize modular exponentiation parameter struct + \retval none +*/ +void pkcau_mod_exp_struct_para_init(pkcau_mod_exp_parameter_struct *init_para) +{ + /* initialize the member of modular exponentiation parameter structure with the default value */ + init_para->oprd_a = 0U; + init_para->oprd_a_len = 0U; + init_para->exp_e = 0U; + init_para->e_len = 0U; + init_para->modulus_n = 0U; + init_para->modulus_n_len = 0U; + init_para->mont_para = 0U; + init_para->mont_para_len = 0U; +} + +/*! + \brief initialize arithmetic parameter structure with a default value + \param[in] none + \param[out] init_para: initialize arithmetic parameter struct + \retval none +*/ +void pkcau_arithmetic_struct_para_init(pkcau_arithmetic_parameter_struct *init_para) +{ + /* initialize the member of arithmetic parameter structure with the default value */ + init_para->oprd_a = 0U; + init_para->oprd_a_len = 0U; + init_para->oprd_b = 0U; + init_para->oprd_b_len = 0U; +} + +/*! + \brief initialize CRT parameter structure with a default value + \param[in] none + \param[out] init_para: initialize CRT parameter struct + \retval none +*/ +void pkcau_crt_struct_para_init(pkcau_crt_parameter_struct *init_para) +{ + /* initialize the member of arithmetic parameter structure with the default value */ + init_para->oprd_a = 0U; + init_para->oprd_a_len = 0U; + init_para->oprd_dp = 0U; + init_para->oprd_dp_len = 0U; + init_para->oprd_dq = 0U; + init_para->oprd_dq_len = 0U; + init_para->oprd_qinv = 0U; + init_para->oprd_qinv_len = 0U; + init_para->oprd_p = 0U; + init_para->oprd_p_len = 0U; + init_para->oprd_q = 0U; + init_para->oprd_q_len = 0U; +} + +/*! + \brief initialize ECC curve parameter structure with a default value + \param[in] none + \param[out] init_para: initialize ECC curve parameter struct + \retval none +*/ +void pkcau_ec_group_struct_para_init(pkcau_ec_group_parameter_struct *init_para) +{ + /* initialize the member of ECC curve parameter structure with the default value */ + init_para->modulus_p = 0U; + init_para->modulus_p_len = 0U; + init_para->coff_a = 0U; + init_para->coff_a_len = 0U; + init_para->coff_b = 0U; + init_para->coff_b_len = 0U; + init_para->base_point_x = 0U; + init_para->base_point_x_len = 0U; + init_para->base_point_y = 0U; + init_para->base_point_y_len = 0U; + init_para->order_n = 0U; + init_para->order_n_len = 0U; + init_para->a_sign = 0U; + init_para->multi_k = 0U; + init_para->multi_k_len = 0U; + init_para->integer_k = 0U; + init_para->integer_k_len = 0U; + init_para->private_key_d = 0U; + init_para->private_key_d_len = 0U; + init_para->mont_para = 0U; + init_para->mont_para_len = 0U; +} + +/*! + \brief initialize point parameter structure with a default value + \param[in] none + \param[out] init_para: initialize point parameter struct + \retval none +*/ +void pkcau_point_struct_para_init(pkcau_point_parameter_struct *init_para) +{ + /* initialize the member of point parameter structure with the default value */ + init_para->point_x = 0U; + init_para->point_x_len = 0U; + init_para->point_y = 0U; + init_para->point_y_len = 0U; +} + +/*! + \brief initialize signature parameter structure with a default value + \param[in] none + \param[out] init_para: initialize signature parameter struct + \retval none +*/ +void pkcau_signature_struct_para_init(pkcau_signature_parameter_struct *init_para) +{ + /* initialize the member of signature parameter structure with the default value */ + init_para->sign_r = 0U; + init_para->sign_r_len = 0U; + init_para->sign_s = 0U; + init_para->sign_s_len = 0U; +} + +/*! + \brief initialize hash parameter structure with a default value + \param[in] none + \param[out] init_para: initialize hash parameter struct + \retval none +*/ +void pkcau_hash_struct_para_init(pkcau_hash_parameter_struct *init_para) +{ + /* initialize the member of hash parameter structure with the default value */ + init_para->hash_z = 0U; + init_para->hash_z_len = 0U; +} + +/*! + \brief initialize ECC out parameter structure with a default value + \param[in] none + \param[out] init_para: initialize ECC out parameter struct + \retval none +*/ +void pkcau_ecc_out_struct_para_init(pkcau_ecc_out_struct *init_para) +{ + /* initialize ecc output parameter structure with a default value */ + init_para->sign_extra = 0U; + init_para->point_x = 0U; + init_para->point_y = 0U; + init_para->sign_r = 0U; + init_para->sign_s = 0U; +} + +/*! + \brief enable PKCAU + \param[in] none + \param[out] none + \retval none +*/ +void pkcau_enable(void) +{ + PKCAU_CTL |= PKCAU_CTL_PKCAUEN; +} + +/*! + \brief disable PKCAU + \param[in] none + \param[out] none + \retval none +*/ +void pkcau_disable(void) +{ + PKCAU_CTL &= ~PKCAU_CTL_PKCAUEN; +} + +/*! + \brief start operation + \param[in] none + \param[out] none + \retval none +*/ +void pkcau_start(void) +{ + PKCAU_CTL |= PKCAU_CTL_START; +} + +/*! + \brief configure the PKCAU operation mode + \param[in] mode: PKCAU operation mode + only one parameter can be selected which is shown as below: + \arg PKCAU_MODE_MOD_EXP: Montgomery parameter computation then modular exponentiation + \arg PKCAU_MODE_MONT_PARAM: Montgomery parameter computation only + \arg PKCAU_MODE_MOD_EXP_FAST: modular exponentiation only + \arg PKCAU_MODE_CRT_EXP: RSA CRT exponentiation + \arg PKCAU_MODE_MOD_INVERSION: modular inversion + \arg PKCAU_MODE_ARITHMETIC_ADD: arithmetic addition + \arg PKCAU_MODE_ARITHMETIC_SUB: arithmetic subtraction + \arg PKCAU_MODE_ARITHMETIC_MUL: arithmetic multiplication + \arg PKCAU_MODE_ARITHMETIC_COMP: arithmetic comparison + \arg PKCAU_MODE_MOD_REDUCTION: modular reduction + \arg PKCAU_MODE_MOD_ADD: modular addition + \arg PKCAU_MODE_MOD_SUB: modular subtraction + \arg PKCAU_MODE_MONT_MUL: Montgomery multiplication + \arg PKCAU_MODE_ECC_MUL: Montgomery parameter computation then ECC scalar multiplication + \arg PKCAU_MODE_ECC_MUL_FAST: ECC scalar multiplication only + \arg PKCAU_MODE_ECDSA_SIGN: ECDSA sign + \arg PKCAU_MODE_ECDSA_VERIFICATION: ECDSA verification + \arg PKCAU_MODE_POINT_CHECK: point on elliptic curve Fp check + \retval none +*/ +void pkcau_mode_set(uint32_t mode) +{ + PKCAU_CTL &= ~PKCAU_CTL_MODESEL; + PKCAU_CTL |= mode; +} + +/*! + \brief execute montgomery parameter operation + This function can only be used when interrupt is not enabled + \param[in] mont_para: PKCAU montgomery parameter struct + modulus_n: modulus value n + modulus_n_len: modulus length in byte + \param[out] results: output buffer + \retval none +*/ +void pkcau_mont_param_operation(pkcau_mont_parameter_struct *mont_para, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (mont_para->modulus_n_len << 3)); + + /* write the modulus value n to PKCAU RAM */ + pkcau_memcpy_operand(0x00000D5CU, mont_para->modulus_n, mont_para->modulus_n_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_MONT_PARAM); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x594U, (uint8_t *)results, mont_para->modulus_n_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute modular operation, include modular addition, modular subtraction and montgomery multiplication + This function can only be used when interrupt is not enabled + \param[in] mod_para: PKCAU modular parameter struct + oprd_a: operand A + oprd_a_len: operand A length in byte + oprd_b: operand B + oprd_b_len: operand B length in byte + modulus_n: modulus value n + modulus_n_len: modulus length in byte + \param[in] mode: modular operation mode + only one parameter can be selected which is shown as below: + \arg PKCAU_MODE_MOD_ADD: modular addition + \arg PKCAU_MODE_MOD_SUB: modular subtraction + \arg PKCAU_MODE_MONT_MUL: Montgomery multiplication + \param[out] results: output buffer + \retval none +*/ +void pkcau_mod_operation(pkcau_mod_parameter_struct *mod_para, uint32_t mode, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (mod_para->modulus_n_len << 3)); + + /* write the operand A, operand B and modulus value n to PKCAU RAM */ + pkcau_memcpy_operand(0x000008B4U, mod_para->oprd_a, mod_para->oprd_a_len); + pkcau_memcpy_operand(0x00000A44U, mod_para->oprd_b, mod_para->oprd_b_len); + pkcau_memcpy_operand(0x00000D5CU, mod_para->modulus_n, mod_para->modulus_n_len); + /* configure the operation mode */ + pkcau_mode_set(mode); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0xBD0U, (uint8_t *)results, mod_para->modulus_n_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute modular exponentiation operation + This function can only be used when interrupt is not enabled + \param[in] mod_exp_para: PKCAU exponentiation parameter struct for fast mode + oprd_a: operand A + oprd_a_len: operand A length in byte + exp_e: exponent e + e_len: exponent length in byte + modulus_n: modulus value n + modulus_n_len: modulus length in byte + mont_para: exponentiation parameter R2 mod n + mont_para_len: montgomery parameter length in byte + \param[in] mode: modular exponentiation operation mode + only one parameter can be selected which is shown as below: + \arg PKCAU_MODE_MOD_EXP_FAST: montgomery parameter computation then modular exponentiation + \arg PKCAU_MODE_MOD_EXP: modular exponentiation only + \param[out] results: output buffer + \retval none +*/ +void pkcau_mod_exp_operation(pkcau_mod_exp_parameter_struct *mod_exp_para, uint32_t mode, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the exponent length and modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000400U, (mod_exp_para->e_len << 3)); + pkcau_memcpy_value(0x00000404U, (mod_exp_para->modulus_n_len << 3)); + + /* write the operand A, exponent e and modulus value n to PKCAU RAM */ + pkcau_memcpy_operand(0x00000A44U, mod_exp_para->oprd_a, mod_exp_para->oprd_a_len); + pkcau_memcpy_operand(0x00000BD0U, mod_exp_para->exp_e, mod_exp_para->e_len); + pkcau_memcpy_operand(0x00000D5CU, mod_exp_para->modulus_n, mod_exp_para->modulus_n_len); + /* write the montgomery parameter to PKCAU RAM */ + if(mode == PKCAU_MODE_MOD_EXP_FAST) { + pkcau_memcpy_operand(0x00000594U, mod_exp_para->mont_para, mod_exp_para->mont_para_len); + } + /* configure the operation mode */ + pkcau_mode_set(mode); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x724U, (uint8_t *)results, mod_exp_para->modulus_n_len); + + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute modular inversion operation + This function can only be used when interrupt is not enabled + \param[in] mod_inver_para: PKCAU modular inversion parameter struct + oprd_a: operand A + oprd_a_len: operand A length in byte + modulus_n: modulus value n + modulus_n_len: modulus length in byte + \param[out] results: output buffer + \retval none +*/ +void pkcau_mod_inver_operation(pkcau_mod_parameter_struct *mod_inver_para, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (mod_inver_para->modulus_n_len) << 3); + + /* write the operand A and modulus value n to PKCAU RAM */ + pkcau_memcpy_operand(0x000008B4U, mod_inver_para->oprd_a, mod_inver_para->oprd_a_len); + pkcau_memcpy_operand(0x00000A44U, mod_inver_para->modulus_n, mod_inver_para->modulus_n_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_MOD_INVERSION); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0xBD0U, (uint8_t *)results, mod_inver_para->modulus_n_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute modular reduction operation + This function can only be used when interrupt is not enabled + \param[in] mod_reduc_para: PKCAU modular reduction parameter struct + oprd_a: operand A + oprd_a_len: length of operand A in byte + modulus_n: modulus value n + modulus_n_len: modulus length in byte + \param[out] results: output buffer + \retval none +*/ +void pkcau_mod_reduc_operation(pkcau_mod_parameter_struct *mod_reduc_para, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length and length of operand A in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000400U, (mod_reduc_para->oprd_a_len) << 3); + pkcau_memcpy_value(0x00000404U, (mod_reduc_para->modulus_n_len) << 3); + + /* write the operand A and modulus value n to PKCAU RAM */ + pkcau_memcpy_operand(0x000008B4U, mod_reduc_para->oprd_a, mod_reduc_para->oprd_a_len); + pkcau_memcpy_operand(0x00000A44U, mod_reduc_para->modulus_n, mod_reduc_para->modulus_n_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_MOD_REDUCTION); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0xBD0U, (uint8_t *)results, mod_reduc_para->modulus_n_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute arithmetic operation + This function can only be used when interrupt is not enabled + \param[in] arithmetic_para: PKCAU arithmetic parameter struct + oprd_a: operand A + oprd_a_len: length of operand A in byte + oprd_b: operand B + oprd_b_len: length of operand B in byte + \param[in] mode: arithmetic operation mode + only one parameter can be selected which is shown as below: + \arg PKCAU_MODE_ARITHMETIC_ADD: arithmetic addition + \arg PKCAU_MODE_ARITHMETIC_SUB: arithmetic subtraction + \arg PKCAU_MODE_ARITHMETIC_MUL: arithmetic multiplication + \arg PKCAU_MODE_ARITHMETIC_COMP: arithmetic comparison + \param[out] results: output buffer + \retval none +*/ +void pkcau_arithmetic_operation(pkcau_arithmetic_parameter_struct *arithmetic_para, uint32_t mode, uint8_t *results) +{ + uint32_t size = 0U; + + uint32_t max_len = (arithmetic_para->oprd_a_len > arithmetic_para->oprd_b_len) ? \ + arithmetic_para->oprd_a_len : arithmetic_para->oprd_b_len; + + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* calculate number of byte to read */ + switch(mode) { + case PKCAU_MODE_ARITHMETIC_ADD: + size = max_len + 1U; + break; + case PKCAU_MODE_ARITHMETIC_SUB: + size = max_len; + break; + case PKCAU_MODE_ARITHMETIC_MUL: + size = arithmetic_para->oprd_a_len + arithmetic_para->oprd_b_len; + break; + case PKCAU_MODE_ARITHMETIC_COMP: + size = 1U; + break; + default: + break; + } + + /* write the length of operand in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, max_len << 3); + + /* write the operand A and operand B to PKCAU RAM */ + pkcau_memcpy_operand(0x000008B4U, arithmetic_para->oprd_a, arithmetic_para->oprd_a_len); + pkcau_memcpy_operand(0x00000A44U, arithmetic_para->oprd_b, arithmetic_para->oprd_b_len); + /* configure the operation mode */ + pkcau_mode_set(mode); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0xBD0U, (uint8_t *)results, size); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute RSA CRT exponentiation operation + This function can only be used when interrupt is not enabled + \param[in] crt_para: PKCAU modular CRT parameter struct + oprd_a: operand A + oprd_a_len: length of operand A in byte + oprd_dp: operand dp + oprd_dp_len: length of operand dp in byte + oprd_dq:operand dq + oprd_dq_len: length of operand dq in byte + oprd_qinv: operand qinv + oprd_qinv_len: length of operand qinv in byte + oprd_p: prime operand p + oprd_p_len: length of operand p in byte + oprd_q: prime operand q + oprd_q_len: length of operand q in byte + \param[out] results: output buffer + \retval none +*/ +void pkcau_crt_exp_operation(pkcau_crt_parameter_struct *crt_para, uint8_t *results) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (crt_para->oprd_a_len << 3)); + + /* write the operand dp, dq, qinv, p and q to PKCAU RAM */ + pkcau_memcpy_operand(0x0000065CU, crt_para->oprd_dp, crt_para->oprd_dp_len); + pkcau_memcpy_operand(0x00000BD0U, crt_para->oprd_dq, crt_para->oprd_dq_len); + pkcau_memcpy_operand(0x000007ECU, crt_para->oprd_qinv, crt_para->oprd_qinv_len); + pkcau_memcpy_operand(0x0000097CU, crt_para->oprd_p, crt_para->oprd_p_len); + pkcau_memcpy_operand(0x00000D5CU, crt_para->oprd_q, crt_para->oprd_q_len); + /* write the operand A to PKCAU RAM */ + pkcau_memcpy_operand(0x00000EECU, crt_para->oprd_a, crt_para->oprd_a_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_CRT_EXP); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x724U, (uint8_t *)results, crt_para->oprd_a_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute point check operation + This function can only be used when interrupt is not enabled + \param[in] point_para: PKCAU point struct + point_x: point coordinate x + point_x_len: point coordinate x length in byte + point_y: point coordinate y + point_y_len: point coordinate y length in byte + \param[in] curve_group_para: PKCAU ECC curve parameter struct + modulus_p: curve modulus p + modulus_p_len: curve modulus p length in byte + coff_a: curve coefficient a + coff_a_len: curve coefficient a length in byte + coff_b: curve coefficient b + coff_b_len: curve coefficient b length in byte + base_point_x: curve base point coordinate x + base_point_x_len: curve base point coordinate x length in byte + base_point_y: curve base point coordinate y + base_point_y_len: curve base point coordinate y length in byte + order_n: curve prime order n + order_n_len: curve prime order n length in byte + a_sign: curve coefficient a sign + multi_k: scalar multiplier k + multi_k_len: scalar multiplier k length in byte + integer_k: integer k length in byte + integer_k_len: integer k length in byte + private_key_d: private key d + private_key_d_len: private key d length in byte + mont_para: montgomery parameter R2 mod n + mont_para_len: montgomery parameter R2 mod n length in byte + \param[out] none + \retval flag indicating whether the point is on an elliptic curve or not +*/ +uint8_t pkcau_point_check_operation(pkcau_point_parameter_struct *point_para, + const pkcau_ec_group_parameter_struct *curve_group_para) +{ + uint8_t res = 1U; + + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the modulus length in bit to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); + /* write the sign of curve coefficient a to PKCAU RAM */ + pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); + + /* write the curve coefficient a, curve coefficient b and curve modulus p to PKCAU RAM */ + pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); + pkcau_memcpy_operand(0x000007FCU, curve_group_para->coff_b, curve_group_para->coff_b_len); + pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); + /* write the point coordinate x and point coordinate y to PKCAU RAM */ + pkcau_memcpy_operand(0x0000055CU, point_para->point_x, point_para->point_x_len); + pkcau_memcpy_operand(0x000005B0U, point_para->point_y, point_para->point_y_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_POINT_CHECK); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x400U, (uint8_t *)&res, 1U); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); + + return res; +} + +/*! + \brief execute point multiplication operation + This function can only be used when interrupt is not enabled + \param[in] point_para: PKCAU point struct + point_x: point coordinate x + point_x_len: point coordinate x length in byte + point_y: point coordinate y + point_y_len: point coordinate y length in byte + \param[in] curve_group_para: PKCAU ECC curve parameter struct + modulus_p: curve modulus p + modulus_p_len: curve modulus p length in byte + coff_a: curve coefficient a + coff_a_len: curve coefficient a length in byte + coff_b: curve coefficient b + coff_b_len: curve coefficient b length in byte + base_point_x: curve base point coordinate x + base_point_x_len: curve base point coordinate x length in byte + base_point_y: curve base point coordinate y + base_point_y_len: curve base point coordinate y length in byte + order_n: curve prime order n + order_n_len: curve prime order n length in byte + a_sign: curve coefficient a sign + + multi_k: scalar multiplier k + multi_k_len: scalar multiplier k length in byte + integer_k: integer k length in byte + integer_k_len: integer k length in byte + private_key_d: private key d + private_key_d_len: private key d length in byte + mont_para: montgomery parameter R2 mod n + mont_para_len: montgomery parameter R2 mod n length in byte + \param[in] mode: point multiplication operation mode + only one parameter can be selected which is shown as below: + \arg PKCAU_MODE_ECC_SCALAR_MUL_FAST: montgomery parameter computation then ECC scalar multiplication + \arg PKCAU_MODE_ECC_SCALAR_MUL: ECC scalar multiplication only + \param[out] result: ecdsa signature, ecc scalar multiplication output structure + sign_extra: flag of extended ECDSA sign (extra outputs) + sign_r: pointer to signature part r + sign_s: pointer to signature part s + point_x: pointer to point kP coordinate x + point_y: pointer to point kP coordinate y + \retval none +*/ +void pkcau_point_mul_operation(pkcau_point_parameter_struct *point_para, + const pkcau_ec_group_parameter_struct *curve_group_para, \ + uint32_t mode, pkcau_ecc_out_struct *result) +{ + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the length of scalar multiplier k, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ + pkcau_memcpy_value(0x00000400U, (curve_group_para->multi_k_len << 3)); + pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); + pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); + + /* write the curve coefficient a, curve modulus p, scalar multiplier k, point coordinate x and point coordinate y to PKCAU RAM */ + pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); + pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); + pkcau_memcpy_operand(0x00000508U, curve_group_para->multi_k, curve_group_para->multi_k_len); + pkcau_memcpy_operand(0x0000055CU, point_para->point_x, point_para->point_x_len); + pkcau_memcpy_operand(0x000005B0U, point_para->point_y, point_para->point_y_len); + if(mode == PKCAU_MODE_ECC_SCALAR_MUL_FAST) { + pkcau_memcpy_operand(0x000004B4U, curve_group_para->mont_para, curve_group_para->mont_para_len); + } + /* configure the operation mode */ + pkcau_mode_set(mode); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x55CU, (uint8_t *)result->point_x, curve_group_para->modulus_p_len); + pkcau_memread(0x5B0U, (uint8_t *)result->point_y, curve_group_para->modulus_p_len); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); +} + +/*! + \brief execute ECDSA sign operation + This function can only be used when interrupt is not enabled + \param[in] hash_para: hash struct + hash_z: hash value z + hash_z_len: hash value z length in byte + \param[in] curve_group_para: PKCAU ECC curve paramter struct + modulus_p: curve modulus p + modulus_p_len: curve modulus p length in byte + coff_a: curve coefficient a + coff_a_len: curve coefficient a length in byte + coff_b: curve coefficient b + coff_b_len: curve coefficient b length in byte + base_point_x: curve base point coordinate x + base_point_x_len: curve base point coordinate x length in byte + base_point_y: curve base point coordinate y + base_point_y_len: curve base point coordinate y length in byte + order_n: curve prime order n + order_n_len: curve prime order n length in byte + a_sign: curve coefficient a sign + multi_k: scalar multiplier k + multi_k_len: scalar multiplier k length in byte + integer_k: integer k length in byte + integer_k_len: integer k length in byte + private_key_d: private key d + private_key_d_len: private key d length in byte + mont_para: montgomery parameter R2 mod n + mont_para_len: montgomery parameter R2 mod n length in byte + \param[out] result: ecdsa signature, ecc scalar multiplication output structure + sign_extra: flag of extended ECDSA sign (extra outputs) + sign_r: pointer to signature part r + sign_s: pointer to signature part s + point_x: pointer to point kP coordinate x + point_y: pointer to point kP coordinate y + \retval flag indicating whether the signature operation was successful +*/ +uint8_t pkcau_ecdsa_sign_operation(pkcau_hash_parameter_struct *hash_para, \ + const pkcau_ec_group_parameter_struct *curve_group_para, \ + pkcau_ecc_out_struct *result) +{ + uint8_t res = 2U; + + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + + /* write the curve prime order n length, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ + pkcau_memcpy_value(0x00000400U, (curve_group_para->order_n_len << 3)); + pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); + pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); + + /* write the curve coefficient a to PKCAU RAM */ + pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); + /* write the curve modulus p to PKCAU RAM */ + pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); + /* write the integer k to PKCAU RAM */ + pkcau_memcpy_operand(0x00000508U, curve_group_para->integer_k, curve_group_para->integer_k_len); + /* write the curve base point coordinate x to PKCAU RAM */ + pkcau_memcpy_operand(0x0000055CU, curve_group_para->base_point_x, curve_group_para->base_point_x_len); + /* write the curve base point coordinate y to PKCAU RAM */ + pkcau_memcpy_operand(0x000005B0U, curve_group_para->base_point_y, curve_group_para->base_point_y_len); + /* write the hash value z and hash value z length in byte to PKCAU RAM */ + pkcau_memcpy_operand(0x00000DE8U, hash_para->hash_z, hash_para->hash_z_len); + /* write the private key d to PKCAU RAM */ + pkcau_memcpy_operand(0x00000E3CU, curve_group_para->private_key_d, curve_group_para->private_key_d_len); + /* write the curve prime order n to PKCAU RAM */ + pkcau_memcpy_operand(0x00000E94U, curve_group_para->order_n, curve_group_para->order_n_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_ECDSA_SIGN); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + /* read results from RAM address */ + pkcau_memread(0x700U, (uint8_t *)result->sign_r, curve_group_para->order_n_len); + pkcau_memread(0x754U, (uint8_t *)result->sign_s, curve_group_para->order_n_len); + pkcau_memread(0xEE8U, (uint8_t *)&res, 1U); + if(0U != result->sign_extra) { + pkcau_memread(0x103CU, (uint8_t *)result->point_x, curve_group_para->order_n_len); + pkcau_memread(0x1090U, (uint8_t *)result->point_y, curve_group_para->order_n_len); + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); + + return res; +} + +/*! + \brief execute ECDSA verification operation + This function can only be used when interrupt is not enabled + \param[in] point_para: PKCAU point struct + point_x: point coordinate x + point_x_len: point coordinate x length in byte + point_y: point coordinate y + point_y_len: point coordinate y length in byte + \param[in] hash_para: hash struct + hash_z: hash value z + hash_z_len: hash value z length in byte + \param[in] signature_para: signature struct + sign_r: signature part r + sign_r_len: signature part r lnegth in byte + sign_s: signature part s + sign_s_len: signature part s lnegth in byte + \param[in] curve_group_para: PKCAU ECC curve paramter struct + modulus_p: curve modulus p + modulus_p_len: curve modulus p length in byte + coff_a: curve coefficient a + coff_a_len: curve coefficient a length in byte + coff_b: curve coefficient b + coff_b_len: curve coefficient b length in byte + base_point_x: curve base point coordinate x + base_point_x_len: curve base point coordinate x length in byte + base_point_y: curve base point coordinate y + base_point_y_len: curve base point coordinate y length in byte + order_n: curve prime order n + order_n_len: curve prime order n length in byte + a_sign: curve coefficient a sign + + multi_k: scalar multiplier k + multi_k_len: scalar multiplier k length in byte + integer_k: integer k length in byte + integer_k_len: integer k length in byte + private_key_d: private key d + private_key_d_len: private key d length in byte + mont_para: montgomery parameter R2 mod n + mont_para_len: montgomery parameter R2 mod n length in byte + \param[out] none + \retval flag indicating whether the signature verification operation was successful +*/ +uint8_t pkcau_ecdsa_verification_operation(pkcau_point_parameter_struct *point_para, \ + pkcau_hash_parameter_struct *hash_para, \ + pkcau_signature_parameter_struct *signature_para, \ + const pkcau_ec_group_parameter_struct *curve_group_para) +{ + uint8_t res = 1U; + + /* reset PKCAU */ + pkcau_deinit(); + /* enable PKCAU */ + pkcau_enable(); + /* wait for PKCAU busy flag to reset */ + while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ + } + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + + /* write the curve prime order n length, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ + pkcau_memcpy_value(0x00000404U, (curve_group_para->order_n_len << 3)); + pkcau_memcpy_value(0x000004B4U, (curve_group_para->modulus_p_len << 3)); + pkcau_memcpy_value(0x0000045CU, curve_group_para->a_sign); + + /* write the curve coefficient a to PKCAU RAM */ + pkcau_memcpy_operand(0x00000460U, curve_group_para->coff_a, curve_group_para->coff_a_len); + /* write the curve modulus p to PKCAU RAM */ + pkcau_memcpy_operand(0x000004B8U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); + /* write the curve base point coordinate x to PKCAU RAM */ + pkcau_memcpy_operand(0x000005E8U, curve_group_para->base_point_x, curve_group_para->base_point_x_len); + /* write the curve base point coordinate y to PKCAU RAM */ + pkcau_memcpy_operand(0x0000063CU, curve_group_para->base_point_y, curve_group_para->base_point_y_len); + /* write the point coordinate x to PKCAU RAM */ + pkcau_memcpy_operand(0x00000F40U, point_para->point_x, point_para->point_x_len); + /* write the point coordinate y to PKCAU RAM */ + pkcau_memcpy_operand(0x00000F94U, point_para->point_y, point_para->point_y_len); + /* write the signature part r to PKCAU RAM */ + pkcau_memcpy_operand(0x000001098U, signature_para->sign_r, signature_para->sign_r_len); + /* write the signature part s to PKCAU RAM */ + pkcau_memcpy_operand(0x00000A44U, signature_para->sign_s, signature_para->sign_s_len); + /* write the hash value z and hash value z length in byte to PKCAU RAM */ + pkcau_memcpy_operand(0x00000FE8U, hash_para->hash_z, hash_para->hash_z_len); + /* write the curve prime order n to PKCAU RAM */ + pkcau_memcpy_operand(0x00000D5CU, curve_group_para->order_n, curve_group_para->order_n_len); + /* configure the operation mode */ + pkcau_mode_set(PKCAU_MODE_ECDSA_VERIFICATION); + /* start computation */ + pkcau_start(); + + /* wait for PKCAU operation completed */ + while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ + } + pkcau_memread(0x5B0U, (uint8_t *)&res, 1U); + /* clear end flag */ + pkcau_flag_clear(PKCAU_FLAG_END); + /* disable PKCAU */ + pkcau_disable(); + + return res; +} + +/*! + \brief get PKCAU flag status + \param[in] flag: PKCAU flags + only one parameter can be selected which is shown as below: + \arg PKCAU_FLAG_ADDRERR: address error flag + \arg PKCAU_FLAG_RAMERR: PKCAU RAM error flag + \arg PKCAU_FLAG_END: end of PKCAU operation flag + \arg PKCAU_FLAG_BUSY: busy flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus pkcau_flag_get(uint32_t flag) +{ + if(RESET != (PKCAU_STAT & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear PKCAU flag status + \param[in] flag: PKCAU flags + one or more parameters can be selected which is shown as below: + \arg PKCAU_FLAG_ADDRERR: address error flag + \arg PKCAU_FLAG_RAMERR: PKCAU RAM error flag + \arg PKCAU_FLAG_END: end of PKCAU operation flag + \param[out] none + \retval none +*/ +void pkcau_flag_clear(uint32_t flag) +{ + switch(flag) { + /* clear address error flag */ + case PKCAU_FLAG_ADDRERR: + PKCAU_STATC |= PKCAU_STATC_ADDRERRC; + break; + /* clear PKCAU RAM error flag */ + case PKCAU_FLAG_RAMERR: + PKCAU_STATC |= PKCAU_STATC_RAMERRC; + break; + /* clear end of PKCAU operation flag */ + case PKCAU_FLAG_END: + PKCAU_STATC |= PKCAU_STATC_ENDFC; + break; + default : + break; + } +} + +/*! + \brief enable PKCAU interrupt + \param[in] interrupt: interrupt type + one or more parameters can be selected which is shown as below: + \arg PKCAU_INT_ADDRERR: address error interrupt + \arg PKCAU_INT_RAMERR: PKCAU RAM error interrupt + \arg PKCAU_INT_END: end of PKCAU operation interrupt + \param[out] none + \retval none +*/ +void pkcau_interrupt_enable(uint32_t interrupt) +{ + PKCAU_CTL |= interrupt; +} + +/*! + \brief disable PKCAU interrupt + \param[in] interrupt: interrupt type + one or more parameters can be selected which is shown as below: + \arg PKCAU_INT_ADDRERR: address error interrupt + \arg PKCAU_INT_RAMERR: PKCAU RAM error interrupt + \arg PKCAU_INT_END: end of PKCAU operation interrupt + \param[out] none + \retval none +*/ +void pkcau_interrupt_disable(uint32_t interrupt) +{ + PKCAU_CTL &= ~(interrupt); +} + +/*! + \brief get PKCAU interrupt flag status + \param[in] int_flag: PKCAU interrupt flags + only one parameter can be selected which is shown as below: + \arg PKCAU_INT_FLAG_ADDRERR: address error interrupt flag + \arg PKCAU_INT_FLAG_RAMERR: PKCAU RAM error interrupt flag + \arg PKCAU_INT_FLAG_END: end of PKCAU operation interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus pkcau_interrupt_flag_get(uint32_t int_flag) +{ + uint32_t reg1 = PKCAU_CTL; + uint32_t reg2 = PKCAU_STAT; + + switch(int_flag) { + /* clear address error interrupt flag */ + case PKCAU_INT_FLAG_ADDRERR: + reg1 = reg1 & PKCAU_CTL_ADDRERRIE; + reg2 = reg2 & PKCAU_STAT_ADDRERR; + break; + /* clear RAM error interrupt flag */ + case PKCAU_INT_FLAG_RAMERR: + reg1 = reg1 & PKCAU_CTL_RAMERRIE; + reg2 = reg2 & PKCAU_STAT_RAMERR; + break; + /* clear end of PKCAU operation interrupt flag */ + case PKCAU_INT_FLAG_ENDF: + reg1 = reg1 & PKCAU_CTL_ENDIE; + reg2 = reg2 & PKCAU_STAT_ENDF; + break; + default : + break; + } + /*get PKCAU interrupt flag status */ + if(reg1 && reg2) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear PKCAU interrupt flag status + \param[in] int_flag: PKCAU interrupt flags + only one parameter can be selected which is shown as below: + \arg PKCAU_INT_FLAG_ADDRERR: address error interrupt flag + \arg PKCAU_INT_FLAG_RAMERR: PKCAU RAM error interrupt flag + \arg PKCAU_INT_FLAG_END: end of PKCAU operation interrupt flag + \param[out] none + \retval none +*/ +void pkcau_interrupt_flag_clear(uint32_t int_flag) +{ + switch(int_flag) { + /* clear address error interrupt flag */ + case PKCAU_INT_FLAG_ADDRERR: + PKCAU_STATC |= PKCAU_STATC_ADDRERRC; + break; + /* clear PKCAU RAM error interrupt flag */ + case PKCAU_INT_FLAG_RAMERR: + PKCAU_STATC |= PKCAU_STATC_RAMERRC; + break; + /* clear end of PKCAU operation interrupt flag */ + case PKCAU_INT_FLAG_ENDF: + PKCAU_STATC |= PKCAU_STATC_ENDFC; + break; + default: + break; + } +} + +/*! + \brief copy normal 32-bit value to PKCAU RAM + \param[in] offset: RAM address offset to PKCAU base address + \param[in] value: the value needed to write into PKCAU RAM + \param[out] none + \retval none +*/ +static void pkcau_memcpy_value(uint32_t offset, uint32_t value) +{ + uint32_t *addr = (uint32_t *)((uint32_t)(PKCAU_BASE + offset)); + *addr = value; +} + +/*! + \brief copy operand with EOS or ROS to PKCAU RAM + \param[in] offset: RAM address offset to PKCAU base address + \param[in] operand: the big endian operand vector, the left most byte of the value should be in the first element of the vector. + If input data is little endian, please flip it in application code. + \param[in] size: operand vector length in byte + \retval none +*/ +static void pkcau_memcpy_operand(uint32_t offset, const uint8_t operand[], uint32_t size) +{ + uint32_t data = 0U, i = 0U, j = 0U; + + while(size >= 4U) { + /* convert the big endian operand vector to little endian parameter to input to PKCAU RAM */ + data = (uint32_t)((uint32_t)operand[size - 1U] | ((uint32_t)operand[size - 2U] << 8U) | (( + uint32_t)operand[size - 3U] << 16U) | ((uint32_t)operand[size - 4U] << 24U)); + *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = data; + i = i + 4U; + size -= 4U; + } + /* convert the big endian operand vector to little endian parameter to input to PKCAU RAM which is not a multiple of four */ + if(size > 0U) { + data = 0U; + for(j = 0U; j < size; j++) { + data = (uint32_t)((data << 8U) | (uint32_t)operand[j]); + } + *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = data; + i = i + 4U; + } + + /* an additional word 0x00000000 is expected by the PKCAU */ + *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = 0x00000000U; +} + +/*! + \brief read result from PKCAU RAM + \param[in] offset: RAM address offset to PKCAU base address + \param[out] buf: big endian result buffer, the left most byte from the PKCAU should be in the first element of buffer + If need output data is little endian, please flip it in application code. + \param[in] size: number of byte to read + \retval none +*/ +static void pkcau_memread(uint32_t offset, uint8_t buf[], uint32_t size) +{ + uint32_t data = 0U, i = 0U, j = 0U; + + /* read data from PKCAU RAM */ + while(size >= 4U) { + data = *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)); + i = i + 4U; + + /* data in PKCAU RAM is big endian */ + buf[size - 1U] = (uint8_t)(data & 0xffU); + buf[size - 2U] = (uint8_t)((data >> 8U) & 0xffU); + buf[size - 3U] = (uint8_t)((data >> 16U) & 0xffU); + buf[size - 4U] = (uint8_t)((data >> 24U) & 0xffU); + size -= 4U; + } + /* read data from PKCAU RAM which is not a multiple of four */ + if(size > 0U) { + data = *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)); + for(j = 0U; j < size; j++) { + buf[j] = (uint8_t)((data >> ((size - 1U - j) * 8U)) & 0xffU); + } + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c new file mode 100644 index 00000000000..440161dbc17 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c @@ -0,0 +1,394 @@ +/*! + \file gd32f5xx_pmu.c + \brief PMU driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_pmu.h" + +/*! + \brief reset PMU registers + \param[in] none + \param[out] none + \retval none +*/ +void pmu_deinit(void) +{ + /* reset PMU */ + rcu_periph_reset_enable(RCU_PMURST); + rcu_periph_reset_disable(RCU_PMURST); +} + +/*! + \brief select low voltage detector threshold + \param[in] lvdt_n: + \arg PMU_LVDT_0: voltage threshold is 2.1V + \arg PMU_LVDT_1: voltage threshold is 2.3V + \arg PMU_LVDT_2: voltage threshold is 2.4V + \arg PMU_LVDT_3: voltage threshold is 2.6V + \arg PMU_LVDT_4: voltage threshold is 2.7V + \arg PMU_LVDT_5: voltage threshold is 2.9V + \arg PMU_LVDT_6: voltage threshold is 3.0V + \arg PMU_LVDT_7: voltage threshold is 3.1V + \param[out] none + \retval none +*/ +void pmu_lvd_select(uint32_t lvdt_n) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; + /* clear LVDT bits */ + PMU_CTL &= ~PMU_CTL_LVDT; + /* set LVDT bits according to pmu_lvdt_n */ + PMU_CTL |= lvdt_n; + /* enable LVD */ + PMU_CTL |= PMU_CTL_LVDEN; +} + +/*! + \brief disable PMU lvd + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lvd_disable(void) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; +} + +/*! + \brief select LDO output voltage + this bit set by software when the main PLL closed, before closing PLL, change the system clock to IRC16M or HXTAL + \param[in] ldo_output: + \arg PMU_LDOVS_LOW: low-driver mode enable in deep-sleep mode + \arg PMU_LDOVS_MID: mid-driver mode disable in deep-sleep mode + \arg PMU_LDOVS_HIGH: high-driver mode disable in deep-sleep mode + \param[out] none + \retval none +*/ +void pmu_ldo_output_select(uint32_t ldo_output) +{ + PMU_CTL &= ~PMU_CTL_LDOVS; + PMU_CTL |= ldo_output; +} + +/*! + \brief enable high-driver mode + this bit set by software only when IRC16M or HXTAL used as system clock + \param[in] none + \param[out] none + \retval none +*/ +void pmu_highdriver_mode_enable(void) +{ + PMU_CTL |= PMU_CTL_HDEN; +} + +/*! + \brief disable high-driver mode + \param[in] none + \param[out] none + \retval none +*/ +void pmu_highdriver_mode_disable(void) +{ + PMU_CTL &= ~PMU_CTL_HDEN; +} + +/*! + \brief switch high-driver mode + this bit set by software only when IRC16M or HXTAL used as system clock + \param[in] highdr_switch: + \arg PMU_HIGHDR_SWITCH_NONE: disable high-driver mode switch + \arg PMU_HIGHDR_SWITCH_EN: enable high-driver mode switch + \param[out] none + \retval none +*/ +void pmu_highdriver_switch_select(uint32_t highdr_switch) +{ + /* wait for HDRF flag set */ + while(SET != pmu_flag_get(PMU_FLAG_HDRF)) { + } + PMU_CTL &= ~PMU_CTL_HDS; + PMU_CTL |= highdr_switch; +} + +/*! + \brief enable low-driver mode in deep-sleep + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lowdriver_mode_enable(void) +{ + PMU_CTL |= PMU_CTL_LDEN; +} + +/*! + \brief disable low-driver mode in deep-sleep + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lowdriver_mode_disable(void) +{ + PMU_CTL &= ~PMU_CTL_LDEN; +} + +/*! + \brief in deep-sleep mode, driver mode when use low power LDO + \param[in] mode: + \arg PMU_NORMALDR_LOWPWR: normal driver when use low power LDO + \arg PMU_LOWDR_LOWPWR: low-driver mode enabled when LDEN is 11 and use low power LDO + \param[out] none + \retval none +*/ +void pmu_lowpower_driver_config(uint32_t mode) +{ + PMU_CTL &= ~PMU_CTL_LDLP; + PMU_CTL |= mode; +} + +/*! + \brief in deep-sleep mode, driver mode when use normal power LDO + \param[in] mode: + \arg PMU_NORMALDR_NORMALPWR: normal driver when use normal power LDO + \arg PMU_LOWDR_NORMALPWR: low-driver mode enabled when LDEN is 11 and use normal power LDO + \param[out] none + \retval none +*/ +void pmu_normalpower_driver_config(uint32_t mode) +{ + PMU_CTL &= ~PMU_CTL_LDNP; + PMU_CTL |= mode; +} + +/*! + \brief PMU work in sleep mode + \param[in] sleepmodecmd: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_sleepmode(uint8_t sleepmodecmd) +{ + /* clear sleepdeep bit of Cortex-M33 system control register */ + SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + /* select WFI or WFE command to enter sleep mode */ + if(WFI_CMD == sleepmodecmd) { + __WFI(); + } else { + __WFE(); + __WFE(); + } +} + +/*! + \brief PMU work in deep-sleep mode + \param[in] ldo + \arg PMU_LDO_NORMAL: LDO normal work when pmu enter deep-sleep mode + \arg PMU_LDO_LOWPOWER: LDO work at low power mode when pmu enter deep-sleep mode + \param[in] lowdrive: + only one parameter can be selected which is shown as below: + \arg PMU_LOWDRIVER_DISABLE: Low-driver mode disable in deep-sleep mode + \arg PMU_LOWDRIVER_ENABLE: Low-driver mode enable in deep-sleep mode + \param[in] deepsleepmodecmd: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd) +{ + /* clear stbmod and ldolp bits */ + PMU_CTL &= ~((uint32_t)(PMU_CTL_STBMOD | PMU_CTL_LDOLP | PMU_CTL_LDEN | PMU_CTL_LDNP | PMU_CTL_LDLP)); + + /* set ldolp bit according to pmu_ldo */ + PMU_CTL |= ldo; + + /* configure low drive mode in deep-sleep mode */ + if(PMU_LOWDRIVER_ENABLE == lowdrive) { + if(PMU_LDO_NORMAL == ldo) { + PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDNP); + } else { + PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDLP); + } + } + /* set sleepdeep bit of Cortex-M33 system control register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* select WFI or WFE command to enter deep-sleep mode */ + if(WFI_CMD == deepsleepmodecmd) { + __WFI(); + } else { + __SEV(); + __WFE(); + __WFE(); + } + + /* reset sleepdeep bit of Cortex-M33 system control register */ + SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); +} + +/*! + \brief pmu work in standby mode + \param[in] none + \param[out] none + \retval none +*/ +void pmu_to_standbymode(void) +{ + /* set stbmod bit */ + PMU_CTL |= PMU_CTL_STBMOD; + + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + + /* set sleepdeep bit of Cortex-M33 system control register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + REG32(0xE000E010U) &= 0x00010004U; + REG32(0xE000E180U) = 0XFFFFFFF3U; + REG32(0xE000E184U) = 0XFFFFFDFFU; + REG32(0xE000E188U) = 0xFFFFFFFFU; + REG32(0xE000E18CU) = 0xFFFFFFFFU; + + /* select WFI command to enter standby mode */ + __WFI(); +} + +/*! + \brief enable PMU wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_enable(void) +{ + PMU_CS |= PMU_CS_WUPEN; +} + +/*! + \brief disable PMU wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_disable(void) +{ + PMU_CS &= ~PMU_CS_WUPEN; +} + +/*! + \brief backup SRAM LDO on + \param[in] bkp_ldo: + \arg PMU_BLDOON_OFF: backup SRAM LDO closed + \arg PMU_BLDOON_ON: open the backup SRAM LDO + \param[out] none + \retval none +*/ +void pmu_backup_ldo_config(uint32_t bkp_ldo) +{ + PMU_CS &= ~PMU_CS_BLDOON; + PMU_CS |= bkp_ldo; +} + +/*! + \brief enable write access to the registers in backup domain + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_enable(void) +{ + PMU_CTL |= PMU_CTL_BKPWEN; +} + +/*! + \brief disable write access to the registers in backup domain + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_disable(void) +{ + PMU_CTL &= ~PMU_CTL_BKPWEN; +} + +/*! + \brief get flag state + \param[in] flag: + \arg PMU_FLAG_WAKEUP: wakeup flag + \arg PMU_FLAG_STANDBY: standby flag + \arg PMU_FLAG_LVD: lvd flag + \arg PMU_FLAG_BLDORF: backup SRAM LDO ready flag + \arg PMU_FLAG_LDOVSRF: LDO voltage select ready flag + \arg PMU_FLAG_HDRF: high-driver ready flag + \arg PMU_FLAG_HDSRF: high-driver switch ready flag + \arg PMU_FLAG_LDRF: low-driver mode ready flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus pmu_flag_get(uint32_t flag) +{ + if(PMU_CS & flag) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear flag bit + \param[in] flag: + \arg PMU_FLAG_RESET_WAKEUP: reset wakeup flag + \arg PMU_FLAG_RESET_STANDBY: reset standby flag + \param[out] none + \retval none +*/ +void pmu_flag_clear(uint32_t flag) +{ + switch(flag) { + case PMU_FLAG_RESET_WAKEUP: + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + break; + case PMU_FLAG_RESET_STANDBY: + /* reset standby flag */ + PMU_CTL |= PMU_CTL_STBRST; + break; + default : + break; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c new file mode 100644 index 00000000000..56ddebbfb23 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c @@ -0,0 +1,1473 @@ +/*! + \file gd32f5xx_rcu.c + \brief RCU driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_rcu.h" + +/* define clock source */ +#define SEL_IRC16M ((uint16_t)0U) /* IRC16M is selected as CK_SYS */ +#define SEL_HXTAL ((uint16_t)1U) /* HXTAL is selected as CK_SYS */ +#define SEL_PLLP ((uint16_t)2U) /* PLLP is selected as CK_SYS */ +/* define startup timeout count */ +#define OSC_STARTUP_TIMEOUT ((uint32_t)0x000fffffU) +#define LXTAL_STARTUP_TIMEOUT ((uint32_t)0x0fffffffU) + +/* RCU IRC16M adjust value mask and offset*/ +#define RCU_IRC16M_ADJUST_MASK ((uint8_t)0x1FU) +#define RCU_IRC16M_ADJUST_OFFSET ((uint32_t)3U) + +/*! + \brief deinitialize the RCU + \param[in] none + \param[out] none + \retval none +*/ +void rcu_deinit(void) +{ + /* enable IRC16M */ + RCU_CTL |= RCU_CTL_IRC16MEN; + rcu_osci_stab_wait(RCU_IRC16M); + RCU_CFG0 &= ~RCU_CFG0_SCS; + + /* reset CTL register */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN | RCU_CTL_PLLI2SEN + | RCU_CTL_PLLSAIEN); + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + /* reset CFG0 register */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_RTCDIV | RCU_CFG0_CKOUT0SEL | RCU_CFG0_I2SSEL | RCU_CFG0_CKOUT0DIV | + RCU_CFG0_CKOUT1DIV | RCU_CFG0_CKOUT1SEL); + /* reset PLL register */ + RCU_PLL = 0x24003010U; + /* reset PLLI2S register */ + RCU_PLLI2S = 0x24003000U; + /* reset PLLSAI register */ + RCU_PLLSAI = 0x24003010U; + /* reset INT register */ + RCU_INT = 0x00000000U; + /* reset CFG1 register */ + RCU_CFG1 &= ~(RCU_CFG1_PLLSAIRDIV | RCU_CFG1_TIMERSEL); +} + +/*! + \brief enable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x = A, B, C, D, E, F, G, H, I): GPIO ports clock + \arg RCU_CRC: CRC clock + \arg RCU_BKPSRAM: BKPSRAM clock + \arg RCU_TCMSRAM: TCMSRAM clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_IPA: IPA clock + \arg RCU_ENET: ENET clock + \arg RCU_ENETTX: ENETTX clock + \arg RCU_ENETRX: ENETRX clock + \arg RCU_ENETPTP: ENETPTP clock + \arg RCU_USBHS: USBHS clock + \arg RCU_USBHSULPI: USBHSULPI clock + \arg RCU_DCI: DCI clock + \arg RCU_PKCAU: PKCAU clock + \arg RCU_CAU: CAU clock + \arg RCU_HAU: HAU clock + \arg RCU_TRNG: TRNG clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x = 0, 1, 2, 3, 4, 5): SPI clock + \arg RCU_SAI: SAI clock + \arg RCU_USARTx (x = 0, 1, 2, 5): USART clock + \arg RCU_UARTx (x = 3, 4, 6, 7): UART clock + \arg RCU_I2Cx (x = 0, 1, 2, 3, 4, 5): I2C clock + \arg RCU_CANx (x = 0, 1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x = 0, 1, 2): ADC clock + \arg RCU_SDIO: SDIO clock + \arg RCU_SYSCFG: SYSCFG clock + \arg RCU_TLI: TLI clock + \arg RCU_CTC: CTC clock + \arg RCU_IREF: IREF clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_enable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x = A, B, C, D, E, F, G, H, I): GPIO ports clock + \arg RCU_CRC: CRC clock + \arg RCU_BKPSRAM: BKPSRAM clock + \arg RCU_TCMSRAM: TCMSRAM clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_IPA: IPA clock + \arg RCU_ENET: ENET clock + \arg RCU_ENETTX: ENETTX clock + \arg RCU_ENETRX: ENETRX clock + \arg RCU_ENETPTP: ENETPTP clock + \arg RCU_USBHS: USBHS clock + \arg RCU_USBHSULPI: USBHSULPI clock + \arg RCU_DCI: DCI clock + \arg RCU_PKCAU: PKCAU clock + \arg RCU_CAU: CAU clock + \arg RCU_HAU: HAU clock + \arg RCU_TRNG: TRNG clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x = 0, 1, 2, 3, 4, 5): SPI clock + \arg RCU_SAI: SAI clock + \arg RCU_USARTx (x = 0, 1, 2, 5): USART clock + \arg RCU_UARTx (x = 3, 4, 6, 7): UART clock + \arg RCU_I2Cx (x = 0, 1, 2, 3, 4, 5): I2C clock + \arg RCU_CANx (x = 0, 1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x = 0, 1, 2): ADC clock + \arg RCU_SDIO: SDIO clock + \arg RCU_SYSCFG: SYSCFG clock + \arg RCU_TLI: TLI clock + \arg RCU_CTC: CTC clock + \arg RCU_IREF: IREF clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_disable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief enable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx_SLP (x = A, B, C, D, E, F, G, H, I): GPIO ports clock + \arg RCU_CRC_SLP: CRC clock + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM0_SLP: SRAM0 clock + \arg RCU_SRAM1_SLP: SRAM1 clock + \arg RCU_BKPSRAM: BKPSRAM clock + \arg RCU_SRAM2_SLP: SRAM2 clock + \arg RCU_DMAx_SLP (x=0,1): DMA clock + \arg RCU_IPA_SLP: IPA clock + \arg RCU_ENET_SLP: ENET clock + \arg RCU_ENETTX_SLP: ENETTX clock + \arg RCU_ENETRX_SLP: ENETRX clock + \arg RCU_ENETPTP_SLP: ENETPTP clock + \arg RCU_USBHS_SLP: USBHS clock + \arg RCU_USBHSULPI_SLP: USBHSULPI clock + \arg RCU_DCI_SLP: DCI clock + \arg RCU_PKCAU_SLP: PKCAU clock + \arg RCU_CAU_SLP: CAU clock + \arg RCU_HAU_SLP: HAU clock + \arg RCU_TRNG_SLP: TRNG clock + \arg RCU_USBFS_SLP: USBFS clock + \arg RCU_EXMC_SLP: EXMC clock + \arg RCU_TIMERx_SLP (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock + \arg RCU_WWDGT_SLP: WWDGT clock + \arg RCU_SPIx_SLP (x = 0, 1, 2, 3, 4, 5): SPI clock + \arg RCU_SAI_SLP: SAI clock + \arg RCU_USARTx_SLP (x = 0, 1, 2, 5): USART clock + \arg RCU_UARTx_SLP (x = 3, 4, 6, 7): UART clock + \arg RCU_I2Cx_SLP (x = 0, 1, 2, 3, 4, 5): I2C clock + \arg RCU_CANx_SLP (x = 0, 1): CAN clock + \arg RCU_PMU_SLP: PMU clock + \arg RCU_DAC_SLP: DAC clock + \arg RCU_RTC_SLP: RTC clock + \arg RCU_ADCx_SLP (x = 0, 1, 2): ADC clock + \arg RCU_SDIO_SLP: SDIO clock + \arg RCU_SYSCFG_SLP: SYSCFG clock + \arg RCU_TLI_SLP: TLI clock + \arg RCU_CTC_SLP: CTC clock + \arg RCU_IREF_SLP: IREF clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx_SLP (x = A, B, C, D, E, F, G, H, I): GPIO ports clock + \arg RCU_CRC_SLP: CRC clock + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM0_SLP: SRAM0 clock + \arg RCU_SRAM1_SLP: SRAM1 clock + \arg RCU_BKPSRAM: BKPSRAM clock + \arg RCU_SRAM2_SLP: SRAM2 clock + \arg RCU_DMAx_SLP (x=0,1): DMA clock + \arg RCU_IPA_SLP: IPA clock + \arg RCU_ENET_SLP: ENET clock + \arg RCU_ENETTX_SLP: ENETTX clock + \arg RCU_ENETRX_SLP: ENETRX clock + \arg RCU_ENETPTP_SLP: ENETPTP clock + \arg RCU_USBHS_SLP: USBHS clock + \arg RCU_USBHSULPI_SLP: USBHSULPI clock + \arg RCU_DCI_SLP: DCI clock + \arg RCU_PKCAU_SLP: PKCAU clock + \arg RCU_CAU_SLP: CAU clock + \arg RCU_HAU_SLP: HAU clock + \arg RCU_TRNG_SLP: TRNG clock + \arg RCU_USBFS_SLP: USBFS clock + \arg RCU_EXMC_SLP: EXMC clock + \arg RCU_TIMERx_SLP (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock + \arg RCU_WWDGT_SLP: WWDGT clock + \arg RCU_SPIx_SLP (x = 0, 1, 2, 3, 4, 5): SPI clock + \arg RCU_SAI_SLP: SAI clock + \arg RCU_USARTx_SLP (x = 0, 1, 2, 5): USART clock + \arg RCU_UARTx_SLP (x = 3, 4, 6, 7): UART clock + \arg RCU_I2Cx_SLP (x = 0, 1, 2, 3, 4, 5): I2C clock + \arg RCU_CANx_SLP (x = 0, 1): CAN clock + \arg RCU_PMU_SLP: PMU clock + \arg RCU_DAC_SLP: DAC clock + \arg RCU_RTC_SLP: RTC clock + \arg RCU_ADCx_SLP (x = 0, 1, 2): ADC clock + \arg RCU_SDIO_SLP: SDIO clock + \arg RCU_SYSCFG_SLP: SYSCFG clock + \arg RCU_TLI_SLP: TLI clock + \arg RCU_CTC_SLP: CTC clock + \arg RCU_IREF_SLP: IREF clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief reset the peripherals + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x = A, B, C, D, E, F, G, H, I): reset GPIO ports + \arg RCU_CRCRST: reset CRC + \arg RCU_DMAxRST (x=0,1): reset DMA + \arg RCU_IPARST: reset IPA + \arg RCU_ENETRST: reset ENET + \arg RCU_USBHSRST: reset USBHS + \arg RCU_DCIRST: reset DCI + \arg RCU_PKCAURST: reset PKCAU + \arg RCU_CAURST: reset CAU + \arg RCU_HAURST: reset HAU + \arg RCU_TRNGRST: reset TRNG + \arg RCU_USBFSRST: reset USBFS + \arg RCU_EXMCRST: reset EXMC + \arg RCU_TIMERxRST (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x = 0, 1, 2, 3, 4, 5): reset SPI + \arg RCU_SAIRST (x = 0, 1, 2, 3, 4, 5): reset SAI + \arg RCU_USARTxRST (x = 0, 1, 2, 5): reset USART + \arg RCU_UARTxRST (x = 3, 4, 6, 7): reset UART + \arg RCU_I2CxRST (x = 0, 1, 2, 3, 4, 5): reset I2C + \arg RCU_CANxRST (x = 0, 1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCRST (x = 0, 1, 2): reset ADC + \arg RCU_SDIORST: reset SDIO + \arg RCU_SYSCFGRST: reset SYSCFG + \arg RCU_TLIRST: reset TLI + \arg RCU_CTCRST: reset CTC + \arg RCU_IREFRST: reset IREF + \param[out] none + \retval none +*/ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) |= BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief disable reset the peripheral + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x = A, B, C, D, E, F, G, H, I): reset GPIO ports + \arg RCU_CRCRST: reset CRC + \arg RCU_DMAxRST (x=0,1): reset DMA + \arg RCU_IPARST: reset IPA + \arg RCU_ENETRST: reset ENET + \arg RCU_USBHSRST: reset USBHS + \arg RCU_DCIRST: reset DCI + \arg RCU_PKCAURST: reset PKCAU + \arg RCU_CAURST: reset CAU + \arg RCU_HAURST: reset HAU + \arg RCU_TRNGRST: reset TRNG + \arg RCU_USBFSRST: reset USBFS + \arg RCU_EXMCRST: reset EXMC + \arg RCU_TIMERxRST (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x = 0, 1, 2, 3, 4, 5): reset SPI + \arg RCU_SAIRST (x = 0, 1, 2, 3, 4, 5): reset SAI + \arg RCU_USARTxRST (x = 0, 1, 2, 5): reset USART + \arg RCU_UARTxRST (x = 3, 4, 6, 7): reset UART + \arg RCU_I2CxRST (x = 0, 1, 2, 3, 4, 5): reset I2C + \arg RCU_CANxRST (x = 0, 1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCRST (x = 0, 1, 2): reset ADC + \arg RCU_SDIORST: reset SDIO + \arg RCU_SYSCFGRST: reset SYSCFG + \arg RCU_TLIRST: reset TLI + \arg RCU_CTCRST: reset CTC + \arg RCU_IREFRST: reset IREF + \param[out] none + \retval none +*/ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) &= ~BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief reset the BKP + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_enable(void) +{ + RCU_BDCTL |= RCU_BDCTL_BKPRST; +} + +/*! + \brief disable the BKP reset + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_disable(void) +{ + RCU_BDCTL &= ~RCU_BDCTL_BKPRST; +} + +/*! + \brief configure the system clock source + \param[in] ck_sys: system clock source select + only one parameter can be selected which is shown as below: + \arg RCU_CKSYSSRC_IRC16M: select CK_IRC16M as the CK_SYS source + \arg RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source + \arg RCU_CKSYSSRC_PLLP: select CK_PLLP as the CK_SYS source + \param[out] none + \retval none +*/ +void rcu_system_clock_source_config(uint32_t ck_sys) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the SCS bits and set according to ck_sys */ + reg &= ~RCU_CFG0_SCS; + RCU_CFG0 = (reg | ck_sys); +} + +/*! + \brief get the system clock source + \param[in] none + \param[out] none + \retval which clock is selected as CK_SYS source + \arg RCU_SCSS_IRC16M: CK_IRC16M is selected as the CK_SYS source + \arg RCU_SCSS_HXTAL: CK_HXTAL is selected as the CK_SYS source + \arg RCU_SCSS_PLLP: CK_PLLP is selected as the CK_SYS source +*/ +uint32_t rcu_system_clock_source_get(void) +{ + return (RCU_CFG0 & RCU_CFG0_SCSS); +} + +/*! + \brief configure the AHB clock prescaler selection + \param[in] ck_ahb: AHB clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_AHB_CKSYS_DIVx (x = 1, 2, 4, 8, 16, 64, 128, 256, 512): select CK_SYS / x as CK_AHB + \param[out] none + \retval none +*/ +void rcu_ahb_clock_config(uint32_t ck_ahb) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the AHBPSC bits and set according to ck_ahb */ + reg &= ~RCU_CFG0_AHBPSC; + RCU_CFG0 = (reg | ck_ahb); +} + +/*! + \brief configure the APB1 clock prescaler selection + \param[in] ck_apb1: APB1 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1 + \arg RCU_APB1_CKAHB_DIV2: select CK_AHB / 2 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV4: select CK_AHB / 4 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV8: select CK_AHB / 8 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV16: select CK_AHB / 16 as CK_APB1 + \param[out] none + \retval none +*/ +void rcu_apb1_clock_config(uint32_t ck_apb1) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the APB1PSC and set according to ck_apb1 */ + reg &= ~RCU_CFG0_APB1PSC; + RCU_CFG0 = (reg | ck_apb1); +} + +/*! + \brief configure the APB2 clock prescaler selection + \param[in] ck_apb2: APB2 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2 + \arg RCU_APB2_CKAHB_DIV2: select CK_AHB / 2 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV4: select CK_AHB / 4 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV8: select CK_AHB / 8 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV16: select CK_AHB / 16 as CK_APB2 + \param[out] none + \retval none +*/ +void rcu_apb2_clock_config(uint32_t ck_apb2) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the APB2PSC and set according to ck_apb2 */ + reg &= ~RCU_CFG0_APB2PSC; + RCU_CFG0 = (reg | ck_apb2); +} + +/*! + \brief configure the CK_OUT0 clock source and divider + \param[in] ckout0_src: CK_OUT0 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CKOUT0SRC_IRC16M: IRC16M selected + \arg RCU_CKOUT0SRC_LXTAL: LXTAL selected + \arg RCU_CKOUT0SRC_HXTAL: HXTAL selected + \arg RCU_CKOUT0SRC_PLLP: PLLP selected + \param[in] ckout0_div: CK_OUT0 divider + \arg RCU_CKOUT0_DIVx(x = 1, 2, 3, 4, 5): CK_OUT0 is divided by x + \param[out] none + \retval none +*/ +void rcu_ckout0_config(uint32_t ckout0_src, uint32_t ckout0_div) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the CKOUT0SRC, CKOUT0DIV and set according to ckout0_src and ckout0_div */ + reg &= ~(RCU_CFG0_CKOUT0SEL | RCU_CFG0_CKOUT0DIV); + RCU_CFG0 = (reg | ckout0_src | ckout0_div); +} + +/*! + \brief configure the CK_OUT1 clock source and divider + \param[in] ckout1_src: CK_OUT1 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CKOUT1SRC_SYSTEMCLOCK: system clock selected + \arg RCU_CKOUT1SRC_PLLI2SR: PLLI2SR selected + \arg RCU_CKOUT1SRC_HXTAL: HXTAL selected + \arg RCU_CKOUT1SRC_PLLP: PLLP selected + \param[in] ckout1_div: CK_OUT1 divider + \arg RCU_CKOUT1_DIVx(x = 1, 2, 3, 4, 5): CK_OUT1 is divided by x + \param[out] none + \retval none +*/ +void rcu_ckout1_config(uint32_t ckout1_src, uint32_t ckout1_div) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the CKOUT1SRC, CKOUT1DIV and set according to ckout1_src and ckout1_div */ + reg &= ~(RCU_CFG0_CKOUT1SEL | RCU_CFG0_CKOUT1DIV); + RCU_CFG0 = (reg | ckout1_src | ckout1_div); +} + +/*! + \brief configure the main PLL clock + \param[in] pll_src: PLL clock source selection + \arg RCU_PLLSRC_IRC16M: select IRC16M as PLL source clock + \arg RCU_PLLSRC_HXTAL: select HXTAL as PLL source clock + \param[in] pll_psc: the PLL VCO source clock prescaler + \arg this parameter should be selected between 2 and 63 + \param[in] pll_n: the PLL VCO clock multi factor + \arg this parameter should be selected between 64 and 500 + \param[in] pll_p: the PLLP output frequency division factor from PLL VCO clock + \arg this parameter should be selected 2,4,6,8 + \param[in] pll_q: the PLL Q output frequency division factor from PLL VCO clock + \arg this parameter should be selected between 2 and 15 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_pll_config(uint32_t pll_src, uint32_t pll_psc, uint32_t pll_n, uint32_t pll_p, uint32_t pll_q) +{ + uint32_t ss_modulation_inc; + uint32_t ss_modulation_reg; + + ss_modulation_inc = 0U; + ss_modulation_reg = RCU_PLLSSCTL; + + /* calculate the minimum factor of PLLN */ + if((ss_modulation_reg & RCU_PLLSSCTL_SSCGON) == RCU_PLLSSCTL_SSCGON) { + if((ss_modulation_reg & RCU_SS_TYPE_DOWN) == RCU_SS_TYPE_DOWN) { + ss_modulation_inc += RCU_SS_MODULATION_DOWN_INC; + } else { + ss_modulation_inc += RCU_SS_MODULATION_CENTER_INC; + } + } + + /* check the function parameter */ + if(CHECK_PLL_PSC_VALID(pll_psc) && CHECK_PLL_N_VALID(pll_n, ss_modulation_inc) && + CHECK_PLL_P_VALID(pll_p) && CHECK_PLL_Q_VALID(pll_q)) { + RCU_PLL = pll_psc | (pll_n << 6) | (((pll_p >> 1) - 1U) << 16) | + (pll_src) | (pll_q << 24); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the PLLI2S_Q clock + \param[in] plli2s_n: the PLLI2S VCO clock multi factor + \arg this parameter should be selected between 50 and 500 + \param[in] plli2s_q: the PLLI2S Q output frequency division factor from PLLI2S VCO clock + \arg this parameter should be selected between 2 and 15 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_plli2s_q_config(uint32_t plli2s_n, uint32_t plli2s_q) +{ + /* check the function parameter */ + if(CHECK_PLLI2S_N_VALID(plli2s_n) && CHECK_PLLI2S_Q_VALID(plli2s_q)) { + RCU_PLLI2S = (plli2s_n << 6) | (plli2s_q << 24); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the PLLI2S_R clock + \param[in] plli2s_n: the PLLI2S VCO clock multi factor + \arg this parameter should be selected between 50 and 500 + \param[in] plli2s_r: the PLLI2S R output frequency division factor from PLLI2S VCO clock + \arg this parameter should be selected between 2 and 7 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_plli2s_r_config(uint32_t plli2s_n, uint32_t plli2s_r) +{ + /* check the function parameter */ + if(CHECK_PLLI2S_N_VALID(plli2s_n) && CHECK_PLLI2S_R_VALID(plli2s_r)) { + RCU_PLLI2S = (plli2s_n << 6) | (plli2s_r << 28); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the PLLSAI_P clock + \param[in] pllsai_n: the PLLSAI VCO clock multi factor + \arg this parameter should be selected between 50 and 500 + \param[in] pllsai_p: the PLLSAI P output frequency division factor from PLL VCO clock + \arg this parameter should be selected 2,4,6,8 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_pllsai_p_config(uint32_t pllsai_n, uint32_t pllsai_p) +{ + /* check the function parameter */ + if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_P_VALID(pllsai_p)) { + RCU_PLLSAI = (pllsai_n << 6U) | (((pllsai_p >> 1U) - 1U) << 16U); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the PLLSAI_Q clock + \param[in] pllsai_n: the PLLSAI VCO clock multi factor + \arg this parameter should be selected between 50 and 500 + \param[in] pllsai_q: the PLLSAI Q output frequency division factor from PLL VCO clock + \arg this parameter should be selected between 2 and 15 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_pllsai_q_config(uint32_t pllsai_n, uint32_t pllsai_q) +{ + /* check the function parameter */ + if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_Q_VALID(pllsai_q)) { + RCU_PLLSAI = (pllsai_n << 6U) | (pllsai_q << 24U); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the PLLSAI_R clock + \param[in] pllsai_n: the PLLSAI VCO clock multi factor + \arg this parameter should be selected between 50 and 500 + \param[in] pllsai_r: the PLLSAI R output frequency division factor from PLL VCO clock + \arg this parameter should be selected between 2 and 7 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_pllsai_r_config(uint32_t pllsai_n, uint32_t pllsai_r) +{ + /* check the function parameter */ + if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_R_VALID(pllsai_r)) { + RCU_PLLSAI = (pllsai_n << 6U) | (pllsai_r << 28U); + } else { + /* return status */ + return ERROR; + } + + /* return status */ + return SUCCESS; +} + +/*! + \brief configure the RTC clock source selection + \param[in] rtc_clock_source: RTC clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_RTCSRC_NONE: no clock selected + \arg RCU_RTCSRC_LXTAL: CK_LXTAL selected as RTC source clock + \arg RCU_RTCSRC_IRC32K: CK_IRC32K selected as RTC source clock + \arg RCU_RTCSRC_HXTAL_DIV_RTCDIV: CK_HXTAL / RTCDIV selected as RTC source clock + \param[out] none + \retval none +*/ +void rcu_rtc_clock_config(uint32_t rtc_clock_source) +{ + uint32_t reg; + + reg = RCU_BDCTL; + /* reset the RTCSRC bits and set according to rtc_clock_source */ + reg &= ~RCU_BDCTL_RTCSRC; + RCU_BDCTL = (reg | rtc_clock_source); +} + +/*! + \brief configure the frequency division of RTC clock when HXTAL was selected as its clock source + \param[in] rtc_div: RTC clock frequency division + only one parameter can be selected which is shown as below: + \arg RCU_RTC_HXTAL_NONE: no clock for RTC + \arg RCU_RTC_HXTAL_DIVx: RTCDIV clock select CK_HXTAL / x, x = 2....31 + \param[out] none + \retval none +*/ +void rcu_rtc_div_config(uint32_t rtc_div) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the RTCDIV bits and set according to rtc_div value */ + reg &= ~RCU_CFG0_RTCDIV; + RCU_CFG0 = (reg | rtc_div); +} + + +/*! + \brief configure the I2S clock source selection + \param[in] i2s_clock_source: I2S clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2SSRC_PLLI2S: CK_PLLI2S selected as I2S source clock + \arg RCU_I2SSRC_I2S_CKIN: external i2s_ckin pin selected as I2S source clock + \param[out] none + \retval none +*/ +void rcu_i2s_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the I2SSEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG0_I2SSEL; + RCU_CFG0 = (reg | i2s_clock_source); +} + +/*! + \brief configure the I2Cx(x=3,4,5) clock source selection + \param[in] i2c_idx: IDX_I2Cx(x=3,4,5) + \param[in] ck_i2c: I2C clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2CSRC_CKAPB1: CK_I2C select CK_APB1 + \arg RCU_I2CSRC_PLLSAIR: CK_I2C select CK_PLLSAIR + \arg RCU_I2CSRC_IRC16M: CK_I2C select IRC16M + \param[out] none + \retval none +*/ +void rcu_i2c_clock_config(i2c_idx_enum i2c_idx, uint32_t ck_i2c) +{ + switch(i2c_idx) { + case IDX_I2C3: + /* reset the I2C3SEL bits and set according to ck_i2c */ + RCU_CFG2 &= ~RCU_CFG2_I2C3SEL; + RCU_CFG2 |= ck_i2c; + break; + case IDX_I2C4: + /* reset the I2C4SEL bits and set according to ck_i2c */ + RCU_CFG2 &= ~RCU_CFG2_I2C4SEL; + RCU_CFG2 |= (uint32_t)ck_i2c << 2U; + break; + case IDX_I2C5: + /* reset the I2C5SEL bits and set according to ck_i2c */ + RCU_CFG2 &= ~RCU_CFG2_I2C5SEL; + RCU_CFG2 |= (uint32_t)ck_i2c << 4U; + break; + default: + break; + } +} + +/*! + \brief configure the SAI clock source selection + \param[in] sai_clock_source: SAI clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_SAISRC_PLLSAIQ: CK_PLLSAIQ selected as SAI source clock + \arg RCU_SAISRC_PLLI2SQ: CK_PLLI2SQ selected as SAI source clock + \arg RCU_SAISRC_I2S_CKIN: CK_I2S_CKIN selected as SAI source clock + \param[out] none + \retval none +*/ +void rcu_sai_clock_config(uint32_t sai_clock_source) +{ + + uint32_t reg; + + reg = RCU_CFG1; + /* reset the SAISEL bit and set according to sai_clock_source */ + reg &= ~RCU_CFG1_SAISEL; + RCU_CFG1 = (reg | sai_clock_source); +} + +/*! + \brief configure the CK48M clock source selection + \param[in] ck48m_clock_source: CK48M clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CK48MSRC_PLL48M: CK_PLL48M selected as CK48M source clock + \arg RCU_CK48MSRC_IRC48M: CK_IRC48M selected as CK48M source clock + \param[out] none + \retval none +*/ +void rcu_ck48m_clock_config(uint32_t ck48m_clock_source) +{ + uint32_t reg; + + reg = RCU_ADDCTL; + /* reset the CK48MSEL bit and set according to i2s_clock_source */ + reg &= ~RCU_ADDCTL_CK48MSEL; + RCU_ADDCTL = (reg | ck48m_clock_source); +} + +/*! + \brief configure the PLL48M clock source selection + \param[in] pll48m_clock_source: PLL48M clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PLL48MSRC_PLLQ: CK_PLLQ selected as PLL48M source clock + \arg RCU_PLL48MSRC_PLLSAIP: CK_PLLSAIP selected as PLL48M source clock + \param[out] none + \retval none +*/ +void rcu_pll48m_clock_config(uint32_t pll48m_clock_source) +{ + uint32_t reg; + + reg = RCU_ADDCTL; + /* reset the PLL48MSEL bit and set according to pll48m_clock_source */ + reg &= ~RCU_ADDCTL_PLL48MSEL; + RCU_ADDCTL = (reg | pll48m_clock_source); +} + +/*! + \brief configure the TIMER clock prescaler selection + \param[in] timer_clock_prescaler: TIMER clock selection + only one parameter can be selected which is shown as below: + \arg RCU_TIMER_PSC_MUL2: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB) + or 0b100(CK_APBx = CK_AHB/2), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). + or else, the TIMER clock is twice the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 2 x CK_APB1; + TIMER in APB2 domain: CK_TIMERx = 2 x CK_APB2) + \arg RCU_TIMER_PSC_MUL4: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB), + 0b100(CK_APBx = CK_AHB/2), or 0b101(CK_APBx = CK_AHB/4), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). + or else, the TIMER clock is four timers the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 4 x CK_APB1; + TIMER in APB2 domain: CK_TIMERx = 4 x CK_APB2) + \param[out] none + \retval none +*/ +void rcu_timer_clock_prescaler_config(uint32_t timer_clock_prescaler) +{ + /* configure the TIMERSEL bit and select the TIMER clock prescaler */ + if(timer_clock_prescaler == RCU_TIMER_PSC_MUL2) { + RCU_CFG1 &= timer_clock_prescaler; + } else { + RCU_CFG1 |= timer_clock_prescaler; + } +} + +/*! + \brief configure the PLLSAIR divider used as input of TLI + \param[in] pllsai_r_div: PLLSAIR divider used as input of TLI + only one parameter can be selected which is shown as below: + \arg RCU_PLLSAIR_DIVx(x=2,4,8,16): PLLSAIR divided x used as input of TLI + \param[out] none + \retval none +*/ +void rcu_tli_clock_div_config(uint32_t pllsai_r_div) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the PLLSAIRDIV bit and set according to pllsai_r_div */ + reg &= ~RCU_CFG1_PLLSAIRDIV; + RCU_CFG1 = (reg | pllsai_r_div); +} + +/*! + \brief configure the LXTAL drive capability + \param[in] lxtal_dricap: drive capability of LXTAL + only one parameter can be selected which is shown as below: + \arg RCU_LXTALDRI_LOWER_DRIVE: lower driving capability + \arg RCU_LXTALDRI_HIGHER_DRIVE: higher driving capability + \param[out] none + \retval none +*/ +void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap) +{ + uint32_t reg; + + reg = RCU_BDCTL; + + /* reset the LXTALDRI bits and set according to lxtal_dricap */ + reg &= ~RCU_BDCTL_LXTALDRI; + RCU_BDCTL = (reg | lxtal_dricap); +} + +/*! + \brief wait for oscillator stabilization flags is SET or oscillator startup is timeout + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: HXTAL + \arg RCU_LXTAL: LXTAL + \arg RCU_IRC16M: IRC16M + \arg RCU_IRC48M: IRC48M + \arg RCU_IRC32K: IRC32K + \arg RCU_PLL_CK: PLL + \arg RCU_PLLI2S_CK: PLLI2S + \arg RCU_PLLSAI_CK: PLLSAI + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci) +{ + uint32_t stb_cnt = 0U; + ErrStatus reval = ERROR; + FlagStatus osci_stat = RESET; + + switch(osci) { + /* wait HXTAL stable */ + case RCU_HXTAL: + while((RESET == osci_stat) && (HXTAL_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_HXTALSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_HXTALSTB)) { + reval = SUCCESS; + } + break; + /* wait LXTAL stable */ + case RCU_LXTAL: + while((RESET == osci_stat) && (LXTAL_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_LXTALSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_LXTALSTB)) { + reval = SUCCESS; + } + break; + /* wait IRC16M stable */ + case RCU_IRC16M: + while((RESET == osci_stat) && (IRC16M_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_IRC16MSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC16MSTB)) { + reval = SUCCESS; + } + break; + /* wait IRC48M stable */ + case RCU_IRC48M: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_IRC48MSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC48MSTB)) { + reval = SUCCESS; + } + break; + /* wait IRC32K stable */ + case RCU_IRC32K: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_IRC32KSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC32KSTB)) { + reval = SUCCESS; + } + break; + /* wait PLL stable */ + case RCU_PLL_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLLSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_PLLSTB)) { + reval = SUCCESS; + } + break; + /* wait PLLI2S stable */ + case RCU_PLLI2S_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLLI2SSTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_PLLI2SSTB)) { + reval = SUCCESS; + } + break; + /* wait PLLSAI stable */ + case RCU_PLLSAI_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { + osci_stat = rcu_flag_get(RCU_FLAG_PLLSAISTB); + stb_cnt++; + } + + /* check whether flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_PLLSAISTB)) { + reval = SUCCESS; + } + break; + + default: + break; + } + + /* return value */ + return reval; +} + +/*! + \brief turn on the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: HXTAL + \arg RCU_LXTAL: LXTAL + \arg RCU_IRC16M: IRC16M + \arg RCU_IRC48M: IRC48M + \arg RCU_IRC32K: IRC32K + \arg RCU_PLL_CK: PLL + \arg RCU_PLLI2S_CK: PLLI2S + \arg RCU_PLLSAI_CK: PLLSAI + \param[out] none + \retval none +*/ +void rcu_osci_on(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) |= BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief turn off the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: HXTAL + \arg RCU_LXTAL: LXTAL + \arg RCU_IRC16M: IRC16M + \arg RCU_IRC48M: IRC48M + \arg RCU_IRC32K: IRC32K + \arg RCU_PLL_CK: PLL + \arg RCU_PLLI2S_CK: PLLI2S + \arg RCU_PLLSAI_CK: PLLSAI + \param[out] none + \retval none +*/ +void rcu_osci_off(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) &= ~BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci) { + /* enable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg | RCU_CTL_HXTALBPS); + break; + /* enable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg | RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC16M: + case RCU_IRC48M: + case RCU_IRC32K: + case RCU_PLL_CK: + case RCU_PLLI2S_CK: + case RCU_PLLSAI_CK: + break; + default: + break; + } +} + +/*! + \brief disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci) { + /* disable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg & ~RCU_CTL_HXTALBPS); + break; + /* disable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg & ~RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC16M: + case RCU_IRC48M: + case RCU_IRC32K: + case RCU_PLL_CK: + case RCU_PLLI2S_CK: + case RCU_PLLSAI_CK: + break; + default: + break; + } +} + +/*! + \brief set the IRC16M adjust value + \param[in] irc16m_adjval: IRC16M adjust value, must be between 0 and 0x1F + \arg 0x00 - 0x1F + \param[out] none + \retval none +*/ +void rcu_irc16m_adjust_value_set(uint32_t irc16m_adjval) +{ + uint32_t reg; + + reg = RCU_CTL; + /* reset the IRC16MADJ bits and set according to irc16m_adjval */ + reg &= ~RCU_CTL_IRC16MADJ; + RCU_CTL = (reg | ((irc16m_adjval & RCU_IRC16M_ADJUST_MASK) << RCU_IRC16M_ADJUST_OFFSET)); +} + +/*! + \brief configure the spread spectrum modulation for the main PLL clock + \param[in] spread_spectrum_type: PLL spread spectrum modulation type select + \arg RCU_SS_TYPE_CENTER: center spread type is selected + \arg RCU_SS_TYPE_DOWN: down spread type is selected + \param[in] modstep: configure PLL spread spectrum modulation profile amplitude and frequency + \arg This parameter should be selected between 0 and 7FFF.The following criteria must be met: MODSTEP*MODCNT <=2^15-1 + \param[in] modcnt: configure PLL spread spectrum modulation profile amplitude and frequency + \arg This parameter should be selected between 0 and 1FFF.The following criteria must be met: MODSTEP*MODCNT <=2^15-1 + \param[out] none + \retval none +*/ +void rcu_spread_spectrum_config(uint32_t spread_spectrum_type, uint32_t modstep, uint32_t modcnt) +{ + uint32_t reg; + + reg = RCU_PLLSSCTL; + /* reset the RCU_PLLSSCTL register bits */ + reg &= ~(RCU_PLLSSCTL_MODCNT | RCU_PLLSSCTL_MODSTEP | RCU_PLLSSCTL_SS_TYPE); + RCU_PLLSSCTL = (reg | spread_spectrum_type | modstep << 13 | modcnt); +} + +/*! + \brief enable the spread spectrum modulation for the main PLL clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_spread_spectrum_enable(void) +{ + RCU_PLLSSCTL |= RCU_PLLSSCTL_SSCGON; +} + +/*! + \brief disable the spread spectrum modulation for the main PLL clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_spread_spectrum_disable(void) +{ + RCU_PLLSSCTL &= ~RCU_PLLSSCTL_SSCGON; +} + +/*! + \brief enable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ +void rcu_hxtal_clock_monitor_enable(void) +{ + RCU_CTL |= RCU_CTL_CKMEN; +} + +/*! + \brief disable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ +void rcu_hxtal_clock_monitor_disable(void) +{ + RCU_CTL &= ~RCU_CTL_CKMEN; +} + +/*! + \brief unlock the voltage key + \param[in] none + \param[out] none + \retval none +*/ +void rcu_voltage_key_unlock(void) +{ + RCU_VKEY = RCU_VKEY_UNLOCK; +} + +/*! + \brief set the deep sleep mode voltage + \param[in] dsvol: deep sleep mode voltage + only one parameter can be selected which is shown as below: + \arg RCU_DEEPSLEEP_V_0: the core voltage is default value + \arg RCU_DEEPSLEEP_V_1: the core voltage is (default value-0.1)V(customers are not recommended to use it) + \arg RCU_DEEPSLEEP_V_2: the core voltage is (default value-0.2)V(customers are not recommended to use it) + \arg RCU_DEEPSLEEP_V_3: the core voltage is (default value-0.3)V(customers are not recommended to use it) + \param[out] none + \retval none +*/ +void rcu_deepsleep_voltage_set(uint32_t dsvol) +{ + dsvol &= RCU_DSV_DSLPVS; + RCU_DSV = dsvol; +} + +/*! + \brief get the system clock, bus and peripheral clock frequency + \param[in] clock: the clock frequency which to get + only one parameter can be selected which is shown as below: + \arg CK_SYS: system clock frequency + \arg CK_AHB: AHB clock frequency + \arg CK_APB1: APB1 clock frequency + \arg CK_APB2: APB2 clock frequency + \param[out] none + \retval clock frequency of system, AHB, APB1, APB2 +*/ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock) +{ + uint32_t sws, ck_freq = 0U; + uint32_t cksys_freq, ahb_freq, apb1_freq, apb2_freq; + uint32_t pllpsc, plln, pllsel, pllp, ck_src, idx, clk_exp; + + /* exponent of AHB, APB1 and APB2 clock divider */ + const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t apb1_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + const uint8_t apb2_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws) { + /* IRC16M is selected as CK_SYS */ + case SEL_IRC16M: + cksys_freq = IRC16M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + cksys_freq = HXTAL_VALUE; + break; + /* PLLP is selected as CK_SYS */ + case SEL_PLLP: + /* get the value of PLLPSC[5:0] */ + pllpsc = GET_BITS(RCU_PLL, 0U, 5U); + plln = GET_BITS(RCU_PLL, 6U, 14U); + pllp = (GET_BITS(RCU_PLL, 16U, 17U) + 1U) * 2U; + /* PLL clock source selection, HXTAL or IRC16M/2 */ + pllsel = (RCU_PLL & RCU_PLL_PLLSEL); + if(RCU_PLLSRC_HXTAL == pllsel) { + ck_src = HXTAL_VALUE; + } else { + ck_src = IRC16M_VALUE; + } + cksys_freq = ((ck_src / pllpsc) * plln) / pllp; + break; + /* IRC16M is selected as CK_SYS */ + default: + cksys_freq = IRC16M_VALUE; + break; + } + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + ahb_freq = cksys_freq >> clk_exp; + + /* calculate APB1 clock frequency */ + idx = GET_BITS(RCU_CFG0, 10, 12); + clk_exp = apb1_exp[idx]; + apb1_freq = ahb_freq >> clk_exp; + + /* calculate APB2 clock frequency */ + idx = GET_BITS(RCU_CFG0, 13, 15); + clk_exp = apb2_exp[idx]; + apb2_freq = ahb_freq >> clk_exp; + + /* return the clocks frequency */ + switch(clock) { + case CK_SYS: + ck_freq = cksys_freq; + break; + case CK_AHB: + ck_freq = ahb_freq; + break; + case CK_APB1: + ck_freq = apb1_freq; + break; + case CK_APB2: + ck_freq = apb2_freq; + break; + default: + break; + } + return ck_freq; +} + +/*! + \brief get the clock stabilization and periphral reset flags + \param[in] flag: the clock stabilization and periphral reset flags, refer to rcu_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_FLAG_IRC16MSTB: IRC16M stabilization flag + \arg RCU_FLAG_HXTALSTB: HXTAL stabilization flag + \arg RCU_FLAG_PLLSTB: PLL stabilization flag + \arg RCU_FLAG_PLLI2SSTB: PLLI2S stabilization flag + \arg RCU_FLAG_PLLSAISTB: PLLSAI stabilization flag + \arg RCU_FLAG_LXTALSTB: LXTAL stabilization flag + \arg RCU_FLAG_IRC32KSTB: IRC32K stabilization flag + \arg RCU_FLAG_IRC48MSTB: IRC48M stabilization flag + \arg RCU_FLAG_BORRST: BOR reset flags + \arg RCU_FLAG_EPRST: external PIN reset flag + \arg RCU_FLAG_PORRST: Power reset flag + \arg RCU_FLAG_SWRST: software reset flag + \arg RCU_FLAG_FWDGTRST: free watchdog timer reset flag + \arg RCU_FLAG_WWDGTRST: window watchdog timer reset flag + \arg RCU_FLAG_LPRST: low-power reset flag + \param[out] none + \retval none +*/ +FlagStatus rcu_flag_get(rcu_flag_enum flag) +{ + /* get the rcu flag */ + if(RESET != (RCU_REG_VAL(flag) & BIT(RCU_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear all the reset flag + \param[in] none + \param[out] none + \retval none +*/ +void rcu_all_reset_flag_clear(void) +{ + RCU_RSTSCK |= RCU_RSTSCK_RSTFC; +} + +/*! + \brief get the clock stabilization interrupt and ckm flags + \param[in] int_flag: interrupt and ckm flags, refer to rcu_int_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC32KSTB: IRC32K stabilization interrupt flag + \arg RCU_INT_FLAG_LXTALSTB: LXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_IRC16MSTB: IRC16M stabilization interrupt flag + \arg RCU_INT_FLAG_HXTALSTB: HXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_PLLSTB: PLL stabilization interrupt flag + \arg RCU_INT_FLAG_PLLI2SSTB: PLLI2S stabilization interrupt flag + \arg RCU_INT_FLAG_PLLSAISTB: PLLSAI stabilization interrupt flag + \arg RCU_INT_FLAG_CKM: HXTAL clock stuck interrupt flag + \arg RCU_INT_FLAG_IRC48MSTB: IRC48M stabilization interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag) +{ + /* get the rcu interrupt flag */ + if(RESET != (RCU_REG_VAL(int_flag) & BIT(RCU_BIT_POS(int_flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the interrupt flags + \param[in] int_flag: clock stabilization and stuck interrupt flags clear, refer to rcu_int_flag_clear_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC32KSTB_CLR: IRC32K stabilization interrupt flag clear + \arg RCU_INT_FLAG_LXTALSTB_CLR: LXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_IRC16MSTB_CLR: IRC16M stabilization interrupt flag clear + \arg RCU_INT_FLAG_HXTALSTB_CLR: HXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLSTB_CLR: PLL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLI2SSTB_CLR: PLLI2S stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLSAISTB_CLR: PLLSAI stabilization interrupt flag clear + \arg RCU_INT_FLAG_CKM_CLR: clock stuck interrupt flag clear + \arg RCU_INT_FLAG_IRC48MSTB_CLR: IRC48M stabilization interrupt flag clear + \param[out] none + \retval none +*/ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag) +{ + RCU_REG_VAL(int_flag) |= BIT(RCU_BIT_POS(int_flag)); +} + +/*! + \brief enable the stabilization interrupt + \param[in] interrupt: clock stabilization interrupt, refer to rcu_int_enum + Only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC32KSTB: IRC32K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC16MSTB: IRC16M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLLI2SSTB: PLLI2S stabilization interrupt enable + \arg RCU_INT_PLLSAISTB: PLLSAI stabilization interrupt enable + \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_enable(rcu_int_enum interrupt) +{ + RCU_REG_VAL(interrupt) |= BIT(RCU_BIT_POS(interrupt)); +} + +/*! + \brief disable the stabilization interrupt + \param[in] interrupt: clock stabilization interrupt, refer to rcu_int_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC32KSTB: IRC32K stabilization interrupt disable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt disable + \arg RCU_INT_IRC16MSTB: IRC16M stabilization interrupt disable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt disable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt disable + \arg RCU_INT_PLLI2SSTB: PLLI2S stabilization interrupt disable + \arg RCU_INT_PLLSAISTB: PLLSAI stabilization interrupt disable + \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt disable + \param[out] none + \retval none +*/ +void rcu_interrupt_disable(rcu_int_enum interrupt) +{ + RCU_REG_VAL(interrupt) &= ~BIT(RCU_BIT_POS(interrupt)); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c new file mode 100644 index 00000000000..1df977fc062 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c @@ -0,0 +1,1289 @@ +/*! + \file gd32f5xx_rtc.c + \brief RTC driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f5xx_rtc.h" + +/* RTC timeout value */ +#define RTC_WTWF_TIMEOUT ((uint32_t)0x00004000U) /*!< wakeup timer can be write flag timeout */ +#define RTC_INITM_TIMEOUT ((uint32_t)0x00004000U) /*!< initialization state flag timeout */ +#define RTC_RSYNF_TIMEOUT ((uint32_t)0x00008000U) /*!< register synchronization flag timeout */ +#define RTC_HRFC_TIMEOUT ((uint32_t)0x20000000U) /*!< recalibration pending flag timeout */ +#define RTC_SHIFTCTL_TIMEOUT ((uint32_t)0x00001000U) /*!< shift function operation pending flag timeout */ +#define RTC_ALRMXWF_TIMEOUT ((uint32_t)0x00008000U) /*!< alarm configuration can be write flag timeout */ + +/*! + \brief reset most of the RTC registers + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_deinit(void) +{ + ErrStatus error_status = ERROR; + volatile uint32_t time_index = RTC_WTWF_TIMEOUT; + uint32_t flag_status = RESET; + /* RTC_TAMP register is not under write protection */ + RTC_TAMP = RTC_REGISTER_RESET; + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + /* reset RTC_CTL register, but RTC_CTL[2:0] */ + RTC_CTL &= (RTC_REGISTER_RESET | RTC_CTL_WTCS); + /* before reset RTC_TIME and RTC_DATE, BPSHAD bit in RTC_CTL should be reset as the condition. + in order to read calendar from shadow register, not the real registers being reset */ + RTC_TIME = RTC_REGISTER_RESET; + RTC_DATE = RTC_DATE_RESET; + + RTC_PSC = RTC_PSC_RESET; + /* only when RTC_CTL_WTEN=0 and RTC_STAT_WTWF=1 can write RTC_CTL[2:0] */ + /* wait until the WTWF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_WTWF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET == flag_status) { + error_status = ERROR; + } else { + RTC_CTL &= RTC_REGISTER_RESET; + RTC_WUT = RTC_WUT_RESET; + RTC_COSC = RTC_REGISTER_RESET; + /* to write RTC_ALRMxSS register, ALRMxEN bit in RTC_CTL register should be reset as the condition */ + RTC_ALRM0TD = RTC_REGISTER_RESET; + RTC_ALRM1TD = RTC_REGISTER_RESET; + RTC_ALRM0SS = RTC_REGISTER_RESET; + RTC_ALRM1SS = RTC_REGISTER_RESET; + /* reset RTC_STAT register, also exit init mode. + at the same time, RTC_STAT_SOPF bit is reset, as the condition to reset RTC_SHIFTCTL register later */ + RTC_STAT = RTC_STAT_RESET; + /* reset RTC_SHIFTCTL and RTC_HRFC register, this can be done without the init mode */ + RTC_SHIFTCTL = RTC_REGISTER_RESET; + RTC_HRFC = RTC_REGISTER_RESET; + error_status = rtc_register_sync_wait(); + } + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief initialize RTC registers + \param[in] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains + parameters for initialization of the rtc peripheral + members of the structure and the member values are shown as below: + year: 0x0 - 0x99(BCD format) + month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, + RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC + date: 0x1 - 0x31(BCD format) + day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY + RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY + hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format chose + minute: 0x0 - 0x59(BCD format) + second: 0x0 - 0x59(BCD format) + factor_asyn: 0x0 - 0x7F + factor_syn: 0x0 - 0x7FFF + am_pm: RTC_AM, RTC_PM + display_format: RTC_24HOUR, RTC_12HOUR + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_init(rtc_parameter_struct *rtc_initpara_struct) +{ + ErrStatus error_status = ERROR; + uint32_t reg_time = 0U, reg_date = 0U; + + reg_date = (DATE_YR(rtc_initpara_struct->year) | \ + DATE_DOW(rtc_initpara_struct->day_of_week) | \ + DATE_MON(rtc_initpara_struct->month) | \ + DATE_DAY(rtc_initpara_struct->date)); + + reg_time = (rtc_initpara_struct->am_pm | \ + TIME_HR(rtc_initpara_struct->hour) | \ + TIME_MN(rtc_initpara_struct->minute) | \ + TIME_SC(rtc_initpara_struct->second)); + + /* 1st: disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* 2nd: enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + RTC_PSC = (uint32_t)(PSC_FACTOR_A(rtc_initpara_struct->factor_asyn) | \ + PSC_FACTOR_S(rtc_initpara_struct->factor_syn)); + + RTC_TIME = (uint32_t)reg_time; + RTC_DATE = (uint32_t)reg_date; + + RTC_CTL &= (uint32_t)(~RTC_CTL_CS); + RTC_CTL |= rtc_initpara_struct->display_format; + + /* 3rd: exit init mode */ + rtc_init_mode_exit(); + + /* 4th: wait the RSYNF flag to set */ + error_status = rtc_register_sync_wait(); + } + + /* 5th: enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief enter RTC init mode + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_init_mode_enter(void) +{ + volatile uint32_t time_index = RTC_INITM_TIMEOUT; + uint32_t flag_status = RESET; + ErrStatus error_status = ERROR; + + /* check whether it has been in init mode */ + if((uint32_t)RESET == (RTC_STAT & RTC_STAT_INITF)) { + RTC_STAT |= RTC_STAT_INITM; + + /* wait until the INITF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_INITF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET != flag_status) { + error_status = SUCCESS; + } + } else { + error_status = SUCCESS; + } + return error_status; +} + +/*! + \brief exit RTC init mode + \param[in] none + \param[out] none + \retval none +*/ +void rtc_init_mode_exit(void) +{ + RTC_STAT &= (uint32_t)(~RTC_STAT_INITM); +} + +/*! + \brief wait until RTC_TIME and RTC_DATE registers are synchronized with APB clock, and the shadow + registers are updated + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_register_sync_wait(void) +{ + volatile uint32_t time_index = RTC_RSYNF_TIMEOUT; + uint32_t flag_status = RESET; + ErrStatus error_status = ERROR; + + if((uint32_t)RESET == (RTC_CTL & RTC_CTL_BPSHAD)) { + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* firstly clear RSYNF flag */ + RTC_STAT &= (uint32_t)(~RTC_STAT_RSYNF); + + /* wait until RSYNF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_RSYNF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET != flag_status) { + error_status = SUCCESS; + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + } else { + error_status = SUCCESS; + } + + return error_status; +} + +/*! + \brief get current time and date + \param[in] none + \param[out] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains + parameters for initialization of the rtc peripheral + members of the structure and the member values are shown as below: + year: 0x0 - 0x99(BCD format) + month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, + RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC + date: 0x1 - 0x31(BCD format) + day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY + RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY + hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format chose + minute: 0x0 - 0x59(BCD format) + second: 0x0 - 0x59(BCD format) + factor_asyn: 0x0 - 0x7F + factor_syn: 0x0 - 0x7FFF + am_pm: RTC_AM, RTC_PM + display_format: RTC_24HOUR, RTC_12HOUR + \retval none +*/ +void rtc_current_time_get(rtc_parameter_struct *rtc_initpara_struct) +{ + uint32_t temp_tr = 0U, temp_dr = 0U, temp_pscr = 0U, temp_ctlr = 0U; + + temp_tr = (uint32_t)RTC_TIME; + temp_dr = (uint32_t)RTC_DATE; + temp_pscr = (uint32_t)RTC_PSC; + temp_ctlr = (uint32_t)RTC_CTL; + + /* get current time and construct rtc_parameter_struct structure */ + rtc_initpara_struct->year = (uint8_t)GET_DATE_YR(temp_dr); + rtc_initpara_struct->month = (uint8_t)GET_DATE_MON(temp_dr); + rtc_initpara_struct->date = (uint8_t)GET_DATE_DAY(temp_dr); + rtc_initpara_struct->day_of_week = (uint8_t)GET_DATE_DOW(temp_dr); + rtc_initpara_struct->hour = (uint8_t)GET_TIME_HR(temp_tr); + rtc_initpara_struct->minute = (uint8_t)GET_TIME_MN(temp_tr); + rtc_initpara_struct->second = (uint8_t)GET_TIME_SC(temp_tr); + rtc_initpara_struct->factor_asyn = (uint16_t)GET_PSC_FACTOR_A(temp_pscr); + rtc_initpara_struct->factor_syn = (uint16_t)GET_PSC_FACTOR_S(temp_pscr); + rtc_initpara_struct->am_pm = (uint32_t)(temp_tr & RTC_TIME_PM); + rtc_initpara_struct->display_format = (uint32_t)(temp_ctlr & RTC_CTL_CS); +} + +/*! + \brief get current subsecond value + \param[in] none + \param[out] none + \retval current subsecond value +*/ +uint32_t rtc_subsecond_get(void) +{ + uint32_t reg = 0U; + /* if BPSHAD bit is reset, reading RTC_SS will lock RTC_TIME and RTC_DATE automatically */ + reg = (uint32_t)RTC_SS; + /* read RTC_DATE to unlock the 3 shadow registers */ + (void)(RTC_DATE); + + return reg; +} + +/*! + \brief configure RTC alarm + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[in] rtc_alarm_time: pointer to a rtc_alarm_struct structure which contains + parameters for RTC alarm configuration + members of the structure and the member values are shown as below: + alarm_mask: RTC_ALARM_NONE_MASK, RTC_ALARM_DATE_MASK, RTC_ALARM_HOUR_MASK + RTC_ALARM_MINUTE_MASK, RTC_ALARM_SECOND_MASK, RTC_ALARM_ALL_MASK + weekday_or_date: RTC_ALARM_DATE_SELECTED, RTC_ALARM_WEEKDAY_SELECTED + alarm_day: 1) 0x1 - 0x31(BCD format) if RTC_ALARM_DATE_SELECTED is set + 2) RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, + RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set + alarm_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format + alarm_minute: 0x0 - 0x59(BCD format) + alarm_second: 0x0 - 0x59(BCD format) + am_pm: RTC_AM, RTC_PM + \param[out] none + \retval none +*/ +void rtc_alarm_config(uint8_t rtc_alarm, rtc_alarm_struct *rtc_alarm_time) +{ + uint32_t reg_alrmtd = 0U; + + reg_alrmtd = (rtc_alarm_time->alarm_mask | \ + rtc_alarm_time->weekday_or_date | \ + rtc_alarm_time->am_pm | \ + ALRMTD_DAY(rtc_alarm_time->alarm_day) | \ + ALRMTD_HR(rtc_alarm_time->alarm_hour) | \ + ALRMTD_MN(rtc_alarm_time->alarm_minute) | \ + ALRMTD_SC(rtc_alarm_time->alarm_second)); + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + if(RTC_ALARM0 == rtc_alarm) { + RTC_ALRM0TD = (uint32_t)reg_alrmtd; + + } else { + RTC_ALRM1TD = (uint32_t)reg_alrmtd; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief configure subsecond of RTC alarm + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[in] mask_subsecond: alarm subsecond mask + \arg RTC_MASKSSC_0_14: mask alarm subsecond configuration + \arg RTC_MASKSSC_1_14: mask RTC_ALRMXSS_SSC[14:1], and RTC_ALRMXSS_SSC[0] is to be compared + \arg RTC_MASKSSC_2_14: mask RTC_ALRMXSS_SSC[14:2], and RTC_ALRMXSS_SSC[1:0] is to be compared + \arg RTC_MASKSSC_3_14: mask RTC_ALRMXSS_SSC[14:3], and RTC_ALRMXSS_SSC[2:0] is to be compared + \arg RTC_MASKSSC_4_14: mask RTC_ALRMXSS_SSC[14:4]], and RTC_ALRMXSS_SSC[3:0] is to be compared + \arg RTC_MASKSSC_5_14: mask RTC_ALRMXSS_SSC[14:5], and RTC_ALRMXSS_SSC[4:0] is to be compared + \arg RTC_MASKSSC_6_14: mask RTC_ALRMXSS_SSC[14:6], and RTC_ALRMXSS_SSC[5:0] is to be compared + \arg RTC_MASKSSC_7_14: mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared + \arg RTC_MASKSSC_8_14: mask RTC_ALRMXSS_SSC[14:8], and RTC_ALRMXSS_SSC[7:0] is to be compared + \arg RTC_MASKSSC_9_14: mask RTC_ALRMXSS_SSC[14:9], and RTC_ALRMXSS_SSC[8:0] is to be compared + \arg RTC_MASKSSC_10_14: mask RTC_ALRMXSS_SSC[14:10], and RTC_ALRMXSS_SSC[9:0] is to be compared + \arg RTC_MASKSSC_11_14: mask RTC_ALRMXSS_SSC[14:11], and RTC_ALRMXSS_SSC[10:0] is to be compared + \arg RTC_MASKSSC_12_14: mask RTC_ALRMXSS_SSC[14:12], and RTC_ALRMXSS_SSC[11:0] is to be compared + \arg RTC_MASKSSC_13_14: mask RTC_ALRMXSS_SSC[14:13], and RTC_ALRMXSS_SSC[12:0] is to be compared + \arg RTC_MASKSSC_14: mask RTC_ALRMXSS_SSC[14], and RTC_ALRMXSS_SSC[13:0] is to be compared + \arg RTC_MASKSSC_NONE: mask none, and RTC_ALRMXSS_SSC[14:0] is to be compared + \param[in] subsecond: alarm subsecond value(0x0000 - 0x7FFF) + \param[out] none + \retval none +*/ +void rtc_alarm_subsecond_config(uint8_t rtc_alarm, uint32_t mask_subsecond, uint32_t subsecond) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + if(RTC_ALARM0 == rtc_alarm) { + RTC_ALRM0SS = mask_subsecond | subsecond; + } else { + RTC_ALRM1SS = mask_subsecond | subsecond; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief get RTC alarm + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[out] rtc_alarm_time: pointer to a rtc_alarm_struct structure which contains + parameters for RTC alarm configuration + members of the structure and the member values are shown as below: + alarm_mask: RTC_ALARM_NONE_MASK, RTC_ALARM_DATE_MASK, RTC_ALARM_HOUR_MASK + RTC_ALARM_MINUTE_MASK, RTC_ALARM_SECOND_MASK, RTC_ALARM_ALL_MASK + weekday_or_date: RTC_ALARM_DATE_SELECTED, RTC_ALARM_WEEKDAY_SELECTED + alarm_day: 1) 0x1 - 0x31(BCD format) if RTC_ALARM_DATE_SELECTED is set + 2) RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, + RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set + alarm_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format + alarm_minute: 0x0 - 0x59(BCD format) + alarm_second: 0x0 - 0x59(BCD format) + am_pm: RTC_AM, RTC_PM + \retval none +*/ +void rtc_alarm_get(uint8_t rtc_alarm, rtc_alarm_struct *rtc_alarm_time) +{ + uint32_t reg_alrmtd = 0U; + + /* get the value of RTC_ALRM0TD register */ + if(RTC_ALARM0 == rtc_alarm) { + reg_alrmtd = RTC_ALRM0TD; + } else { + reg_alrmtd = RTC_ALRM1TD; + } + /* get alarm parameters and construct the rtc_alarm_struct structure */ + rtc_alarm_time->alarm_mask = reg_alrmtd & RTC_ALARM_ALL_MASK; + rtc_alarm_time->am_pm = (uint32_t)(reg_alrmtd & RTC_ALRMXTD_PM); + rtc_alarm_time->weekday_or_date = (uint32_t)(reg_alrmtd & RTC_ALRMXTD_DOWS); + rtc_alarm_time->alarm_day = (uint8_t)GET_ALRMTD_DAY(reg_alrmtd); + rtc_alarm_time->alarm_hour = (uint8_t)GET_ALRMTD_HR(reg_alrmtd); + rtc_alarm_time->alarm_minute = (uint8_t)GET_ALRMTD_MN(reg_alrmtd); + rtc_alarm_time->alarm_second = (uint8_t)GET_ALRMTD_SC(reg_alrmtd); +} + +/*! + \brief get RTC alarm subsecond + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[out] none + \retval RTC alarm subsecond value +*/ +uint32_t rtc_alarm_subsecond_get(uint8_t rtc_alarm) +{ + if(RTC_ALARM0 == rtc_alarm) { + return ((uint32_t)(RTC_ALRM0SS & RTC_ALRM0SS_SSC)); + } else { + return ((uint32_t)(RTC_ALRM1SS & RTC_ALRM1SS_SSC)); + } +} + +/*! + \brief enable RTC alarm + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[out] none + \retval none +*/ +void rtc_alarm_enable(uint8_t rtc_alarm) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + if(RTC_ALARM0 == rtc_alarm) { + RTC_CTL |= RTC_CTL_ALRM0EN; + } else { + RTC_CTL |= RTC_CTL_ALRM1EN; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief disable RTC alarm + \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_alarm_disable(uint8_t rtc_alarm) +{ + volatile uint32_t time_index = RTC_ALRMXWF_TIMEOUT; + ErrStatus error_status = ERROR; + uint32_t flag_status = RESET; + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* clear the state of alarm */ + if(RTC_ALARM0 == rtc_alarm) { + RTC_CTL &= (uint32_t)(~RTC_CTL_ALRM0EN); + /* wait until ALRM0WF flag to be set after the alarm is disabled */ + do { + flag_status = RTC_STAT & RTC_STAT_ALRM0WF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + } else { + RTC_CTL &= (uint32_t)(~RTC_CTL_ALRM1EN); + /* wait until ALRM1WF flag to be set after the alarm is disabled */ + do { + flag_status = RTC_STAT & RTC_STAT_ALRM1WF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + } + + if((uint32_t)RESET != flag_status) { + error_status = SUCCESS; + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief enable RTC time-stamp + \param[in] edge: specify which edge to detect of time-stamp + \arg RTC_TIMESTAMP_RISING_EDGE: rising edge is valid event edge for timestamp event + \arg RTC_TIMESTAMP_FALLING_EDGE: falling edge is valid event edge for timestamp event + \param[out] none + \retval none +*/ +void rtc_timestamp_enable(uint32_t edge) +{ + uint32_t reg_ctl = 0U; + + /* clear the bits to be configured in RTC_CTL */ + reg_ctl = (uint32_t)(RTC_CTL & (uint32_t)(~(RTC_CTL_TSEG | RTC_CTL_TSEN))); + + /* new configuration */ + reg_ctl |= (uint32_t)(edge | RTC_CTL_TSEN); + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL = (uint32_t)reg_ctl; + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief disable RTC time-stamp + \param[in] none + \param[out] none + \retval none +*/ +void rtc_timestamp_disable(void) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* clear the TSEN bit */ + RTC_CTL &= (uint32_t)(~ RTC_CTL_TSEN); + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief get RTC timestamp time and date + \param[in] none + \param[out] rtc_timestamp: pointer to a rtc_timestamp_struct structure which contains + parameters for RTC time-stamp configuration + members of the structure and the member values are shown as below: + timestamp_month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, + RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC + timestamp_date: 0x1 - 0x31(BCD format) + timestamp_day: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, + RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set + timestamp_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format + timestamp_minute: 0x0 - 0x59(BCD format) + timestamp_second: 0x0 - 0x59(BCD format) + am_pm: RTC_AM, RTC_PM + \retval none +*/ +void rtc_timestamp_get(rtc_timestamp_struct *rtc_timestamp) +{ + uint32_t temp_tts = 0U, temp_dts = 0U; + + /* get the value of time_stamp registers */ + temp_tts = (uint32_t)RTC_TTS; + temp_dts = (uint32_t)RTC_DTS; + + /* get timestamp time and construct the rtc_timestamp_struct structure */ + rtc_timestamp->am_pm = (uint32_t)(temp_tts & RTC_TTS_PM); + rtc_timestamp->timestamp_month = (uint8_t)GET_DTS_MON(temp_dts); + rtc_timestamp->timestamp_date = (uint8_t)GET_DTS_DAY(temp_dts); + rtc_timestamp->timestamp_day = (uint8_t)GET_DTS_DOW(temp_dts); + rtc_timestamp->timestamp_hour = (uint8_t)GET_TTS_HR(temp_tts); + rtc_timestamp->timestamp_minute = (uint8_t)GET_TTS_MN(temp_tts); + rtc_timestamp->timestamp_second = (uint8_t)GET_TTS_SC(temp_tts); +} + +/*! + \brief get RTC time-stamp subsecond + \param[in] none + \param[out] none + \retval RTC time-stamp subsecond value +*/ +uint32_t rtc_timestamp_subsecond_get(void) +{ + return ((uint32_t)RTC_SSTS); +} + +/*! + \brief RTC time-stamp mapping + \param[in] rtc_af: + \arg RTC_AF0_TIMESTAMP: RTC_AF0 use for timestamp + \arg RTC_AF1_TIMESTAMP: RTC_AF1 use for timestamp + \param[out] none + \retval none +*/ +void rtc_timestamp_pin_map(uint32_t rtc_af) +{ + RTC_TAMP &= ~RTC_TAMP_TSSEL; + RTC_TAMP |= rtc_af; +} + +/*! + \brief enable RTC tamper + \param[in] rtc_tamper: pointer to a rtc_tamper_struct structure which contains + parameters for RTC tamper configuration + members of the structure and the member values are shown as below: + detecting tamper event can using edge mode or level mode + (1) using edge mode configuration: + tamper_source: RTC_TAMPER0, RTC_TAMPER1 + tamper_trigger: RTC_TAMPER_TRIGGER_EDGE_RISING, RTC_TAMPER_TRIGGER_EDGE_FALLING + tamper_filter: RTC_FLT_EDGE + tamper_with_timestamp: DISABLE, ENABLE + (2) using level mode configuration: + tamper_source: RTC_TAMPER0, RTC_TAMPER1 + tamper_trigger:RTC_TAMPER_TRIGGER_LEVEL_LOW, RTC_TAMPER_TRIGGER_LEVEL_HIGH + tamper_filter: RTC_FLT_2S, RTC_FLT_4S, RTC_FLT_8S + tamper_sample_frequency: RTC_FREQ_DIV32768, RTC_FREQ_DIV16384, RTC_FREQ_DIV8192, + RTC_FREQ_DIV4096, RTC_FREQ_DIV2048, RTC_FREQ_DIV1024, + RTC_FREQ_DIV512, RTC_FREQ_DIV256 + tamper_precharge_enable: DISABLE, ENABLE + tamper_precharge_time: RTC_PRCH_1C, RTC_PRCH_2C, RTC_PRCH_4C, RTC_PRCH_8C + tamper_with_timestamp: DISABLE, ENABLE + \param[out] none + \retval none +*/ +void rtc_tamper_enable(rtc_tamper_struct *rtc_tamper) +{ + /* disable tamper */ + RTC_TAMP &= (uint32_t)~(rtc_tamper->tamper_source); + + /* tamper filter must be used when the tamper source is voltage level detection */ + RTC_TAMP &= (uint32_t)~RTC_TAMP_FLT; + + /* the tamper source is voltage level detection */ + if((uint32_t)(rtc_tamper->tamper_filter) != RTC_FLT_EDGE) { + RTC_TAMP &= (uint32_t)~(RTC_TAMP_DISPU | RTC_TAMP_PRCH | RTC_TAMP_FREQ | RTC_TAMP_FLT); + + /* check if the tamper pin need precharge, if need, then configure the precharge time */ + if(DISABLE == rtc_tamper->tamper_precharge_enable) { + RTC_TAMP |= (uint32_t)RTC_TAMP_DISPU; + } else { + RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_precharge_time); + } + + RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_sample_frequency); + RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_filter); + + /* configure the tamper trigger */ + RTC_TAMP &= ((uint32_t)~((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS)); + if(RTC_TAMPER_TRIGGER_LEVEL_LOW != rtc_tamper->tamper_trigger) { + RTC_TAMP |= (uint32_t)((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS); + } + } else { + /* configure the tamper trigger */ + RTC_TAMP &= ((uint32_t)~((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS)); + if(RTC_TAMPER_TRIGGER_EDGE_RISING != rtc_tamper->tamper_trigger) { + RTC_TAMP |= (uint32_t)((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS); + } + } + + RTC_TAMP &= (uint32_t)~RTC_TAMP_TPTS; + if(DISABLE != rtc_tamper->tamper_with_timestamp) { + /* the tamper event also cause a time-stamp event */ + RTC_TAMP |= (uint32_t)RTC_TAMP_TPTS; + } + /* enable tamper */ + RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_source); +} + +/*! + \brief disable RTC tamper + \param[in] source: specify which tamper source to be disabled + \arg RTC_TAMPER0 + \arg RTC_TAMPER1 + \param[out] none + \retval none +*/ +void rtc_tamper_disable(uint32_t source) +{ + /* disable tamper */ + RTC_TAMP &= (uint32_t)~source; +} + +/*! + \brief RTC tamper0 mapping + \param[in] rtc_af: + \arg RTC_AF0_TAMPER0: RTC_AF0 use for tamper0 + \arg RTC_AF1_TAMPER0: RTC_AF1 use for tamper0 + \param[out] none + \retval none +*/ +void rtc_tamper0_pin_map(uint32_t rtc_af) +{ + RTC_TAMP &= ~(RTC_TAMP_TP0EN | RTC_TAMP_TP0SEL); + RTC_TAMP |= rtc_af; +} + +/*! + \brief enable specified RTC interrupt + \param[in] interrupt: specify which interrupt source to be enabled + \arg RTC_INT_TIMESTAMP: timestamp interrupt + \arg RTC_INT_ALARM0: alarm0 interrupt + \arg RTC_INT_ALARM1: alarm1 interrupt + \arg RTC_INT_TAMP: tamper detection interrupt + \arg RTC_INT_WAKEUP: wakeup timer interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_enable(uint32_t interrupt) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* enable the interrupts in RTC_CTL register */ + RTC_CTL |= (uint32_t)(interrupt & (uint32_t)~RTC_TAMP_TPIE); + /* enable the interrupts in RTC_TAMP register */ + RTC_TAMP |= (uint32_t)(interrupt & RTC_TAMP_TPIE); + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief disble specified RTC interrupt + \param[in] interrupt: specify which interrupt source to be disabled + \arg RTC_INT_TIMESTAMP: timestamp interrupt + \arg RTC_INT_ALARM0: alarm interrupt + \arg RTC_INT_ALARM1: alarm interrupt + \arg RTC_INT_TAMP: tamper detection interrupt + \arg RTC_INT_WAKEUP: wakeup timer interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_disable(uint32_t interrupt) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* disable the interrupts in RTC_CTL register */ + RTC_CTL &= (uint32_t)~(interrupt & (uint32_t)~RTC_TAMP_TPIE); + /* disable the interrupts in RTC_TAMP register */ + RTC_TAMP &= (uint32_t)~(interrupt & RTC_TAMP_TPIE); + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief check specified flag + \param[in] flag: specify which flag to check + \arg RTC_STAT_SCP: smooth calibration pending flag + \arg RTC_FLAG_TP1: RTC tamper 1 detected flag + \arg RTC_FLAG_TP0: RTC tamper 0 detected flag + \arg RTC_FLAG_TSOVR: time-stamp overflow flag + \arg RTC_FLAG_TS: time-stamp flag + \arg RTC_FLAG_ALRM0: alarm0 occurs flag + \arg RTC_FLAG_ALRM1: alarm1 occurs flag + \arg RTC_FLAG_WT: wakeup timer occurs flag + \arg RTC_FLAG_INIT: initialization state flag + \arg RTC_FLAG_RSYN: register synchronization flag + \arg RTC_FLAG_YCM: year configuration mark status flag + \arg RTC_FLAG_SOP: shift function operation pending flag + \arg RTC_FLAG_ALRM0W: alarm0 configuration can be write flag + \arg RTC_FLAG_ALRM1W: alarm1 configuration can be write flag + \arg RTC_FLAG_WTW: wakeup timer can be write flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rtc_flag_get(uint32_t flag) +{ + FlagStatus flag_state = RESET; + + if((uint32_t)RESET != (RTC_STAT & flag)) { + flag_state = SET; + } + return flag_state; +} + +/*! + \brief clear specified flag + \arg RTC_FLAG_TP1: RTC tamper 1 detected flag + \arg RTC_FLAG_TP0: RTC tamper 0 detected flag + \arg RTC_FLAG_TSOVR: time-stamp overflow flag + \arg RTC_FLAG_TS: time-stamp flag + \arg RTC_FLAG_WT: wakeup timer occurs flag + \arg RTC_FLAG_ALARM0: alarm0 occurs flag + \arg RTC_FLAG_ALARM1: alarm1 occurs flag + \arg RTC_FLAG_RSYN: register synchronization flag + \param[out] none + \retval none +*/ +void rtc_flag_clear(uint32_t flag) +{ + RTC_STAT &= (uint32_t)(~flag); +} + +/*! + \brief configure rtc alarm output source + \param[in] source: specify signal to output + \arg RTC_ALARM0_HIGH: when the alarm0 flag is set, the output pin is high + \arg RTC_ALARM0_LOW: when the alarm0 flag is set, the output pin is low + \arg RTC_ALARM1_HIGH: when the alarm1 flag is set, the output pin is high + \arg RTC_ALARM1_LOW: when the alarm1 flag is set, the output pin is low + \arg RTC_WAKEUP_HIGH: when the wakeup flag is set, the output pin is high + \arg RTC_WAKEUP_LOW: when the wakeup flag is set, the output pin is low + \param[in] mode: specify the output pin mode when output alarm signal + \arg RTC_ALARM_OUTPUT_OD: open drain mode + \arg RTC_ALARM_OUTPUT_PP: push pull mode + \param[out] none + \retval none +*/ +void rtc_alarm_output_config(uint32_t source, uint32_t mode) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL &= ~(RTC_CTL_OS | RTC_CTL_OPOL); + RTC_TAMP &= ~RTC_TAMP_AOT; + + RTC_CTL |= (uint32_t)(source); + /* alarm output */ + RTC_TAMP |= (uint32_t)(mode); + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief configure rtc calibration output source + \param[in] source: specify signal to output + \arg RTC_CALIBRATION_512HZ: when the LSE freqency is 32768Hz and the RTC_PSC + is the default value, output 512Hz signal + \arg RTC_CALIBRATION_1HZ: when the LSE freqency is 32768Hz and the RTC_PSC + is the default value, output 1Hz signal + \param[out] none + \retval none +*/ +void rtc_calibration_output_config(uint32_t source) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL &= (uint32_t)~(RTC_CTL_COEN | RTC_CTL_COS); + + RTC_CTL |= (uint32_t)(source); + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief adjust the daylight saving time by adding or substracting one hour from the current time + \param[in] operation: hour adjustment operation + \arg RTC_CTL_A1H: add one hour + \arg RTC_CTL_S1H: substract one hour + \param[out] none + \retval none +*/ +void rtc_hour_adjust(uint32_t operation) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL |= (uint32_t)(operation); + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief adjust RTC second or subsecond value of current time + \param[in] add: add 1s to current time or not + \arg RTC_SHIFT_ADD1S_RESET: no effect + \arg RTC_SHIFT_ADD1S_SET: add 1s to current time + \param[in] minus: number of subsecond to minus from current time(0x0 - 0x7FFF) + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_second_adjust(uint32_t add, uint32_t minus) +{ + volatile uint32_t time_index = RTC_SHIFTCTL_TIMEOUT; + ErrStatus error_status = ERROR; + uint32_t flag_status = RESET; + uint32_t temp = 0U; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* check if a shift operation is ongoing */ + do { + flag_status = RTC_STAT & RTC_STAT_SOPF; + } while((--time_index > 0U) && ((uint32_t)RESET != flag_status)); + + /* check if the function of reference clock detection is disabled */ + temp = RTC_CTL & RTC_CTL_REFEN; + if((RESET == flag_status) && (RESET == temp)) { + RTC_SHIFTCTL = (uint32_t)(add | SHIFTCTL_SFS(minus)); + error_status = rtc_register_sync_wait(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief enable RTC bypass shadow registers function + \param[in] none + \param[out] none + \retval none +*/ +void rtc_bypass_shadow_enable(void) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL |= RTC_CTL_BPSHAD; + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief disable RTC bypass shadow registers function + \param[in] none + \param[out] none + \retval none +*/ +void rtc_bypass_shadow_disable(void) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL &= ~RTC_CTL_BPSHAD; + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief enable RTC reference clock detection function + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_refclock_detection_enable(void) +{ + ErrStatus error_status = ERROR; + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + RTC_CTL |= (uint32_t)RTC_CTL_REFEN; + /* exit init mode */ + rtc_init_mode_exit(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief disable RTC reference clock detection function + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_refclock_detection_disable(void) +{ + ErrStatus error_status = ERROR; + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + RTC_CTL &= (uint32_t)~RTC_CTL_REFEN; + /* exit init mode */ + rtc_init_mode_exit(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief enable RTC auto wakeup function + \param[in] none + \param[out] none + \retval none +*/ +void rtc_wakeup_enable(void) +{ + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + RTC_CTL |= RTC_CTL_WTEN; + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; +} + +/*! + \brief disable RTC auto wakeup function + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_wakeup_disable(void) +{ + ErrStatus error_status = ERROR; + volatile uint32_t time_index = RTC_WTWF_TIMEOUT; + uint32_t flag_status = RESET; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + RTC_CTL &= ~RTC_CTL_WTEN; + /* wait until the WTWF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_WTWF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET == flag_status) { + error_status = ERROR; + } else { + error_status = SUCCESS; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + return error_status; +} + +/*! + \brief set RTC auto wakeup timer clock + \param[in] wakeup_clock: + \arg WAKEUP_RTCCK_DIV16: RTC auto wakeup timer clock is RTC clock divided by 16 + \arg WAKEUP_RTCCK_DIV8: RTC auto wakeup timer clock is RTC clock divided by 8 + \arg WAKEUP_RTCCK_DIV4: RTC auto wakeup timer clock is RTC clock divided by 4 + \arg WAKEUP_RTCCK_DIV2: RTC auto wakeup timer clock is RTC clock divided by 2 + \arg WAKEUP_CKSPRE: RTC auto wakeup timer clock is ckspre + \arg WAKEUP_CKSPRE_2EXP16: RTC auto wakeup timer clock is ckspre and wakeup timer add 2exp16 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_wakeup_clock_set(uint8_t wakeup_clock) +{ + ErrStatus error_status = ERROR; + volatile uint32_t time_index = RTC_WTWF_TIMEOUT; + uint32_t flag_status = RESET; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + /* only when RTC_CTL_WTEN=0 and RTC_STAT_WTWF=1 can write RTC_CTL[2��0] */ + /* wait until the WTWF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_WTWF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET == flag_status) { + error_status = ERROR; + } else { + RTC_CTL &= (uint32_t)~ RTC_CTL_WTCS; + RTC_CTL |= (uint32_t)wakeup_clock; + error_status = SUCCESS; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief set wakeup timer value + \param[in] wakeup_timer: 0x0000-0xffff + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_wakeup_timer_set(uint16_t wakeup_timer) +{ + ErrStatus error_status = ERROR; + volatile uint32_t time_index = RTC_WTWF_TIMEOUT; + uint32_t flag_status = RESET; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + /* wait until the WTWF flag to be set */ + do { + flag_status = RTC_STAT & RTC_STAT_WTWF; + } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); + + if((uint32_t)RESET == flag_status) { + error_status = ERROR; + } else { + RTC_WUT = (uint32_t)wakeup_timer; + error_status = SUCCESS; + } + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + return error_status; +} + +/*! + \brief get wakeup timer value + \param[in] none + \param[out] none + \retval wakeup timer value +*/ +uint16_t rtc_wakeup_timer_get(void) +{ + return (uint16_t)RTC_WUT; +} + +/*! + \brief configure RTC smooth calibration + \param[in] window: select calibration window + \arg RTC_CALIBRATION_WINDOW_32S: 2exp20 RTCCLK cycles, 32s if RTCCLK = 32768 Hz + \arg RTC_CALIBRATION_WINDOW_16S: 2exp19 RTCCLK cycles, 16s if RTCCLK = 32768 Hz + \arg RTC_CALIBRATION_WINDOW_8S: 2exp18 RTCCLK cycles, 8s if RTCCLK = 32768 Hz + \param[in] plus: add RTC clock or not + \arg RTC_CALIBRATION_PLUS_SET: add one RTC clock every 2048 rtc clock + \arg RTC_CALIBRATION_PLUS_RESET: no effect + \param[in] minus: the RTC clock to minus during the calibration window(0x0 - 0x1FF) + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_smooth_calibration_config(uint32_t window, uint32_t plus, uint32_t minus) +{ + volatile uint32_t time_index = RTC_HRFC_TIMEOUT; + ErrStatus error_status = ERROR; + uint32_t flag_status = RESET; + + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* check if a smooth calibration operation is ongoing */ + do { + flag_status = RTC_STAT & RTC_STAT_SCPF; + } while((--time_index > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET == flag_status) { + RTC_HRFC = (uint32_t)(window | plus | HRFC_CMSK(minus)); + error_status = SUCCESS; + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} + +/*! + \brief enable RTC coarse calibration + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_coarse_calibration_enable(void) +{ + ErrStatus error_status = ERROR; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + RTC_CTL |= (uint32_t)RTC_CTL_CCEN; + /* exit init mode */ + rtc_init_mode_exit(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + return error_status; +} + +/*! + \brief disable RTC coarse calibration + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_coarse_calibration_disable(void) +{ + ErrStatus error_status = ERROR; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + RTC_CTL &= (uint32_t)~RTC_CTL_CCEN; + /* exit init mode */ + rtc_init_mode_exit(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + return error_status; +} + +/*! + \brief config coarse calibration direction and step + \param[in] direction: CALIB_INCREASE or CALIB_DECREASE + \param[in] step: 0x00-0x1F + COSD=0: + 0x00:+0 PPM + 0x01:+4 PPM + 0x02:+8 PPM + .... + 0x1F:+126 PPM + COSD=1: + 0x00:-0 PPM + 0x01:-2 PPM + 0x02:-4 PPM + .... + 0x1F:-63 PPM + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus rtc_coarse_calibration_config(uint8_t direction, uint8_t step) +{ + ErrStatus error_status = ERROR; + /* disable the write protection */ + RTC_WPK = RTC_UNLOCK_KEY1; + RTC_WPK = RTC_UNLOCK_KEY2; + + /* enter init mode */ + error_status = rtc_init_mode_enter(); + + if(ERROR != error_status) { + if(CALIB_DECREASE == direction) { + RTC_COSC |= (uint32_t)RTC_COSC_COSD; + } else { + RTC_COSC &= (uint32_t)~RTC_COSC_COSD; + } + RTC_COSC &= ~RTC_COSC_COSS; + RTC_COSC |= (uint32_t)((uint32_t)step & 0x1FU); + /* exit init mode */ + rtc_init_mode_exit(); + } + + /* enable the write protection */ + RTC_WPK = RTC_LOCK_KEY; + + return error_status; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c new file mode 100644 index 00000000000..34d9271b08e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c @@ -0,0 +1,609 @@ +/*! + \file gd32f5xx_sai.c + \brief SAI driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_sai.h" + +/*!< bit offset of MTFCNT in SAI_CFG1 */ +#define CFG1_MTFCNT_OFFSET ((uint32_t)0x00000007U) + +/*! + \brief reset SAI + \param[in] none + \param[out] none + \retval none +*/ +void sai_deinit(void) +{ + /* reset SAI */ + rcu_periph_reset_enable(RCU_SAIRST); + rcu_periph_reset_disable(RCU_SAIRST); +} + +/*! + \brief initialize the parameter of SAI structure with a default value + \param[in] none + \param[out] sai_init_stuct: the initialization data needed to initialize SAI + \retval none +*/ +void sai_struct_para_init(sai_parameter_struct *sai_init_stuct) +{ + /* initialize the initpara struct member with the default value */ + sai_init_stuct->operating_mode = SAI_MASTER_TRANSMITTER; + sai_init_stuct->protocol = SAI_PROTOCOL_POLYMORPHIC; + sai_init_stuct->data_width = SAI_DATAWIDTH_32BIT; + sai_init_stuct->shift_dir = SAI_SHIFT_MSB; + sai_init_stuct->sample_edge = SAI_SAMPEDGE_FALLING; + sai_init_stuct->sync_mode = SAI_SYNCMODE_ASYNC; + sai_init_stuct->output_drive = SAI_OUTPUT_WITH_SAIEN; + sai_init_stuct->clk_div_bypass = SAI_CLKDIV_BYPASS_OFF; + sai_init_stuct->mclk_div = SAI_MCLKDIV_1; + sai_init_stuct->mclk_oversampling = SAI_MCLK_OVERSAMP_256; + sai_init_stuct->mclk_enable = SAI_MCLK_DISABLE; + sai_init_stuct->fifo_threshold = SAI_FIFOTH_EMPTY; +} + +/*! + \brief initialize the parameter of SAI frame structure with a default value + \param[in] none + \param[out] sai_frame_init_struct: the initialization data needed to initialize SAI frame + \retval none +*/ +void sai_frame_struct_para_init(sai_frame_parameter_struct *sai_frame_init_struct) +{ + /* initialize the initpara struct member with the default value */ + sai_frame_init_struct->frame_width = 256U; + sai_frame_init_struct->frame_sync_width = 128U; + sai_frame_init_struct->frame_sync_function = SAI_FS_FUNC_START; + sai_frame_init_struct->frame_sync_polarity = SAI_FS_POLARITY_LOW; + sai_frame_init_struct->frame_sync_offset = SAI_FS_OFFSET_BEGINNING; +} + +/*! + \brief initialize the parameter of SAI slot structure with a default value + \param[in] none + \param[out] sai_slot_init_struct: the initialization data needed to initialize SAI slot + \retval none +*/ +void sai_slot_struct_para_init(sai_slot_parameter_struct *sai_slot_init_struct) +{ + /* initialize the initpara struct member with the default value */ + sai_slot_init_struct->slot_number = 16U; + sai_slot_init_struct->slot_width = SAI_SLOT_WIDTH_DATA; + sai_slot_init_struct->data_offset = 0U; + sai_slot_init_struct->slot_active = SAI_SLOT_ACTIVE_NONE; +} + +/*! + \brief initialize SAI + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x = 0,1) + \param[in] sai_struct: SAI parameter initialization stuct members of the structure + and the member values are shown as below: + operating_mode: SAI_MASTER_TRANSMITTER, SAI_MASTER_RECEIVER, SAI_SLAVE_TRANSMITTER, SAI_SLAVE_RECEIVER; + protocol: SAI_PROTOCOL_POLYMORPHIC, SAI_PROTOCOL_SPDIF, SAI_PROTOCOL_AC97 + data_width: SAI_DATA_WIDTH_xBIT (x = 8, 10, 16, 20, 24, 32) + shift_dir: SAI_SHIFT_MSB, SAI_SHIFT_LSB + sample_edge: SAI_SAMPEDGE_FALLING, SAI_SAMPEDGE_RISING + sync_mode: SAI_SYNCMODE_ASYNC, SAI_SYNCMODE_OTHERBLOCK, SAI_SYNCMODE_EXTERNALSAI + output_drive: SAI_OUTPUT_WITH_SAIEN, SAI_OUTPUT_NOW + clk_div_bypass: SAI_CLKDIV_BYPASS_OFF, SAI_CLKDIV_BYPASS_ON + mck_div: SAI_MCLKDIV_x (x = 1,2,..,63) + mck_oversampling: SAI_MASTERCLK_OVERSAMP_256, SAI_MASTERCLK_OVERSAMP_512 + mck_enable: SAI_MASTERCLK_DISABLE, SAI_MASTERCLK_ENABLE + fifo_threshold: SAI_FIFOTH_EMPTY, SAI_FIFOTH_QUARTER, SAI_FIFOTH_HALF, SAI_FIFOTH_THREE_QUARTER, SAI_FIFOTH_FULL + \param[out] none + \retval none +*/ +void sai_init(uint32_t block, sai_parameter_struct *sai_struct) +{ + uint32_t reg = 0U; + + /* configure the SAI CFGR0 value */ + reg = SAI_CFG0(block); + reg &= ~(SAI_CFG0_OPTMOD | SAI_CFG0_PROT | \ + SAI_CFG0_DATAWD | SAI_CFG0_SHIFTDIR | \ + SAI_CFG0_SAMPEDGE | SAI_CFG0_SYNCMOD | \ + SAI_CFG0_ODRIV | SAI_CFG0_BYPASS | \ + SAI_CFG0_MDIV | SAI_CFG0_MOSPR | \ + SAI_CFG0_MCLKEN | SAI_CFG0_SAIEN); + + reg |= (uint32_t)(sai_struct->operating_mode | sai_struct->protocol | \ + sai_struct->data_width | sai_struct->shift_dir | \ + sai_struct->sample_edge | sai_struct->sync_mode | \ + sai_struct->output_drive | sai_struct->clk_div_bypass | \ + sai_struct->mclk_div | sai_struct->mclk_oversampling | \ + sai_struct->mclk_enable); + SAI_CFG0(block) = reg; + + /* configure the SAI CFGR1 FIFO threshold */ + reg = SAI_CFG1(block); + reg &= ~SAI_CFG1_FFTH; + reg |= (uint32_t)(sai_struct->fifo_threshold); + SAI_CFG1(block) = reg; +} + +/*! + \brief initialize SAI frame + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] sai_frame_struct: SAI frame parameter initialization stuct members of the structure + and the member values are shown as below: + frame_width: 1~256, frame width + frame_sync_width: 1~128, frame synchronization active width + frame_sync_function: SAI_FS_FUNC_START, SAI_FS_FUNC_START_CHANNEL + frame_sync_polarity: SAI_FS_POLARITY_LOW, SAI_FS_POLARITY_HIGH + frame_sync_offset: SAI_FS_OFFSET_BEGINNING, SAI_FS_OFFSET_ONEBITBEFORE + \param[out] none + \retval none +*/ +void sai_frame_init(uint32_t block, sai_frame_parameter_struct *sai_frame_struct) +{ + uint32_t reg = 0U; + reg = SAI_FCFG(block); + reg &= ~(SAI_FCFG_FWD | SAI_FCFG_FSAWD | SAI_FCFG_FSFUNC | \ + SAI_FCFG_FSPL | SAI_FCFG_FSOST); + reg |= (uint32_t)(sai_frame_struct->frame_sync_offset | \ + sai_frame_struct->frame_sync_polarity | \ + sai_frame_struct->frame_sync_function | \ + ((sai_frame_struct->frame_sync_width - 1U) << 8U) | \ + (sai_frame_struct->frame_width - 1U)); + /* configure the SAI frame */ + SAI_FCFG(block) = reg; +} + +/*! + \brief initialize SAI slot + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] sai_slot_struct: SAI slot parameter initialization stuct members of the structure + and the member values are shown as below: + slot_number: 1~16, slot number + slot_width: SAI_SLOTWIDTH_DATA, SAI_SLOTWIDTH_16BIT, SAI_SLOTWIDTH_32BIT + data_offset: 0~31, data offset + slot_active: one or more parameters can be selected, SAI_SLOT_ACTIVE_NONE, SAI_SLOT_ACTIVE_x(x=0..15), SAI_SLOT_ACTIVE_ALL + \param[out] none + \retval none +*/ +void sai_slot_init(uint32_t block, sai_slot_parameter_struct *sai_slot_struct) +{ + uint32_t reg = 0U; + reg = SAI_SCFG(block); + reg &= ~(SAI_SCFG_DATAOST | SAI_SCFG_SLOTWD | SAI_SCFG_SLOTNUM | SAI_SCFG_SLOTAV); + reg = (uint32_t)(((sai_slot_struct->slot_number - 1U) << 8U) | \ + sai_slot_struct->slot_width | \ + sai_slot_struct->data_offset | \ + sai_slot_struct->slot_active); + /* configure the SAI slot */ + SAI_SCFG(block) = reg; +} + +/*! + \brief SAI enable + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[out] none + \retval none +*/ +void sai_enable(uint32_t block) +{ + SAI_CFG0(block) |= SAI_CFG0_SAIEN; +} + +/*! + \brief SAI disable + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[out] none + \retval none +*/ +void sai_disable(uint32_t block) +{ + SAI_CFG0(block) &= ~SAI_CFG0_SAIEN; +} + +/*! + \brief SAI serial data near inactive slot output management + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] sdout: serial data output management + only one parameter can be selected which is shown as below: + \arg SAI_SDLINE_DRIVE: SD line output is driven entirely during the audio frame + \arg SAI_SDLINE_RELEASE: SD line output is released near inactive slots + \param[out] none + \retval none +*/ +void sai_sdoutput_config(uint32_t block, uint32_t sdout) +{ + SAI_CFG1(block) &= ~SAI_CFG1_SDOM; + SAI_CFG1(block) |= sdout; +} + +/*! + \brief configure SAI mono mode + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[in] mono: stereo and mono mode selection + only one parameter can be selected which is shown as below: + \arg SAI_STEREO_MODE: stereo mode + \arg SAI_MONO_MODE: mono mode + \param[out] none + \retval none +*/ +void sai_monomode_config(uint32_t block, uint32_t mono) +{ + SAI_CFG0(block) &= ~SAI_CFG0_MONO; + SAI_CFG0(block) |= mono; +} + +/*! + \brief configure SAI companding mode + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[in] compander: compander mode + only one parameter can be selected which is shown as below: + \arg SAI_COMPANDER_OFF: no compansion applies + \arg SAI_COMPANDER_ULAW: u-law algorithm + \arg SAI_COMPANDER_ALAW: A-law algorithm + \param[in] complement:complement mode + only one parameter can be selected which is shown as below: + \arg SAI_COMPLEMENT_1S: data represented in 1's complement form + \arg SAI_COMPLEMENT_2S: data represented in 2's complement form + \param[out] none + \retval none +*/ +void sai_companding_config(uint32_t block, uint32_t compander, uint32_t complement) +{ + uint32_t reg = 0U; + reg = SAI_CFG1(block); + reg &= ~(SAI_CFG1_CPLMOD | SAI_CFG1_CPAMOD); + reg |= (compander | complement); + SAI_CFG1(block) = reg; +} + +/*! + \brief SAI mute detected enable or mute send enable + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval none +*/ +void sai_mute_enable(uint32_t block) +{ + SAI_CFG1(block) |= SAI_CFG1_MT; +} + +/*! + \brief SAI mute detected disable or mute send disable + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval none +*/ +void sai_mute_disable(uint32_t block) +{ + SAI_CFG1(block) &= ~SAI_CFG1_MT; +} + +/*! + \brief configure SAI mute value + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[in] value: mute value + only one parameter can be selected which are shown as below: + \arg SAI_MUTESENT_0: 0 is sent via the serial data line when mute is on + \arg SAI_MUTESENT_LASTFREAM: If SLOTNUM is less or equals to two, last frame is sent via the serial data line + \param[out] none + \retval none +*/ +void sai_mute_value_config(uint32_t block, uint32_t value) +{ + SAI_CFG1(block) &= ~SAI_CFG1_MTVAL; + SAI_CFG1(block) |= value; +} + +/*! + \brief configure SAI mute frame count + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[in] count: 0~63, mute frame count + \param[out] none + \retval none +*/ +void sai_mute_count_config(uint32_t block, uint32_t count) +{ + uint32_t reg = 0U; + reg = SAI_CFG1(block); + reg &= ~SAI_CFG1_MTFCNT; + reg |= count << CFG1_MTFCNT_OFFSET; + SAI_CFG1(block) = reg; +} + +/*! + \brief SAI transmit data + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[in] data: 32-bit data + \param[out] none + \retval none +*/ +void sai_data_transmit(uint32_t block, uint32_t data) +{ + SAI_DATA(block) = data; +} + +/*! + \brief SAI receive data + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval received data +*/ +uint32_t sai_data_receive(uint32_t block) +{ + return SAI_DATA(block); +} + +/*! + \brief get SAI fifo status + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval state of fifo + \arg FIFO_EMPTY: empty + \arg FIFO_EMPTY_TO_1_4_FULL: empty < fifo_level <= 1/4_full + \arg FIFO_1_4_FULL_TO_1_2_FULL: 1/4_full < fifo_level <= 1/2_full + \arg FIFO_1_2_FULL_TO_3_4_FULL: 1/2_full < fifo_level <= 3/4_full + \arg FIFO_3_4_FULL_TO_FULL: 3/4_full < fifo_level < full + \arg FIFO_FULL: full +*/ +sai_fifo_state_enum sai_fifo_status_get(uint32_t block) +{ + sai_fifo_state_enum sai_fifo_state = FIFO_EMPTY; + + if(SAI_FIFO_STAT_EMPTY == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { + sai_fifo_state = FIFO_EMPTY; + } else if(SAI_FIFO_STAT_QUARTER == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { + sai_fifo_state = FIFO_EMPTY_TO_1_4_FULL; + } else if(SAI_FIFO_STAT_HALF == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { + sai_fifo_state = FIFO_1_4_FULL_TO_1_2_FULL; + } else if(SAI_FIFO_STAT_THREE_QUARTER == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { + sai_fifo_state = FIFO_1_2_FULL_TO_3_4_FULL; + } else if(SAI_FIFO_STAT_NEARFULL == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { + sai_fifo_state = FIFO_3_4_FULL_TO_FULL; + } else { + sai_fifo_state = FIFO_FULL; + } + + return sai_fifo_state; +} + +/*! + \brief SAI fifo flush + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval none +*/ +void sai_fifo_flush(uint32_t block) +{ + SAI_CFG1(block) = SAI_CFG1_FLUSH; +} + +/*! + \brief enable SAI dma + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval none +*/ +void sai_dma_enable(uint32_t block) +{ + SAI_CFG0(block) |= SAI_CFG0_DMAEN; +} + +/*! + \brief disable SAI dma + + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx (x=0,1) + \param[out] none + \retval none +*/ +void sai_dma_disable(uint32_t block) +{ + SAI_CFG0(block) &= ~SAI_CFG0_DMAEN; +} + +/*! + \brief enable the SAI interrupt + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] interrupt: specify which interrupt to enable + one or more parameters can be selected which are shown as below: + \arg SAI_INT_OUERR: FIFO overrun or underrun interrupt enable + \arg SAI_INT_MTDET: mute detection interrupt enable + \arg SAI_INT_ERRCK: error clock interrupt enable + \arg SAI_INT_FFREQ: FIFO request interrupt enable + \arg SAI_INT_ACNRDY: audio codec not ready interrupt enable + \arg SAI_INT_FSADET: frame synchronization advanced detection interrupt enable + \arg SAI_INT_FSPDET: frame synchronization postpone detection interrupt enable + \param[out] none + \retval none +*/ +void sai_interrupt_enable(uint32_t block, uint32_t interrupt) +{ + SAI_INTEN(block) |= interrupt; +} + +/*! + \brief disable the SAI interrupt + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] interrupt: specify which interrupt to disable + one or more parameters can be selected which are shown as below: + \arg SAI_INT_OUERR: FIFO overrun or underrun interrupt + \arg SAI_INT_MTDET: mute detection interrupt + \arg SAI_INT_ERRCK: error clock interrupt + \arg SAI_INT_FFREQ: FIFO request interrupt + \arg SAI_INT_ACNRDY: audio codec not ready interrupt + \arg SAI_INT_FSADET: frame synchronization advanced detection interrupt + \arg SAI_INT_FSPDET: frame synchronization postpone detection interrupt + \param[out] none + \retval none +*/ +void sai_interrupt_disable(uint32_t block, uint32_t interrupt) +{ + SAI_INTEN(block) &= ~interrupt; +} + +/*! + \brief get the SAI interrupt flag + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] interrupt: specify which interrupt flag to get + only one parameter can be selected which are shown as below: + \arg SAI_FLAG_OUERR: FIFO overrun or underrun interrupt flag + \arg SAI_FLAG_MTDET: mute detection interrupt flag + \arg SAI_FLAG_ERRCK: error clock interrupt flag + \arg SAI_FLAG_FFREQ: FIFO request interrupt flag + \arg SAI_FLAG_ACNRDY: audio codec not ready interrupt flag + \arg SAI_FLAG_FSADET: frame synchronization advanced detection interrupt flag + \arg SAI_FLAG_FSPDET: frame synchronization postpone detection interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sai_interrupt_flag_get(uint32_t block, uint32_t interrupt) +{ + uint32_t inten = 0U; + inten = SAI_INTEN(block) & interrupt; + if((RESET != (SAI_STAT(block) & interrupt)) && (RESET != inten)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the SAI interrupt flag + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] interrupt: specify which interrupt flag to clear + one or more parameters can be selected which are shown as below: + \arg SAI_FLAG_OUERR: FIFO overrun or underrun interrupt flag + \arg SAI_FLAG_MTDET: mute detection interrupt flag + \arg SAI_FLAG_ERRCK: error clock interrupt flag + \arg SAI_FLAG_ACNRDY: audio codec not ready interrupt flag + \arg SAI_FLAG_FSADET: frame synchronization advanced detection interrupt flag + \arg SAI_FLAG_FSPDET: frame synchronization postpone detection interrupt flag + \param[out] none + \retval none +*/ +void sai_interrupt_flag_clear(uint32_t block, uint32_t interrupt) +{ + SAI_INTC(block) = interrupt; +} + +/*! + \brief get the SAI flag + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] flag: specify which flag to get + only one parameter can be selected which are shown as below: + \arg SAI_FLAG_OUERR: FIFO overrun or underrun flag + \arg SAI_FLAG_MTDET: mute detection flag + \arg SAI_FLAG_ERRCK: error clock flag + \arg SAI_FLAG_FFREQ: FIFO request flag + \arg SAI_FLAG_ACNRDY: audio codec not ready flag + \arg SAI_FLAG_FSADET: frame synchronization advanced detection flag + \arg SAI_FLAG_FSPDET: frame synchronization postpone detection flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sai_flag_get(uint32_t block, uint32_t flag) +{ + if(RESET != (SAI_STAT(block) & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the SAI flag + \param[in] block: specify which bolck is initialized + only one parameter can be selected which is shown as below: + \arg SAI_BLOCKx(x=0,1) + \param[in] flag: specify which flag to clear + one or more parameters can be selected which are shown as below: + \arg SAI_FLAG_OUERR: FIFO overrun or underrun flag + \arg SAI_FLAG_MTDET: mute detection flag + \arg SAI_FLAG_ERRCK: error clock flag + \arg SAI_FLAG_ACNRDY: audio codec not ready flag + \arg SAI_FLAG_FSADET: frame synchronization advanced detection flag + \arg SAI_FLAG_FSPDET: frame synchronization postpone detection flag + \param[out] none + \retval none +*/ +void sai_flag_clear(uint32_t block, uint32_t flag) +{ + SAI_INTC(block) = flag; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c new file mode 100644 index 00000000000..d4d574e9b5c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c @@ -0,0 +1,801 @@ +/*! + \file gd32f5xx_sdio.c + \brief SDIO driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_sdio.h" + +/*! + \brief deinitialize the SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_deinit(void) +{ + rcu_periph_reset_enable(RCU_SDIORST); + rcu_periph_reset_disable(RCU_SDIORST); +} + +/*! + \brief configure the SDIO clock + \param[in] clock_edge: SDIO_CLK clock edge + only one parameter can be selected which is shown as below: + \arg SDIO_SDIOCLKEDGE_RISING: select the rising edge of the SDIOCLK to generate SDIO_CLK + \arg SDIO_SDIOCLKEDGE_FALLING: select the falling edge of the SDIOCLK to generate SDIO_CLK + \param[in] clock_bypass: clock bypass + only one parameter can be selected which is shown as below: + \arg SDIO_CLOCKBYPASS_ENABLE: clock bypass + \arg SDIO_CLOCKBYPASS_DISABLE: no bypass + \param[in] clock_powersave: SDIO_CLK clock dynamic switch on/off for power saving + only one parameter can be selected which is shown as below: + \arg SDIO_CLOCKPWRSAVE_ENABLE: SDIO_CLK closed when bus is idle + \arg SDIO_CLOCKPWRSAVE_DISABLE: SDIO_CLK clock is always on + \param[in] clock_division: clock division, less than 512 + \param[out] none + \retval none +*/ +void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division) +{ + uint32_t clock_config = 0U; + clock_config = SDIO_CLKCTL; + /* reset the CLKEDGE, CLKBYP, CLKPWRSAV, DIV */ + clock_config &= ~(SDIO_CLKCTL_CLKEDGE | SDIO_CLKCTL_CLKBYP | SDIO_CLKCTL_CLKPWRSAV | SDIO_CLKCTL_DIV8 | SDIO_CLKCTL_DIV); + /* if the clock division is greater or equal to 256, set the DIV[8] */ + if(clock_division >= 256U) { + clock_config |= SDIO_CLKCTL_DIV8; + clock_division -= 256U; + } + /* configure the SDIO_CLKCTL according to the parameters */ + clock_config |= (clock_edge | clock_bypass | clock_powersave | clock_division); + SDIO_CLKCTL = clock_config; +} + +/*! + \brief enable hardware clock control + \param[in] none + \param[out] none + \retval none +*/ +void sdio_hardware_clock_enable(void) +{ + SDIO_CLKCTL |= SDIO_CLKCTL_HWCLKEN; +} + +/*! + \brief disable hardware clock control + \param[in] none + \param[out] none + \retval none +*/ +void sdio_hardware_clock_disable(void) +{ + SDIO_CLKCTL &= ~SDIO_CLKCTL_HWCLKEN; +} + +/*! + \brief set different SDIO card bus mode + \param[in] bus_mode: SDIO card bus mode + only one parameter can be selected which is shown as below: + \arg SDIO_BUSMODE_1BIT: 1-bit SDIO card bus mode + \arg SDIO_BUSMODE_4BIT: 4-bit SDIO card bus mode + \arg SDIO_BUSMODE_8BIT: 8-bit SDIO card bus mode + \param[out] none + \retval none +*/ +void sdio_bus_mode_set(uint32_t bus_mode) +{ + /* reset the SDIO card bus mode bits and set according to bus_mode */ + SDIO_CLKCTL &= ~SDIO_CLKCTL_BUSMODE; + SDIO_CLKCTL |= bus_mode; +} + +/*! + \brief set the SDIO power state + \param[in] power_state: SDIO power state + only one parameter can be selected which is shown as below: + \arg SDIO_POWER_ON: SDIO power on + \arg SDIO_POWER_OFF: SDIO power off + \param[out] none + \retval none +*/ +void sdio_power_state_set(uint32_t power_state) +{ + SDIO_PWRCTL = power_state; +} + +/*! + \brief get the SDIO power state + \param[in] none + \param[out] none + \retval SDIO power state + \arg SDIO_POWER_ON: SDIO power on + \arg SDIO_POWER_OFF: SDIO power off +*/ +uint32_t sdio_power_state_get(void) +{ + return SDIO_PWRCTL; +} + +/*! + \brief enable SDIO_CLK clock output + \param[in] none + \param[out] none + \retval none +*/ +void sdio_clock_enable(void) +{ + SDIO_CLKCTL |= SDIO_CLKCTL_CLKEN; +} + +/*! + \brief disable SDIO_CLK clock output + \param[in] none + \param[out] none + \retval none +*/ +void sdio_clock_disable(void) +{ + SDIO_CLKCTL &= ~SDIO_CLKCTL_CLKEN; +} + +/*! + \brief configure the command and response + \param[in] cmd_index: command index, refer to the related specifications + \param[in] cmd_argument: command argument, refer to the related specifications + \param[in] response_type: response type + only one parameter can be selected which is shown as below: + \arg SDIO_RESPONSETYPE_NO: no response + \arg SDIO_RESPONSETYPE_SHORT: short response + \arg SDIO_RESPONSETYPE_LONG: long response + \param[out] none + \retval none +*/ +void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type) +{ + uint32_t cmd_config = 0U; + /* disable the CSM */ + SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN; + /* reset the command index, command argument and response type */ + SDIO_CMDAGMT &= ~SDIO_CMDAGMT_CMDAGMT; + SDIO_CMDAGMT = cmd_argument; + cmd_config = SDIO_CMDCTL; + cmd_config &= ~(SDIO_CMDCTL_CMDIDX | SDIO_CMDCTL_CMDRESP); + /* configure SDIO_CMDCTL and SDIO_CMDAGMT according to the parameters */ + cmd_config |= (cmd_index | response_type); + SDIO_CMDCTL = cmd_config; +} + +/*! + \brief set the command state machine wait type + \param[in] wait_type: wait type + only one parameter can be selected which is shown as below: + \arg SDIO_WAITTYPE_NO: not wait interrupt + \arg SDIO_WAITTYPE_INTERRUPT: wait interrupt + \arg SDIO_WAITTYPE_DATAEND: wait the end of data transfer + \param[out] none + \retval none +*/ +void sdio_wait_type_set(uint32_t wait_type) +{ + /* reset INTWAIT and WAITDEND */ + SDIO_CMDCTL &= ~(SDIO_CMDCTL_INTWAIT | SDIO_CMDCTL_WAITDEND); + /* set the wait type according to wait_type */ + SDIO_CMDCTL |= wait_type; +} + +/*! + \brief enable the CSM(command state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_csm_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_CSMEN; +} + +/*! + \brief disable the CSM(command state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_csm_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN; +} + +/*! + \brief get the last response command index + \param[in] none + \param[out] none + \retval last response command index +*/ +uint8_t sdio_command_index_get(void) +{ + return (uint8_t)SDIO_RSPCMDIDX; +} + +/*! + \brief get the response for the last received command + \param[in] sdio_responsex: SDIO response + only one parameter can be selected which is shown as below: + \arg SDIO_RESPONSE0: card response[31:0]/card response[127:96] + \arg SDIO_RESPONSE1: card response[95:64] + \arg SDIO_RESPONSE2: card response[63:32] + \arg SDIO_RESPONSE3: card response[31:1], plus bit 0 + \param[out] none + \retval response for the last received command +*/ +uint32_t sdio_response_get(uint32_t sdio_responsex) +{ + uint32_t resp_content = 0U; + switch(sdio_responsex) { + case SDIO_RESPONSE0: + resp_content = SDIO_RESP0; + break; + case SDIO_RESPONSE1: + resp_content = SDIO_RESP1; + break; + case SDIO_RESPONSE2: + resp_content = SDIO_RESP2; + break; + case SDIO_RESPONSE3: + resp_content = SDIO_RESP3; + break; + default: + break; + } + return resp_content; +} + +/*! + \brief configure the data timeout, data length and data block size + \param[in] data_timeout: data timeout period in card bus clock periods + \param[in] data_length: number of data bytes to be transferred + \param[in] data_blocksize: size of data block for block transfer + only one parameter can be selected which is shown as below: + \arg SDIO_DATABLOCKSIZE_1BYTE: block size = 1 byte + \arg SDIO_DATABLOCKSIZE_2BYTES: block size = 2 bytes + \arg SDIO_DATABLOCKSIZE_4BYTES: block size = 4 bytes + \arg SDIO_DATABLOCKSIZE_8BYTES: block size = 8 bytes + \arg SDIO_DATABLOCKSIZE_16BYTES: block size = 16 bytes + \arg SDIO_DATABLOCKSIZE_32BYTES: block size = 32 bytes + \arg SDIO_DATABLOCKSIZE_64BYTES: block size = 64 bytes + \arg SDIO_DATABLOCKSIZE_128BYTES: block size = 128 bytes + \arg SDIO_DATABLOCKSIZE_256BYTES: block size = 256 bytes + \arg SDIO_DATABLOCKSIZE_512BYTES: block size = 512 bytes + \arg SDIO_DATABLOCKSIZE_1024BYTES: block size = 1024 bytes + \arg SDIO_DATABLOCKSIZE_2048BYTES: block size = 2048 bytes + \arg SDIO_DATABLOCKSIZE_4096BYTES: block size = 4096 bytes + \arg SDIO_DATABLOCKSIZE_8192BYTES: block size = 8192 bytes + \arg SDIO_DATABLOCKSIZE_16384BYTES: block size = 16384 bytes + \param[out] none + \retval none +*/ +void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize) +{ + /* reset data timeout, data length and data block size */ + SDIO_DATATO &= ~SDIO_DATATO_DATATO; + SDIO_DATALEN &= ~SDIO_DATALEN_DATALEN; + SDIO_DATACTL &= ~SDIO_DATACTL_BLKSZ; + /* configure the related parameters of data */ + SDIO_DATATO = data_timeout; + SDIO_DATALEN = data_length; + SDIO_DATACTL |= data_blocksize; +} + +/*! + \brief configure the data transfer mode and direction + \param[in] transfer_mode: mode of data transfer + only one parameter can be selected which is shown as below: + \arg SDIO_TRANSMODE_BLOCK: block transfer + \arg SDIO_TRANSMODE_STREAM: stream transfer or SDIO multibyte transfer + \param[in] transfer_direction: data transfer direction, read or write + only one parameter can be selected which is shown as below: + \arg SDIO_TRANSDIRECTION_TOCARD: write data to card + \arg SDIO_TRANSDIRECTION_TOSDIO: read data from card + \param[out] none + \retval none +*/ +void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction) +{ + uint32_t data_trans = 0U; + /* reset the data transfer mode, transfer direction and set according to the parameters */ + data_trans = SDIO_DATACTL; + data_trans &= ~(SDIO_DATACTL_TRANSMOD | SDIO_DATACTL_DATADIR); + data_trans |= (transfer_mode | transfer_direction); + SDIO_DATACTL = data_trans; +} + +/*! + \brief enable the DSM(data state machine) for data transfer + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dsm_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_DATAEN; +} + +/*! + \brief disable the DSM(data state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dsm_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_DATAEN; +} + +/*! + \brief write data(one word) to the transmit FIFO + \param[in] data: 32-bit data write to card + \param[out] none + \retval none +*/ +void sdio_data_write(uint32_t data) +{ + SDIO_FIFO = data; +} + +/*! + \brief read data(one word) from the receive FIFO + \param[in] none + \param[out] none + \retval received data +*/ +uint32_t sdio_data_read(void) +{ + return SDIO_FIFO; +} + +/*! + \brief get the number of remaining data bytes to be transferred to card + \param[in] none + \param[out] none + \retval number of remaining data bytes to be transferred +*/ +uint32_t sdio_data_counter_get(void) +{ + return SDIO_DATACNT; +} + +/*! + \brief get the number of words remaining to be written or read from FIFO + \param[in] none + \param[out] none + \retval remaining number of words +*/ +uint32_t sdio_fifo_counter_get(void) +{ + return SDIO_FIFOCNT; +} + +/*! + \brief enable the DMA request for SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dma_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_DMAEN; +} + +/*! + \brief disable the DMA request for SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dma_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_DMAEN; +} + +/*! + \brief get the flags state of SDIO + \param[in] flag: flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_FLAG_DTTMOUT: data timeout flag + \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_FLAG_CMDRUN: command transmission in progress flag + \arg SDIO_FLAG_TXRUN: data transmission in progress flag + \arg SDIO_FLAG_RXRUN: data reception in progress flag + \arg SDIO_FLAG_TFH: transmit FIFO is half empty flag: at least 8 words can be written into the FIFO + \arg SDIO_FLAG_RFH: receive FIFO is half full flag: at least 8 words can be read in the FIFO + \arg SDIO_FLAG_TFF: transmit FIFO is full flag + \arg SDIO_FLAG_RFF: receive FIFO is full flag + \arg SDIO_FLAG_TFE: transmit FIFO is empty flag + \arg SDIO_FLAG_RFE: receive FIFO is empty flag + \arg SDIO_FLAG_TXDTVAL: data is valid in transmit FIFO flag + \arg SDIO_FLAG_RXDTVAL: data is valid in receive FIFO flag + \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sdio_flag_get(uint32_t flag) +{ + FlagStatus temp_flag = RESET; + if(RESET != (SDIO_STAT & flag)) { + temp_flag = SET; + } + return temp_flag; +} + +/*! + \brief clear the pending flags of SDIO + \param[in] flag: flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_FLAG_DTTMOUT: data timeout flag + \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval none +*/ +void sdio_flag_clear(uint32_t flag) +{ + SDIO_INTC = flag; +} + +/*! + \brief enable the SDIO interrupt + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt + \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt + \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt + \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt + \arg SDIO_INT_TXURE: SDIO TXURE interrupt + \arg SDIO_INT_RXORE: SDIO RXORE interrupt + \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt + \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt + \arg SDIO_INT_DTEND: SDIO DTEND interrupt + \arg SDIO_INT_STBITE: SDIO STBITE interrupt + \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt + \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt + \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt + \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt + \arg SDIO_INT_TFH: SDIO TFH interrupt + \arg SDIO_INT_RFH: SDIO RFH interrupt + \arg SDIO_INT_TFF: SDIO TFF interrupt + \arg SDIO_INT_RFF: SDIO RFF interrupt + \arg SDIO_INT_TFE: SDIO TFE interrupt + \arg SDIO_INT_RFE: SDIO RFE interrupt + \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt + \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt + \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt + \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt + \param[out] none + \retval none +*/ +void sdio_interrupt_enable(uint32_t int_flag) +{ + SDIO_INTEN |= int_flag; +} + +/*! + \brief disable the SDIO interrupt + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt + \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt + \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt + \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt + \arg SDIO_INT_TXURE: SDIO TXURE interrupt + \arg SDIO_INT_RXORE: SDIO RXORE interrupt + \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt + \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt + \arg SDIO_INT_DTEND: SDIO DTEND interrupt + \arg SDIO_INT_STBITE: SDIO STBITE interrupt + \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt + \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt + \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt + \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt + \arg SDIO_INT_TFH: SDIO TFH interrupt + \arg SDIO_INT_RFH: SDIO RFH interrupt + \arg SDIO_INT_TFF: SDIO TFF interrupt + \arg SDIO_INT_RFF: SDIO RFF interrupt + \arg SDIO_INT_TFE: SDIO TFE interrupt + \arg SDIO_INT_RFE: SDIO RFE interrupt + \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt + \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt + \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt + \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt + \param[out] none + \retval none +*/ +void sdio_interrupt_disable(uint32_t int_flag) +{ + SDIO_INTEN &= ~int_flag; +} + +/*! + \brief get the interrupt flags state of SDIO + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_FLAG_CCRCERR: SDIO CCRCERR interrupt flag + \arg SDIO_INT_FLAG_DTCRCERR: SDIO DTCRCERR interrupt flag + \arg SDIO_INT_FLAG_CMDTMOUT: SDIO CMDTMOUT interrupt flag + \arg SDIO_INT_FLAG_DTTMOUT: SDIO DTTMOUT interrupt flag + \arg SDIO_INT_FLAG_TXURE: SDIO TXURE interrupt flag + \arg SDIO_INT_FLAG_RXORE: SDIO RXORE interrupt flag + \arg SDIO_INT_FLAG_CMDRECV: SDIO CMDRECV interrupt flag + \arg SDIO_INT_FLAG_CMDSEND: SDIO CMDSEND interrupt flag + \arg SDIO_INT_FLAG_DTEND: SDIO DTEND interrupt flag + \arg SDIO_INT_FLAG_STBITE: SDIO STBITE interrupt flag + \arg SDIO_INT_FLAG_DTBLKEND: SDIO DTBLKEND interrupt flag + \arg SDIO_INT_FLAG_CMDRUN: SDIO CMDRUN interrupt flag + \arg SDIO_INT_FLAG_TXRUN: SDIO TXRUN interrupt flag + \arg SDIO_INT_FLAG_RXRUN: SDIO RXRUN interrupt flag + \arg SDIO_INT_FLAG_TFH: SDIO TFH interrupt flag + \arg SDIO_INT_FLAG_RFH: SDIO RFH interrupt flag + \arg SDIO_INT_FLAG_TFF: SDIO TFF interrupt flag + \arg SDIO_INT_FLAG_RFF: SDIO RFF interrupt flag + \arg SDIO_INT_FLAG_TFE: SDIO TFE interrupt flag + \arg SDIO_INT_FLAG_RFE: SDIO RFE interrupt flag + \arg SDIO_INT_FLAG_TXDTVAL: SDIO TXDTVAL interrupt flag + \arg SDIO_INT_FLAG_RXDTVAL: SDIO RXDTVAL interrupt flag + \arg SDIO_INT_FLAG_SDIOINT: SDIO SDIOINT interrupt flag + \arg SDIO_INT_FLAG_ATAEND: SDIO ATAEND interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sdio_interrupt_flag_get(uint32_t int_flag) +{ + FlagStatus temp_flag = RESET; + if(RESET != (SDIO_STAT & int_flag)) { + temp_flag = SET; + } + return temp_flag; +} + +/*! + \brief clear the interrupt pending flags of SDIO + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_INT_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_INT_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_INT_FLAG_DTTMOUT: data timeout flag + \arg SDIO_INT_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_INT_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_INT_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_INT_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_INT_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_INT_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_INT_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_INT_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_INT_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval none +*/ +void sdio_interrupt_flag_clear(uint32_t int_flag) +{ + SDIO_INTC = int_flag; +} + +/*! + \brief enable the read wait mode(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_readwait_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_RWEN; +} + +/*! + \brief disable the read wait mode(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_readwait_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_RWEN; +} + +/*! + \brief enable the function that stop the read wait process(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_stop_readwait_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_RWSTOP; +} + +/*! + \brief disable the function that stop the read wait process(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_stop_readwait_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_RWSTOP; +} + +/*! + \brief set the read wait type(SD I/O only) + \param[in] readwait_type: SD I/O read wait type + only one parameter can be selected which is shown as below: + \arg SDIO_READWAITTYPE_CLK: read wait control by stopping SDIO_CLK + \arg SDIO_READWAITTYPE_DAT2: read wait control using SDIO_DAT[2] + \param[out] none + \retval none +*/ +void sdio_readwait_type_set(uint32_t readwait_type) +{ + if(SDIO_READWAITTYPE_CLK == readwait_type) { + SDIO_DATACTL |= SDIO_DATACTL_RWTYPE; + } else { + SDIO_DATACTL &= ~SDIO_DATACTL_RWTYPE; + } +} + +/*! + \brief enable the SD I/O mode specific operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_operation_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_IOEN; +} + +/*! + \brief disable the SD I/O mode specific operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_operation_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_IOEN; +} + +/*! + \brief enable the SD I/O suspend operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_suspend_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_SUSPEND; +} + +/*! + \brief disable the SD I/O suspend operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_suspend_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_SUSPEND; +} + +/*! + \brief enable the CE-ATA command(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_ATAEN; +} + +/*! + \brief disable the CE-ATA command(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_ATAEN; +} + +/*! + \brief enable the CE-ATA interrupt(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_interrupt_enable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_NINTEN; +} + +/*! + \brief disable the CE-ATA interrupt(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_interrupt_disable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_NINTEN; +} + +/*! + \brief enable the CE-ATA command completion signal(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_completion_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_ENCMDC; +} + +/*! + \brief disable the CE-ATA command completion signal(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_completion_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_ENCMDC; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c new file mode 100644 index 00000000000..2e112973133 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c @@ -0,0 +1,877 @@ +/*! + \file gd32f5xx_spi.c + \brief SPI driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f5xx_spi.h" +#include "gd32f5xx_rcu.h" + +/* SPI/I2S parameter initialization mask */ +#define SPI_INIT_MASK ((uint32_t)0x00003040U) /*!< SPI parameter initialization mask */ +#define I2S_INIT_MASK ((uint32_t)0x0000F047U) /*!< I2S parameter initialization mask */ +#define I2S_FULL_DUPLEX_MASK ((uint32_t)0x00000480U) /*!< I2S full duples mode configure parameter initialization mask */ + +/* default value */ +#define SPI_I2SPSC_DEFAULT_VALUE ((uint32_t)0x00000002U) /*!< default value of SPI_I2SPSC register */ + +/*! + \brief deinitialize SPI and I2S + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5),include I2S1_ADD and I2S2_ADD + \param[out] none + \retval none +*/ +void spi_i2s_deinit(uint32_t spi_periph) +{ + switch(spi_periph) { + case SPI0: + /* reset SPI0 */ + rcu_periph_reset_enable(RCU_SPI0RST); + rcu_periph_reset_disable(RCU_SPI0RST); + break; + case SPI1: + /* reset SPI1,I2S1 and I2S1_ADD */ + rcu_periph_reset_enable(RCU_SPI1RST); + rcu_periph_reset_disable(RCU_SPI1RST); + break; + case SPI2: + /* reset SPI2,I2S2 and I2S2_ADD */ + rcu_periph_reset_enable(RCU_SPI2RST); + rcu_periph_reset_disable(RCU_SPI2RST); + break; + case SPI3: + /* reset SPI3 */ + rcu_periph_reset_enable(RCU_SPI3RST); + rcu_periph_reset_disable(RCU_SPI3RST); + break; + case SPI4: + /* reset SPI4 */ + rcu_periph_reset_enable(RCU_SPI4RST); + rcu_periph_reset_disable(RCU_SPI4RST); + break; + case SPI5: + /* reset SPI5 */ + rcu_periph_reset_enable(RCU_SPI5RST); + rcu_periph_reset_disable(RCU_SPI5RST); + break; + default : + break; + } +} + +/*! + \brief initialize the parameters of SPI struct with default values + \param[in] none + \param[out] spi_parameter_struct: the initialized struct spi_parameter_struct pointer + \retval none +*/ +void spi_struct_para_init(spi_parameter_struct *spi_struct) +{ + /* configure the structure with default value */ + spi_struct->device_mode = SPI_SLAVE; + spi_struct->trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_struct->frame_size = SPI_FRAMESIZE_8BIT; + spi_struct->nss = SPI_NSS_HARD; + spi_struct->clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; + spi_struct->prescale = SPI_PSC_2; + spi_struct->endian = SPI_ENDIAN_MSB; +} +/*! + \brief initialize SPI parameter + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_struct: SPI parameter initialization stuct members of the structure + and the member values are shown as below: + device_mode: SPI_MASTER, SPI_SLAVE. + trans_mode: SPI_TRANSMODE_FULLDUPLEX, SPI_TRANSMODE_RECEIVEONLY, + SPI_TRANSMODE_BDRECEIVE, SPI_TRANSMODE_BDTRANSMIT + frame_size: SPI_FRAMESIZE_16BIT, SPI_FRAMESIZE_8BIT + nss: SPI_NSS_SOFT, SPI_NSS_HARD + endian: SPI_ENDIAN_MSB, SPI_ENDIAN_LSB + clock_polarity_phase: SPI_CK_PL_LOW_PH_1EDGE, SPI_CK_PL_HIGH_PH_1EDGE + SPI_CK_PL_LOW_PH_2EDGE, SPI_CK_PL_HIGH_PH_2EDGE + prescale: SPI_PSC_n (n=2,4,8,16,32,64,128,256) + \param[out] none + \retval none +*/ +void spi_init(uint32_t spi_periph, spi_parameter_struct *spi_struct) +{ + uint32_t reg = 0U; + reg = SPI_CTL0(spi_periph); + reg &= SPI_INIT_MASK; + + /* select SPI as master or slave */ + reg |= spi_struct->device_mode; + /* select SPI transfer mode */ + reg |= spi_struct->trans_mode; + /* select SPI frame size */ + reg |= spi_struct->frame_size; + /* select SPI nss use hardware or software */ + reg |= spi_struct->nss; + /* select SPI LSB or MSB */ + reg |= spi_struct->endian; + /* select SPI polarity and phase */ + reg |= spi_struct->clock_polarity_phase; + /* select SPI prescale to adjust transmit speed */ + reg |= spi_struct->prescale; + + /* write to SPI_CTL0 register */ + SPI_CTL0(spi_periph) = (uint32_t)reg; + + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SSEL); +} + +/*! + \brief enable SPI + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_enable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SPIEN; +} + +/*! + \brief disable SPI + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_disable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SPIEN); +} + +/*! + \brief initialize I2S parameter + \param[in] spi_periph: SPIx(x=1,2) + \param[in] i2s_mode: I2S operation mode + only one parameter can be selected which is shown as below: + \arg I2S_MODE_SLAVETX : I2S slave transmit mode + \arg I2S_MODE_SLAVERX : I2S slave receive mode + \arg I2S_MODE_MASTERTX : I2S master transmit mode + \arg I2S_MODE_MASTERRX : I2S master receive mode + \param[in] i2s_standard: I2S standard + only one parameter can be selected which is shown as below: + \arg I2S_STD_PHILIPS : I2S philips standard + \arg I2S_STD_MSB : I2S MSB standard + \arg I2S_STD_LSB : I2S LSB standard + \arg I2S_STD_PCMSHORT : I2S PCM short standard + \arg I2S_STD_PCMLONG : I2S PCM long standard + \param[in] i2s_ckpl: I2S idle state clock polarity + only one parameter can be selected which is shown as below: + \arg I2S_CKPL_LOW : I2S clock polarity low level + \arg I2S_CKPL_HIGH : I2S clock polarity high level + \param[out] none + \retval none +*/ +void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl) +{ + uint32_t reg = 0U; + reg = SPI_I2SCTL(spi_periph); + reg &= I2S_INIT_MASK; + + /* enable I2S mode */ + reg |= (uint32_t)SPI_I2SCTL_I2SSEL; + /* select I2S mode */ + reg |= (uint32_t)i2s_mode; + /* select I2S standard */ + reg |= (uint32_t)i2s_standard; + /* select I2S polarity */ + reg |= (uint32_t)i2s_ckpl; + + /* write to SPI_I2SCTL register */ + SPI_I2SCTL(spi_periph) = (uint32_t)reg; +} + +/*! + \brief configure I2S prescale + \param[in] spi_periph: SPIx(x=1,2) + \param[in] i2s_audiosample: I2S audio sample rate + only one parameter can be selected which is shown as below: + \arg I2S_AUDIOSAMPLE_8K: audio sample rate is 8KHz + \arg I2S_AUDIOSAMPLE_11K: audio sample rate is 11KHz + \arg I2S_AUDIOSAMPLE_16K: audio sample rate is 16KHz + \arg I2S_AUDIOSAMPLE_22K: audio sample rate is 22KHz + \arg I2S_AUDIOSAMPLE_32K: audio sample rate is 32KHz + \arg I2S_AUDIOSAMPLE_44K: audio sample rate is 44KHz + \arg I2S_AUDIOSAMPLE_48K: audio sample rate is 48KHz + \arg I2S_AUDIOSAMPLE_96K: audio sample rate is 96KHz + \arg I2S_AUDIOSAMPLE_192K: audio sample rate is 192KHz + \param[in] i2s_frameformat: I2S data length and channel length + only one parameter can be selected which is shown as below: + \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit + \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit + \param[in] i2s_mckout: I2S master clock output + only one parameter can be selected which is shown as below: + \arg I2S_MCKOUT_ENABLE: I2S master clock output enable + \arg I2S_MCKOUT_DISABLE: I2S master clock output disable + \param[out] none + \retval none +*/ +void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout) +{ + uint32_t i2sdiv = 2U, i2sof = 0U; + uint32_t clks = 0U; + uint32_t i2sclock = 0U; + +#ifndef I2S_EXTERNAL_CLOCK_IN + uint32_t plli2sm = 0U, plli2sn = 0U, plli2sr = 0U; +#endif /* I2S_EXTERNAL_CLOCK_IN */ + + /* deinit SPI_I2SPSC register */ + SPI_I2SPSC(spi_periph) = SPI_I2SPSC_DEFAULT_VALUE; + +#ifdef I2S_EXTERNAL_CLOCK_IN + rcu_i2s_clock_config(RCU_I2SSRC_I2S_CKIN); + + /* set the I2S clock to the external clock input value */ + i2sclock = I2S_EXTERNAL_CLOCK_IN; +#else + + /* turn on the oscillator HXTAL */ + rcu_osci_on(RCU_HXTAL); + /* wait for oscillator stabilization flags is SET */ + rcu_osci_stab_wait(RCU_HXTAL); + /* turn on the PLLI2S */ + rcu_osci_on(RCU_PLLI2S_CK); + /* wait for PLLI2S flags is SET */ + rcu_osci_stab_wait(RCU_PLLI2S_CK); + /* configure the I2S clock source selection */ + rcu_i2s_clock_config(RCU_I2SSRC_PLLI2S); + + /* get the RCU_PLL_PLLPSC value */ + plli2sm = (uint32_t)(RCU_PLL & RCU_PLL_PLLPSC); + /* get the RCU_PLLI2S_PLLI2SN value */ + plli2sn = (uint32_t)((RCU_PLLI2S & RCU_PLLI2S_PLLI2SN) >> 6); + /* get the RCU_PLLI2S_PLLI2SR value */ + plli2sr = (uint32_t)((RCU_PLLI2S & RCU_PLLI2S_PLLI2SR) >> 28); + + if((RCU_PLL & RCU_PLL_PLLSEL) == RCU_PLLSRC_HXTAL) { + /* get the I2S source clock value */ + i2sclock = (uint32_t)(((HXTAL_VALUE / plli2sm) * plli2sn) / plli2sr); + } else { + /* get the I2S source clock value */ + i2sclock = (uint32_t)(((IRC16M_VALUE / plli2sm) * plli2sn) / plli2sr); + } +#endif /* I2S_EXTERNAL_CLOCK_IN */ + + /* config the prescaler depending on the mclk output state, the frame format and audio sample rate */ + if(I2S_MCKOUT_ENABLE == i2s_mckout) { + clks = (uint32_t)(((i2sclock / 256U) * 10U) / i2s_audiosample); + } else { + if(I2S_FRAMEFORMAT_DT16B_CH16B == i2s_frameformat) { + clks = (uint32_t)(((i2sclock / 32U) * 10U) / i2s_audiosample); + } else { + clks = (uint32_t)(((i2sclock / 64U) * 10U) / i2s_audiosample); + } + } + /* remove the floating point */ + clks = (clks + 5U) / 10U; + i2sof = (clks & 0x00000001U); + i2sdiv = ((clks - i2sof) / 2U); + i2sof = (i2sof << 8U); + + /* set the default values */ + if((i2sdiv < 2U) || (i2sdiv > 255U)) { + i2sdiv = 2U; + i2sof = 0U; + } + + /* configure SPI_I2SPSC */ + SPI_I2SPSC(spi_periph) = (uint32_t)(i2sdiv | i2sof | i2s_mckout); + + /* clear SPI_I2SCTL_DTLEN and SPI_I2SCTL_CHLEN bits */ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~(SPI_I2SCTL_DTLEN | SPI_I2SCTL_CHLEN)); + /* configure data frame format */ + SPI_I2SCTL(spi_periph) |= (uint32_t)i2s_frameformat; +} + +/*! + \brief enable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_enable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) |= (uint32_t)SPI_I2SCTL_I2SEN; +} + +/*! + \brief disable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_disable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SEN); +} + +/*! + \brief enable SPI nss output + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_nss_output_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV; +} + +/*! + \brief disable SPI nss output + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_nss_output_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSDRV); +} + +/*! + \brief SPI nss pin high level in software mode + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_nss_internal_high(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SWNSS; +} + +/*! + \brief SPI nss pin low level in software mode + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_nss_internal_low(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SWNSS); +} + +/*! + \brief enable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA + \arg SPI_DMA_RECEIVE: SPI receive data use DMA + \param[out] none + \retval none +*/ +void spi_dma_enable(uint32_t spi_periph, uint8_t spi_dma) +{ + if(SPI_DMA_TRANSMIT == spi_dma) { + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMATEN; + } else { + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMAREN; + } +} + +/*! + \brief diable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA + \arg SPI_DMA_RECEIVE: SPI receive data use DMA + \param[out] none + \retval none +*/ +void spi_dma_disable(uint32_t spi_periph, uint8_t spi_dma) +{ + if(SPI_DMA_TRANSMIT == spi_dma) { + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMATEN); + } else { + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMAREN); + } +} + +/*! + \brief configure SPI/I2S data frame format + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] frame_format: SPI frame size + only one parameter can be selected which is shown as below: + \arg SPI_FRAMESIZE_16BIT: SPI frame size is 16 bits + \arg SPI_FRAMESIZE_8BIT: SPI frame size is 8 bits + \param[out] none + \retval none +*/ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format) +{ + /* clear SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_FF16); + /* configure SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) |= (uint32_t)frame_format; +} + +/*! + \brief SPI transmit data + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] data: 16-bit data + \param[out] none + \retval none +*/ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data) +{ + SPI_DATA(spi_periph) = (uint32_t)data; +} + +/*! + \brief SPI receive data + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval 16-bit data +*/ +uint16_t spi_i2s_data_receive(uint32_t spi_periph) +{ + return ((uint16_t)SPI_DATA(spi_periph)); +} + +/*! + \brief configure SPI bidirectional transfer direction + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] transfer_direction: SPI transfer direction + only one parameter can be selected which is shown as below: + \arg SPI_BIDIRECTIONAL_TRANSMIT: SPI work in transmit-only mode + \arg SPI_BIDIRECTIONAL_RECEIVE: SPI work in receive-only mode + \retval none +*/ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction) +{ + if(SPI_BIDIRECTIONAL_TRANSMIT == transfer_direction) { + /* set the transmit only mode */ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_BIDIRECTIONAL_TRANSMIT; + } else { + /* set the receive only mode */ + SPI_CTL0(spi_periph) &= SPI_BIDIRECTIONAL_RECEIVE; + } +} + +/*! + \brief set SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] crc_poly: CRC polynomial value + \param[out] none + \retval none +*/ +void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly) +{ + /* set SPI CRC polynomial */ + SPI_CRCPOLY(spi_periph) = (uint32_t)crc_poly; +} + +/*! + \brief get SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval 16-bit CRC polynomial +*/ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph) +{ + return ((uint16_t)SPI_CRCPOLY(spi_periph)); +} + +/*! + \brief turn on SPI CRC function + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_crc_on(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCEN; +} + +/*! + \brief turn off SPI CRC function + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_crc_off(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_CRCEN); +} + +/*! + \brief SPI next data is CRC value + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_crc_next(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCNT; +} + +/*! + \brief get SPI CRC send value or receive value + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_crc: SPI crc value + only one parameter can be selected which is shown as below: + \arg SPI_CRC_TX: get transmit crc value + \arg SPI_CRC_RX: get receive crc value + \param[out] none + \retval 16-bit CRC value +*/ +uint16_t spi_crc_get(uint32_t spi_periph, uint8_t spi_crc) +{ + if(SPI_CRC_TX == spi_crc) { + return ((uint16_t)(SPI_TCRC(spi_periph))); + } else { + return ((uint16_t)(SPI_RCRC(spi_periph))); + } +} + +/*! + \brief enable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_ti_mode_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TMOD; +} + +/*! + \brief disable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_ti_mode_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TMOD); +} + +/*! + \brief configure i2s full duplex mode + \param[in] i2s_add_periph: I2Sx_ADD(x=1,2) + \param[in] i2s_mode: + \arg I2S_MODE_SLAVETX : I2S slave transmit mode + \arg I2S_MODE_SLAVERX : I2S slave receive mode + \arg I2S_MODE_MASTERTX : I2S master transmit mode + \arg I2S_MODE_MASTERRX : I2S master receive mode + \param[in] i2s_standard: + \arg I2S_STD_PHILIPS : I2S philips standard + \arg I2S_STD_MSB : I2S MSB standard + \arg I2S_STD_LSB : I2S LSB standard + \arg I2S_STD_PCMSHORT : I2S PCM short standard + \arg I2S_STD_PCMLONG : I2S PCM long standard + \param[in] i2s_ckpl: + \arg I2S_CKPL_LOW : I2S clock polarity low level + \arg I2S_CKPL_HIGH : I2S clock polarity high level + \param[in] i2s_frameformat: + \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit + \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit + \param[out] none + \retval none +*/ +void i2s_full_duplex_mode_config(uint32_t i2s_add_periph, uint32_t i2s_mode, uint32_t i2s_standard, + uint32_t i2s_ckpl, uint32_t i2s_frameformat) +{ + uint32_t reg = 0U, tmp = 0U; + + reg = I2S_ADD_I2SCTL(i2s_add_periph); + reg &= I2S_FULL_DUPLEX_MASK; + + /* get the mode of the extra I2S module I2Sx_ADD */ + if((I2S_MODE_MASTERTX == i2s_mode) || (I2S_MODE_SLAVETX == i2s_mode)) { + tmp = I2S_MODE_SLAVERX; + } else { + tmp = I2S_MODE_SLAVETX; + } + + /* enable I2S mode */ + reg |= (uint32_t)SPI_I2SCTL_I2SSEL; + /* select I2S mode */ + reg |= (uint32_t)tmp; + /* select I2S standard */ + reg |= (uint32_t)i2s_standard; + /* select I2S polarity */ + reg |= (uint32_t)i2s_ckpl; + /* configure data frame format */ + reg |= (uint32_t)i2s_frameformat; + + /* write to SPI_I2SCTL register */ + I2S_ADD_I2SCTL(i2s_add_periph) = (uint32_t)reg; +} + +/*! + \brief enable quad wire SPI + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QMOD; +} + +/*! + \brief disable quad wire SPI + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_disable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QMOD); +} + +/*! + \brief enable quad wire SPI write + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_write_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QRD); +} + +/*! + \brief enable quad wire SPI read + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_read_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QRD; +} + +/*! + \brief enable SPI_IO2 and SPI_IO3 pin output + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_io23_output_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_IO23_DRV; +} + +/*! + \brief disable SPI_IO2 and SPI_IO3 pin output + \param[in] spi_periph: SPIx(only x=5) + \param[out] none + \retval none +*/ +void spi_quad_io23_output_disable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_IO23_DRV); +} + +/*! + \brief enable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_i2s_int: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t spi_i2s_int) +{ + switch(spi_i2s_int) { + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_RBNEIE; + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_ERRIE; + break; + default: + break; + } +} + +/*! + \brief disable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_i2s_int: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t spi_i2s_int) +{ + switch(spi_i2s_int) { + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE : + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TBEIE); + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE : + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_RBNEIE); + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR : + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_ERRIE); + break; + default : + break; + } +} + +/*! + \brief get SPI and I2S interrupt flag status + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_i2s_int: SPI/I2S interrupt flag status + only one parameter can be selected which are shown as below: + \arg SPI_I2S_INT_FLAG_TBE: transmit buffer empty interrupt flag + \arg SPI_I2S_INT_FLAG_RBNE: receive buffer not empty interrupt flag + \arg SPI_I2S_INT_FLAG_RXORERR: overrun interrupt flag + \arg SPI_INT_FLAG_CONFERR: config error interrupt flag + \arg SPI_INT_FLAG_CRCERR: CRC error interrupt flag + \arg I2S_INT_FLAG_TXURERR: underrun error interrupt flag + \arg SPI_I2S_INT_FLAG_FERR: format error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t spi_i2s_int) +{ + uint32_t reg1 = SPI_STAT(spi_periph); + uint32_t reg2 = SPI_CTL1(spi_periph); + + switch(spi_i2s_int) { + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_FLAG_TBE : + reg1 = reg1 & SPI_STAT_TBE; + reg2 = reg2 & SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_FLAG_RBNE : + reg1 = reg1 & SPI_STAT_RBNE; + reg2 = reg2 & SPI_CTL1_RBNEIE; + break; + /* SPI/I2S overrun interrupt */ + case SPI_I2S_INT_FLAG_RXORERR : + reg1 = reg1 & SPI_STAT_RXORERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI config error interrupt */ + case SPI_INT_FLAG_CONFERR : + reg1 = reg1 & SPI_STAT_CONFERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI CRC error interrupt */ + case SPI_INT_FLAG_CRCERR : + reg1 = reg1 & SPI_STAT_CRCERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* I2S underrun error interrupt */ + case I2S_INT_FLAG_TXURERR : + reg1 = reg1 & SPI_STAT_TXURERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI/I2S format error interrupt */ + case SPI_I2S_INT_FLAG_FERR : + reg1 = reg1 & SPI_STAT_FERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + default : + break; + } + /*get SPI/I2S interrupt flag status */ + if(reg1 && reg2) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get SPI and I2S flag status + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[in] spi_i2s_flag: SPI/I2S flag status + only one parameter can be selected which are shown as below: + \arg SPI_FLAG_TBE: transmit buffer empty flag + \arg SPI_FLAG_RBNE: receive buffer not empty flag + \arg SPI_FLAG_TRANS: transmit on-going flag + \arg SPI_FLAG_RXORERR: receive overrun error flag + \arg SPI_FLAG_CONFERR: mode config error flag + \arg SPI_FLAG_CRCERR: CRC error flag + \arg SPI_FLAG_FERR: format error flag + \arg I2S_FLAG_TBE: transmit buffer empty flag + \arg I2S_FLAG_RBNE: receive buffer not empty flag + \arg I2S_FLAG_TRANS: transmit on-going flag + \arg I2S_FLAG_RXORERR: overrun error flag + \arg I2S_FLAG_TXURERR: underrun error flag + \arg I2S_FLAG_CH: channel side flag + \arg I2S_FLAG_FERR: format error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t spi_i2s_flag) +{ + if(SPI_STAT(spi_periph) & spi_i2s_flag) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear SPI CRC error flag status + \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) + \param[out] none + \retval none +*/ +void spi_crc_error_clear(uint32_t spi_periph) +{ + SPI_STAT(spi_periph) &= (uint32_t)(~SPI_FLAG_CRCERR); +} + diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c new file mode 100644 index 00000000000..ed147118901 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c @@ -0,0 +1,471 @@ +/*! + \file gd32f5xx_syscfg.c + \brief SYSCFG driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_syscfg.h" + +/*! + \brief reset the SYSCFG registers + \param[in] none + \param[out] none + \retval none +*/ +void syscfg_deinit(void) +{ + rcu_periph_reset_enable(RCU_SYSCFGRST); + rcu_periph_reset_disable(RCU_SYSCFGRST); +} + +/*! + \brief configure the boot mode + \param[in] syscfg_bootmode: selects the memory remapping + only one parameter can be selected which is shown as below: + \arg SYSCFG_BOOTMODE_FLASH: main flash memory (0x08000000~0x0877FFFF) is mapped at address 0x00000000 + \arg SYSCFG_BOOTMODE_BOOTLOADER: boot loader (0x1FFF0000~0x1FFF77FF) is mapped at address 0x00000000 + \arg SYSCFG_BOOTMODE_SRAM: SRAM0 of on-chip SRAM(0x20000000~0x2003FFFF) is mapped at address 0x00000000 + \arg SYSCFG_BOOTMODE_OTP: OTP(0x1FF00000~0x1FF1FFFF) is mapped at address 0x00000000 + \param[out] none + \retval none +*/ +void syscfg_bootmode_config(uint8_t syscfg_bootmode) +{ + /* reset the SYSCFG_CFG0_BOOT_MODE bit and set according to syscfg_bootmode */ + SYSCFG_CFG0 &= ~SYSCFG_CFG0_BOOT_MODE; + SYSCFG_CFG0 |= (uint32_t)syscfg_bootmode; +} + +/*! + \brief FMC memory mapping swap + \param[in] syscfg_fmc_swap: selects the interal flash bank swapping + only one parameter can be selected which is shown as below: + \arg SYSCFG_FMC_SWP_BANK0: bank 0 is mapped at address 0x08000000 and bank 1 is mapped at address 0x08100000(if main flash is 4M,the swaped address is 0x0820_0000) + \arg SYSCFG_FMC_SWP_BANK1: bank 1 is mapped at address 0x08000000 and bank 0 is mapped at address 0x08100000(if main flash is 4M,the swaped address is 0x0820_0000) + \param[out] none + \retval none +*/ +void syscfg_fmc_swap_config(uint32_t syscfg_fmc_swap) +{ + uint32_t reg; + reg = SYSCFG_CFG0; + /* reset the FMC_SWP bit and set according to syscfg_fmc_swap */ + reg &= ~SYSCFG_CFG0_FMC_SWP; + SYSCFG_CFG0 = (reg | syscfg_fmc_swap); +} + +/*! + \brief EXMC memory mapping swap + \param[in] syscfg_exmc_swap: selects the memories in EXMC swapping + only one parameter can be selected which is shown as below: + \arg SYSCFG_EXMC_SWP_ENABLE: SDRAM bank 0 and bank 1 are swapped with NAND bank 1 and PC card + \arg SYSCFG_EXMC_SWP_DISABLE: no memory mapping swap + \param[out] none + \retval none +*/ +void syscfg_exmc_swap_config(uint32_t syscfg_exmc_swap) +{ + uint32_t reg; + + reg = SYSCFG_CFG0; + /* reset the SYSCFG_CFG0_EXMC_SWP bits and set according to syscfg_exmc_swap */ + reg &= ~SYSCFG_CFG0_EXMC_SWP; + SYSCFG_CFG0 = (reg | syscfg_exmc_swap); +} + +/*! + \brief configure the GPIO pin as EXTI Line + \param[in] exti_port: specify the GPIO port used in EXTI + only one parameter can be selected which is shown as below: + \arg EXTI_SOURCE_GPIOx(x = A,B,C,D,E,F,G,H,I): EXTI GPIO port + \param[in] exti_pin: specify the EXTI line + only one parameter can be selected which is shown as below: + \arg EXTI_SOURCE_PINx(x = 0..15): EXTI GPIO pin + \param[out] none + \retval none +*/ +void syscfg_exti_line_config(uint8_t exti_port, uint8_t exti_pin) +{ + uint32_t clear_exti_mask = ~((uint32_t)EXTI_SS_MASK << (EXTI_SS_MSTEP(exti_pin))); + uint32_t config_exti_mask = ((uint32_t)exti_port) << (EXTI_SS_MSTEP(exti_pin)); + + switch(exti_pin / EXTI_SS_JSTEP) { + case EXTISS0: + /* clear EXTI source line(0..3) */ + SYSCFG_EXTISS0 &= clear_exti_mask; + /* configure EXTI soure line(0..3) */ + SYSCFG_EXTISS0 |= config_exti_mask; + break; + case EXTISS1: + /* clear EXTI soure line(4..7) */ + SYSCFG_EXTISS1 &= clear_exti_mask; + /* configure EXTI soure line(4..7) */ + SYSCFG_EXTISS1 |= config_exti_mask; + break; + case EXTISS2: + /* clear EXTI soure line(8..11) */ + SYSCFG_EXTISS2 &= clear_exti_mask; + /* configure EXTI soure line(8..11) */ + SYSCFG_EXTISS2 |= config_exti_mask; + break; + case EXTISS3: + /* clear EXTI soure line(12..15) */ + SYSCFG_EXTISS3 &= clear_exti_mask; + /* configure EXTI soure line(12..15) */ + SYSCFG_EXTISS3 |= config_exti_mask; + break; + default: + break; + } +} + +/*! + \brief configure the PHY interface for the ethernet MAC + \param[in] syscfg_enet_phy_interface: specifies the media interface mode. + only one parameter can be selected which is shown as below: + \arg SYSCFG_ENET_PHY_MII: MII mode is selected + \arg SYSCFG_ENET_PHY_RMII: RMII mode is selected + \param[out] none + \retval none +*/ +void syscfg_enet_phy_interface_config(uint32_t syscfg_enet_phy_interface) +{ + uint32_t reg; + + reg = SYSCFG_CFG1; + /* reset the ENET_PHY_SEL bit and set according to syscfg_enet_phy_interface */ + reg &= ~SYSCFG_CFG1_ENET_PHY_SEL; + SYSCFG_CFG1 = (reg | syscfg_enet_phy_interface); +} + +/*! + \brief configure the I/O compensation cell + \param[in] syscfg_compensation: specifies the I/O compensation cell mode + only one parameter can be selected which is shown as below: + \arg SYSCFG_COMPENSATION_ENABLE: I/O compensation cell is enabled + \arg SYSCFG_COMPENSATION_DISABLE: I/O compensation cell is disabled + \param[out] none + \retval none +*/ +void syscfg_compensation_config(uint32_t syscfg_compensation) +{ + uint32_t reg; + + reg = SYSCFG_CPSCTL; + /* reset the SYSCFG_CPSCTL_CPS_EN bit and set according to syscfg_compensation */ + reg &= ~SYSCFG_CPSCTL_CPS_EN; + SYSCFG_CPSCTL = (reg | syscfg_compensation); +} + +/*! + \brief get Compensation cell ready flag + \param[in] none + \param[out] FlagStatus: the status of vref + \arg SET: the VREF output is ready + \arg RESET: the VREF output is not ready + \retval none +*/ +FlagStatus syscfg_cps_cell_ready_get(void) +{ + if(SYSCFG_CPSCTL & SYSCFG_CPSCTL_CPS_RDY){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief get ECC event error bits + \param[in] ecc_type: ECC event type, refer to syscfg_ecc_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_SRAM0_ECC: SRAM0 ECC event + \arg SYSCFG_SRAM1_ECC: SRAM1 ECC event + \arg SYSCFG_SRAM2_ECC: SRAM2 ECC event + \arg SYSCFG_ADDSRAM_ECC: ADDSRAM ECC event + \arg SYSCFG_TCMSRAM_ECC: TCMSRAM ECC event + \arg SYSCFG_BKPSRAM_ECC: BKPSRAM ECC event + \arg SYSCFG_FLASH_ECC: FLASH ECC event + \param[out] none + \retval error bits +*/ +uint32_t syscfg_ecc_err_bits_get(syscfg_ecc_enum ecc_type) +{ + uint32_t err_bits = 0U; + + switch(ecc_type){ + case SYSCFG_SRAM0_ECC: + err_bits = (uint32_t)((SYSCFG_SRAM0ECC & SYSCFG_SRAM0ECC_ECCSERRBITS0) >> 10U); + break; + case SYSCFG_SRAM1_ECC: + err_bits = (uint32_t)((SYSCFG_SRAM1ECC & SYSCFG_SRAM1ECC_ECCSERRBITS1) >> 12U); + break; + case SYSCFG_SRAM2_ECC: + err_bits = (uint32_t)((SYSCFG_SRAM2ECC & SYSCFG_SRAM2ECC_ECCSERRBITS2) >> 10U); + break; + case SYSCFG_ADDSRAM_ECC: + err_bits = (uint32_t)((SYSCFG_ADDSRAMECC & SYSCFG_ADDSRAMECC_ECCSERRBITS3) >> 8U); + break; + case SYSCFG_TCMSRAM_ECC: + err_bits = (uint32_t)((SYSCFG_TCMSRAMECC & SYSCFG_TCMSRAMECC_ECCSERRBITS4) >> 12U); + break; + case SYSCFG_BKPSRAM_ECC: + err_bits = (uint32_t)((SYSCFG_BKPSRAMECC & SYSCFG_BKPSRAMECC_ECCSERRBITS5) >> 16U); + break; + case SYSCFG_FLASH_ECC: + err_bits = (uint32_t)((SYSCFG_FLASHECC & SYSCFG_FLASHECC_ECCSERRBITS6) >> 2U); + break; + default: + /* should not jump to here */ + break; + } + + return err_bits; +} + +/*! + \brief get last address of ECC event + \param[in] ecc_type: ECC event type, refer to syscfg_ecc_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_SRAM0_ECC: SRAM0 ECC event + \arg SYSCFG_SRAM1_ECC: SRAM1 ECC event + \arg SYSCFG_SRAM2_ECC: SRAM2 ECC event + \arg SYSCFG_ADDSRAM_ECC: ADDSRAM ECC event + \arg SYSCFG_TCMSRAM_ECC: TCMSRAM ECC event + \arg SYSCFG_BKPSRAM_ECC: BKPSRAM ECC event + \arg SYSCFG_FLASH_ECC: FLASH ECC event + \param[out] none + \retval error address +*/ +uint32_t syscfg_ecc_address_get(syscfg_ecc_enum ecc_type) +{ + uint32_t err_addr = 0U; + + switch(ecc_type){ + case SYSCFG_SRAM0_ECC: + err_addr = (uint32_t)((SYSCFG_SRAM0ECC & SYSCFG_SRAM0ECC_ECCEADDR0) >> 16U); + break; + case SYSCFG_SRAM1_ECC: + err_addr = (uint32_t)((SYSCFG_SRAM1ECC & SYSCFG_SRAM1ECC_ECCEADDR1) >> 18U); + break; + case SYSCFG_SRAM2_ECC: + err_addr = (uint32_t)((SYSCFG_SRAM2ECC & SYSCFG_SRAM2ECC_ECCEADDR2) >> 16U); + break; + case SYSCFG_ADDSRAM_ECC: + err_addr = (uint32_t)((SYSCFG_ADDSRAMECC & SYSCFG_ADDSRAMECC_ECCEADDR3) >> 14U); + break; + case SYSCFG_TCMSRAM_ECC: + err_addr = (uint32_t)((SYSCFG_TCMSRAMECC & SYSCFG_TCMSRAMECC_ECCEADDR4) >> 18U); + break; + case SYSCFG_BKPSRAM_ECC: + err_addr = (uint32_t)((SYSCFG_BKPSRAMECC & SYSCFG_BKPSRAMECC_ECCEADDR5) >> 22U); + break; + case SYSCFG_FLASH_ECC: + err_addr = (uint32_t)(SYSCFG_FLASHECC_ADDR); + break; + default: + /* should not jump to here */ + break; + } + + return err_addr; +} + +/*! + \brief get SYSCFG flag state + \param[in] flag: SYSCFG flags, refer to syscfg_flag_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_FLAG_ECCME0: SRAM0 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE0: SRAM0 single bit correction event flag + \arg SYSCFG_FLAG_ECCME1: SRAM1 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE1: SRAM1 single bit correction event flag + \arg SYSCFG_FLAG_ECCME2: SRAM2 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE2: SRAM2 single bit correction event flag + \arg SYSCFG_FLAG_ECCME3: ADDSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE3: ADDSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME4: TCMSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE4: TCMSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME5: BKPSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE5: BKPSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME6: FLASH two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE6: FLASH single bit correction event flag + \arg SYSCFG_FLAG_CKMNMI: HXTAL clock moniotor NMI flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus syscfg_flag_get(syscfg_flag_enum flag) +{ + /* get flag and interrupt enable state */ + if(RESET != (SYSCFG_STAT & (uint32_t)flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear SYSCFG flag state + \param[in] flag: SYSCFG flags, refer to syscfg_flag_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_FLAG_ECCME0: SRAM0 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE0: SRAM0 single bit correction event flag + \arg SYSCFG_FLAG_ECCME1: SRAM1 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE1: SRAM1 single bit correction event flag + \arg SYSCFG_FLAG_ECCME2: SRAM2 two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE2: SRAM2 single bit correction event flag + \arg SYSCFG_FLAG_ECCME3: ADDSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE3: ADDSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME4: TCMSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE4: TCMSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME5: BKPSRAM two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE5: BKPSRAM single bit correction event flag + \arg SYSCFG_FLAG_ECCME6: FLASH two bits non-correction event flag + \arg SYSCFG_FLAG_ECCSE6: FLASH single bit correction event flag + \arg SYSCFG_FLAG_CKMNMI: HXTAL clock moniotor NMI flag + \param[out] none + \retval none +*/ +void syscfg_flag_clear(syscfg_flag_enum flag) +{ + SYSCFG_STAT = (uint32_t)flag; +} + +/*! + \brief enable SYSCFG interrupt + \param[in] interrupt: SYSCFG interrupt, refer to syscfg_interrupt_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_INT_ECCME0: SRAM0 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE0: SRAM0 single bit correction interrupt + \arg SYSCFG_INT_CKMNMI: HXTAL clock moniotor NMI interrupt + \arg SYSCFG_INT_ECCME1: SRAM1 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE1: SRAM1 single bit correction interrupt + \arg SYSCFG_INT_ECCME2: SRAM2 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE2: SRAM2 single bit correction interrupt + \arg SYSCFG_INT_ECCME3: ADDSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE3: ADDSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME4: TCMSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE4: TCMSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME5: BKPSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE5: BKPSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME6: FLASH two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE6: FLASH single bit correction interrupt + \param[out] none + \retval none +*/ +void syscfg_interrupt_enable(syscfg_interrupt_enum interrupt) +{ + SYSCFG_REG_VAL(interrupt) |= BIT(SYSCFG_BIT_POS(interrupt)); +} + +/*! + \brief disable SYSCFG interrupt + \param[in] interrupt: SYSCFG interrupt, refer to syscfg_interrupt_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_INT_ECCME0: SRAM0 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE0: SRAM0 single bit correction interrupt + \arg SYSCFG_INT_CKMNMI: HXTAL clock moniotor NMI interrupt + \arg SYSCFG_INT_ECCME1: SRAM1 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE1: SRAM1 single bit correction interrupt + \arg SYSCFG_INT_ECCME2: SRAM2 two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE2: SRAM2 single bit correction interrupt + \arg SYSCFG_INT_ECCME3: ADDSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE3: ADDSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME4: TCMSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE4: TCMSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME5: BKPSRAM two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE5: BKPSRAM single bit correction interrupt + \arg SYSCFG_INT_ECCME6: FLASH two bits non-correction interrupt + \arg SYSCFG_INT_ECCSE6: FLASH single bit correction interrupt + \param[out] none + \retval none +*/ +void syscfg_interrupt_disable(syscfg_interrupt_enum interrupt) +{ + SYSCFG_REG_VAL(interrupt) &= ~BIT(SYSCFG_BIT_POS(interrupt)); +} + +/*! + \brief get SYSCFG interrupt flag state + \param[in] flag: SYSCFG interrupt flags, refer to syscfg_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_INT_FLAG_ECCME0: SRAM0 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE0: SRAM0 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME1: SRAM1 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE1: SRAM1 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME2: SRAM2 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE2: SRAM2 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME3: ADDSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE3: ADDSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME4: TCMSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE4: TCMSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME5: BKPSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE5: BKPSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME6: FLASH two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE6: FLASH single bit correction event flag + \arg SYSCFG_INT_FLAG_CKMNMI: HXTAL clock moniotor NMI flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus syscfg_interrupt_flag_get(syscfg_interrupt_flag_enum flag) +{ + /* get flag and interrupt enable state */ + if(RESET != (SYSCFG_STAT & (uint32_t)flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear SYSCFG interrupt flag state + \param[in] flag: SYSCFG interrupt flags, refer to syscfg_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg SYSCFG_INT_FLAG_ECCME0: SRAM0 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE0: SRAM0 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME1: SRAM1 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE1: SRAM1 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME2: SRAM2 two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE2: SRAM2 single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME3: ADDSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE3: ADDSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME4: TCMSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE4: TCMSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME5: BKPSRAM two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE5: BKPSRAM single bit correction event flag + \arg SYSCFG_INT_FLAG_ECCME6: FLASH two bits non-correction event flag + \arg SYSCFG_INT_FLAG_ECCSE6: FLASH single bit correction event flag + \arg SYSCFG_INT_FLAG_CKMNMI: HXTAL clock moniotor NMI flag + \param[out] none + \retval none +*/ +void syscfg_interrupt_flag_clear(syscfg_interrupt_flag_enum flag) +{ + SYSCFG_STAT = (uint32_t)flag; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c new file mode 100644 index 00000000000..9c212674abc --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c @@ -0,0 +1,2282 @@ +/*! + \file gd32f5xx_timer.c + \brief TIMER driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_timer.h" + +/*! + \brief deinit a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_deinit(uint32_t timer_periph) +{ + switch(timer_periph) { + case TIMER0: + /* reset TIMER0 */ + rcu_periph_reset_enable(RCU_TIMER0RST); + rcu_periph_reset_disable(RCU_TIMER0RST); + break; + case TIMER1: + /* reset TIMER1 */ + rcu_periph_reset_enable(RCU_TIMER1RST); + rcu_periph_reset_disable(RCU_TIMER1RST); + break; + case TIMER2: + /* reset TIMER2 */ + rcu_periph_reset_enable(RCU_TIMER2RST); + rcu_periph_reset_disable(RCU_TIMER2RST); + break; + case TIMER3: + /* reset TIMER3 */ + rcu_periph_reset_enable(RCU_TIMER3RST); + rcu_periph_reset_disable(RCU_TIMER3RST); + break; + case TIMER4: + /* reset TIMER4 */ + rcu_periph_reset_enable(RCU_TIMER4RST); + rcu_periph_reset_disable(RCU_TIMER4RST); + break; + case TIMER5: + /* reset TIMER5 */ + rcu_periph_reset_enable(RCU_TIMER5RST); + rcu_periph_reset_disable(RCU_TIMER5RST); + break; + case TIMER6: + /* reset TIMER6 */ + rcu_periph_reset_enable(RCU_TIMER6RST); + rcu_periph_reset_disable(RCU_TIMER6RST); + break; + case TIMER7: + /* reset TIMER7 */ + rcu_periph_reset_enable(RCU_TIMER7RST); + rcu_periph_reset_disable(RCU_TIMER7RST); + break; + case TIMER8: + /* reset TIMER8 */ + rcu_periph_reset_enable(RCU_TIMER8RST); + rcu_periph_reset_disable(RCU_TIMER8RST); + break; + case TIMER9: + /* reset TIMER9 */ + rcu_periph_reset_enable(RCU_TIMER9RST); + rcu_periph_reset_disable(RCU_TIMER9RST); + break; + case TIMER10: + /* reset TIMER10 */ + rcu_periph_reset_enable(RCU_TIMER10RST); + rcu_periph_reset_disable(RCU_TIMER10RST); + break; + case TIMER11: + /* reset TIMER11 */ + rcu_periph_reset_enable(RCU_TIMER11RST); + rcu_periph_reset_disable(RCU_TIMER11RST); + break; + case TIMER12: + /* reset TIMER12 */ + rcu_periph_reset_enable(RCU_TIMER12RST); + rcu_periph_reset_disable(RCU_TIMER12RST); + break; + case TIMER13: + /* reset TIMER13 */ + rcu_periph_reset_enable(RCU_TIMER13RST); + rcu_periph_reset_disable(RCU_TIMER13RST); + break; + default: + break; + } +} + +/*! + \brief initialize TIMER init parameter struct with a default value + \param[in] initpara: init parameter struct + \param[out] none + \retval none +*/ +void timer_struct_para_init(timer_parameter_struct *initpara) +{ + /* initialize the init parameter struct member with the default value */ + initpara->prescaler = 0U; + initpara->alignedmode = TIMER_COUNTER_EDGE; + initpara->counterdirection = TIMER_COUNTER_UP; + initpara->period = 65535U; + initpara->clockdivision = TIMER_CKDIV_DIV1; + initpara->repetitioncounter = 0U; +} + +/*! + \brief initialize TIMER counter + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] initpara: init parameter struct + prescaler: prescaler value of the counter clock,0~65535 + alignedmode: TIMER_COUNTER_EDGE,TIMER_COUNTER_CENTER_DOWN,TIMER_COUNTER_CENTER_UP,TIMER_COUNTER_CENTER_BOTH + counterdirection: TIMER_COUNTER_UP,TIMER_COUNTER_DOWN + period: counter auto reload value,(TIMER1,TIMER4,32 bit) + clockdivision: TIMER_CKDIV_DIV1,TIMER_CKDIV_DIV2,TIMER_CKDIV_DIV4 + repetitioncounter: counter repetition value,0~255 + \param[out] none + \retval none +*/ +void timer_init(uint32_t timer_periph, timer_parameter_struct *initpara) +{ + /* configure the counter prescaler value */ + TIMER_PSC(timer_periph) = (uint16_t)initpara->prescaler; + + /* configure the counter direction and aligned mode */ + if((TIMER0 == timer_periph) || (TIMER1 == timer_periph) || (TIMER2 == timer_periph) + || (TIMER3 == timer_periph) || (TIMER4 == timer_periph) || (TIMER7 == timer_periph)) { + TIMER_CTL0(timer_periph) &= ~(uint32_t)(TIMER_CTL0_DIR | TIMER_CTL0_CAM); + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->alignedmode; + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->counterdirection; + } + + /* configure the autoreload value */ + TIMER_CAR(timer_periph) = (uint32_t)initpara->period; + + if((TIMER5 != timer_periph) && (TIMER6 != timer_periph)) { + /* reset the CKDIV bit */ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CKDIV; + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->clockdivision; + } + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { + /* configure the repetition counter value */ + TIMER_CREP(timer_periph) = (uint32_t)initpara->repetitioncounter; + } + + /* generate an update event */ + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; +} + +/*! + \brief enable a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief disable a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief enable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief disable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief enable the update event + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_update_event_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPDIS; +} + +/*! + \brief disable the update event + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_update_event_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t) TIMER_CTL0_UPDIS; +} + +/*! + \brief set TIMER counter alignment mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] aligned: + only one parameter can be selected which is shown as below: + \arg TIMER_COUNTER_EDGE: edge-aligned mode + \arg TIMER_COUNTER_CENTER_DOWN: center-aligned and counting down assert mode + \arg TIMER_COUNTER_CENTER_UP: center-aligned and counting up assert mode + \arg TIMER_COUNTER_CENTER_BOTH: center-aligned and counting up/down assert mode + \param[out] none + \retval none +*/ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CAM; + TIMER_CTL0(timer_periph) |= (uint32_t)aligned; +} + +/*! + \brief set TIMER counter up direction + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_counter_up_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief set TIMER counter down direction + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_counter_down_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief configure TIMER prescaler + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] prescaler: prescaler value,0~65535 + \param[in] pscreload: prescaler reload mode + only one parameter can be selected which is shown as below: + \arg TIMER_PSC_RELOAD_NOW: the prescaler is loaded right now + \arg TIMER_PSC_RELOAD_UPDATE: the prescaler is loaded at the next update event + \param[out] none + \retval none +*/ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload) +{ + TIMER_PSC(timer_periph) = (uint32_t)prescaler; + + if(TIMER_PSC_RELOAD_NOW == pscreload) { + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; + } +} + +/*! + \brief configure TIMER repetition register value + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] repetition: the counter repetition value,0~255 + \param[out] none + \retval none +*/ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition) +{ + TIMER_CREP(timer_periph) = (uint32_t)repetition; +} + +/*! + \brief configure TIMER autoreload register value + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] autoreload: the counter auto-reload value + \param[out] none + \retval none +*/ +void timer_autoreload_value_config(uint32_t timer_periph, uint32_t autoreload) +{ + TIMER_CAR(timer_periph) = (uint32_t)autoreload; +} + +/*! + \brief configure TIMER counter register value + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] counter: the counter value,0~65535 + \param[out] none + \retval none +*/ +void timer_counter_value_config(uint32_t timer_periph, uint32_t counter) +{ + TIMER_CNT(timer_periph) = (uint32_t)counter; +} + +/*! + \brief read TIMER counter value + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval counter value +*/ +uint32_t timer_counter_read(uint32_t timer_periph) +{ + uint32_t count_value = 0U; + count_value = TIMER_CNT(timer_periph); + return (count_value); +} + +/*! + \brief read TIMER prescaler value + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval prescaler register value +*/ +uint16_t timer_prescaler_read(uint32_t timer_periph) +{ + uint16_t prescaler_value = 0U; + prescaler_value = (uint16_t)(TIMER_PSC(timer_periph)); + return (prescaler_value); +} + +/*! + \brief configure TIMER single pulse mode + \param[in] timer_periph: TIMERx(x=0..8,11) + \param[in] spmode: + only one parameter can be selected which is shown as below: + \arg TIMER_SP_MODE_SINGLE: single pulse mode + \arg TIMER_SP_MODE_REPETITIVE: repetitive pulse mode + \param[out] none + \retval none +*/ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode) +{ + if(TIMER_SP_MODE_SINGLE == spmode) { + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_SPM; + } else if(TIMER_SP_MODE_REPETITIVE == spmode) { + TIMER_CTL0(timer_periph) &= ~((uint32_t)TIMER_CTL0_SPM); + } else { + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER update source + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] update: + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATE_SRC_GLOBAL: update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger + \arg TIMER_UPDATE_SRC_REGULAR: update generate only by counter overflow/underflow + \param[out] none + \retval none +*/ +void timer_update_source_config(uint32_t timer_periph, uint32_t update) +{ + if(TIMER_UPDATE_SRC_REGULAR == update) { + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_UPS; + } else if(TIMER_UPDATE_SRC_GLOBAL == update) { + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPS; + } else { + /* illegal parameters */ + } +} + +/*! + \brief enable the TIMER DMA + \param[in] timer_periph: please refer to the following parameters + \param[in] dma: specify which DMA to enable + one or more parameters can be selected which is shown as below: + \arg TIMER_DMA_UPD: update DMA,TIMERx(x=0..7) + \arg TIMER_DMA_CH0D: channel 0 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH1D: channel 1 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH2D: channel 2 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH3D: channel 3 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CMTD: commutation DMA request,TIMERx(x=0,7) + \arg TIMER_DMA_TRGD: trigger DMA request,TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) dma; +} + +/*! + \brief disable the TIMER DMA + \param[in] timer_periph: please refer to the following parameters + \param[in] dma: specify which DMA to disable + one or more parameters can be selected which are shown as below: + \arg TIMER_DMA_UPD: update DMA,TIMERx(x=0..7) + \arg TIMER_DMA_CH0D: channel 0 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH1D: channel 1 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH2D: channel 2 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH3D: channel 3 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CMTD: commutation DMA request ,TIMERx(x=0,7) + \arg TIMER_DMA_TRGD: trigger DMA request,TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)(dma)); +} + +/*! + \brief channel DMA request source selection + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] dma_request: channel DMA request source selection + only one parameter can be selected which is shown as below: + \arg TIMER_DMAREQUEST_CHANNELEVENT: DMA request of channel y is sent when channel y event occurs + \arg TIMER_DMAREQUEST_UPDATEEVENT: DMA request of channel y is sent when update event occurs + \param[out] none + \retval none +*/ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request) +{ + if(TIMER_DMAREQUEST_UPDATEEVENT == dma_request) { + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_DMAS; + } else if(TIMER_DMAREQUEST_CHANNELEVENT == dma_request) { + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_DMAS; + } else { + /* illegal parameters */ + } +} + +/*! + \brief configure the TIMER DMA transfer + \param[in] timer_periph: please refer to the following parameters + \param[in] dma_baseaddr: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATA_CTL0: DMA transfer address is TIMER_CTL0,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CTL1: DMA transfer address is TIMER_CTL1,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_SMCFG: DMA transfer address is TIMER_SMCFG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_DMAINTEN: DMA transfer address is TIMER_DMAINTEN,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_INTF: DMA transfer address is TIMER_INTF,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_SWEVG: DMA transfer address is TIMER_SWEVG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL0: DMA transfer address is TIMER_CHCTL0,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL1: DMA transfer address is TIMER_CHCTL1,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL2: DMA transfer address is TIMER_CHCTL2,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CNT: DMA transfer address is TIMER_CNT,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_PSC: DMA transfer address is TIMER_PSC,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CAR: DMA transfer address is TIMER_CAR,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CREP: DMA transfer address is TIMER_CREP,TIMERx(x=0,7) + \arg TIMER_DMACFG_DMATA_CH0CV: DMA transfer address is TIMER_CH0CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH1CV: DMA transfer address is TIMER_CH1CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH2CV: DMA transfer address is TIMER_CH2CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH3CV: DMA transfer address is TIMER_CH3CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CCHP: DMA transfer address is TIMER_CCHP,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_DMACFG: DMA transfer address is TIMER_DMACFG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_DMATB: DMA transfer address is TIMER_DMATB,TIMERx(x=0..4,7) + \param[in] dma_lenth: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATC_xTRANSFER(x=1..18): DMA transfer x time + \param[out] none + \retval none +*/ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth) +{ + TIMER_DMACFG(timer_periph) &= (~(uint32_t)(TIMER_DMACFG_DMATA | TIMER_DMACFG_DMATC)); + TIMER_DMACFG(timer_periph) |= (uint32_t)(dma_baseaddr | dma_lenth); +} + +/*! + \brief software generate events + \param[in] timer_periph: please refer to the following parameters + \param[in] event: the timer software event generation sources + one or more parameters can be selected which are shown as below: + \arg TIMER_EVENT_SRC_UPG: update event,TIMERx(x=0..13) + \arg TIMER_EVENT_SRC_CH0G: channel 0 capture or compare event generation,TIMERx(x=0..4,7..13) + \arg TIMER_EVENT_SRC_CH1G: channel 1 capture or compare event generation,TIMERx(x=0..4,7,8,11) + \arg TIMER_EVENT_SRC_CH2G: channel 2 capture or compare event generation,TIMERx(x=0..4,7) + \arg TIMER_EVENT_SRC_CH3G: channel 3 capture or compare event generation,TIMERx(x=0..4,7) + \arg TIMER_EVENT_SRC_CMTG: channel commutation event generation,TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_TRGG: trigger event generation,TIMERx(x=0..4,7,8,11) + \arg TIMER_EVENT_SRC_BRKG: break event generation,TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_CH0COMADDG: Channel 0 additional compare event generation, TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_CH1COMADDG: Channel 1 additional compare event generation, TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_CH2COMADDG: Channel 2 additional compare event generation, TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_CH3COMADDG: Channel 3 additional compare event generation, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event) +{ + TIMER_SWEVG(timer_periph) |= (uint32_t)event; +} + +/*! + \brief initialize TIMER break parameter struct + \param[in] breakpara: TIMER break parameter struct + \param[out] none + \retval none +*/ +void timer_break_struct_para_init(timer_break_parameter_struct *breakpara) +{ + /* initialize the break parameter struct member with the default value */ + breakpara->runoffstate = TIMER_ROS_STATE_DISABLE; + breakpara->ideloffstate = TIMER_IOS_STATE_DISABLE; + breakpara->deadtime = 0U; + breakpara->breakpolarity = TIMER_BREAK_POLARITY_LOW; + breakpara->outputautostate = TIMER_OUTAUTO_DISABLE; + breakpara->protectmode = TIMER_CCHP_PROT_OFF; + breakpara->breakstate = TIMER_BREAK_DISABLE; +} + +/*! + \brief configure TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] breakpara: TIMER break parameter struct + runoffstate: TIMER_ROS_STATE_ENABLE,TIMER_ROS_STATE_DISABLE + ideloffstate: TIMER_IOS_STATE_ENABLE,TIMER_IOS_STATE_DISABLE + deadtime: 0~255 + breakpolarity: TIMER_BREAK_POLARITY_LOW,TIMER_BREAK_POLARITY_HIGH + outputautostate: TIMER_OUTAUTO_ENABLE,TIMER_OUTAUTO_DISABLE + protectmode: TIMER_CCHP_PROT_OFF,TIMER_CCHP_PROT_0,TIMER_CCHP_PROT_1,TIMER_CCHP_PROT_2 + breakstate: TIMER_BREAK_ENABLE,TIMER_BREAK_DISABLE + \param[out] none + \retval none +*/ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct *breakpara) +{ + TIMER_CCHP(timer_periph) = (uint32_t)(((uint32_t)(breakpara->runoffstate)) | + ((uint32_t)(breakpara->ideloffstate)) | + ((uint32_t)(breakpara->deadtime)) | + ((uint32_t)(breakpara->breakpolarity)) | + ((uint32_t)(breakpara->outputautostate)) | + ((uint32_t)(breakpara->protectmode)) | + ((uint32_t)(breakpara->breakstate))) ; +} + +/*! + \brief enable TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_break_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief disable TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_break_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief enable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_automatic_output_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief disable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_automatic_output_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief configure TIMER primary output function + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_POEN; + } else { + TIMER_CCHP(timer_periph) &= (~(uint32_t)TIMER_CCHP_POEN); + } +} + +/*! + \brief enable or disable channel capture/compare control shadow register + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue) { + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCSE; + } else { + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCSE); + } +} + +/*! + \brief configure TIMER channel control shadow register update control + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] ccuctl: channel control shadow register update control + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATECTL_CCU: the shadow registers update by when CMTG bit is set + \arg TIMER_UPDATECTL_CCUTRI: the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl) +{ + if(TIMER_UPDATECTL_CCU == ccuctl) { + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCUC); + } else if(TIMER_UPDATECTL_CCUTRI == ccuctl) { + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCUC; + } else { + /* illegal parameters */ + } +} + +/*! + \brief initialize TIMER channel output parameter struct with a default value + \param[in] ocpara: TIMER channel n output parameter struct + \param[out] none + \retval none +*/ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara) +{ + /* initialize the channel output parameter struct member with the default value */ + ocpara->outputstate = (uint16_t)TIMER_CCX_DISABLE; + ocpara->outputnstate = TIMER_CCXN_DISABLE; + ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH; + ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH; + ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW; + ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; +} + +/*! + \brief configure TIMER channel output function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4,7)) + \param[in] ocpara: TIMER channeln output parameter struct + outputstate: TIMER_CCX_ENABLE,TIMER_CCX_DISABLE + outputnstate: TIMER_CCXN_ENABLE,TIMER_CCXN_DISABLE + ocpolarity: TIMER_OC_POLARITY_HIGH,TIMER_OC_POLARITY_LOW + ocnpolarity: TIMER_OCN_POLARITY_HIGH,TIMER_OCN_POLARITY_LOW + ocidlestate: TIMER_OC_IDLE_STATE_LOW,TIMER_OC_IDLE_STATE_HIGH + ocnidlestate: TIMER_OCN_IDLE_STATE_LOW,TIMER_OCN_IDLE_STATE_HIGH + \param[out] none + \retval none +*/ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, + timer_oc_parameter_struct *ocpara) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH0MS; + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputstate; + /* reset the CH0P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + /* set the CH0P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocpolarity; + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { + /* reset the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + /* set the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputnstate; + /* reset the CH0NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + /* set the CH0NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocnpolarity; + /* reset the ISO0 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0); + /* set the ISO0 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocidlestate; + /* reset the ISO0N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0N); + /* set the ISO0N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocnidlestate; + } + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH1MS; + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 4U); + /* reset the CH1P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + /* set the CH1P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 4U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { + /* reset the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + /* set the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 4U); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 4U); + /* reset the ISO1 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1); + /* set the ISO1 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 2U); + /* reset the ISO1N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1N); + /* set the ISO1N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 2U); + } + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH2MS; + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 8U); + /* reset the CH2P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + /* set the CH2P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 8U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { + /* reset the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + /* set the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 8U); + /* reset the CH2NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + /* set the CH2NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 8U); + /* reset the ISO2 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2); + /* set the ISO2 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 4U); + /* reset the ISO2N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2N); + /* set the ISO2N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 4U); + } + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH3MS; + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 12U); + /* reset the CH3P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + /* set the CH3P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 12U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { + /* reset the CH3NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NEN); + /* set the CH3NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 12U); + /* reset the CH3NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NP); + /* set the CH3NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 12U); + /* reset the ISO3 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3); + /* set the ISO3 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 6U); + /* reset the ISO3N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3N); + /* set the ISO3N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 6U); + } + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output compare mode + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocmode: channel output compare mode + only one parameter can be selected which is shown as below: + \arg TIMER_OC_MODE_TIMING: timing mode + \arg TIMER_OC_MODE_ACTIVE: active mode + \arg TIMER_OC_MODE_INACTIVE: inactive mode + \arg TIMER_OC_MODE_TOGGLE: toggle mode + \arg TIMER_OC_MODE_LOW: force low mode + \arg TIMER_OC_MODE_HIGH: force high mode + \arg TIMER_OC_MODE_PWM0: PWM0 mode + \arg TIMER_OC_MODE_PWM1: PWM1 mode + \param[out] none + \retval none +*/ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output pulse value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] pulse: channel output pulse value,0~65535 + \param[out] none + \retval none +*/ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, + uint32_t pulse) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CH0CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CH1CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CH2CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CH3CV(timer_periph) = (uint32_t)pulse; + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output shadow function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocshadow: channel output shadow state + only one parameter can be selected which is shown as below: + \arg TIMER_OC_SHADOW_ENABLE: channel output shadow state enable + \arg TIMER_OC_SHADOW_DISABLE: channel output shadow state disable + \param[out] none + \retval none +*/ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output fast function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocfast: channel output fast function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_FAST_ENABLE: channel output fast function enable + \arg TIMER_OC_FAST_DISABLE: channel output fast function disable + \param[out] none + \retval none +*/ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output clear function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] occlear: channel output clear function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_CLEAR_ENABLE: channel output clear function enable + \arg TIMER_OC_CLEAR_DISABLE: channel output clear function disable + \param[out] none + \retval none +*/ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output polarity + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocpolarity: channel output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OC_POLARITY_HIGH: channel output polarity is high + \arg TIMER_OC_POLARITY_LOW: channel output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocpolarity) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output polarity + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0,7)) + \param[in] ocnpolarity: channel complementary output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OCN_POLARITY_HIGH: channel complementary output polarity is high + \arg TIMER_OCN_POLARITY_LOW: channel complementary output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocnpolarity) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel enable state + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] state: TIMER channel enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCX_ENABLE: channel enable + \arg TIMER_CCX_DISABLE: channel disable + \param[out] none + \retval none +*/ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)state; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output enable state + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0 + \arg TIMER_CH_1: TIMER channel1 + \arg TIMER_CH_2: TIMER channel2 + \arg TIMER_CH_3: TIMER channel3 + \param[in] ocnstate: TIMER channel complementary output enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCXN_ENABLE: channel complementary enable + \arg TIMER_CCXN_DISABLE: channel complementary disable + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocnstate) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnstate; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 12U); + break; + default: + break; + } +} + +/*! + \brief initialize TIMER channel input parameter struct + \param[in] icpara: TIMER channel intput parameter struct + \param[out] none + \retval none +*/ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct *icpara) +{ + /* initialize the channel input parameter struct member with the default value */ + icpara->icpolarity = TIMER_IC_POLARITY_RISING; + icpara->icselection = TIMER_IC_SELECTION_DIRECTTI; + icpara->icprescaler = TIMER_IC_PSC_DIV1; + icpara->icfilter = 0U; +} + +/*! + \brief configure TIMER input capture parameter + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] icpara: TIMER channel intput parameter struct + icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING,TIMER_IC_POLARITY_BOTH_EDGE + icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI,TIMER_IC_SELECTION_ITS + icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, + timer_ic_parameter_struct *icpara) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpara->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpara->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + break; + + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + + /* reset the CH2P and CH2NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH2P | TIMER_CHCTL2_CH2NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 8U); + + /* reset the CH2MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection)); + + /* reset the CH2CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH2EN; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + + /* reset the CH3P bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH3P)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 12U); + + /* reset the CH3MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + + /* reset the CH3CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH3EN; + break; + default: + break; + } + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, channel, + (uint16_t)(icpara->icprescaler)); +} + +/*! + \brief configure TIMER channel input capture prescaler value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] prescaler: channel input capture prescaler value + only one parameter can be selected which is shown as below: + \arg TIMER_IC_PSC_DIV1: no prescaler + \arg TIMER_IC_PSC_DIV2: divided by 2 + \arg TIMER_IC_PSC_DIV4: divided by 4 + \arg TIMER_IC_PSC_DIV8: divided by 8 + \param[out] none + \retval none +*/ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, + uint16_t prescaler) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPPSC); + TIMER_CHCTL0(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPPSC); + TIMER_CHCTL0(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPPSC); + TIMER_CHCTL1(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPPSC); + TIMER_CHCTL1(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + default: + break; + } +} + +/*! + \brief read TIMER channel capture compare register value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[out] none + \retval channel capture compare register value +*/ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel) +{ + uint32_t count_value = 0U; + + switch(channel) { + /* read TIMER channel 0 capture compare register value */ + case TIMER_CH_0: + count_value = TIMER_CH0CV(timer_periph); + break; + /* read TIMER channel 1 capture compare register value */ + case TIMER_CH_1: + count_value = TIMER_CH1CV(timer_periph); + break; + /* read TIMER channel 2 capture compare register value */ + case TIMER_CH_2: + count_value = TIMER_CH2CV(timer_periph); + break; + /* read TIMER channel 3 capture compare register value */ + case TIMER_CH_3: + count_value = TIMER_CH3CV(timer_periph); + break; + default: + break; + } + return (count_value); +} + +/*! + \brief configure TIMER input pwm capture function + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0 + \arg TIMER_CH_1: TIMER channel1 + \param[in] icpwm:TIMER channel intput pwm parameter struct + icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING + icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI + icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, + timer_ic_parameter_struct *icpwm) +{ + uint16_t icpolarity = 0x0U; + uint16_t icselection = 0x0U; + + /* Set channel input polarity */ + if(TIMER_IC_POLARITY_RISING == icpwm->icpolarity) { + icpolarity = TIMER_IC_POLARITY_FALLING; + } else { + icpolarity = TIMER_IC_POLARITY_RISING; + } + + /* Set channel input mode selection */ + if(TIMER_IC_SELECTION_DIRECTTI == icpwm->icselection) { + icselection = TIMER_IC_SELECTION_INDIRECTTI; + } else { + icselection = TIMER_IC_SELECTION_DIRECTTI; + } + + if(TIMER_CH_0 == channel) { + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpwm->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpwm->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, + (uint16_t)(icpwm->icprescaler)); + + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)icpolarity << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)icselection << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, + (uint16_t)(icpwm->icprescaler)); + } else { + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, + (uint16_t)(icpwm->icprescaler)); + + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)icpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)icselection; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, + (uint16_t)(icpwm->icprescaler)); + } +} + +/*! + \brief configure TIMER hall sensor mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] hallmode: + only one parameter can be selected which is shown as below: + \arg TIMER_HALLINTERFACE_ENABLE: TIMER hall sensor mode enable + \arg TIMER_HALLINTERFACE_DISABLE: TIMER hall sensor mode disable + \param[out] none + \retval none +*/ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode) +{ + if(TIMER_HALLINTERFACE_ENABLE == hallmode) { + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_TI0S; + } else if(TIMER_HALLINTERFACE_DISABLE == hallmode) { + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_TI0S; + } else { + /* illegal parameters */ + } +} + +/*! + \brief select TIMER input trigger source + \param[in] timer_periph: please refer to the following parameters + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SMCFG_TRGSEL_ETIFP: external trigger(TIMERx(x=0..4,7,8,11)) + \param[out] none + \retval none +*/ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_TRGS); + TIMER_SMCFG(timer_periph) |= (uint32_t)intrigger; +} + +/*! + \brief select TIMER master mode output trigger source + \param[in] timer_periph: TIMERx(x=0..7) + \param[in] outrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_TRI_OUT_SRC_RESET: the UPG bit as trigger output(TIMERx(x=0..7,9,10,12,13)) + \arg TIMER_TRI_OUT_SRC_ENABLE: the counter enable signal TIMER_CTL0_CEN as trigger output(TIMERx(x=0..7,9,10,12,13)) + \arg TIMER_TRI_OUT_SRC_UPDATE: update event as trigger output(TIMERx(x=0..7,9,10,12,13)) + \arg TIMER_TRI_OUT_SRC_CH0: a capture or a compare match occurred in channal0 as trigger output TRGO(TIMERx(x=0..4,7,9,10,12,13)) + \arg TIMER_TRI_OUT_SRC_O0CPRE: O0CPRE as trigger output(TIMERx(x=0..4,7,9,10,12,13)) + \arg TIMER_TRI_OUT_SRC_O1CPRE: O1CPRE as trigger output(TIMERx(x=0..4,7)) + \arg TIMER_TRI_OUT_SRC_O2CPRE: O2CPRE as trigger output(TIMERx(x=0..4,7)) + \arg TIMER_TRI_OUT_SRC_O3CPRE: O3CPRE as trigger output(TIMERx(x=0..4,7)) + \param[out] none + \retval none +*/ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger) +{ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_MMC); + TIMER_CTL1(timer_periph) |= (uint32_t)outrigger; +} + +/*! + \brief select TIMER slave mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] slavemode: + only one parameter can be selected which is shown as below: + \arg TIMER_SLAVE_MODE_DISABLE: slave mode disable(TIMERx(x=0..4,7,8,11)) + \arg TIMER_ENCODER_MODE0: encoder mode 0(TIMERx(x=0..4,7)) + \arg TIMER_ENCODER_MODE1: encoder mode 1(TIMERx(x=0..4,7)) + \arg TIMER_ENCODER_MODE2: encoder mode 2(TIMERx(x=0..4,7)) + \arg TIMER_SLAVE_MODE_RESTART: restart mode(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SLAVE_MODE_PAUSE: pause mode(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SLAVE_MODE_EVENT: event mode(TIMERx(x=0..4,7,8,11)) + \arg TIMER_SLAVE_MODE_EXTERNAL0: external clock mode 0.(TIMERx(x=0..4,7,8,11)) + \param[out] none + \retval none +*/ + +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + + TIMER_SMCFG(timer_periph) |= (uint32_t)slavemode; +} + +/*! + \brief configure TIMER master slave mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] masterslave: + only one parameter can be selected which is shown as below: + \arg TIMER_MASTER_SLAVE_MODE_ENABLE: master slave mode enable + \arg TIMER_MASTER_SLAVE_MODE_DISABLE: master slave mode disable + \param[out] none + \retval none +*/ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave) +{ + if(TIMER_MASTER_SLAVE_MODE_ENABLE == masterslave) { + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_MSM; + } else if(TIMER_MASTER_SLAVE_MODE_DISABLE == masterslave) { + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_MSM; + } else { + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER external trigger input + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_ETP | TIMER_SMCFG_ETPSC | TIMER_SMCFG_ETFC)); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extprescaler | extpolarity); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extfilter << 8U); +} + +/*! + \brief configure TIMER quadrature decoder mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] decomode: + only one parameter can be selected which is shown as below: + \arg TIMER_ENCODER_MODE0: counter counts on CI0FE0 edge depending on CI1FE1 level + \arg TIMER_ENCODER_MODE1: counter counts on CI1FE1 edge depending on CI0FE0 level + \arg TIMER_ENCODER_MODE2: counter counts on both CI0FE0 and CI1FE1 edges depending on the level of the other input + \param[in] ic0polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[in] ic1polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[out] none + \retval none +*/ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, + uint16_t ic0polarity, uint16_t ic1polarity) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + TIMER_SMCFG(timer_periph) |= (uint32_t)decomode; + + TIMER_CHCTL0(timer_periph) &= (uint32_t)(((~(uint32_t)TIMER_CHCTL0_CH0MS)) & ((~ + (uint32_t)TIMER_CHCTL0_CH1MS))); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(TIMER_IC_SELECTION_DIRECTTI | (( + uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U)); + + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= ((uint32_t)ic0polarity | ((uint32_t)ic1polarity << 4U)); +} + +/*! + \brief configure TIMER internal clock mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[out] none + \retval none +*/ +void timer_internal_clock_config(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; +} + +/*! + \brief configure TIMER the internal trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0 + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1 + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2 + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3 + \param[out] none + \retval none +*/ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger) +{ + timer_input_trigger_source_select(timer_periph, intrigger); + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] extrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0 + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: active high or rising edge active + \arg TIMER_IC_POLARITY_FALLING: active low or falling edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, + uint16_t extpolarity, uint32_t extfilter) +{ + if(TIMER_SMCFG_TRGSEL_CI1FE1 == extrigger) { + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)extpolarity << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + } else { + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)extpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)TIMER_IC_SELECTION_DIRECTTI; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + } + /* select TIMER input trigger source */ + timer_input_trigger_source_select(timer_periph, extrigger); + /* reset the SMC bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + /* set the SMC bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external clock mode0 + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + + /* reset the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_SMC | TIMER_SMCFG_TRGS)); + /* set the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)(TIMER_SLAVE_MODE_EXTERNAL0 | TIMER_SMCFG_TRGSEL_ETIFP); +} + +/*! + \brief configure TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief disable TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_disable(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief configure TIMER channel remap function + \param[in] timer_periph: TIMERx(x=1,4,10) + \param[in] remap: + only one parameter can be selected which is shown as below: + \arg TIMER1_ITI1_RMP_TIMER7_TRGO: timer1 internal trigger input1 remap to TIMER7_TRGO + \arg TIMER1_ITI1_RMP_ETHERNET_PTP: timer1 internal trigger input1 remap to ethernet PTP + \arg TIMER1_ITI1_RMP_USB_FS_SOF: timer1 internal trigger input1 remap to USB FS SOF + \arg TIMER1_ITI1_RMP_USB_HS_SOF: timer1 internal trigger input1 remap to USB HS SOF + \arg TIMER4_CI3_RMP_GPIO: timer4 channel 3 input remap to GPIO pin + \arg TIMER4_CI3_RMP_IRC32K: timer4 channel 3 input remap to IRC32K + \arg TIMER4_CI3_RMP_LXTAL: timer4 channel 3 input remap to LXTAL + \arg TIMER4_CI3_RMP_RTC_WAKEUP_INT: timer4 channel 3 input remap to RTC wakeup interrupt + \arg TIMER10_ITI1_RMP_GPIO: timer10 internal trigger input1 remap based on GPIO setting + \arg TIMER10_ITI1_RMP_RTC_HXTAL_DIV: timer10 internal trigger input1 remap HXTAL _DIV(clock used for RTC which is HXTAL clock divided by RTCDIV bits in RCU_CFG0 register) + \param[out] none + \retval none +*/ +void timer_channel_remap_config(uint32_t timer_periph, uint32_t remap) +{ + TIMER_IRMP(timer_periph) = (uint32_t)remap; +} + +/*! + \brief configure TIMER write CHxVAL register selection + \param[in] timer_periph: TIMERx(x=0,1,2,13,14,15,16) + \param[in] ccsel: + only one parameter can be selected which is shown as below: + \arg TIMER_CHVSEL_DISABLE: no effect + \arg TIMER_CHVSEL_ENABLE: when write the CHxVAL register, if the write value is same as the CHxVAL value, the write access is ignored + \param[out] none + \retval none +*/ +void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel) +{ + if(TIMER_CHVSEL_ENABLE == ccsel) { + TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_CHVSEL; + } else if(TIMER_CHVSEL_DISABLE == ccsel) { + TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_CHVSEL; + } else { + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER output value selection + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] outsel: + only one parameter can be selected which is shown as below: + \arg TIMER_OUTSEL_DISABLE: no effect + \arg TIMER_OUTSEL_ENABLE: if POEN and IOS is 0, the output disabled + \param[out] none + \retval none +*/ +void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel) +{ + if(TIMER_OUTSEL_ENABLE == outsel) { + TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_OUTSEL; + } else if(TIMER_OUTSEL_DISABLE == outsel) { + TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_OUTSEL; + } else { + /* illegal parameters */ + } +} + +/*! + \brief enable the TIMER composite pwm + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) + \param[out] none + \retval none +*/ +void timer_channel_composite_pwm_enable(uint32_t timer_periph, uint32_t channel) +{ + TIMER_CTL2(timer_periph) |= (uint32_t)(TIMER_CTL2_CH0CPWMEN << channel); +} + +/*! + \brief disable the TIMER composite pwm + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) + \param[out] none + \retval none +*/ +void timer_channel_composite_pwm_disable(uint32_t timer_periph, uint32_t channel) +{ + TIMER_CTL2(timer_periph) &= (~(uint32_t)(TIMER_CTL2_CH0CPWMEN << channel)); +} + +/*! + \brief configure TIMER channel additional compare value + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) + \param[in] value: channel additional compare value + \param[out] none + \retval none +*/ +void timer_channel_additional_compare_value_config(uint32_t timer_periph, uint16_t channel, + uint32_t value) +{ + switch(channel) { + /* configure CH0COMV_ADD value */ + case TIMER_CH_0: + TIMER_CH0COMV_ADD(timer_periph) = (uint32_t)value; + break; + /* configure CH1COMV_ADD value */ + case TIMER_CH_1: + TIMER_CH1COMV_ADD(timer_periph) = (uint32_t)value; + break; + /* configure CH2COMV_ADD value */ + case TIMER_CH_2: + TIMER_CH2COMV_ADD(timer_periph) = (uint32_t)value; + break; + /* configure CH3COMV_ADD value */ + case TIMER_CH_3: + TIMER_CH3COMV_ADD(timer_periph) = (uint32_t)value; + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel additional output shadow function + \param[in] timer_periph: TIMERx(x=0~4,7,14~16,22,23,30,31,40~44) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) + \param[in] ocshadow: channel additional compare output shadow state + only one parameter can be selected which is shown as below: + \arg TIMER_ADD_SHADOW_ENABLE: channel additional compare output shadow enable + \arg TIMER_ADD_SHADOW_DISABLE: channel additional compare output shadow disable + \param[out] none + \retval none +*/ +void timer_channel_additional_output_shadow_config(uint32_t timer_periph, uint16_t channel, + uint16_t ocshadow) +{ + switch(channel) { + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMADDSEN); + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(ocshadow) << 28U); + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMADDSEN); + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(ocshadow) << 29U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMADDSEN); + TIMER_CHCTL1(timer_periph) |= ((uint32_t)(ocshadow) << 28U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMADDSEN); + TIMER_CHCTL1(timer_periph) |= ((uint32_t)(ocshadow) << 29U); + break; + default: + break; + } +} + +/*! + \brief read TIMER channel additional compare value + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) + \param[out] none + \retval value: channel additional compare value +*/ +uint32_t timer_channel_additional_compare_value_read(uint32_t timer_periph, uint16_t channel) +{ + uint32_t value = 0U; + switch(channel) { + case TIMER_CH_0: + /* read CH0COMV_ADD value */ + value = TIMER_CH0COMV_ADD(timer_periph); + break; + case TIMER_CH_1: + /* read CH1COMV_ADD value */ + value = TIMER_CH1COMV_ADD(timer_periph); + break; + case TIMER_CH_2: + /* read CH2COMV_ADD value */ + value = TIMER_CH2COMV_ADD(timer_periph); + break; + case TIMER_CH_3: + /* read CH3COMV_ADD value */ + value = TIMER_CH3COMV_ADD(timer_periph); + break; + default: + break; + } + return value; +} + +/*! + \brief get TIMER flags + \param[in] timer_periph: please refer to the following parameters + \param[in] flag: the timer interrupt flags + only one parameter can be selected which is shown as below: + \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) + \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) + \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) + \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) + \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH0COMADD: Channel 0 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH1COMADD: Channel 1 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH2COMADD: Channel 2 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH3COMADD: Channel 3 additional compare interrupt flag, TIMERx(x=0,7) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag) +{ + if(RESET != (TIMER_INTF(timer_periph) & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear TIMER flags + \param[in] timer_periph: please refer to the following parameters + \param[in] flag: the timer interrupt flags + only one parameter can be selected which is shown as below: + \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) + \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) + \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) + \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) + \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH0COMADD: Channel 0 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH1COMADD: Channel 1 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH2COMADD: Channel 2 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_FLAG_CH3COMADD: Channel 3 additional compare interrupt flag, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)flag); +} + +/*! + \brief enable the TIMER interrupt + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: timer interrupt enable source + only one parameter can be selected which is shown as below: + \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..13) + \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4,7..13) + \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4,7) + \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4,7) + \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_CH0COMADD: channel 0 additional compare interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_CH1COMADD: channel 1 additional compare interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_CH2COMADD: channel 2 additional compare interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_CH3COMADD: channel 3 additional compare interrupt enable, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) interrupt; +} + +/*! + \brief disable the TIMER interrupt + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: timer interrupt source enable + only one parameter can be selected which is shown as below: + \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..13) + \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4,7..13) + \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4,7) + \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4,7) + \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_CH0COMADD: channel 0 additional compare interrupt disable, TIMERx(x=0,7) + \arg TIMER_INT_CH1COMADD: channel 1 additional compare interrupt disable, TIMERx(x=0,7) + \arg TIMER_INT_CH2COMADD: channel 2 additional compare interrupt disable, TIMERx(x=0,7) + \arg TIMER_INT_CH3COMADD: channel 3 additional compare interrupt disable, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)interrupt); +} + +/*! + \brief get timer interrupt flag + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: the timer interrupt bits + only one parameter can be selected which is shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) + \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH0COMADD: channel 0 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH1COMADD: channel 1 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH2COMADD: channel 2 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH3COMADD: channel 3 additional compare interrupt flag, TIMERx(x=0,7) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt) +{ + uint32_t val; + val = (TIMER_DMAINTEN(timer_periph) & interrupt); + if((RESET != (TIMER_INTF(timer_periph) & interrupt)) && (RESET != val)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear TIMER interrupt flag + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: the timer interrupt bits + only one parameter can be selected which is shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) + \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH0COMADD: channel 0 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH1COMADD: channel 1 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH2COMADD: channel 2 additional compare interrupt flag, TIMERx(x=0,7) + \arg TIMER_INT_FLAG_CH3COMADD: channel 3 additional compare interrupt flag, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c new file mode 100644 index 00000000000..9cd3a0c5cf0 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c @@ -0,0 +1,595 @@ +/*! + \file gd32f5xx_tli.c + \brief TLI driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_tli.h" + +#define TLI_DEFAULT_VALUE 0x00000000U +#define TLI_OPAQUE_VALUE 0x000000FFU + +/*! + \brief deinitialize TLI registers + \param[in] none + \param[out] none + \retval none +*/ +void tli_deinit(void) +{ + rcu_periph_reset_enable(RCU_TLIRST); + rcu_periph_reset_disable(RCU_TLIRST); +} + +/*! + \brief initialize the parameters of TLI parameter structure with the default values, it is suggested + that call this function after a tli_parameter_struct structure is defined + \param[in] none + \param[out] tli_struct: the data needed to initialize TLI + synpsz_vpsz: size of the vertical synchronous pulse + synpsz_hpsz: size of the horizontal synchronous pulse + backpsz_vbpsz: size of the vertical back porch plus synchronous pulse + backpsz_hbpsz: size of the horizontal back porch plus synchronous pulse + activesz_vasz: size of the vertical active area width plus back porch and synchronous pulse + activesz_hasz: size of the horizontal active area width plus back porch and synchronous pulse + totalsz_vtsz: vertical total size of the display, including active area, back porch, synchronous + totalsz_htsz: vorizontal total size of the display, including active area, back porch, synchronous + backcolor_red: background value red + backcolor_green: background value green + backcolor_blue: background value blue + signalpolarity_hs: TLI_HSYN_ACTLIVE_LOW,TLI_HSYN_ACTLIVE_HIGHT + signalpolarity_vs: TLI_VSYN_ACTLIVE_LOW,TLI_VSYN_ACTLIVE_HIGHT + signalpolarity_de: TLI_DE_ACTLIVE_LOW,TLI_DE_ACTLIVE_HIGHT + signalpolarity_pixelck: TLI_PIXEL_CLOCK_TLI,TLI_PIXEL_CLOCK_INVERTEDTLI + \retval none +*/ +void tli_struct_para_init(tli_parameter_struct *tli_struct) +{ + /* initialize the struct parameters with default values */ + tli_struct->synpsz_vpsz = TLI_DEFAULT_VALUE; + tli_struct->synpsz_hpsz = TLI_DEFAULT_VALUE; + tli_struct->backpsz_vbpsz = TLI_DEFAULT_VALUE; + tli_struct->backpsz_hbpsz = TLI_DEFAULT_VALUE; + tli_struct->activesz_vasz = TLI_DEFAULT_VALUE; + tli_struct->activesz_hasz = TLI_DEFAULT_VALUE; + tli_struct->totalsz_vtsz = TLI_DEFAULT_VALUE; + tli_struct->totalsz_htsz = TLI_DEFAULT_VALUE; + tli_struct->backcolor_red = TLI_DEFAULT_VALUE; + tli_struct->backcolor_green = TLI_DEFAULT_VALUE; + tli_struct->backcolor_blue = TLI_DEFAULT_VALUE; + tli_struct->signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW; + tli_struct->signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW; + tli_struct->signalpolarity_de = TLI_DE_ACTLIVE_LOW; + tli_struct->signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI; +} + +/*! + \brief initialize TLI display timing parameters + \param[in] tli_struct: the data needed to initialize TLI + synpsz_vpsz: size of the vertical synchronous pulse + synpsz_hpsz: size of the horizontal synchronous pulse + backpsz_vbpsz: size of the vertical back porch plus synchronous pulse + backpsz_hbpsz: size of the horizontal back porch plus synchronous pulse + activesz_vasz: size of the vertical active area width plus back porch and synchronous pulse + activesz_hasz: size of the horizontal active area width plus back porch and synchronous pulse + totalsz_vtsz: vertical total size of the display, including active area, back porch, synchronous + totalsz_htsz: vorizontal total size of the display, including active area, back porch, synchronous + backcolor_red: background value red + backcolor_green: background value green + backcolor_blue: background value blue + signalpolarity_hs: TLI_HSYN_ACTLIVE_LOW,TLI_HSYN_ACTLIVE_HIGHT + signalpolarity_vs: TLI_VSYN_ACTLIVE_LOW,TLI_VSYN_ACTLIVE_HIGHT + signalpolarity_de: TLI_DE_ACTLIVE_LOW,TLI_DE_ACTLIVE_HIGHT + signalpolarity_pixelck: TLI_PIXEL_CLOCK_TLI,TLI_PIXEL_CLOCK_INVERTEDTLI + \param[out] none + \retval none +*/ +void tli_init(tli_parameter_struct *tli_struct) +{ + /* synchronous pulse size configuration */ + TLI_SPSZ &= ~(TLI_SPSZ_VPSZ | TLI_SPSZ_HPSZ); + TLI_SPSZ = (uint32_t)((uint32_t)tli_struct->synpsz_vpsz | ((uint32_t)tli_struct->synpsz_hpsz << 16U)); + /* back-porch size configuration */ + TLI_BPSZ &= ~(TLI_BPSZ_VBPSZ | TLI_BPSZ_HBPSZ); + TLI_BPSZ = (uint32_t)((uint32_t)tli_struct->backpsz_vbpsz | ((uint32_t)tli_struct->backpsz_hbpsz << 16U)); + /* active size configuration */ + TLI_ASZ &= ~(TLI_ASZ_VASZ | TLI_ASZ_HASZ); + TLI_ASZ = (tli_struct->activesz_vasz | (tli_struct->activesz_hasz << 16U)); + /* total size configuration */ + TLI_TSZ &= ~(TLI_TSZ_VTSZ | TLI_TSZ_HTSZ); + TLI_TSZ = (tli_struct->totalsz_vtsz | (tli_struct->totalsz_htsz << 16U)); + /* background color configuration */ + TLI_BGC &= ~(TLI_BGC_BVB | (TLI_BGC_BVG) | (TLI_BGC_BVR)); + TLI_BGC = (tli_struct->backcolor_blue | (tli_struct->backcolor_green << 8U) | (tli_struct->backcolor_red << 16U)); + TLI_CTL &= ~(TLI_CTL_HPPS | TLI_CTL_VPPS | TLI_CTL_DEPS | TLI_CTL_CLKPS); + TLI_CTL |= (tli_struct->signalpolarity_hs | tli_struct->signalpolarity_vs | \ + tli_struct->signalpolarity_de | tli_struct->signalpolarity_pixelck); + +} + +/*! + \brief configure TLI dither function + \param[in] dither_stat + only one parameter can be selected which is shown as below: + \arg TLI_DITHER_ENABLE + \arg TLI_DITHER_DISABLE + \param[out] none + \retval none +*/ +void tli_dither_config(uint8_t dither_stat) +{ + if(TLI_DITHER_ENABLE == dither_stat) { + TLI_CTL |= TLI_CTL_DFEN; + } else { + TLI_CTL &= ~(TLI_CTL_DFEN); + } +} + +/*! + \brief enable TLI + \param[in] none + \param[out] none + \retval none +*/ +void tli_enable(void) +{ + TLI_CTL |= TLI_CTL_TLIEN; +} + +/*! + \brief disable TLI + \param[in] none + \param[out] none + \retval none +*/ +void tli_disable(void) +{ + TLI_CTL &= ~(TLI_CTL_TLIEN); +} + +/*! + \brief configure TLI reload mode + \param[in] reload_mod + only one parameter can be selected which is shown as below: + \arg TLI_FRAME_BLANK_RELOAD_EN + \arg TLI_REQUEST_RELOAD_EN + \param[out] none + \retval none +*/ +void tli_reload_config(uint8_t reload_mod) +{ + if(TLI_FRAME_BLANK_RELOAD_EN == reload_mod) { + /* the layer configuration will be reloaded at frame blank */ + TLI_RL |= TLI_RL_FBR; + } else { + /* the layer configuration will be reloaded after this bit sets */ + TLI_RL |= TLI_RL_RQR; + } +} + +/*! + \brief initialize the parameters of TLI layer structure with the default values, it is suggested + that call this function after a tli_layer_parameter_struct structure is defined + \param[in] none + \param[out] layer_struct: TLI Layer parameter struct + layer_window_rightpos: window right position + layer_window_leftpos: window left position + layer_window_bottompos: window bottom position + layer_window_toppos: window top position + layer_ppf: LAYER_PPF_ARGB8888,LAYER_PPF_RGB888,LAYER_PPF_RGB565, + LAYER_PPF_ARG1555,LAYER_PPF_ARGB4444,LAYER_PPF_L8, + LAYER_PPF_AL44,LAYER_PPF_AL88 + layer_sa: specified alpha + layer_default_alpha: the default color alpha + layer_default_red: the default color red + layer_default_green: the default color green + layer_default_blue: the default color blue + layer_acf1: LAYER_ACF1_SA,LAYER_ACF1_PASA + layer_acf2: LAYER_ACF2_SA,LAYER_ACF2_PASA + layer_frame_bufaddr: frame buffer base address + layer_frame_buf_stride_offset: frame buffer stride offset + layer_frame_line_length: frame line length + layer_frame_total_line_number: frame total line number + \retval none +*/ +void tli_layer_struct_para_init(tli_layer_parameter_struct *layer_struct) +{ + /* initialize the struct parameters with default values */ + layer_struct->layer_window_rightpos = TLI_DEFAULT_VALUE; + layer_struct->layer_window_leftpos = TLI_DEFAULT_VALUE; + layer_struct->layer_window_bottompos = TLI_DEFAULT_VALUE; + layer_struct->layer_window_toppos = TLI_DEFAULT_VALUE; + layer_struct->layer_ppf = LAYER_PPF_ARGB8888; + layer_struct->layer_sa = TLI_OPAQUE_VALUE; + layer_struct->layer_default_alpha = TLI_DEFAULT_VALUE; + layer_struct->layer_default_red = TLI_DEFAULT_VALUE; + layer_struct->layer_default_green = TLI_DEFAULT_VALUE; + layer_struct->layer_default_blue = TLI_DEFAULT_VALUE; + layer_struct->layer_acf1 = LAYER_ACF1_PASA; + layer_struct->layer_acf2 = LAYER_ACF2_PASA; + layer_struct->layer_frame_bufaddr = TLI_DEFAULT_VALUE; + layer_struct->layer_frame_buf_stride_offset = TLI_DEFAULT_VALUE; + layer_struct->layer_frame_line_length = TLI_DEFAULT_VALUE; + layer_struct->layer_frame_total_line_number = TLI_DEFAULT_VALUE; +} + +/*! + \brief initialize TLI layer + \param[in] layerx: LAYERx(x=0,1) + \param[in] layer_struct: TLI Layer parameter struct + layer_window_rightpos: window right position + layer_window_leftpos: window left position + layer_window_bottompos: window bottom position + layer_window_toppos: window top position + layer_ppf: LAYER_PPF_ARGB8888,LAYER_PPF_RGB888,LAYER_PPF_RGB565, + LAYER_PPF_ARG1555,LAYER_PPF_ARGB4444,LAYER_PPF_L8, + LAYER_PPF_AL44,LAYER_PPF_AL88 + layer_sa: specified alpha + layer_default_alpha: the default color alpha + layer_default_red: the default color red + layer_default_green: the default color green + layer_default_blue: the default color blue + layer_acf1: LAYER_ACF1_SA,LAYER_ACF1_PASA + layer_acf2: LAYER_ACF2_SA,LAYER_ACF2_PASA + layer_frame_bufaddr: frame buffer base address + layer_frame_buf_stride_offset: frame buffer stride offset + layer_frame_line_length: frame line length + layer_frame_total_line_number: frame total line number + \param[out] none + \retval none +*/ +void tli_layer_init(uint32_t layerx, tli_layer_parameter_struct *layer_struct) +{ + /* configure layer window horizontal position */ + TLI_LxHPOS(layerx) &= ~(TLI_LxHPOS_WLP | (TLI_LxHPOS_WRP)); + TLI_LxHPOS(layerx) = (uint32_t)((uint32_t)layer_struct->layer_window_leftpos | ((uint32_t)layer_struct->layer_window_rightpos << 16U)); + /* configure layer window vertical position */ + TLI_LxVPOS(layerx) &= ~(TLI_LxVPOS_WTP | (TLI_LxVPOS_WBP)); + TLI_LxVPOS(layerx) = (uint32_t)((uint32_t)layer_struct->layer_window_toppos | ((uint32_t)layer_struct->layer_window_bottompos << 16U)); + /* configure layer packeted pixel format */ + TLI_LxPPF(layerx) &= ~(TLI_LxPPF_PPF); + TLI_LxPPF(layerx) = layer_struct->layer_ppf; + /* configure layer specified alpha */ + TLI_LxSA(layerx) &= ~(TLI_LxSA_SA); + TLI_LxSA(layerx) = layer_struct->layer_sa; + /* configure layer default color */ + TLI_LxDC(layerx) &= ~(TLI_LxDC_DCB | (TLI_LxDC_DCG) | (TLI_LxDC_DCR) | (TLI_LxDC_DCA)); + TLI_LxDC(layerx) = (uint32_t)((uint32_t)layer_struct->layer_default_blue | ((uint32_t)layer_struct->layer_default_green << 8U) + | ((uint32_t)layer_struct->layer_default_red << 16U) + | ((uint32_t)layer_struct->layer_default_alpha << 24U)); + + /* configure layer alpha calculation factors */ + TLI_LxBLEND(layerx) &= ~(TLI_LxBLEND_ACF2 | (TLI_LxBLEND_ACF1)); + TLI_LxBLEND(layerx) = ((layer_struct->layer_acf2) | (layer_struct->layer_acf1)); + /* configure layer frame buffer base address */ + TLI_LxFBADDR(layerx) &= ~(TLI_LxFBADDR_FBADD); + TLI_LxFBADDR(layerx) = (layer_struct->layer_frame_bufaddr); + /* configure layer frame line length */ + TLI_LxFLLEN(layerx) &= ~(TLI_LxFLLEN_FLL | (TLI_LxFLLEN_STDOFF)); + TLI_LxFLLEN(layerx) = (uint32_t)((uint32_t)layer_struct->layer_frame_line_length | ((uint32_t)layer_struct->layer_frame_buf_stride_offset << 16U)); + /* configure layer frame total line number */ + TLI_LxFTLN(layerx) &= ~(TLI_LxFTLN_FTLN); + TLI_LxFTLN(layerx) = (uint32_t)(layer_struct->layer_frame_total_line_number); + +} + +/*! + \brief reconfigure window position + \param[in] layerx: LAYERx(x=0,1) + \param[in] offset_x: new horizontal offset + \param[in] offset_y: new vertical offset + \param[out] none + \retval none +*/ +void tli_layer_window_offset_modify(uint32_t layerx, uint16_t offset_x, uint16_t offset_y) +{ + /* configure window start position */ + uint32_t layer_ppf, line_num, hstart, vstart; + uint32_t line_length = 0U; + TLI_LxHPOS(layerx) &= ~(TLI_LxHPOS_WLP | (TLI_LxHPOS_WRP)); + TLI_LxVPOS(layerx) &= ~(TLI_LxVPOS_WTP | (TLI_LxVPOS_WBP)); + hstart = (uint32_t)offset_x + (((TLI_BPSZ & TLI_BPSZ_HBPSZ) >> 16U) + 1U); + vstart = (uint32_t)offset_y + ((TLI_BPSZ & TLI_BPSZ_VBPSZ) + 1U); + line_num = (TLI_LxFTLN(layerx) & TLI_LxFTLN_FTLN); + layer_ppf = (TLI_LxPPF(layerx) & TLI_LxPPF_PPF); + /* the bytes of a line equal TLI_LxFLLEN_FLL bits value minus 3 */ + switch(layer_ppf) { + case LAYER_PPF_ARGB8888: + /* each pixel includes 4bytes, when pixel format is ARGB8888 */ + line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 4U); + break; + case LAYER_PPF_RGB888: + /* each pixel includes 3bytes, when pixel format is RGB888 */ + line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 3U); + break; + case LAYER_PPF_RGB565: + case LAYER_PPF_ARGB1555: + case LAYER_PPF_ARGB4444: + case LAYER_PPF_AL88: + /* each pixel includes 2bytes, when pixel format is RGB565,ARG1555,ARGB4444 or AL88 */ + line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 2U); + break; + case LAYER_PPF_L8: + case LAYER_PPF_AL44: + /* each pixel includes 1byte, when pixel format is L8 or AL44 */ + line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U)); + break; + default: + break; + } + /* reconfigure window position */ + TLI_LxHPOS(layerx) = (hstart | ((hstart + line_length - 1U) << 16U)); + TLI_LxVPOS(layerx) = (vstart | ((vstart + line_num - 1U) << 16U)); +} + +/*! + \brief initialize the parameters of TLI layer LUT structure with the default values, it is suggested + that call this function after a tli_layer_lut_parameter_struct structure is defined + \param[in] none + \param[out] lut_struct: TLI layer LUT parameter struct + layer_table_addr: look up table write address + layer_lut_channel_red: red channel of a LUT entry + layer_lut_channel_green: green channel of a LUT entry + layer_lut_channel_blue: blue channel of a LUT entry + \retval none +*/ +void tli_lut_struct_para_init(tli_layer_lut_parameter_struct *lut_struct) +{ + /* initialize the struct parameters with default values */ + lut_struct->layer_table_addr = TLI_DEFAULT_VALUE; + lut_struct->layer_lut_channel_red = TLI_DEFAULT_VALUE; + lut_struct->layer_lut_channel_green = TLI_DEFAULT_VALUE; + lut_struct->layer_lut_channel_blue = TLI_DEFAULT_VALUE; +} + +/*! + \brief initialize TLI layer LUT + \param[in] layerx: LAYERx(x=0,1) + \param[in] lut_struct: TLI layer LUT parameter struct + layer_table_addr: look up table write address + layer_lut_channel_red: red channel of a LUT entry + layer_lut_channel_green: green channel of a LUT entry + layer_lut_channel_blue: blue channel of a LUT entry + \param[out] none + \retval none +*/ +void tli_lut_init(uint32_t layerx, tli_layer_lut_parameter_struct *lut_struct) +{ + TLI_LxLUT(layerx) = (uint32_t)(((uint32_t)lut_struct->layer_lut_channel_blue) | ((uint32_t)lut_struct->layer_lut_channel_green << 8U) + | ((uint32_t)lut_struct->layer_lut_channel_red << 16U + | ((uint32_t)lut_struct->layer_table_addr << 24U))); +} + +/*! + \brief initialize TLI layer color key + \param[in] layerx: LAYERx(x=0,1) + \param[in] redkey: color key red + \param[in] greenkey: color key green + \param[in] bluekey: color key blue + \param[out] none + \retval none +*/ +void tli_color_key_init(uint32_t layerx, uint8_t redkey, uint8_t greenkey, uint8_t bluekey) +{ + TLI_LxCKEY(layerx) = (((uint32_t)bluekey) | ((uint32_t)greenkey << 8U) | ((uint32_t)redkey << 16U)); +} + +/*! + \brief enable TLI layer + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_layer_enable(uint32_t layerx) +{ + TLI_LxCTL(layerx) |= TLI_LxCTL_LEN; +} + +/*! + \brief disable TLI layer + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_layer_disable(uint32_t layerx) +{ + TLI_LxCTL(layerx) &= ~(TLI_LxCTL_LEN); +} + +/*! + \brief enable TLI layer color keying + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_color_key_enable(uint32_t layerx) +{ + TLI_LxCTL(layerx) |= TLI_LxCTL_CKEYEN; +} + +/*! + \brief disable TLI layer color keying + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_color_key_disable(uint32_t layerx) +{ + TLI_LxCTL(layerx) &= ~(TLI_LxCTL_CKEYEN); +} + +/*! + \brief enable TLI layer LUT + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_lut_enable(uint32_t layerx) +{ + TLI_LxCTL(layerx) |= TLI_LxCTL_LUTEN; +} + +/*! + \brief disable TLI layer LUT + \param[in] layerx: LAYERx(x=0,1) + \param[out] none + \retval none +*/ +void tli_lut_disable(uint32_t layerx) +{ + TLI_LxCTL(layerx) &= ~(TLI_LxCTL_LUTEN); +} + +/*! + \brief set line mark value + \param[in] line_num: line number + \param[out] none + \retval none +*/ +void tli_line_mark_set(uint16_t line_num) +{ + TLI_LM &= ~(TLI_LM_LM); + TLI_LM = (uint32_t)line_num; +} + +/*! + \brief get current displayed position + \param[in] none + \param[out] none + \retval position of current pixel +*/ +uint32_t tli_current_pos_get(void) +{ + return TLI_CPPOS; +} + +/*! + \brief enable TLI interrupt + \param[in] int_flag: TLI interrupt flags + one or more parameters can be selected which are shown as below: + \arg TLI_INT_LM: line mark interrupt + \arg TLI_INT_FE: FIFO error interrupt + \arg TLI_INT_TE: transaction error interrupt + \arg TLI_INT_LCR: layer configuration reloaded interrupt + \param[out] none + \retval none +*/ +void tli_interrupt_enable(uint32_t int_flag) +{ + TLI_INTEN |= (int_flag); +} + +/*! + \brief disable TLI interrupt + \param[in] int_flag: TLI interrupt flags + one or more parameters can be selected which are shown as below: + \arg TLI_INT_LM: line mark interrupt + \arg TLI_INT_FE: FIFO error interrupt + \arg TLI_INT_TE: transaction error interrupt + \arg TLI_INT_LCR: layer configuration reloaded interrupt + \param[out] none + \retval none +*/ +void tli_interrupt_disable(uint32_t int_flag) +{ + TLI_INTEN &= ~(int_flag); +} + +/*! + \brief get TLI interrupt flag + \param[in] int_flag: TLI interrupt flags + one or more parameters can be selected which are shown as below: + \arg TLI_INT_FLAG_LM: line mark interrupt flag + \arg TLI_INT_FLAG_FE: FIFO error interrupt flag + \arg TLI_INT_FLAG_TE: transaction error interrupt flag + \arg TLI_INT_FLAG_LCR: layer configuration reloaded interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus tli_interrupt_flag_get(uint32_t int_flag) +{ + uint32_t state; + state = TLI_INTF; + if(state & int_flag) { + state = TLI_INTEN; + if(state & int_flag) { + return SET; + } + } + return RESET; +} + +/*! + \brief clear TLI interrupt flag + \param[in] int_flag: TLI interrupt flags + one or more parameters can be selected which are shown as below: + \arg TLI_INT_FLAG_LM: line mark interrupt flag + \arg TLI_INT_FLAG_FE: FIFO error interrupt flag + \arg TLI_INT_FLAG_TE: transaction error interrupt flag + \arg TLI_INT_FLAG_LCR: layer configuration reloaded interrupt flag + \param[out] none + \retval none +*/ +void tli_interrupt_flag_clear(uint32_t int_flag) +{ + TLI_INTC |= (int_flag); +} + +/*! + \brief get TLI flag or state in TLI_INTF register or TLI_STAT register + \param[in] flag: TLI flags or states + only one parameter can be selected which is shown as below: + \arg TLI_FLAG_VDE: current VDE state + \arg TLI_FLAG_HDE: current HDE state + \arg TLI_FLAG_VS: current VS status of the TLI + \arg TLI_FLAG_HS: current HS status of the TLI + \arg TLI_FLAG_LM: line mark interrupt flag + \arg TLI_FLAG_FE: FIFO error interrupt flag + \arg TLI_FLAG_TE: transaction error interrupt flag + \arg TLI_FLAG_LCR: layer configuration reloaded interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus tli_flag_get(uint32_t flag) +{ + uint32_t stat; + /* choose which register to get flag or state */ + if(flag >> 31U) { + stat = TLI_INTF; + } else { + stat = TLI_STAT; + } + if(flag & stat) { + return SET; + } else { + return RESET; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c new file mode 100644 index 00000000000..36bd0460267 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c @@ -0,0 +1,153 @@ +/*! + \file gd32f5xx_trng.c + \brief TRNG driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_trng.h" + +/*! + \brief reset TRNG + \param[in] none + \param[out] none + \retval none +*/ +void trng_deinit(void) +{ + rcu_periph_reset_enable(RCU_TRNGRST); + rcu_periph_reset_disable(RCU_TRNGRST); +} + +/*! + \brief enable TRNG + \param[in] none + \param[out] none + \retval none +*/ +void trng_enable(void) +{ + TRNG_CTL |= TRNG_CTL_TRNGEN; +} + +/*! + \brief disable TRNG + \param[in] none + \param[out] none + \retval none +*/ +void trng_disable(void) +{ + TRNG_CTL &= ~TRNG_CTL_TRNGEN; +} + +/*! + \brief get the true random data + \param[in] none + \param[out] none + \retval uint32_t: 0x0-0xFFFFFFFF +*/ +uint32_t trng_get_true_random_data(void) +{ + return (TRNG_DATA); +} + +/*! + \brief get TRNG flag status + \param[in] flag: TRNG flag + only one parameter can be selected which is shown as below: + \arg TRNG_FLAG_DRDY: random Data ready status + \arg TRNG_FLAG_CECS: clock error current status + \arg TRNG_FLAG_SECS: seed error current status + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus trng_flag_get(trng_flag_enum flag) +{ + if(RESET != (TRNG_STAT & flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief enable TRNG interrupt + \param[in] none + \param[out] none + \retval none +*/ +void trng_interrupt_enable(void) +{ + TRNG_CTL |= TRNG_CTL_TRNGIE; +} + +/*! + \brief disable TRNG interrupt + \param[in] none + \param[out] none + \retval none +*/ +void trng_interrupt_disable(void) +{ + TRNG_CTL &= ~TRNG_CTL_TRNGIE; +} + +/*! + \brief get TRNG interrupt flag status + \param[in] int_flag: TRNG interrupt flag + only one parameter can be selected which is shown as below: + \arg TRNG_INT_FLAG_CEIF: clock error interrupt flag + \arg TRNG_INT_FLAG_SEIF: seed error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus trng_interrupt_flag_get(trng_int_flag_enum int_flag) +{ + if(RESET != (TRNG_STAT & int_flag)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear TRNG interrupt flag status + \param[in] int_flag: TRNG interrupt flag + only one parameter can be selected which is shown as below: + \arg TRNG_INT_FLAG_CEIF: clock error interrupt flag + \arg TRNG_INT_FLAG_SEIF: seed error interrupt flag + \param[out] none + \retval none +*/ +void trng_interrupt_flag_clear(trng_int_flag_enum int_flag) +{ + TRNG_STAT &= ~(uint32_t)int_flag; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c new file mode 100644 index 00000000000..a0a45ac28da --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c @@ -0,0 +1,1010 @@ +/*! + \file gd32f5xx_usart.c + \brief USART driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_usart.h" + +/* USART register bit offset */ +#define GP_GUAT_OFFSET ((uint32_t)8U) /* bit offset of GUAT in USART_GP */ +#define CTL3_SCRTNUM_OFFSET ((uint32_t)1U) /* bit offset of SCRTNUM in USART_CTL3 */ +#define RT_BL_OFFSET ((uint32_t)24U) /* bit offset of BL in USART_RT */ + +/*! + \brief reset USART/UART + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_deinit(uint32_t usart_periph) +{ + switch(usart_periph) { + case USART0: + rcu_periph_reset_enable(RCU_USART0RST); + rcu_periph_reset_disable(RCU_USART0RST); + break; + case USART1: + rcu_periph_reset_enable(RCU_USART1RST); + rcu_periph_reset_disable(RCU_USART1RST); + break; + case USART2: + rcu_periph_reset_enable(RCU_USART2RST); + rcu_periph_reset_disable(RCU_USART2RST); + break; + case USART5: + rcu_periph_reset_enable(RCU_USART5RST); + rcu_periph_reset_disable(RCU_USART5RST); + break; + case UART3: + rcu_periph_reset_enable(RCU_UART3RST); + rcu_periph_reset_disable(RCU_UART3RST); + break; + case UART4: + rcu_periph_reset_enable(RCU_UART4RST); + rcu_periph_reset_disable(RCU_UART4RST); + break; + case UART6: + rcu_periph_reset_enable(RCU_UART6RST); + rcu_periph_reset_disable(RCU_UART6RST); + break; + case UART7: + rcu_periph_reset_enable(RCU_UART7RST); + rcu_periph_reset_disable(RCU_UART7RST); + break; + default: + break; + } +} + +/*! + \brief configure USART baud rate value + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] baudval: baud rate value + \param[out] none + \retval none +*/ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval) +{ + uint32_t uclk = 0U, intdiv = 0U, fradiv = 0U, udiv = 0U; + switch(usart_periph) { + /* get clock frequency */ + case USART0: + uclk = rcu_clock_freq_get(CK_APB2); + break; + case USART5: + uclk = rcu_clock_freq_get(CK_APB2); + break; + case USART1: + uclk = rcu_clock_freq_get(CK_APB1); + break; + case USART2: + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART3: + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART4: + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART6: + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART7: + uclk = rcu_clock_freq_get(CK_APB1); + break; + default: + break; + } + if(USART_CTL0(usart_periph) & USART_CTL0_OVSMOD) { + /* when oversampling by 8, configure the value of USART_BAUD */ + udiv = ((2U * uclk) + baudval / 2U) / baudval; + intdiv = udiv & 0xfff0U; + fradiv = (udiv >> 1U) & 0x7U; + USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); + } else { + /* when oversampling by 16, configure the value of USART_BAUD */ + udiv = (uclk + baudval / 2U) / baudval; + intdiv = udiv & 0xfff0U; + fradiv = udiv & 0xfU; + USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); + } +} + +/*! + \brief configure USART parity function + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] paritycfg: configure USART parity + only one parameter can be selected which is shown as below: + \arg USART_PM_NONE: no parity + \arg USART_PM_EVEN: even parity + \arg USART_PM_ODD: odd parity + \param[out] none + \retval none +*/ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg) +{ + /* clear USART_CTL0 PM,PCEN Bits */ + USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN); + /* configure USART parity mode */ + USART_CTL0(usart_periph) |= paritycfg ; +} + +/*! + \brief configure USART word length + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] wlen: USART word length configure + only one parameter can be selected which is shown as below: + \arg USART_WL_8BIT: 8 bits + \arg USART_WL_9BIT: 9 bits + \param[out] none + \retval none +*/ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen) +{ + /* clear USART_CTL0 WL bit */ + USART_CTL0(usart_periph) &= ~USART_CTL0_WL; + /* configure USART word length */ + USART_CTL0(usart_periph) |= wlen; +} + +/*! + \brief configure USART stop bit length + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] stblen: USART stop bit configure + only one parameter can be selected which is shown as below: + \arg USART_STB_1BIT: 1 bit + \arg USART_STB_0_5BIT: 0.5 bit(not available for UARTx(x=3,4,6,7)) + \arg USART_STB_2BIT: 2 bits + \arg USART_STB_1_5BIT: 1.5 bits(not available for UARTx(x=3,4,6,7)) + \param[out] none + \retval none +*/ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen) +{ + /* clear USART_CTL1 STB bits */ + USART_CTL1(usart_periph) &= ~USART_CTL1_STB; + /* configure USART stop bits */ + USART_CTL1(usart_periph) |= stblen; +} +/*! + \brief enable USART + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_UEN; +} + +/*! + \brief disable USART + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN); +} + +/*! + \brief configure USART transmitter + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] txconfig: enable or disable USART transmitter + only one parameter can be selected which is shown as below: + \arg USART_TRANSMIT_ENABLE: enable USART transmission + \arg USART_TRANSMIT_DISABLE: enable USART transmission + \param[out] none + \retval none +*/ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_TEN; + ctl |= txconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief configure USART receiver + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] rxconfig: enable or disable USART receiver + only one parameter can be selected which is shown as below: + \arg USART_RECEIVE_ENABLE: enable USART reception + \arg USART_RECEIVE_DISABLE: disable USART reception + \param[out] none + \retval none +*/ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_REN; + ctl |= rxconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief data is transmitted/received with the LSB/MSB first + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] msbf: LSB/MSB + only one parameter can be selected which is shown as below: + \arg USART_MSBF_LSB: LSB first + \arg USART_MSBF_MSB: MSB first + \param[out] none + \retval none +*/ +void usart_data_first_config(uint32_t usart_periph, uint32_t msbf) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL3(usart_periph); + ctl &= ~(USART_CTL3_MSBF); + ctl |= msbf; + /* configure data transmitted/received mode */ + USART_CTL3(usart_periph) = ctl; +} + +/*! + \brief configure USART inversion + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] invertpara: refer to enum USART_INVERT_CONFIG + only one parameter can be selected which is shown as below: + \arg USART_DINV_ENABLE: data bit level inversion + \arg USART_DINV_DISABLE: data bit level not inversion + \arg USART_TXPIN_ENABLE: TX pin level inversion + \arg USART_TXPIN_DISABLE: TX pin level not inversion + \arg USART_RXPIN_ENABLE: RX pin level inversion + \arg USART_RXPIN_DISABLE: RX pin level not inversion + \param[out] none + \retval none +*/ +void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara) +{ + /* inverted or not the specified siginal */ + switch(invertpara) { + case USART_DINV_ENABLE: + USART_CTL3(usart_periph) |= USART_CTL3_DINV; + break; + case USART_TXPIN_ENABLE: + USART_CTL3(usart_periph) |= USART_CTL3_TINV; + break; + case USART_RXPIN_ENABLE: + USART_CTL3(usart_periph) |= USART_CTL3_RINV; + break; + case USART_DINV_DISABLE: + USART_CTL3(usart_periph) &= ~(USART_CTL3_DINV); + break; + case USART_TXPIN_DISABLE: + USART_CTL3(usart_periph) &= ~(USART_CTL3_TINV); + break; + case USART_RXPIN_DISABLE: + USART_CTL3(usart_periph) &= ~(USART_CTL3_RINV); + break; + default: + break; + } +} + +/*! + \brief configure the USART oversample mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] oversamp: oversample value + only one parameter can be selected which is shown as below: + \arg USART_OVSMOD_8: 8 bits + \arg USART_OVSMOD_16: 16 bits + \param[out] none + \retval none +*/ +void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp) +{ + /* clear OVSMOD bit */ + USART_CTL0(usart_periph) &= ~(USART_CTL0_OVSMOD); + USART_CTL0(usart_periph) |= oversamp; +} + +/*! + \brief configure sample bit method + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] obsm: sample bit + only one parameter can be selected which is shown as below: + \arg USART_OSB_1bit: 1 bit + \arg USART_OSB_3bit: 3 bits + \param[out] none + \retval none +*/ +void usart_sample_bit_config(uint32_t usart_periph, uint32_t obsm) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_OSB); + USART_CTL2(usart_periph) |= obsm; +} + +/*! + \brief enable receiver timeout of USART + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_receiver_timeout_enable(uint32_t usart_periph) +{ + USART_CTL3(usart_periph) |= USART_CTL3_RTEN; +} + +/*! + \brief disable receiver timeout of USART + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_receiver_timeout_disable(uint32_t usart_periph) +{ + USART_CTL3(usart_periph) &= ~(USART_CTL3_RTEN); +} + +/*! + \brief configure receiver timeout threshold + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] rtimeout: 0-0x00FFFFFF + \param[out] none + \retval none +*/ +void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout) +{ + USART_RT(usart_periph) &= ~(USART_RT_RT); + USART_RT(usart_periph) |= rtimeout; +} + +/*! + \brief USART transmit data function + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void usart_data_transmit(uint32_t usart_periph, uint32_t data) +{ + USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data); +} + +/*! + \brief USART receive data function + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval data of received +*/ +uint16_t usart_data_receive(uint32_t usart_periph) +{ + return (uint16_t)(GET_BITS(USART_DATA(usart_periph), 0U, 8U)); +} + +/*! + \brief configure address of the USART + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] addr: address of USART/UART + \param[out] none + \retval none +*/ +void usart_address_config(uint32_t usart_periph, uint8_t addr) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR); + USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr); +} + +/*! + \brief enable mute mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_mute_mode_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_RWU; +} + +/*! + \brief disable mute mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_mute_mode_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU); +} + +/*! + \brief configure wakeup method in mute mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] wmehtod: two method be used to enter or exit the mute mode + only one parameter can be selected which is shown as below: + \arg USART_WM_IDLE: idle line + \arg USART_WM_ADDR: address mask + \param[out] none + \retval none +*/ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmehtod) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_WM); + USART_CTL0(usart_periph) |= wmehtod; +} + +/*! + \brief enable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_lin_mode_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_LMEN; +} + +/*! + \brief disable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_lin_mode_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN); +} + +/*! + \brief configure lin break frame length + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] lblen: lin break frame length + only one parameter can be selected which is shown as below: + \arg USART_LBLEN_10B: 10 bits + \arg USART_LBLEN_11B: 11 bits + \param[out] none + \retval none +*/ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN); + USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen); +} + +/*! + \brief send break frame + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_send_break(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD; +} + +/*! + \brief enable half-duplex mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_halfduplex_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_HDEN; +} + +/*! + \brief disable half-duplex mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_halfduplex_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN); +} + +/*! + \brief enable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_CKEN; +} + +/*! + \brief disable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN); +} + +/*! + \brief configure USART synchronous mode parameters + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] clen: CK length + only one parameter can be selected which is shown as below: + \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame + \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame + \param[in] cph: clock phase + only one parameter can be selected which is shown as below: + \arg USART_CPH_1CK: first clock transition is the first data capture edge + \arg USART_CPH_2CK: second clock transition is the first data capture edge + \param[in] cpl: clock polarity + only one parameter can be selected which is shown as below: + \arg USART_CPL_LOW: steady low value on CK pin + \arg USART_CPL_HIGH: steady high value on CK pin + \param[out] none + \retval none +*/ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl) +{ + uint32_t ctl = 0U; + + /* read USART_CTL1 register */ + ctl = USART_CTL1(usart_periph); + ctl &= ~(USART_CTL1_CLEN | USART_CTL1_CPH | USART_CTL1_CPL); + /* set CK length, CK phase, CK polarity */ + ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl); + + USART_CTL1(usart_periph) = ctl; +} + +/*! + \brief configure guard time value in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] guat: guard time value, 0-0xFF + \param[out] none + \retval none +*/ +void usart_guard_time_config(uint32_t usart_periph, uint32_t guat) +{ + USART_GP(usart_periph) &= ~(USART_GP_GUAT); + USART_GP(usart_periph) |= (USART_GP_GUAT & ((guat) << GP_GUAT_OFFSET)); +} + +/*! + \brief enable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_SCEN; +} + +/*! + \brief disable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_SCEN); +} + +/*! + \brief enable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_NKEN; +} + +/*! + \brief disable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_NKEN); +} + +/*! + \brief configure smartcard auto-retry number + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] scrtnum: smartcard auto-retry number + \param[out] none + \retval none +*/ +void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum) +{ + USART_CTL3(usart_periph) &= ~(USART_CTL3_SCRTNUM); + USART_CTL3(usart_periph) |= (USART_CTL3_SCRTNUM & ((scrtnum) << CTL3_SCRTNUM_OFFSET)); +} + +/*! + \brief configure block length in Smartcard T=1 reception + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] bl: block length + \param[out] none + \retval none +*/ +void usart_block_length_config(uint32_t usart_periph, uint32_t bl) +{ + USART_RT(usart_periph) &= ~(USART_RT_BL); + USART_RT(usart_periph) |= (USART_RT_BL & ((bl) << RT_BL_OFFSET)); +} + +/*! + \brief enable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_irda_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_IREN; +} + +/*! + \brief disable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[out] none + \retval none +*/ +void usart_irda_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IREN); +} + +/*! + \brief configure the peripheral clock prescaler in USART IrDA low-power mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] psc: 0-0xFF + \param[out] none + \retval none +*/ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc) +{ + USART_GP(usart_periph) &= ~(USART_GP_PSC); + USART_GP(usart_periph) |= psc; +} + +/*! + \brief configure IrDA low-power + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] irlp: IrDA low-power or normal + only one parameter can be selected which is shown as below: + \arg USART_IRLP_LOW: low-power + \arg USART_IRLP_NORMAL: normal + \param[out] none + \retval none +*/ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IRLP); + USART_CTL2(usart_periph) |= (USART_CTL2_IRLP & irlp); +} + +/*! + \brief configure hardware flow control RTS + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] rtsconfig: enable or disable RTS + only one parameter can be selected which is shown as below: + \arg USART_RTS_ENABLE: enable RTS + \arg USART_RTS_DISABLE: disable RTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_RTSEN; + ctl |= rtsconfig; + /* configure RTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure hardware flow control CTS + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] ctsconfig: enable or disable CTS + only one parameter can be selected which is shown as below: + \arg USART_CTS_ENABLE: enable CTS + \arg USART_CTS_DISABLE: disable CTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_CTSEN; + ctl |= ctsconfig; + /* configure CTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure break frame coherence mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] bcm: + only one parameter can be selected which is shown as below: + \arg USART_BCM_NONE: no parity error is detected + \arg USART_BCM_EN: parity error is detected + \param[out] none + \retval none +*/ +void usart_break_frame_coherence_config(uint32_t usart_periph, uint32_t bcm) +{ + USART_CHC(usart_periph) &= ~(USART_CHC_BCM); + USART_CHC(usart_periph) |= (USART_CHC_BCM & bcm); +} + +/*! + \brief configure parity check coherence mode + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] pcm: + only one parameter can be selected which is shown as below: + \arg USART_PCM_NONE: not check parity + \arg USART_PCM_EN: check the parity + \param[out] none + \retval none +*/ +void usart_parity_check_coherence_config(uint32_t usart_periph, uint32_t pcm) +{ + USART_CHC(usart_periph) &= ~(USART_CHC_PCM); + USART_CHC(usart_periph) |= (USART_CHC_PCM & pcm); +} + +/*! + \brief configure hardware flow control coherence mode + \param[in] usart_periph: USARTx(x=0,1,2,5) + \param[in] hcm: + only one parameter can be selected which is shown as below: + \arg USART_HCM_NONE: nRTS signal equals to the rxne status register + \arg USART_HCM_EN: nRTS signal is set when the last data bit has been sampled + \param[out] none + \retval none +*/ +void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm) +{ + USART_CHC(usart_periph) &= ~(USART_CHC_HCM); + USART_CHC(usart_periph) |= (USART_CHC_HCM & hcm); +} + +/*! + \brief configure USART DMA for reception + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] dmacmd: enable or disable DMA for reception + only one parameter can be selected which is shown as below: + \arg USART_DENR_ENABLE: DMA enable for reception + \arg USART_DENR_DISABLE: DMA disable for reception + \param[out] none + \retval none +*/ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENR; + ctl |= dmacmd; + /* configure DMA reception */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure USART DMA for transmission + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] dmacmd: enable or disable DMA for transmission + only one parameter can be selected which is shown as below: + \arg USART_DENT_ENABLE: DMA enable for transmission + \arg USART_DENT_DISABLE: DMA disable for transmission + \param[out] none + \retval none +*/ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENT; + ctl |= dmacmd; + /* configure DMA transmission */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief get USART flag status + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTS: CTS change flag + \arg USART_FLAG_LBD: LIN break detected flag + \arg USART_FLAG_TBE: transmit data buffer empty + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \arg USART_FLAG_IDLE: IDLE frame detected flag + \arg USART_FLAG_ORERR: overrun error + \arg USART_FLAG_NERR: noise error flag + \arg USART_FLAG_FERR: frame error flag + \arg USART_FLAG_PERR: parity error flag + \arg USART_FLAG_BSY: busy flag + \arg USART_FLAG_EB: end of block flag + \arg USART_FLAG_RT: receiver timeout flag + \arg USART_FLAG_EPERR: early parity error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag) +{ + if(RESET != (USART_REG_VAL(usart_periph, flag) & BIT(USART_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear USART flag status + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTS: CTS change flag + \arg USART_FLAG_LBD: LIN break detected flag + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \arg USART_FLAG_EB: end of block flag + \arg USART_FLAG_RT: receiver timeout flag + \arg USART_FLAG_EPERR: early parity error flag + \param[out] none + \retval none +*/ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag) +{ + if (USART_FLAG_EPERR == flag) { + USART_REG_VAL(usart_periph, flag) &= ~BIT(USART_BIT_POS(flag)); + } else { + USART_REG_VAL(usart_periph, flag) = ~BIT(USART_BIT_POS(flag)); + } +} + +/*! + \brief enable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] interrupt: USART interrupts, refer to usart_interrupt_enum + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \arg USART_INT_RT: interrupt enable bit of receive timeout event + \arg USART_INT_EB: interrupt enable bit of end of block event + \param[out] none + \retval none +*/ +void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt) +{ + USART_REG_VAL(usart_periph, interrupt) |= BIT(USART_BIT_POS(interrupt)); +} + +/*! + \brief disable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] interrupt: USART interrupts, refer to usart_interrupt_enum + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \arg USART_INT_RT: interrupt enable bit of receive timeout event + \arg USART_INT_EB: interrupt enable bit of end of block event + \param[out] none + \retval none +*/ +void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt) +{ + USART_REG_VAL(usart_periph, interrupt) &= ~BIT(USART_BIT_POS(interrupt)); +} + +/*! + \brief get USART interrupt and flag status + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] int_flag: USART interrupt flags, refer to usart_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_PERR: parity error interrupt and flag + \arg USART_INT_FLAG_TBE: transmitter buffer empty interrupt and flag + \arg USART_INT_FLAG_TC: transmission complete interrupt and flag + \arg USART_INT_FLAG_RBNE: read data buffer not empty interrupt and flag + \arg USART_INT_FLAG_RBNE_ORERR: read data buffer not empty interrupt and overrun error flag + \arg USART_INT_FLAG_IDLE: IDLE line detected interrupt and flag + \arg USART_INT_FLAG_LBD: LIN break detected interrupt and flag + \arg USART_INT_FLAG_CTS: CTS interrupt and flag + \arg USART_INT_FLAG_ERR_ORERR: error interrupt and overrun error + \arg USART_INT_FLAG_ERR_NERR: error interrupt and noise error flag + \arg USART_INT_FLAG_ERR_FERR: error interrupt and frame error flag + \arg USART_INT_FLAG_EB: interrupt enable bit of end of block event and flag + \arg USART_INT_FLAG_RT: interrupt enable bit of receive timeout event and flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U; + /* get the interrupt enable bit status */ + intenable = (USART_REG_VAL(usart_periph, int_flag) & BIT(USART_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (USART_REG_VAL2(usart_periph, int_flag) & BIT(USART_BIT_POS2(int_flag))); + + if((0U != flagstatus) && (0U != intenable)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear interrupt flag and flag status + \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) + \param[in] int_flag: USART interrupt flags, refer to usart_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_CTS: CTS change flag + \arg USART_INT_FLAG_LBD: LIN break detected flag + \arg USART_INT_FLAG_TC: transmission complete + \arg USART_INT_FLAG_RBNE: read data buffer not empty + \arg USART_INT_FLAG_EB: end of block flag + \arg USART_INT_FLAG_RT: receiver timeout flag + \param[out] none + \retval none +*/ +void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag) +{ + USART_REG_VAL2(usart_periph, int_flag) = ~BIT(USART_BIT_POS2(int_flag)); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c new file mode 100644 index 00000000000..caf9c7c5705 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c @@ -0,0 +1,141 @@ +/*! + \file gd32f5xx_wwdgt.c + \brief WWDGT driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f5xx_wwdgt.h" + +/*! + \brief reset the window watchdog timer configuration + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_deinit(void) +{ + rcu_periph_reset_enable(RCU_WWDGTRST); + rcu_periph_reset_disable(RCU_WWDGTRST); +} + +/*! + \brief start the window watchdog timer counter + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_enable(void) +{ + WWDGT_CTL |= WWDGT_CTL_WDGTEN; +} + +/*! + \brief configure the window watchdog timer counter value + \param[in] counter_value: 0x00 - 0x7F + \param[out] none + \retval none +*/ +void wwdgt_counter_update(uint16_t counter_value) +{ + WWDGT_CTL = (uint32_t)(CTL_CNT(counter_value)); +} + +/*! + \brief configure counter value, window value, and prescaler divider value + \param[in] counter: 0x00 - 0x7F + \param[in] window: 0x00 - 0x7F + \param[in] prescaler: wwdgt prescaler value + only one parameter can be selected which is shown as below: + \arg WWDGT_CFG_PSC_DIV1 : the time base of window watchdog counter = (PCLK1/4096)/1 + \arg WWDGT_CFG_PSC_DIV2 : the time base of window watchdog counter = (PCLK1/4096)/2 + \arg WWDGT_CFG_PSC_DIV4 : the time base of window watchdog counter = (PCLK1/4096)/4 + \arg WWDGT_CFG_PSC_DIV8 : the time base of window watchdog counter = (PCLK1/4096)/8 + \arg WWDGT_CFG_PSC_DIV16 : the time base of window watchdog counter = (PCLK1/4096)/16 + \arg WWDGT_CFG_PSC_DIV32 : the time base of window watchdog counter = (PCLK1/4096)/32 + \arg WWDGT_CFG_PSC_DIV64 : the time base of window watchdog counter = (PCLK1/4096)/64 + \arg WWDGT_CFG_PSC_DIV128 : the time base of window watchdog counter = (PCLK1/4096)/128 + \arg WWDGT_CFG_PSC_DIV256 : the time base of window watchdog counter = (PCLK1/4096)/256 + \arg WWDGT_CFG_PSC_DIV512 : the time base of window watchdog counter = (PCLK1/4096)/512 + \arg WWDGT_CFG_PSC_DIV1024 : the time base of window watchdog counter = (PCLK1/4096)/1024 + \arg WWDGT_CFG_PSC_DIV2048 : the time base of window watchdog counter = (PCLK1/4096)/2048 + \arg WWDGT_CFG_PSC_DIV4096 : the time base of window watchdog counter = (PCLK1/4096)/4096 + \arg WWDGT_CFG_PSC_DIV8192 : the time base of window watchdog counter = (PCLK1/4096)/8192 + \arg WWDGT_CFG_PSC_DIV16384 : the time base of window watchdog counter = (PCLK1/4096)/16384 + \arg WWDGT_CFG_PSC_DIV32768 : the time base of window watchdog counter = (PCLK1/4096)/32768 + \arg WWDGT_CFG_PSC_DIV65536 : the time base of window watchdog counter = (PCLK1/4096)/65536 + \arg WWDGT_CFG_PSC_DIV131072: the time base of window watchdog counter = (PCLK1/4096)/131072 + \arg WWDGT_CFG_PSC_DIV262144: the time base of window watchdog counter = (PCLK1/4096)/262144 + \param[out] none + \retval none +*/ +void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler) +{ + /* configure WIN and PSC bits, configure CNT bit */ + WWDGT_CTL = (uint32_t)(CTL_CNT(counter)); + WWDGT_CFG = (uint32_t)(CFG_WIN(window) | prescaler); +} + +/*! + \brief check early wakeup interrupt state of WWDGT + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus wwdgt_flag_get(void) +{ + if(RESET != (WWDGT_STAT & WWDGT_STAT_EWIF)) { + return SET; + } + + return RESET; +} + +/*! + \brief clear early wakeup interrupt state of WWDGT + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_flag_clear(void) +{ + WWDGT_STAT = (uint32_t)(RESET); +} + +/*! + \brief enable early wakeup interrupt of WWDGT + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_interrupt_enable(void) +{ + WWDGT_CFG |= WWDGT_CFG_EWIE; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h new file mode 100644 index 00000000000..c531d51ae1a --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h @@ -0,0 +1,316 @@ +/*! + \file audio_core.h + \brief the header file of USB audio device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef AUDIO_CORE_H +#define AUDIO_CORE_H + +#include "usbd_enum.h" + +#define FORMAT_24BIT(x) (uint8_t)(x);(uint8_t)((x) >> 8);(uint8_t)((x) >> 16) + +/* number of sub-packets in the audio transfer buffer. you can modify this value but always make sure + that it is an even number and higher than 3 */ +#define OUT_PACKET_NUM 200U + +/* total size of the audio transfer buffer */ +#define OUT_BUF_MARGIN 0U +#define TOTAL_OUT_BUF_SIZE ((uint32_t)((SPEAKER_OUT_PACKET + OUT_BUF_MARGIN) * OUT_PACKET_NUM)) + +/* audio configuration descriptor length and interface descriptor size */ +#define AD_CONFIG_DESC_SET_LEN (sizeof(usb_desc_config_set)) +#define AD_INTERFACE_DESC_SIZE 9U + +/* audio standard endpoint and streaming endpoint descriptor size */ +#define USB_AD_DESC_SIZ 0x09U /*!< audio descriptor size */ +#define AD_STANDARD_EP_DESC_SIZE 0x09U /*!< audio standard endpoint descriptor size */ +#define AD_STREAMING_EP_DESC_SIZE 0x07U /*!< audio streaming endpoint descriptor size */ + +/* audio interface class code */ +#define USB_CLASS_AUDIO 0x01U + +/* audio interface subclass codes */ +#define AD_SUBCLASS_CONTROL 0x01U /*!< audio interface control */ +#define AD_SUBCLASS_AUDIOSTREAMING 0x02U /*!< audio interface audiostreaming */ +#define AD_SUBCLASS_MIDISTREAMING 0x03U /*!< audio interface midistreaming */ + +/* audio interface protocol codes */ +#define AD_PROTOCOL_UNDEFINED 0x00U /*!< audio interface undefined */ +#define AD_STREAMING_GENERAL 0x01U /*!< audio interface streaming general */ +#define AD_STREAMING_FORMAT_TYPE 0x02U /*!< audio interface streaming format type */ + +/* audio class-specific descriptor types */ +#define AD_DESCTYPE_UNDEFINED 0x20U /*!< audio class-specific descriptor undefined */ +#define AD_DESCTYPE_DEVICE 0x21U /*!< audio device descriptor */ +#define AD_DESCTYPE_CONFIGURATION 0x22U /*!< audio configuration descriptor */ +#define AD_DESCTYPE_STRING 0x23U /*!< audio string descriptor */ +#define AD_DESCTYPE_INTERFACE 0x24U /*!< audio interface descriptor */ +#define AD_DESCTYPE_ENDPOINT 0x25U /*!< audio endpoint descriptor */ + +/* audio control interface descriptor subtypes */ +#define AD_CONTROL_HEADER 0x01U /*!< audio control interface header descriptor */ +#define AD_CONTROL_INPUT_TERMINAL 0x02U /*!< audio control interface input terminal descriptor */ +#define AD_CONTROL_OUTPUT_TERMINAL 0x03U /*!< audio control interface output terminal descriptor */ +#define AD_CONTROL_MIXER_UNIT 0x04U /*!< audio control interface maximum unit descriptor */ +#define AD_CONTROL_SELECTOR_UNIT 0x05U /*!< audio control interface selector unit descriptor */ +#define AD_CONTROL_FEATURE_UNIT 0x06U /*!< audio control interface feature unit descriptor */ +#define AD_CONTROL_PROCESSING_UNIT 0x07U /*!< audio control interface processing unit descriptor */ +#define AD_CONTROL_EXTENSION_UNIT 0x08U /*!< audio control interface extension unit descriptor */ + +/* audio input/output terminal and streaming interface descriptor size */ +#define AD_INPUT_TERMINAL_DESC_SIZE 0x0CU /*!< audio input terminal interface descriptor size */ +#define AD_OUTPUT_TERMINAL_DESC_SIZE 0x09U /*!< audio output terminal interface descriptor size */ +#define AD_STREAMING_INTERFACE_DESC_SIZE 0x07U /*!< audio streaming interface descriptor size */ + +/* audio control types */ +#define AD_CONTROL_MUTE 0x01U /*!< audio control mute type */ +#define AD_CONTROL_VOLUME 0x02U /*!< audio control volume type */ + +/* audio format types */ +#define AD_FORMAT_TYPE_I 0x01U /*!< audio format typeI */ +#define AD_FORMAT_TYPE_III 0x03U /*!< audio format typeIII */ + +/* endpoint types */ +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01U /*!< audio isochronous endpoint type */ +#define AD_ENDPOINT_GENERAL 0x01U /*!< audio general endpoint type */ + +/* audio request types */ +#define AD_REQ_UNDEFINED 0x00U /*!< audio undefined request */ +#define AD_REQ_SET_CUR 0x01U /*!< current setting attribute request */ +#define AD_REQ_GET_CUR 0x81U /*!< current getting attribute request */ +#define AD_REQ_SET_MIN 0x02U /*!< setting minimum range attribute request */ +#define AD_REQ_GET_MIN 0x82U /*!< getting minimum range attribute request */ +#define AD_REQ_SET_MAX 0x03U /*!< setting maximum range attribute request */ +#define AD_REQ_GET_MAX 0x83U /*!< getting maximum range attribute request */ +#define AD_REQ_SET_RES 0x04U /*!< setting range attribute request */ +#define AD_REQ_GET_RES 0x84U /*!< getting range attribute request */ +#define AD_REQ_SET_MEM 0x05U /*!< setting memory attribute request */ +#define AD_REQ_GET_MEM 0x85U /*!< getting memory attribute request */ +#define AD_REQ_GET_STAT 0xFFU /*!< getting state request */ + +/* streaming control types */ +#define AD_OUT_STREAMING_CTRL 0x05U /*!< audio streaming control OUT */ +#define AD_IN_STREAMING_CTRL 0x02U /*!< audio streaming control IN */ + +/* audio stream interface number */ +enum { +#ifdef USE_USB_AD_MICPHONE + MIC_INTERFACE_COUNT, /*!< audio microphone interface count */ +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + SPEAK_INTERFACE_COUNT, /*!< audio speaker interface count */ +#endif /* USE_USB_AD_SPEAKER */ + CONFIG_DESC_AS_ITF_COUNT /*!< audio system interface count */ +}; + +/* audio interface descriptor total length */ +#define AC_ITF_TOTAL_LEN (sizeof(usb_desc_AC_itf) + CONFIG_DESC_AS_ITF_COUNT*(sizeof(usb_desc_input_terminal) + \ + sizeof(usb_desc_mono_feature_unit) + sizeof(usb_desc_output_terminal))) + +#pragma pack(1) + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< header descriptor subtype */ + uint16_t bcdADC; /*!< audio device class specification release number in binary-coded decimal */ + uint16_t wTotalLength; /*!< total number of bytes */ + uint8_t bInCollection; /*!< the number of the streaming interfaces */ +#ifdef USE_USB_AD_MICPHONE + uint8_t baInterfaceNr0; /*!< interface number of the streaming interfaces */ +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + uint8_t baInterfaceNr1; /*!< interface number of the streaming interfaces */ +#endif /* USE_USB_AD_SPEAKER */ +} usb_desc_AC_itf; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< general audio system descriptor subtype */ + uint8_t bTerminalLink; /*!< the terminal ID */ + uint8_t bDelay; /*!< delay introduced by the data path */ + uint16_t wFormatTag; /*!< the audio data format */ +} usb_desc_AS_itf; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< input terminal descriptor subtype. */ + uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ + uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ + uint8_t bAssocTerminal; /*!< ID of the output terminal */ + uint8_t bNrChannels; /*!< number of logical output channels */ + uint16_t wChannelConfig; /*!< describes the spatial location of the logical channels */ + uint8_t iChannelNames; /*!< index of a string descriptor */ + uint8_t iTerminal; /*!< index of a string descriptor */ +} usb_desc_input_terminal; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< output terminal descriptor subtype */ + uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ + uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ + uint8_t bAssocTerminal; /*!< constant, identifying the input terminal to which this output terminal is associated */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t iTerminal; /*!< index of a string descriptor */ +} usb_desc_output_terminal; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< feature unit descriptor subtype */ + uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ + uint8_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ + uint8_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ + uint8_t iFeature; /*!< index of a string descriptor */ +} usb_desc_mono_feature_unit; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< feature unit descriptor subtype */ + uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ + uint16_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ + uint16_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ + uint16_t bmaControls2; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 2 */ + uint8_t iFeature; /*!< index of a string descriptor */ +} usb_desc_stereo_feature_unit; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< format type descriptor subtype */ + uint8_t bFormatType; /*!< constant identifying the format type */ + uint8_t bNrChannels; /*!< indicates the number of physical channels in the audio data stream */ + uint8_t bSubFrameSize; /*!< the number of bytes occupied by one audio subframe */ + uint8_t bBitResolution; /*!< the number of effectively used bits from the available bits in an audio subframe */ + uint8_t bSamFreqType; /*!< indicates how the sampling frequency can be programmed */ + uint8_t bSamFreq[3]; /*!< sampling frequency ns in Hz for this isochronous data endpoint */ +} usb_desc_format_type; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bEndpointAddress; /*!< the address of the endpoint */ + uint8_t bmAttributes; /*!< transfer type and synchronization type */ + uint16_t wMaxPacketSize; /*!< maximum packet size this endpoint is capable of sending or receiving */ + uint8_t bInterval; /*!< left to the designer's discretion */ + uint8_t bRefresh; /*!< reset to 0 */ + uint8_t bSynchAddress; /*!< reset to 0 */ +} usb_desc_std_ep; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< general endpoint descriptor subtype */ + uint8_t bmAttributes; /*!< transfer type and synchronization type */ + uint8_t bLockDelayUnits; /*!< indicates the units used for the lock delay field */ + uint16_t wLockDelay; /*!< indicates the time it takes this endpoint to reliably lock its internal clock recovery circuitry */ +} usb_desc_AS_ep; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bEndpointAddress; /*!< general endpoint descriptor subtype */ + uint8_t bmAttributes; /*!< transfer type and synchronization type */ + uint16_t wMaxPacketSize; /*!< maximum packet size this endpoint is capable of sending or receiving */ + uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an interrupt or isochronous type */ + uint8_t Refresh; /*!< refresh 1~9, power of 2 */ + uint8_t bSynchAddress; /*!< synchronous address */ +} usb_desc_FeedBack_ep; + +#pragma pack() + +/* USB configuration descriptor structure */ +typedef struct { + usb_desc_config config; /*!< configuration descriptor */ + usb_desc_itf std_itf; /*!< interface descriptor */ + usb_desc_AC_itf ac_itf; /*!< audio controller interface descriptor */ + +#ifdef USE_USB_AD_MICPHONE + usb_desc_input_terminal mic_in_terminal; /*!< microphone input terminal descriptor */ + usb_desc_mono_feature_unit mic_feature_unit; /*!< microphone feature unit descriptor */ + usb_desc_output_terminal mic_out_terminal; /*!< microphone output terminal descriptor */ +#endif + +#ifdef USE_USB_AD_SPEAKER + usb_desc_input_terminal speak_in_terminal; /*!< speaker input terminal descriptor */ + usb_desc_mono_feature_unit speak_feature_unit; /*!< speaker feature unit descriptor */ + usb_desc_output_terminal speak_out_terminal; /*!< speaker output terminal descriptor */ +#endif /* USE_USB_AD_SPEAKER */ + +#ifdef USE_USB_AD_MICPHONE + usb_desc_itf mic_std_as_itf_zeroband; /*!< microphone zeroband configuration standard audio streaming interface descriptor */ + usb_desc_itf mic_std_as_itf_opera; /*!< microphone standard audio streaming interface descriptor */ + usb_desc_AS_itf mic_as_itf; /*!< microphone audio correlation descriptor */ + usb_desc_format_type mic_format_typeI; /*!< microphone typeI format type descriptor */ + usb_desc_std_ep mic_std_endpoint; /*!< microphone standard endpoint descriptor */ + usb_desc_AS_ep mic_as_endpoint; /*!< microphone audio dependent isochronous data endpoint descriptor */ +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + usb_desc_itf speak_std_as_itf_zeroband; /*!< speaker zeroband configuration standard audio streaming interface descriptor */ + usb_desc_itf speak_std_as_itf_opera; /*!< speaker standard audio streaming interface descriptor */ + usb_desc_AS_itf speak_as_itf; /*!< speaker audio correlation descriptor */ + usb_desc_format_type speak_format_typeI; /*!< speaker typeI format type descriptor */ + usb_desc_std_ep speak_std_endpoint; /*!< speaker standard endpoint descriptor */ + usb_desc_AS_ep speak_as_endpoint; /*!< speaker audio dependent isochronous data endpoint descriptor */ + usb_desc_FeedBack_ep speak_feedback_endpoint; /*!< speaker feedback endpoint descriptor */ +#endif /* USE_USB_AD_SPEAKER */ +} usb_desc_config_set; + +typedef struct { + /* main buffer for audio data OUT transfers and its relative pointers */ + uint8_t isoc_out_buff[TOTAL_OUT_BUF_SIZE]; /*!< audio isochronous OUT data buff */ + uint8_t* isoc_out_wrptr; /*!< audio isochronous OUT data write pointer */ + uint8_t* isoc_out_rdptr; /*!< audio isochronous OUT data read pointer */ + uint16_t buf_free_size; /*!< audio data buff free size */ + uint16_t dam_tx_len; /*!< audio amplifier transmit length */ + + __IO uint32_t actual_freq; /*!< audio actual frequency */ + __IO uint8_t play_flag; /*!< audio play flag */ + uint8_t feedback_freq[3]; /*!< audio feedback frequency */ + uint32_t cur_sam_freq; /*!< audio current sampling frequency */ + + /* USB receive buffer */ + uint8_t usb_rx_buffer[SPEAKER_OUT_MAX_PACKET]; + + /* main buffer for audio control requests transfers and its relative variables */ + uint8_t audioctl[64]; /*!< audio control requests transfers buff */ + uint8_t audioctl_unit; /*!< audio control requests unit */ + uint32_t audioctl_len; /*!< audio control requests length */ +} usbd_audio_handler; + +extern usb_desc audio_desc; +extern usb_class_core usbd_audio_cb; +extern usbd_audio_handler audio_handler; + +#endif /* AUDIO_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h new file mode 100644 index 00000000000..949cee91146 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h @@ -0,0 +1,48 @@ +/*! + \file audio_out_itf.h + \brief audio OUT (playback) interface header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef AUDIO_OUT_ITF_H +#define AUDIO_OUT_ITF_H + +#include "usbd_conf.h" + +typedef struct { + uint8_t (*audio_init)(uint32_t audio_freq, uint32_t volume); + uint8_t (*audio_deinit)(void); + uint8_t (*audio_cmd)(uint8_t* pbuf, uint32_t size, uint8_t cmd); +} audio_fops_struct; + +extern audio_fops_struct audio_out_fops; + +#endif /* AUDIO_OUT_ITF_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c new file mode 100644 index 00000000000..9c62646440b --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c @@ -0,0 +1,951 @@ +/*! + \file audio_core.c + \brief USB audio device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "audio_out_itf.h" +#include "audio_core.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x9574U + +#define VOL_MIN 0U /* volume minimum value */ +#define VOL_MAX 100U /* volume maximum value */ +#define VOL_RES 1U /* volume resolution */ +#define VOL_0dB 70U /* 0dB is in the middle of VOL_MIN and VOL_MAX */ + +#ifdef USE_USB_AD_MICPHONE +extern volatile uint32_t count_data; +extern const char wavetestdata[]; +#define LENGTH_DATA (1747U * 32U) +#endif /* USE_USB_AD_MICPHONE */ + +__ALIGN_BEGIN usbd_audio_handler audio_handler __ALIGN_END; + +/* local function prototypes ('static') */ +static uint8_t audio_init(usb_dev *udev, uint8_t config_index); +static uint8_t audio_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t audio_req_handler(usb_dev *udev, usb_req *req); +static uint8_t audio_set_intf(usb_dev *udev, usb_req *req); +static uint8_t audio_ctlx_out(usb_dev *udev); +static uint8_t audio_data_in(usb_dev *udev, uint8_t ep_num); +static uint8_t audio_data_out(usb_dev *udev, uint8_t ep_num); +static uint8_t audio_sof(usb_dev *udev); +static uint8_t audio_iso_in_incomplete(usb_dev *udev); +static uint8_t audio_iso_out_incomplete(usb_dev *udev); +static uint32_t usbd_audio_spk_get_feedback(usb_dev *udev); +static void get_feedback_fs_rate(uint32_t rate, uint8_t *buf); + +usb_class_core usbd_audio_cb = { + .init = audio_init, + .deinit = audio_deinit, + .req_proc = audio_req_handler, + .set_intf = audio_set_intf, + .ctlx_out = audio_ctlx_out, + .data_in = audio_data_in, + .data_out = audio_data_out, + .SOF = audio_sof, + .incomplete_isoc_in = audio_iso_in_incomplete, + .incomplete_isoc_out = audio_iso_out_incomplete +}; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev audio_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_desc_config_set audio_config_set __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = AD_CONFIG_DESC_SET_LEN, + .bNumInterfaces = 0x01U + CONFIG_DESC_AS_ITF_COUNT, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .std_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AD_SUBCLASS_CONTROL, + .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .ac_itf = + { + .header = + { + .bLength = sizeof(usb_desc_AC_itf), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = 0x01U, + .bcdADC = 0x0100U, + .wTotalLength = AC_ITF_TOTAL_LEN, + .bInCollection = CONFIG_DESC_AS_ITF_COUNT, +#ifdef USE_USB_AD_MICPHONE + .baInterfaceNr0 = 0x01U, +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + .baInterfaceNr1 = 0x02U +#endif /* USE_USB_AD_SPEAKER */ + }, + +#ifdef USE_USB_AD_MICPHONE + .mic_in_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_input_terminal), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = 0x02U, + .bTerminalID = 0x01U, + .wTerminalType = 0x0201U, + .bAssocTerminal = 0x00U, + .bNrChannels = 0x02U, + .wChannelConfig = 0x0003U, + .iChannelNames = 0x00U, + .iTerminal = 0x00U + }, + + .mic_feature_unit = + { + .header = + { + .bLength = sizeof(usb_desc_mono_feature_unit), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_CONTROL_FEATURE_UNIT, + .bUnitID = AD_IN_STREAMING_CTRL, + .bSourceID = 0x01U, + .bControlSize = 0x01U, + .bmaControls0 = AD_CONTROL_MUTE | AD_CONTROL_VOLUME, + .bmaControls1 = 0x00U, + .iFeature = 0x00U + }, + + .mic_out_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_output_terminal), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_CONTROL_OUTPUT_TERMINAL, + .bTerminalID = 0x03U, + .wTerminalType = 0x0101U, + .bAssocTerminal = 0x00U, + .bSourceID = 0x02U, + .iTerminal = 0x00U + }, +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + .speak_in_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_input_terminal), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_CONTROL_INPUT_TERMINAL, + .bTerminalID = 0x04U, + .wTerminalType = 0x0101U, + .bAssocTerminal = 0x00U, + .bNrChannels = 0x02U, + .wChannelConfig = 0x0003U, + .iChannelNames = 0x00U, + .iTerminal = 0x00U + }, + + .speak_feature_unit = + { + .header = + { + .bLength = sizeof(usb_desc_mono_feature_unit), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_CONTROL_FEATURE_UNIT, + .bUnitID = AD_OUT_STREAMING_CTRL, + .bSourceID = 0x04U, + .bControlSize = 0x01U, + .bmaControls0 = AD_CONTROL_MUTE | AD_CONTROL_VOLUME, + .bmaControls1 = 0x00U, + .iFeature = 0x00U + }, + + .speak_out_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_output_terminal), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_CONTROL_OUTPUT_TERMINAL, + .bTerminalID = 0x06U, + .wTerminalType = 0x0301U, + .bAssocTerminal = 0x00U, + .bSourceID = 0x05U, + .iTerminal = 0x00U + }, +#endif /* USE_USB_AD_SPEAKER */ + +#ifdef USE_USB_AD_MICPHONE + .mic_std_as_itf_zeroband = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .mic_std_as_itf_opera = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x01U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .mic_as_itf = + { + .header = + { + .bLength = sizeof(usb_desc_AS_itf), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_STREAMING_GENERAL, + .bTerminalLink = 0x03U, + .bDelay = 0x01U, + .wFormatTag = 0x0001U + }, + + .mic_format_typeI = + { + .header = + { + .bLength = sizeof(usb_desc_format_type), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_STREAMING_FORMAT_TYPE, + .bFormatType = AD_FORMAT_TYPE_I, + .bNrChannels = MIC_IN_CHANNEL_NBR, + .bSubFrameSize = 0x02U, + .bBitResolution = MIC_IN_BIT_RESOLUTION, + .bSamFreqType = 0x01U, + .bSamFreq[0] = (uint8_t)USBD_MIC_FREQ, + .bSamFreq[1] = USBD_MIC_FREQ >> 8, + .bSamFreq[2] = USBD_MIC_FREQ >> 16 + }, + + .mic_std_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_std_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = AD_IN_EP, + .bmAttributes = USB_ENDPOINT_TYPE_ISOCHRONOUS, + .wMaxPacketSize = MIC_IN_PACKET, + .bInterval = 0x01U, + .bRefresh = 0x00U, + .bSynchAddress = 0x00U + }, + + .mic_as_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_AS_ep), + .bDescriptorType = AD_DESCTYPE_ENDPOINT + }, + .bDescriptorSubtype = AD_ENDPOINT_GENERAL, + .bmAttributes = 0x00U, + .bLockDelayUnits = 0x00U, + .wLockDelay = 0x0000U + }, +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + .speak_std_as_itf_zeroband = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x02U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .speak_std_as_itf_opera = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x02U, + .bAlternateSetting = 0x01U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .speak_as_itf = + { + .header = + { + .bLength = sizeof(usb_desc_AS_itf), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_STREAMING_GENERAL, + .bTerminalLink = 0x04U, + .bDelay = 0x01U, + .wFormatTag = 0x0001U + }, + + .speak_format_typeI = + { + .header = + { + .bLength = sizeof(usb_desc_format_type), + .bDescriptorType = AD_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AD_STREAMING_FORMAT_TYPE, + .bFormatType = AD_FORMAT_TYPE_I, + .bNrChannels = SPEAKER_OUT_CHANNEL_NBR, + .bSubFrameSize = 0x02U, + .bBitResolution = SPEAKER_OUT_BIT_RESOLUTION, + .bSamFreqType = 0x01U, + .bSamFreq[0] = (uint8_t)USBD_SPEAKER_FREQ, + .bSamFreq[1] = USBD_SPEAKER_FREQ >> 8, + .bSamFreq[2] = USBD_SPEAKER_FREQ >> 16 + }, + + .speak_std_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_std_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = AD_OUT_EP, + .bmAttributes = USB_EP_ATTR_ISO | USB_EP_ATTR_ASYNC, + .wMaxPacketSize = SPEAKER_OUT_PACKET, + .bInterval = 0x01U, + .bRefresh = 0x00U, + .bSynchAddress = AD_FEEDBACK_IN_EP + }, + + .speak_as_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_AS_ep), + .bDescriptorType = AD_DESCTYPE_ENDPOINT + }, + .bDescriptorSubtype = AD_ENDPOINT_GENERAL, + .bmAttributes = 0x00U, + .bLockDelayUnits = 0x00U, + .wLockDelay = 0x0000U, + }, + + .speak_feedback_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_FeedBack_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = AD_FEEDBACK_IN_EP, + .bmAttributes = USB_EP_ATTR_ISO | USB_EP_ATTR_ASYNC | USB_EP_ATTR_FEEDBACK, + .wMaxPacketSize = FEEDBACK_IN_PACKET, + .bInterval = 0x01U, + .Refresh = FEEDBACK_IN_INTERVAL, /* refresh every 32(2^5) ms */ + .bSynchAddress = 0x00U + }, +#endif /* USE_USB_AD_SPEAKER */ +}; + +/* USB language ID descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(14U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'A', 'u', 'd', 'i', 'o'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB string descriptor */ +void *const usbd_audio_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +/* USB descriptor configure */ +usb_desc audio_desc = { + .dev_desc = (uint8_t *)&audio_dev_desc, + .config_desc = (uint8_t *)&audio_config_set, + .strings = usbd_audio_strings +}; + +/*! + \brief initialize the AUDIO device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_init(usb_dev *udev, uint8_t config_index) +{ + memset((void *)&audio_handler, 0U, sizeof(usbd_audio_handler)); + +#ifdef USE_USB_AD_MICPHONE + { + usb_desc_std_ep std_ep = audio_config_set.mic_std_endpoint; + + usb_desc_ep ep = { + .header = std_ep.header, + .bEndpointAddress = std_ep.bEndpointAddress, + .bmAttributes = std_ep.bmAttributes, + .wMaxPacketSize = std_ep.wMaxPacketSize, + .bInterval = std_ep.bInterval + }; + + /* initialize TX endpoint */ + usbd_ep_setup(udev, &ep); + } +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + { + audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + + usb_desc_std_ep std_ep = audio_config_set.speak_std_endpoint; + + usb_desc_ep ep1 = { + .header = std_ep.header, + .bEndpointAddress = std_ep.bEndpointAddress, + .bmAttributes = std_ep.bmAttributes, + .wMaxPacketSize = SPEAKER_OUT_MAX_PACKET, + .bInterval = std_ep.bInterval + }; + + /* initialize RX endpoint */ + usbd_ep_setup(udev, &ep1); + + /* prepare OUT endpoint to receive next audio packet */ + usbd_ep_recev(udev, AD_OUT_EP, audio_handler.usb_rx_buffer, SPEAKER_OUT_MAX_PACKET); + + /* initialize the audio output hardware layer */ + if(USBD_OK != audio_out_fops.audio_init(USBD_SPEAKER_FREQ, DEFAULT_VOLUME)) { + return USBD_FAIL; + } + + usb_desc_FeedBack_ep feedback_ep = audio_config_set.speak_feedback_endpoint; + + usb_desc_ep ep2 = { + .header = feedback_ep.header, + .bEndpointAddress = feedback_ep.bEndpointAddress, + .bmAttributes = feedback_ep.bmAttributes, + .wMaxPacketSize = feedback_ep.wMaxPacketSize, + .bInterval = feedback_ep.bInterval + }; + + /* initialize TX endpoint */ + usbd_ep_setup(udev, &ep2); + } +#endif /* USE_USB_AD_SPEAKER */ + + return USBD_OK; +} + +/*! + \brief de-initialize the AUDIO device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_deinit(usb_dev *udev, uint8_t config_index) +{ +#ifdef USE_USB_AD_MICPHONE + /* deinitialize AUDIO endpoints */ + usbd_ep_clear(udev, AD_IN_EP); +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + /* deinitialize AUDIO endpoints */ + usbd_ep_clear(udev, AD_OUT_EP); + + /* deinitialize the audio output hardware layer */ + if(USBD_OK != audio_out_fops.audio_deinit()) { + return USBD_FAIL; + } + + /* deinitialize AUDIO endpoints */ + usbd_ep_clear(udev, AD_FEEDBACK_IN_EP); +#endif /* USE_USB_AD_SPEAKER */ + + return USBD_OK; +} + +/*! + \brief handle the AUDIO class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_req_handler(usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + usb_transc *transc_in = &udev->dev.transc_in[0]; + usb_transc *transc_out = &udev->dev.transc_out[0]; + + switch(req->bRequest) { + case AD_REQ_GET_CUR: + transc_in->xfer_buf = audio_handler.audioctl; + transc_in->remain_len = req->wLength; + + status = REQ_SUPP; + break; + + case AD_REQ_SET_CUR: + if(req->wLength) { + transc_out->xfer_buf = audio_handler.audioctl; + transc_out->remain_len = req->wLength; + + udev->dev.class_core->command = AD_REQ_SET_CUR; + + audio_handler.audioctl_len = req->wLength; + audio_handler.audioctl_unit = BYTE_HIGH(req->wIndex); + + status = REQ_SUPP; + } + break; + + case AD_REQ_GET_MIN: + *((uint16_t *)audio_handler.audioctl) = VOL_MIN; + transc_in->xfer_buf = audio_handler.audioctl; + transc_in->remain_len = req->wLength; + status = REQ_SUPP; + break; + + case AD_REQ_GET_MAX: + *((uint16_t *)audio_handler.audioctl) = VOL_MAX; + transc_in->xfer_buf = audio_handler.audioctl; + transc_in->remain_len = req->wLength; + status = REQ_SUPP; + break; + + case AD_REQ_GET_RES: + *((uint16_t *)audio_handler.audioctl) = VOL_RES; + transc_in->xfer_buf = audio_handler.audioctl; + transc_in->remain_len = req->wLength; + status = REQ_SUPP; + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle the AUDIO set interface requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_set_intf(usb_dev *udev, usb_req *req) +{ + udev->dev.class_core->alter_set = req->wValue; + + if(0xFFU != req->wValue) { + if(0U != req->wValue) { + /* deinit audio handler */ + memset((void *)&audio_handler, 0U, sizeof(usbd_audio_handler)); + + audio_handler.play_flag = 0U; + audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + + /* feedback calculate sample frequency */ + audio_handler.actual_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ); + get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); + + /* send feedback data of estimated frequency */ + usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); + } else { + /* stop audio output */ + audio_out_fops.audio_cmd(audio_handler.isoc_out_rdptr, SPEAKER_OUT_PACKET / 2U, AD_CMD_STOP); + + audio_handler.play_flag = 0U; + audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + + usbd_fifo_flush(udev, AD_IN_EP); + usbd_fifo_flush(udev, AD_FEEDBACK_IN_EP); + usbd_fifo_flush(udev, AD_OUT_EP); + } + } + + return 0U; +} + +/*! + \brief handles the control transfer OUT callback + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_ctlx_out(usb_dev *udev) +{ +#ifdef USE_USB_AD_SPEAKER + /* handles audio control requests data */ + /* check if an audio_control request has been issued */ + if(AD_REQ_SET_CUR == udev->dev.class_core->command) { + /* in this driver, to simplify code, only SET_CUR request is managed */ + + /* check for which addressed unit the audio_control request has been issued */ + if(AD_OUT_STREAMING_CTRL == audio_handler.audioctl_unit) { + /* in this driver, to simplify code, only one unit is manage */ + + /* reset the audioctl_cmd variable to prevent re-entering this function */ + udev->dev.class_core->command = 0U; + + audio_handler.audioctl_len = 0U; + } + } +#endif /* USE_USB_AD_SPEAKER */ + + return USBD_OK; +} + +/*! + \brief handles the audio IN data stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_data_in(usb_dev *udev, uint8_t ep_num) +{ +#ifdef USE_USB_AD_MICPHONE + if(EP_ID(AD_IN_EP) == ep_num) { + if(count_data < LENGTH_DATA) { + /* Prepare next buffer to be sent: dummy data */ + usbd_ep_send(udev, AD_IN_EP, (uint8_t *)&wavetestdata[count_data], MIC_IN_PACKET); + count_data += MIC_IN_PACKET; + } else { + usbd_ep_send(udev, AD_IN_EP, (uint8_t *)wavetestdata, MIC_IN_PACKET); + count_data = MIC_IN_PACKET; + } + } +#endif /* USE_USB_AD_MICPHONE */ + +#ifdef USE_USB_AD_SPEAKER + if(EP_ID(AD_FEEDBACK_IN_EP) == ep_num) { + /* calculate feedback actual freq */ + audio_handler.actual_freq = usbd_audio_spk_get_feedback(udev); + get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); + + usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); + } +#endif /* USE_USB_AD_SPEAKER */ + + return USBD_OK; +} + +/*! + \brief handles the audio OUT data stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_data_out(usb_dev *udev, uint8_t ep_num) +{ + uint16_t usb_rx_length, tail_len; + + /* get receive length */ + usb_rx_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count; + + if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { + audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } else { + audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } + + /* free buffer enough to save RX data */ + if(audio_handler.buf_free_size > usb_rx_length) { + if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { + tail_len = audio_handler.isoc_out_buff + TOTAL_OUT_BUF_SIZE - audio_handler.isoc_out_wrptr; + + if(tail_len >= usb_rx_length) { + memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, usb_rx_length); + + /* increment the buffer pointer */ + audio_handler.isoc_out_wrptr += usb_rx_length; + + /* increment the Buffer pointer or roll it back when all buffers are full */ + if(audio_handler.isoc_out_wrptr >= (audio_handler.isoc_out_buff + TOTAL_OUT_BUF_SIZE)) { + /* all buffers are full: roll back */ + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + } + } else { + memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, tail_len); + /* adjust write pointer */ + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + + memcpy(audio_handler.isoc_out_wrptr, &audio_handler.usb_rx_buffer[tail_len], usb_rx_length - tail_len); + /* adjust write pointer */ + audio_handler.isoc_out_wrptr += usb_rx_length - tail_len; + } + } else { + memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, usb_rx_length); + + /* increment the buffer pointer */ + audio_handler.isoc_out_wrptr += usb_rx_length; + } + } + + /* toggle the frame index */ + udev->dev.transc_out[ep_num].frame_num = (udev->dev.transc_out[ep_num].frame_num) ? 0U : 1U; + + /* prepare OUT endpoint to receive next audio packet */ + usbd_ep_recev(udev, AD_OUT_EP, audio_handler.usb_rx_buffer, SPEAKER_OUT_MAX_PACKET); + + if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { + audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } else { + audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } + + if((0U == audio_handler.play_flag) && (audio_handler.buf_free_size < TOTAL_OUT_BUF_SIZE / 2U)) { + /* enable start of streaming */ + audio_handler.play_flag = 1U; + + /* initialize the audio output hardware layer */ + if(USBD_OK != audio_out_fops.audio_cmd(audio_handler.isoc_out_rdptr, SPEAKER_OUT_MAX_PACKET / 2U, AD_CMD_PLAY)) { + return USBD_FAIL; + } + + audio_handler.dam_tx_len = SPEAKER_OUT_MAX_PACKET; + } + + return USBD_OK; +} + +/*! + \brief handles the SOF event (data buffer update and synchronization) + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_sof(usb_dev *udev) +{ + return USBD_OK; +} + +/*! + \brief handles the audio ISO IN Incomplete event + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_iso_in_incomplete(usb_dev *udev) +{ + (void)usb_txfifo_flush(&udev->regs, EP_ID(AD_FEEDBACK_IN_EP)); + + audio_handler.actual_freq = usbd_audio_spk_get_feedback(udev); + get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); + + /* send feedback data of estimated frequency */ + usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); + + return USBD_OK; +} + +/*! + \brief handles the audio ISO OUT Incomplete event + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_iso_out_incomplete(usb_dev *udev) +{ + return USBD_OK; +} + +/*! + \brief calculate feedback sample frequency + \param[in] udev: pointer to USB device instance + \param[out] none + \retval feedback frequency value +*/ +static uint32_t usbd_audio_spk_get_feedback(usb_dev *udev) +{ + static uint32_t fb_freq; + + /* calculate buffer free size */ + if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { + audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } else { + audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; + } + + /* calculate feedback frequency */ + if(audio_handler.buf_free_size <= (TOTAL_OUT_BUF_SIZE / 4U)) { + fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ) - FEEDBACK_FREQ_OFFSET; + } else if(audio_handler.buf_free_size >= (TOTAL_OUT_BUF_SIZE * 3U / 4U)) { + fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ) + FEEDBACK_FREQ_OFFSET; + } else { + fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ); + } + + return fb_freq; +} + +/*! + \brief get feedback value from rate in USB full speed + \param[in] rate: sample frequency + \param[in] buf: pointer to result buffer + \param[out] none + \retval none +*/ +static void get_feedback_fs_rate(uint32_t rate, uint8_t *buf) +{ + rate = ((rate / 1000U) << 14) | ((rate % 1000U) << 4); + + buf[0] = rate; + buf[1] = rate >> 8; + buf[2] = rate >> 16; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c new file mode 100644 index 00000000000..1eda0cb68fc --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c @@ -0,0 +1,167 @@ +/*! + \file audio_out_itf.c + \brief audio OUT (playback) interface functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "audio_core.h" +#include "audio_out_itf.h" + +/* local function prototypes ('static') */ +static uint8_t init(uint32_t audio_freq, uint32_t volume); +static uint8_t deinit(void); +static uint8_t audio_cmd(uint8_t *pbuf, uint32_t size, uint8_t cmd); + +/* local variable defines */ +static uint8_t audio_state = AD_STATE_INACTIVE; + +audio_fops_struct audio_out_fops = { + .audio_init = init, + .audio_deinit = deinit, + .audio_cmd = audio_cmd +}; + +/*! + \brief initialize and configures all required resources + \param[in] audio_freq: statrt_up audio frequency + \param[in] volume: start_up volume to be set + \param[out] none + \retval AD_OK if all operations succeed, otherwise, AD_FAIL. +*/ +static uint8_t init(uint32_t audio_freq, uint32_t volume) +{ + static uint32_t initialized = 0U; + + /* check if the low layer has already been initialized */ + if(0U == initialized) { + /* initialize GPIO */ + codec_gpio_init(); + + /* initialize I2S */ + codec_audio_interface_init(audio_freq); + + /* initialize DMA */ + codec_i2s_dma_init(); + + /* prevent reinitializing the interface again */ + initialized = 1U; + } + + /* update the audio state machine */ + audio_state = AD_STATE_ACTIVE; + + return AD_OK; +} + +/*! + \brief free all resources used by low layer and stops audio-play function + \param[in] none + \param[out] none + \retval AD_OK if all operations succeed, otherwise, AD_FAIL. +*/ +static uint8_t deinit(void) +{ + /* update the audio state machine */ + audio_state = AD_STATE_INACTIVE; + + return AD_OK; +} + +/*! + \brief play, stop, pause or resume current file + \param[in] pbuf: address from which file should be played + \param[in] size: size of the current buffer/file + \param[in] cmd: command to be executed, can be: + \arg AD_CMD_PLAY + \arg AD_CMD_PAUSE + \arg AD_CMD_RESUME + \arg AD_CMD_STOP + \param[out] none + \retval AD_OK if all operations succeed, otherwise, AD_FAIL. +*/ +static uint8_t audio_cmd(uint8_t *pbuf, uint32_t size, uint8_t cmd) +{ + /* check the current state */ + if((AD_STATE_INACTIVE == audio_state) || (AD_STATE_ERROR == audio_state)) { + audio_state = AD_STATE_ERROR; + + return AD_FAIL; + } + + switch(cmd) { + /* process the play command */ + case AD_CMD_PLAY: + /* if current state is active or stopped */ + if((AD_STATE_ACTIVE == audio_state) || \ + (AD_STATE_STOPPED == audio_state) || \ + (AD_STATE_PLAYING == audio_state)) { + audio_play((uint32_t)pbuf, size); + audio_state = AD_STATE_PLAYING; + + return AD_OK; + } else if(AD_STATE_PAUSED == audio_state) { + audio_pause_resume(AD_RESUME, (uint32_t)pbuf, (size / 2U)); + audio_state = AD_STATE_PLAYING; + + return AD_OK; + } else { + return AD_FAIL; + } + + /* process the stop command */ + case AD_CMD_STOP: + if(AD_STATE_PLAYING != audio_state) { + /* unsupported command */ + return AD_FAIL; + } else { + audio_stop(); + audio_state = AD_STATE_STOPPED; + + return AD_OK; + } + + /* process the pause command */ + case AD_CMD_PAUSE: + if(AD_STATE_PLAYING != audio_state) { + /* unsupported command */ + return AD_FAIL; + } else { + audio_pause_resume(AD_PAUSE, (uint32_t)pbuf, (size / 2U)); + audio_state = AD_STATE_PAUSED; + + return AD_OK; + } + + /* unsupported command */ + default: + return AD_FAIL; + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h new file mode 100644 index 00000000000..741938e1f98 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h @@ -0,0 +1,65 @@ +/*! + \file cdc_acm_core.h + \brief the header file of cdc acm driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef CDC_ACM_CORE_H +#define CDC_ACM_CORE_H + +#include "usbd_enum.h" +#include "usb_cdc.h" + +#define USB_CDC_RX_LEN USB_CDC_DATA_PACKET_SIZE /*< CDC data packet size */ + +typedef struct { + uint8_t data[USB_CDC_RX_LEN]; /*< CDC data transfer buff */ + uint8_t cmd[USB_CDC_CMD_PACKET_SIZE]; /*< CDC cmd packet buff */ + + uint8_t packet_sent; /*< CDC data packet start send flag */ + uint8_t packet_receive; /*< CDC data packet start receive flag */ + uint32_t receive_length; /*< CDC data receive length */ + + acm_line line_coding; /*< CDC line coding structure */ +} usb_cdc_handler; + +extern usb_desc cdc_desc; +extern usb_class_core cdc_class; + +/* function declarations */ +/* check CDC ACM is ready for data transfer */ +uint8_t cdc_acm_check_ready(usb_dev *udev); +/* send CDC ACM data */ +void cdc_acm_data_send(usb_dev *udev); +/* receive CDC ACM data */ +void cdc_acm_data_receive(usb_dev *udev); + +#endif /* CDC_ACM_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c new file mode 100644 index 00000000000..bbf9c410178 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c @@ -0,0 +1,520 @@ +/*! + \file cdc_acm_core.c + \brief CDC ACM driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "cdc_acm_core.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x018AU + +/* note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev cdc_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = USB_CLASS_CDC, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_cdc_desc_config_set cdc_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_CDC_ACM_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x02U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .cmd_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_CLASS_CDC, + .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, + .bInterfaceProtocol = USB_CDC_PROTOCOL_AT, + .iInterface = 0x00U + }, + + .cdc_header = + { + .header = + { + .bLength = sizeof(usb_desc_header_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x00U, + .bcdCDC = 0x0110U + }, + + .cdc_call_managment = + { + .header = + { + .bLength = sizeof(usb_desc_call_managment_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x01U, + .bmCapabilities = 0x00U, + .bDataInterface = 0x01U + }, + + .cdc_acm = + { + .header = + { + .bLength = sizeof(usb_desc_acm_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x02U, + .bmCapabilities = 0x02U + }, + + .cdc_union = + { + .header = + { + .bLength = sizeof(usb_desc_union_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x06U, + .bMasterInterface = 0x00U, + .bSlaveInterface0 = 0x01U + }, + + .cdc_cmd_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_CMD_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = USB_CDC_CMD_PACKET_SIZE, + .bInterval = 0x0AU + }, + + .cdc_data_interface = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_DATA, + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = USB_CDC_PROTOCOL_NONE, + .iInterface = 0x00U + }, + + .cdc_out_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_DATA_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = USB_CDC_DATA_PACKET_SIZE, + .bInterval = 0x00U + }, + + .cdc_in_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_DATA_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = USB_CDC_DATA_PACKET_SIZE, + .bInterval = 0x00U + } +}; + +/* USB language ID Descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'C', 'D', 'C', '_', 'A', 'C', 'M'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB string descriptor set */ +void *const usbd_cdc_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc cdc_desc = { + .dev_desc = (uint8_t *)&cdc_dev_desc, + .config_desc = (uint8_t *)&cdc_config_desc, + .strings = usbd_cdc_strings +}; + +/* local function prototypes ('static') */ +static uint8_t cdc_acm_init(usb_dev *udev, uint8_t config_index); +static uint8_t cdc_acm_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t cdc_acm_req(usb_dev *udev, usb_req *req); +static uint8_t cdc_acm_ctlx_out(usb_dev *udev); +static uint8_t cdc_acm_in(usb_dev *udev, uint8_t ep_num); +static uint8_t cdc_acm_out(usb_dev *udev, uint8_t ep_num); + +/* USB CDC device class callbacks structure */ +usb_class_core cdc_class = { + .command = NO_CMD, + .alter_set = 0U, + + .init = cdc_acm_init, + .deinit = cdc_acm_deinit, + .req_proc = cdc_acm_req, + .ctlx_out = cdc_acm_ctlx_out, + .data_in = cdc_acm_in, + .data_out = cdc_acm_out +}; + +/*! + \brief check CDC ACM is ready for data transfer + \param[in] udev: pointer to USB device instance + \param[out] none + \retval 0 if CDC is ready, else 1 +*/ +uint8_t cdc_acm_check_ready(usb_dev *udev) +{ + if(NULL != udev->dev.class_data[CDC_COM_INTERFACE]) { + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + if((1U == cdc->packet_receive) && (1U == cdc->packet_sent)) { + return 0U; + } + } + + return 1U; +} + +/*! + \brief send CDC ACM data + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void cdc_acm_data_send(usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + if(0U != cdc->receive_length) { + cdc->packet_sent = 0U; + + usbd_ep_send(udev, CDC_DATA_IN_EP, (uint8_t *)(cdc->data), cdc->receive_length); + + cdc->receive_length = 0U; + } +} + +/*! + \brief receive CDC ACM data + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void cdc_acm_data_receive(usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + cdc->packet_receive = 0U; + cdc->packet_sent = 0U; + + usbd_ep_recev(udev, CDC_DATA_OUT_EP, (uint8_t *)(cdc->data), USB_CDC_DATA_PACKET_SIZE); +} + +/*! + \brief initialize the CDC ACM device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN usb_cdc_handler cdc_handler __ALIGN_END; + + /* initialize the data TX endpoint */ + usbd_ep_setup(udev, &(cdc_config_desc.cdc_in_endpoint)); + + /* initialize the data RX endpoint */ + usbd_ep_setup(udev, &(cdc_config_desc.cdc_out_endpoint)); + + /* initialize the command TX endpoint */ + usbd_ep_setup(udev, &(cdc_config_desc.cdc_cmd_endpoint)); + + /* initialize CDC handler structure */ + cdc_handler.packet_receive = 1U; + cdc_handler.packet_sent = 1U; + cdc_handler.receive_length = 0U; + + cdc_handler.line_coding = (acm_line) { + .dwDTERate = 115200U, + .bCharFormat = 0U, + .bParityType = 0U, + .bDataBits = 0x08U + }; + + udev->dev.class_data[CDC_COM_INTERFACE] = (void *)&cdc_handler; + + return USBD_OK; +} + +/*! + \brief deinitialize the CDC ACM device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_deinit(usb_dev *udev, uint8_t config_index) +{ + /* deinitialize the data TX/RX endpoint */ + usbd_ep_clear(udev, CDC_DATA_IN_EP); + usbd_ep_clear(udev, CDC_DATA_OUT_EP); + + /* deinitialize the command TX endpoint */ + usbd_ep_clear(udev, CDC_CMD_EP); + + return USBD_OK; +} + +/*! + \brief handle the CDC ACM class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_req(usb_dev *udev, usb_req *req) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + usb_transc *transc = NULL; + + switch(req->bRequest) { + case SEND_ENCAPSULATED_COMMAND: + /* no operation for this driver */ + break; + + case GET_ENCAPSULATED_RESPONSE: + /* no operation for this driver */ + break; + + case SET_COMM_FEATURE: + /* no operation for this driver */ + break; + + case GET_COMM_FEATURE: + /* no operation for this driver */ + break; + + case CLEAR_COMM_FEATURE: + /* no operation for this driver */ + break; + + case SET_LINE_CODING: + transc = &udev->dev.transc_out[0]; + + /* set the value of the current command to be processed */ + udev->dev.class_core->alter_set = req->bRequest; + + /* enable EP0 prepare to receive command data packet */ + transc->remain_len = req->wLength; + transc->xfer_buf = cdc->cmd; + break; + + case GET_LINE_CODING: + transc = &udev->dev.transc_in[0]; + + cdc->cmd[0] = (uint8_t)(cdc->line_coding.dwDTERate); + cdc->cmd[1] = (uint8_t)(cdc->line_coding.dwDTERate >> 8); + cdc->cmd[2] = (uint8_t)(cdc->line_coding.dwDTERate >> 16); + cdc->cmd[3] = (uint8_t)(cdc->line_coding.dwDTERate >> 24); + cdc->cmd[4] = cdc->line_coding.bCharFormat; + cdc->cmd[5] = cdc->line_coding.bParityType; + cdc->cmd[6] = cdc->line_coding.bDataBits; + + transc->xfer_buf = cdc->cmd; + transc->remain_len = 7U; + break; + + case SET_CONTROL_LINE_STATE: + /* no operation for this driver */ + break; + + case SEND_BREAK: + /* no operation for this driver */ + break; + + default: + break; + } + + return USBD_OK; +} + +/*! + \brief command data received on control endpoint + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_ctlx_out(usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + if(NO_CMD != udev->dev.class_core->alter_set) { + /* process the command data */ + cdc->line_coding.dwDTERate = (uint32_t)((uint32_t)cdc->cmd[0] | \ + ((uint32_t)cdc->cmd[1] << 8) | \ + ((uint32_t)cdc->cmd[2] << 16) | \ + ((uint32_t)cdc->cmd[3] << 24)); + + cdc->line_coding.bCharFormat = cdc->cmd[4]; + cdc->line_coding.bParityType = cdc->cmd[5]; + cdc->line_coding.bDataBits = cdc->cmd[6]; + + udev->dev.class_core->alter_set = NO_CMD; + } + + return USBD_OK; +} + +/*! + \brief handle CDC ACM data IN stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_in(usb_dev *udev, uint8_t ep_num) +{ + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_num)]; + + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + if((0U == transc->xfer_len % transc->max_len) && (0U != transc->xfer_len)) { + usbd_ep_send(udev, ep_num, NULL, 0U); + } else { + cdc->packet_sent = 1U; + } + + return USBD_OK; +} + +/*! + \brief handle CDC ACM data OUT stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_out(usb_dev *udev, uint8_t ep_num) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; + + cdc->packet_receive = 1U; + cdc->receive_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count; + + return USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h new file mode 100644 index 00000000000..62819092194 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h @@ -0,0 +1,173 @@ +/*! + \file dfu_core.h + \brief the header file of USB DFU device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DFU_CORE_H +#define DFU_CORE_H + +#include "usbd_enum.h" + +/* DFU class code */ +#define USB_DFU_CLASS 0xFEU + +/* DFU subclass code */ +#define USB_DFU_SUBCLASS_UPGRADE 0x01U + +/* DFU protocol code */ +#define USB_DFU_PROTOCL_RUNTIME 0x01U /*!< runtime interface protocol */ +#define USB_DFU_PROTOCL_DFU 0x02U /*!< DFU interface protocol */ + +/* manifestation state */ +#define MANIFEST_COMPLETE 0x00U /*!< manifest complete state */ +#define MANIFEST_IN_PROGRESS 0x01U /*!< manifest in progress state */ + +/* DFU attributes code */ +#define USB_DFU_CAN_DOWNLOAD 0x01U /*!< download attribute */ +#define USB_DFU_CAN_UPLOAD 0x02U /*!< upload attribute */ +#define USB_DFU_MANIFEST_TOLERANT 0x04U /*!< manifest tolerant attribute */ +#define USB_DFU_WILL_DETACH 0x08U /*!< detach attribute */ + +/* special commands with download request */ +#define GET_COMMANDS 0x00U /*!< get command request */ +#define SET_ADDRESS_POINTER 0x21U /*!< set address pointer request */ +#define ERASE 0x41U /*!< erase request */ + +/* memory operation command */ +#define CMD_ERASE 0U /*!< erase command */ +#define CMD_WRITE 1U /*!< write command */ + +#define _BYTE1(x) (uint8_t)((x) & 0xFFU) /*!< addressing cycle 1st byte */ +#define _BYTE2(x) (uint8_t)(((x) & 0xFF00U) >> 8) /*!< addressing cycle 2nd byte */ +#define _BYTE3(x) (uint8_t)(((x) & 0xFF0000U) >> 16) /*!< addressing cycle 3rd byte */ + +#define FLASH_ERASE_TIMEOUT 60U /*!< erase flash timeout */ +#define FLASH_WRITE_TIMEOUT 80U /*!< write flash timeout */ + +/* bit detach capable = bit 3 in bmAttributes field */ +#define DFU_DETACH_MASK (uint8_t)(0x10U) + +/* DFU descriptor type code */ +#define DFU_DESC_TYPE 0x21U + +/* DFU device state defines */ +typedef enum { + STATE_APP_IDLE = 0x00U, /*!< DFU APP idle state */ + STATE_APP_DETACH, /*!< DFU APP detach state */ + STATE_DFU_IDLE, /*!< idle state */ + STATE_DFU_DNLOAD_SYNC, /*!< download synchronous state */ + STATE_DFU_DNBUSY, /*!< download busy state */ + STATE_DFU_DNLOAD_IDLE, /*!< download idle state */ + STATE_DFU_MANIFEST_SYNC, /*!< manifest synchronous state */ + STATE_DFU_MANIFEST, /*!< manifest state */ + STATE_DFU_MANIFEST_WAIT_RESET, /*!< manifest wait reset state */ + STATE_DFU_UPLOAD_IDLE, /*!< upload idle state */ + STATE_DFU_ERROR /*!< DFU error state */ +} dfu_state; + +/* DFU device status defines */ +typedef enum { + STATUS_OK = 0x00U, /*!< no error status */ + STATUS_ERR_TARGET, /*!< trigger error status */ + STATUS_ERR_FILE, /*!< file error status */ + STATUS_ERR_WRITE, /*!< write error status */ + STATUS_ERR_ERASE, /*!< erase error status */ + STATUS_ERR_CHECK_ERASED, /*!< check erased error status */ + STATUS_ERR_PROG, /*!< program error status */ + STATUS_ERR_VERIFY, /*!< verify error status */ + STATUS_ERR_ADDRESS, /*!< address error status */ + STATUS_ERR_NOTDONE, /*!< not done error status */ + STATUS_ERR_FIRMWARE, /*!< firmware error status */ + STATUS_ERR_VENDOR, /*!< vendor error status */ + STATUS_ERR_USBR, /*!< USB reset error status */ + STATUS_ERR_POR, /*!< power error status */ + STATUS_ERR_UNKNOWN, /*!< unknown error status */ + STATUS_ERR_STALLEDPKT /*!< stalled pocket error status */ +} dfu_status; + +/* DFU class-specific requests */ +typedef enum { + DFU_DETACH = 0U, /*!< detach request */ + DFU_DNLOAD, /*!< download request */ + DFU_UPLOAD, /*!< upload request */ + DFU_GETSTATUS, /*!< get status request */ + DFU_CLRSTATUS, /*!< clear status request */ + DFU_GETSTATE, /*!< get state request */ + DFU_ABORT, /*!< abort request */ + DFU_REQ_MAX /*!< maximum request */ +} dfu_requests; + +#pragma pack(1) + +/* USB DFU function descriptor structure */ +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bmAttributes; /*!< DFU attributes */ + uint16_t wDetachTimeOut; /*!< time, in milliseconds, that the device will wait after receipt of the DFU_DETACH request. */ + uint16_t wTransferSize; /*!< maximum number of bytes that the device can accept per control-write transaction */ + uint16_t bcdDFUVersion; /*!< numeric expression identifying the version of the DFU Specification release. */ +} usb_desc_dfu_func; + +#pragma pack() + +/* USB configuration descriptor structure */ +typedef struct { + usb_desc_config config; /*!< configuration descriptor */ + usb_desc_itf dfu_itf0; /*!< DFU interface 0 descriptor */ + usb_desc_itf dfu_itf1; /*!< DFU interface 1 descriptor */ + usb_desc_itf dfu_itf2; /*!< DFU interface 2 descriptor */ + usb_desc_dfu_func dfu_func; /*!< DFU function descriptor */ +} usb_dfu_desc_config_set; + +/* USB DFU handler structure */ +typedef struct { + uint8_t bStatus; /*!< DFU device current status */ + uint8_t bwPollTimeout0; /*!< DFU device polling timeout 0 */ + uint8_t bwPollTimeout1; /*!< DFU device polling timeout 1 */ + uint8_t bwPollTimeout2; /*!< DFU device polling timeout 2 */ + uint8_t bState; /*!< DFU device current state */ + uint8_t iString; /*!< DFU device string */ + + uint8_t manifest_state; /*!< DFU device current manifest state */ + uint32_t data_len; /*!< DFU device data transfer length */ + uint16_t block_num; /*!< memory block number */ + uint32_t base_addr; /*!< memory base address */ + + uint8_t buf[TRANSFER_SIZE]; /*!< data transfer buff */ +} usbd_dfu_handler; + +typedef void (*app_func)(void); + +extern usb_desc dfu_desc; +extern usb_class_core dfu_class; + +#endif /* DFU_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h new file mode 100644 index 00000000000..d0c651a43ac --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h @@ -0,0 +1,82 @@ +/*! + \file dfu_mem.h + \brief USB DFU device media access layer header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DFU_MEM_H +#define DFU_MEM_H + +#include "usb_conf.h" + +#define _1ST_BYTE(x) (uint8_t)((x) & 0xFFU) /*!< addressing cycle 1st byte */ +#define _2ND_BYTE(x) (uint8_t)(((x) & 0xFF00U) >> 8) /*!< addressing cycle 2nd byte */ +#define _3RD_BYTE(x) (uint8_t)(((x) & 0xFF0000U) >> 16) /*!< addressing cycle 3rd byte */ + +#define POLLING_TIMEOUT_SET(x) buffer[0] = _1ST_BYTE(x); \ + buffer[1] = _2ND_BYTE(x); \ + buffer[2] = _3RD_BYTE(x); + +/* USB DFU property structure */ +typedef struct _dfu_mem_prop { + const uint8_t *pstr_desc; /*!< pointer to the string descriptor */ + + uint8_t (*mem_init)(void); + uint8_t (*mem_deinit)(void); + uint8_t (*mem_erase)(uint32_t addr); + uint8_t (*mem_write)(uint8_t *buf, uint32_t addr, uint32_t len); + uint8_t *(*mem_read)(uint8_t *buf, uint32_t addr, uint32_t len); + uint8_t (*mem_checkaddr)(uint32_t addr); + + const uint32_t erase_timeout; /*!< erase memory timeout */ + const uint32_t write_timeout; /*!< write memory timeout */ +} dfu_mem_prop; + +typedef enum { + MEM_OK = 0U, /*!< memory operation succeed */ + MEM_FAIL /*!< memory operation fail */ +} mem_status; + +/* function declarations */ +/* initialize the memory media */ +uint8_t dfu_mem_init(void); +/* deinitialize the memory media */ +uint8_t dfu_mem_deinit(void); +/* erase a memory sector */ +uint8_t dfu_mem_erase(uint32_t addr); +/* write data to sectors of memory */ +uint8_t dfu_mem_write(uint8_t *buf, uint32_t addr, uint32_t len); +/* read data from sectors of memory */ +uint8_t *dfu_mem_read(uint8_t *buf, uint32_t addr, uint32_t len); +/* get the status of a given memory and store in buffer */ +uint8_t dfu_mem_getstatus(uint32_t addr, uint8_t cmd, uint8_t *buffer); + +#endif /* DFU_MEM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c new file mode 100644 index 00000000000..40d1e7cb75d --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c @@ -0,0 +1,721 @@ +/*! + \file dfu_core.c + \brief USB DFU device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "dfu_core.h" +#include "dfu_mem.h" +#include "drv_usb_hw.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x0189U + +/* local function prototypes ('static') */ +static uint8_t dfu_init(usb_dev *udev, uint8_t config_index); +static uint8_t dfu_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t dfu_req_handler(usb_dev *udev, usb_req *req); +static uint8_t dfu_ctlx_in(usb_dev *udev); + +static void dfu_mode_leave(usb_dev *udev); +static uint8_t dfu_getstatus_complete(usb_dev *udev); + +/* DFU requests management functions */ +static void dfu_detach(usb_dev *udev, usb_req *req); +static void dfu_dnload(usb_dev *udev, usb_req *req); +static void dfu_upload(usb_dev *udev, usb_req *req); +static void dfu_getstatus(usb_dev *udev, usb_req *req); +static void dfu_clrstatus(usb_dev *udev, usb_req *req); +static void dfu_getstate(usb_dev *udev, usb_req *req); +static void dfu_abort(usb_dev *udev, usb_req *req); + +static void string_to_unicode(uint8_t *str, uint16_t *pbuf); + +static void (*dfu_request_process[])(usb_dev *udev, usb_req *req) = { + [DFU_DETACH] = dfu_detach, + [DFU_DNLOAD] = dfu_dnload, + [DFU_UPLOAD] = dfu_upload, + [DFU_GETSTATUS] = dfu_getstatus, + [DFU_CLRSTATUS] = dfu_clrstatus, + [DFU_GETSTATE] = dfu_getstate, + [DFU_ABORT] = dfu_abort +}; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev dfu_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_dfu_desc_config_set dfu_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = sizeof(usb_dfu_desc_config_set), + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .dfu_itf0 = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_DFU_CLASS, + .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, + .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, + .iInterface = STR_IDX_ALT_ITF0 + }, + + .dfu_itf1 = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x01U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_DFU_CLASS, + .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, + .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, + .iInterface = STR_IDX_ALT_ITF1 + }, + + .dfu_itf2 = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x02U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_DFU_CLASS, + .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, + .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, + .iInterface = STR_IDX_ALT_ITF2 + }, + + .dfu_func = + { + .header = + { + .bLength = sizeof(usb_desc_dfu_func), + .bDescriptorType = DFU_DESC_TYPE + }, + .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_CAN_UPLOAD | USB_DFU_WILL_DETACH, + .wDetachTimeOut = 0x00FFU, + .wTransferSize = TRANSFER_SIZE, + .bcdDFUVersion = 0x0110U + } +}; + +/* USB language ID descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'D', 'F', 'U'} +}; + +/* USB serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB configure string */ +static __ALIGN_BEGIN const usb_desc_str config_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(15U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', ' ', 'U', 'S', 'B', ' ', 'C', 'O', 'N', 'F', 'I', 'G'} +}; + +/* alternate interface 0 string */ +static __ALIGN_BEGIN usb_desc_str interface_string0 __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* alternate interface 1 string */ +static __ALIGN_BEGIN usb_desc_str interface_string1 __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* alternate interface 2 string */ +static __ALIGN_BEGIN usb_desc_str interface_string2 __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +void *const usbd_dfu_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string, + [STR_IDX_CONFIG] = (uint8_t *)&config_string, + [STR_IDX_ALT_ITF0] = (uint8_t *)&interface_string0, + [STR_IDX_ALT_ITF1] = (uint8_t *)&interface_string1, + [STR_IDX_ALT_ITF2] = (uint8_t *)&interface_string2 +}; + +usb_desc dfu_desc = { + .dev_desc = (uint8_t *)&dfu_dev_desc, + .config_desc = (uint8_t *)&dfu_config_desc, + .strings = usbd_dfu_strings +}; + +usb_class_core dfu_class = { + .init = dfu_init, + .deinit = dfu_deinit, + .req_proc = dfu_req_handler, + .ctlx_in = dfu_ctlx_in +}; + +/*! + \brief initialize the DFU device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN usbd_dfu_handler dfu_handler __ALIGN_END; + + /* unlock the internal flash */ + dfu_mem_init(); + + memset((void *)&dfu_handler, 0U, sizeof(usbd_dfu_handler)); + + dfu_handler.manifest_state = MANIFEST_COMPLETE; + dfu_handler.bState = STATE_DFU_IDLE; + dfu_handler.bStatus = STATUS_OK; + + udev->dev.class_data[USBD_DFU_INTERFACE] = (void *)&dfu_handler; + + /* create interface string */ + string_to_unicode((uint8_t *)dfu_inter_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF0]); + string_to_unicode((uint8_t *)dfu_nor_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF1]); + string_to_unicode((uint8_t *)dfu_nand_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF2]); + + return USBD_OK; +} + +/*! + \brief deinitialize the DFU device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_deinit(usb_dev *udev, uint8_t config_index) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + /* restore device default state */ + memset(udev->dev.class_data[USBD_DFU_INTERFACE], 0U, sizeof(usbd_dfu_handler)); + + dfu->bState = STATE_DFU_IDLE; + dfu->bStatus = STATUS_OK; + + /* deinit the memory */ + dfu_mem_deinit(); + + return USBD_OK; +} + +/*! + \brief handle the DFU class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_req_handler(usb_dev *udev, usb_req *req) +{ + if(req->bRequest < DFU_REQ_MAX) { + dfu_request_process[req->bRequest](udev, req); + } else { + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_ctlx_in(usb_dev *udev) +{ + dfu_getstatus_complete(udev); + + return USBD_OK; +} + +/*! + \brief leave DFU mode and reset device to jump to user loaded code + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void dfu_mode_leave(usb_dev *udev) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + dfu->manifest_state = MANIFEST_COMPLETE; + + if(dfu_config_desc.dfu_func.bmAttributes & 0x04U) { + dfu->bState = STATE_DFU_MANIFEST_SYNC; + } else { + dfu->bState = STATE_DFU_MANIFEST_WAIT_RESET; + + /* deinit the memory */ + dfu_mem_deinit(); + + /* generate system reset to allow jumping to the user code */ + NVIC_SystemReset(); + } +} + +/*! + \brief handle data IN stage in control endpoint 0 + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status + */ +static uint8_t dfu_getstatus_complete(usb_dev *udev) +{ + uint32_t addr; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + if(STATE_DFU_DNBUSY == dfu->bState) { + /* decode the special command */ + if(0U == dfu->block_num) { + if(1U == dfu->data_len) { + if(GET_COMMANDS == dfu->buf[0]) { + /* no operation */ + } + } else if(5U == dfu->data_len) { + if(SET_ADDRESS_POINTER == dfu->buf[0]) { + /* set flash operation address */ + dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); + } else if(ERASE == dfu->buf[0]) { + dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); + + dfu_mem_erase(dfu->base_addr); + } else { + /* no operation */ + } + } else { + /* no operation */ + } + } else if(dfu->block_num > 1U) { /* regular download command */ + /* decode the required address */ + addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; + + dfu_mem_write(dfu->buf, addr, dfu->data_len); + + dfu->block_num = 0U; + } else { + /* no operation */ + } + + dfu->data_len = 0U; + + /* update the device state and poll timeout */ + dfu->bState = STATE_DFU_DNLOAD_SYNC; + + return USBD_OK; + } else if(STATE_DFU_MANIFEST == dfu->bState) { /* manifestation in progress */ + /* start leaving DFU mode */ + dfu_mode_leave(udev); + } else { + /* no operation */ + } + + return USBD_OK; +} + +/*! + \brief handle the DFU_DETACH request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none. +*/ +static void dfu_detach(usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + switch(dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_SYNC: + case STATE_DFU_DNLOAD_IDLE: + case STATE_DFU_MANIFEST_SYNC: + case STATE_DFU_UPLOAD_IDLE: + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + dfu->iString = 0U; /* iString */ + + dfu->block_num = 0U; + dfu->data_len = 0U; + break; + + default: + break; + } + + /* check the detach capability in the DFU functional descriptor */ + if(dfu_config_desc.dfu_func.wDetachTimeOut & DFU_DETACH_MASK) { + usbd_disconnect(udev); + + usbd_connect(udev); + } else { + /* wait for the period of time specified in detach request */ + usb_mdelay(4U); + } +} + +/*! + \brief handle the DFU_DNLOAD request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_dnload(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_out[0]; + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + switch(dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_IDLE: + if(req->wLength > 0U) { + /* update the global length and block number */ + dfu->block_num = req->wValue; + dfu->data_len = req->wLength; + + dfu->bState = STATE_DFU_DNLOAD_SYNC; + + transc->remain_len = dfu->data_len; + transc->xfer_buf = dfu->buf; + } else { + dfu->manifest_state = MANIFEST_IN_PROGRESS; + dfu->bState = STATE_DFU_MANIFEST_SYNC; + } + break; + + default: + break; + } +} + +/*! + \brief handles the DFU UPLOAD request. + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_upload(usb_dev *udev, usb_req *req) +{ + uint8_t *phy_addr = NULL; + uint32_t addr = 0U; + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + usb_transc *transc = &udev->dev.transc_in[0]; + + if(req->wLength <= 0U) { + dfu->bState = STATE_DFU_IDLE; + return; + } + + switch(dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_UPLOAD_IDLE: + /* update the global length and block number */ + dfu->block_num = req->wValue; + dfu->data_len = req->wLength; + + /* DFU get command */ + if(0U == dfu->block_num) { + /* update the state machine */ + dfu->bState = (dfu->data_len > 3U) ? STATE_DFU_IDLE : STATE_DFU_UPLOAD_IDLE; + + /* store the values of all supported commands */ + dfu->buf[0] = GET_COMMANDS; + dfu->buf[1] = SET_ADDRESS_POINTER; + dfu->buf[2] = ERASE; + + /* send the status data over EP0 */ + transc->xfer_buf = &(dfu->buf[0]); + transc->remain_len = 3U; + } else if(dfu->block_num > 1U) { + dfu->bState = STATE_DFU_UPLOAD_IDLE; + + /* change is accelerated */ + addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; + + /* return the physical address where data are stored */ + phy_addr = dfu_mem_read(dfu->buf, addr, dfu->data_len); + + /* send the status data over EP0 */ + transc->xfer_buf = phy_addr; + transc->remain_len = dfu->data_len; + } else { + dfu->bState = STATUS_ERR_STALLEDPKT; + } + break; + + default: + dfu->data_len = 0U; + dfu->block_num = 0U; + break; + } +} + +/*! + \brief handle the DFU_GETSTATUS request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_getstatus(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + switch(dfu->bState) { + case STATE_DFU_DNLOAD_SYNC: + if(0U != dfu->data_len) { + dfu->bState = STATE_DFU_DNBUSY; + + if(0U == dfu->block_num) { + if(ERASE == dfu->buf[0]) { + dfu_mem_getstatus(dfu->base_addr, CMD_ERASE, (uint8_t *)&dfu->bwPollTimeout0); + } else { + dfu_mem_getstatus(dfu->base_addr, CMD_WRITE, (uint8_t *)&dfu->bwPollTimeout0); + } + } + } else { + dfu->bState = STATE_DFU_DNLOAD_IDLE; + } + break; + + case STATE_DFU_MANIFEST_SYNC: + if(MANIFEST_IN_PROGRESS == dfu->manifest_state) { + dfu->bState = STATE_DFU_MANIFEST; + dfu->bwPollTimeout0 = 1U; + } else if((MANIFEST_COMPLETE == dfu->manifest_state) && \ + (dfu_config_desc.dfu_func.bmAttributes & 0x04U)) { + dfu->bState = STATE_DFU_IDLE; + dfu->bwPollTimeout0 = 0U; + } else { + /* no operation */ + } + break; + + default: + break; + } + + /* send the status data of DFU interface to host over EP0 */ + transc->xfer_buf = (uint8_t *)&(dfu->bStatus); + transc->remain_len = 6U; +} + +/*! + \brief handle the DFU_CLRSTATUS request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_clrstatus(usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + if(STATE_DFU_ERROR == dfu->bState) { + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + } else { + /* state error */ + dfu->bStatus = STATUS_ERR_UNKNOWN; + dfu->bState = STATE_DFU_ERROR; + } + + dfu->iString = 0U; /* iString: index = 0 */ +} + +/*! + \brief handle the DFU_GETSTATE request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_getstate(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + /* send the current state of the DFU interface to host */ + transc->xfer_buf = &(dfu->bState); + transc->remain_len = 1U; +} + +/*! + \brief handle the DFU_ABORT request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_abort(usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; + + switch(dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_SYNC: + case STATE_DFU_DNLOAD_IDLE: + case STATE_DFU_MANIFEST_SYNC: + case STATE_DFU_UPLOAD_IDLE: + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + dfu->iString = 0U; /* iString: index = 0 */ + + dfu->block_num = 0U; + dfu->data_len = 0U; + break; + + default: + break; + } +} + +/*! + \brief convert string value into unicode char + \param[in] str: pointer to plain string + \param[in] pbuf: buffer pointer to store unicode char + \param[out] none + \retval none +*/ +static void string_to_unicode(uint8_t *str, uint16_t *pbuf) +{ + uint8_t index = 0U; + + if(NULL != str) { + pbuf[index++] = ((strlen((const char *)str) * 2U + 2U) & 0x00FFU) | ((USB_DESCTYPE_STR << 8) & 0xFF00U); + + while('\0' != *str) { + pbuf[index++] = *str++; + } + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c new file mode 100644 index 00000000000..92bd84c627c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c @@ -0,0 +1,241 @@ +/*! + \file dfu_mem.c + \brief USB DFU device media access layer functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "dfu_mem.h" +#include "usbd_transc.h" + +extern usb_core_driver usb_dfu_dev; + +extern struct { + uint8_t buf[TRANSFER_SIZE]; + uint16_t data_len; + uint16_t block_num; + uint32_t base_addr; +} prog; + +dfu_mem_prop *mem_tab[MAX_USED_MEMORY_MEDIA] = { + &dfu_inter_flash_cb, + &dfu_nor_flash_cb, + &dfu_nand_flash_cb, +}; + +/* The list of memory interface string descriptor pointers. This list + can be updated whenever a memory has to be added or removed */ +const uint8_t *USBD_DFU_StringDesc[MAX_USED_MEMORY_MEDIA] = { + (const uint8_t *)INTER_FLASH_IF_STR, + (const uint8_t *)NOR_FLASH_IF_STR, + (const uint8_t *)NAND_FLASH_IF_STR +}; + +static uint8_t dfu_mem_checkaddr(uint32_t addr); + +/*! + \brief initialize the memory media + \param[in] none + \param[out] none + \retval MEM_OK +*/ +uint8_t dfu_mem_init(void) +{ + uint32_t mem_index = 0U; + + /* initialize all supported memory medias */ + for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { + /* check if the memory media exists */ + if(NULL != mem_tab[mem_index]->mem_init) { + mem_tab[mem_index]->mem_init(); + } + } + + return MEM_OK; +} + +/*! + \brief deinitialize the memory media + \param[in] none + \param[out] none + \retval MEM_OK +*/ +uint8_t dfu_mem_deinit(void) +{ + uint32_t mem_index = 0U; + + /* deinitialize all supported memory medias */ + for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { + /* check if the memory media exists */ + if(NULL != mem_tab[mem_index]->mem_deinit) { + mem_tab[mem_index]->mem_deinit(); + } + } + + return MEM_OK; +} + +/*! + \brief erase a memory sector + \param[in] addr: memory sector address/code + \param[out] none + \retval MEM_OK +*/ +uint8_t dfu_mem_erase(uint32_t addr) +{ + uint32_t mem_index = dfu_mem_checkaddr(addr); + + /* check if the address is in protected area */ + if(IS_PROTECTED_AREA(addr)) { + return MEM_FAIL; + } + + if(mem_index < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if(NULL != mem_tab[mem_index]->mem_erase) { + return mem_tab[mem_index]->mem_erase(addr); + } else { + return MEM_FAIL; + } + } else { + return MEM_FAIL; + } +} + +/*! + \brief write data to sectors of memory + \param[in] buf: the data buffer to be write + \param[in] addr: memory sector address/code + \param[in] len: data length + \param[out] none + \retval MEM_OK +*/ +uint8_t dfu_mem_write(uint8_t *buf, uint32_t addr, uint32_t len) +{ + uint32_t mem_index = dfu_mem_checkaddr(addr); + + /* check if the address is in protected area */ + if(IS_PROTECTED_AREA(addr)) { + return MEM_FAIL; + } + + if(OB_RDPT0 == (addr & MAL_MASK_OB)) { + option_byte_write(addr, buf); + NVIC_SystemReset(); + + return MEM_OK; + } + + if(mem_index < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if(NULL != mem_tab[mem_index]->mem_write) { + return mem_tab[mem_index]->mem_write(buf, addr, len); + } else { + return MEM_FAIL; + } + } else { + return MEM_FAIL; + } +} + +/*! + \brief read data from sectors of memory + \param[in] buf: the data buffer to be write + \param[in] addr: memory sector address/code + \param[in] len: data length + \param[out] none + \retval pointer to buffer +*/ +uint8_t *dfu_mem_read(uint8_t *buf, uint32_t addr, uint32_t len) +{ + uint32_t mem_index = 0U; + + if((OB_RDPT0 != addr) && (OB_RDPT1 != addr)) { + mem_index = dfu_mem_checkaddr(addr); + } + + if(mem_index < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if(NULL != mem_tab[mem_index]->mem_read) { + return mem_tab[mem_index]->mem_read(buf, addr, len); + } else { + return buf; + } + } else { + return buf; + } +} + +/*! + \brief get the status of a given memory and store in buffer + \param[in] addr: memory sector address/code + \param[in] cmd: 0 for erase and 1 for write + \param[in] buffer: pointer to the buffer where the status data will be stored + \param[out] none + \retval MEM_OK if all operations are OK, MEM_FAIL else +*/ +uint8_t dfu_mem_getstatus(uint32_t addr, uint8_t cmd, uint8_t *buffer) +{ + uint32_t mem_index = dfu_mem_checkaddr(addr); + + if(mem_index < MAX_USED_MEMORY_MEDIA) { + if(cmd & 0x01U) { + POLLING_TIMEOUT_SET(mem_tab[mem_index]->write_timeout); + } else { + POLLING_TIMEOUT_SET(mem_tab[mem_index]->erase_timeout); + } + + return MEM_OK; + } else { + return MEM_FAIL; + } +} + +/*! + \brief check the address is supported + \param[in] addr: memory sector address/code + \param[out] none + \retval index of the addressed memory +*/ +static uint8_t dfu_mem_checkaddr(uint32_t addr) +{ + uint8_t mem_index = 0U; + + /* check with all supported memories */ + for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { + /* if the check address is supported, return the memory index */ + if(MEM_OK == mem_tab[mem_index]->mem_checkaddr(addr)) { + return mem_index; + } + } + + /* if there is no memory found, return MAX_USED_MEMORY_MEDIA */ + return (MAX_USED_MEMORY_MEDIA); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h new file mode 100644 index 00000000000..60f70bbf4d0 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h @@ -0,0 +1,66 @@ +/*! + \file custom_hid_core.h + \brief definitions for HID core + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef CUSTOM_HID_CORE_H +#define CUSTOM_HID_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define DESC_LEN_REPORT 96U /*!< report descriptor length */ +#define DESC_LEN_CONFIG 41U /*!< configuration descriptor length */ +#define NO_CMD 0xFFU /*!< no command */ +#define MAX_PERIPH_NUM 4U /*!< maximum peripheral number */ + +typedef struct { + uint8_t data[2]; /*!< custom HID data packet buff */ + uint8_t reportID; /*!< custom HID report id */ + uint8_t idlestate; /*!< idle state */ + uint8_t protocol; /*!< HID protocol */ +} custom_hid_handler; + +typedef struct { + void (*periph_config[MAX_PERIPH_NUM])(void); +} hid_fop_handler; + +extern usb_desc custom_hid_desc; +extern usb_class_core usbd_custom_hid_cb; + +/* function declarations */ +/* register HID interface operation functions */ +uint8_t custom_hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop); +/* send custom HID report */ +uint8_t custom_hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len); + +#endif /* CUSTOM_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h new file mode 100644 index 00000000000..5a60ac886cd --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h @@ -0,0 +1,67 @@ +/*! + \file standard_hid_core.h + \brief definitions for HID core + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef STANDARD_HID_CORE_H +#define STANDARD_HID_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_HID_CONFIG_DESC_LEN 0x22U /*!< HID device configuration descriptor length */ +#define USB_HID_REPORT_DESC_LEN 0x2EU /*!< HID device report descriptor length */ + +#define NO_CMD 0xFFU /*!< no command */ + +typedef struct { + uint32_t protocol; /*!< control request protocol */ + uint32_t idle_state; /*!< HID device idle state */ + uint8_t data[HID_IN_PACKET]; /*!< data transfer buff */ + __IO uint8_t prev_transfer_complete; /*!< previous transfer complete flag */ +} standard_hid_handler; + +typedef struct { + void (*hid_itf_config)(void); + void (*hid_itf_data_process)(usb_dev *udev); +} hid_fop_handler; + +extern usb_desc hid_desc; +extern usb_class_core usbd_hid_cb; + +/* function declarations */ +/* register HID interface operation functions */ +uint8_t hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop); +/* send keyboard report */ +uint8_t hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len); + +#endif /* STANDARD_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c new file mode 100644 index 00000000000..57dd157a003 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c @@ -0,0 +1,473 @@ +/*! + \file custom_hid_core.c + \brief custom HID class driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "custom_hid_core.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028AU + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev custom_hid_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_hid_desc_config_set custom_hid_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = DESC_LEN_CONFIG, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = 0x00U, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = DESC_LEN_REPORT + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CUSTOMHID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = CUSTOMHID_IN_PACKET, + .bInterval = 0x20U + }, + + .hid_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CUSTOMHID_OUT_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = CUSTOMHID_OUT_PACKET, + .bInterval = 0x20U + } +}; + +/* USB language ID descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(14U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'C', 'u', 's', 't', 'o', 'm', 'H', 'I', 'D'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB string descriptor set */ +void *const usbd_hid_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc custom_hid_desc = { + .dev_desc = (uint8_t *)&custom_hid_dev_desc, + .config_desc = (uint8_t *)&custom_hid_config_desc, + .strings = usbd_hid_strings +}; + +__ALIGN_BEGIN const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] __ALIGN_END = { + 0x06U, 0x00U, 0xFFU, /* USAGE_PAGE (Vendor Defined: 0xFF00) */ + 0x09U, 0x00U, /* USAGE (Custom Device) */ + 0xa1U, 0x01U, /* COLLECTION (Application) */ + + /* led 1 */ + 0x85U, 0x11U, /* REPORT_ID (0x11) */ + 0x09U, 0x01U, /* USAGE (LED 1) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x95U, 0x01U, /* REPORT_COUNT (1) */ + 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* led 2 */ + 0x85U, 0x12U, /* REPORT_ID (0x12) */ + 0x09U, 0x02U, /* USAGE (LED 2) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x95U, 0x01U, /* REPORT_COUNT (1) */ + 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* led 3 */ + 0x85U, 0x13U, /* REPORT_ID (0x13) */ + 0x09U, 0x03U, /* USAGE (LED 3) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x95U, 0x01U, /* REPORT_COUNT (1) */ + 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* led 4 */ + 0x85U, 0x14U, /* REPORT_ID (0x14) */ + 0x09U, 0x04U, /* USAGE (LED 4) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x95U, 0x01U, /* REPORT_COUNT (1) */ + 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* wakeup key */ + 0x85U, 0x15U, /* REPORT_ID (0x15) */ + 0x09U, 0x05U, /* USAGE (Push Button) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x01U, /* REPORT_SIZE (1) */ + 0x81U, 0x02U, /* INPUT (Data,Var,Abs,Vol) */ + + 0x75U, 0x07U, /* REPORT_SIZE (7) */ + 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs,Vol) */ + + /* tamper key */ + 0x85U, 0x16U, /* REPORT_ID (0x16) */ + 0x09U, 0x06U, /* USAGE (Push Button) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x75U, 0x01U, /* REPORT_SIZE (1) */ + 0x81U, 0x02U, /* INPUT (Data,Var,Abs,Vol) */ + + 0x75U, 0x07U, /* REPORT_SIZE (7) */ + 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs,Vol) */ + + 0xc0U /* END_COLLECTION */ +}; + +/* local function prototypes ('static') */ +static uint8_t custom_hid_init(usb_dev *udev, uint8_t config_index); +static uint8_t custom_hid_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t custom_hid_req_handler(usb_dev *udev, usb_req *req); + +static uint8_t custom_hid_data_in(usb_dev *udev, uint8_t ep_num); +static uint8_t custom_hid_data_out(usb_dev *udev, uint8_t ep_num); + +usb_class_core usbd_custom_hid_cb = { + .command = NO_CMD, + .alter_set = 0U, + + .init = custom_hid_init, + .deinit = custom_hid_deinit, + + .req_proc = custom_hid_req_handler, + + .data_in = custom_hid_data_in, + .data_out = custom_hid_data_out +}; + +/*! + \brief register HID interface operation functions + \param[in] udev: pointer to USB device instance + \param[in] hid_fop: HID operation functions structure + \param[out] none + \retval USB device operation status +*/ +uint8_t custom_hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop) +{ + if(NULL != hid_fop) { + udev->dev.user_data = hid_fop; + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send custom HID report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t custom_hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len) +{ + usbd_ep_send(udev, CUSTOMHID_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN custom_hid_handler hid_handler __ALIGN_END; + + memset((void *)&hid_handler, 0U, sizeof(custom_hid_handler)); + + /* initialize the data TX endpoint */ + usbd_ep_setup(udev, &(custom_hid_config_desc.hid_epin)); + + /* initialize the data RX endpoint */ + usbd_ep_setup(udev, &(custom_hid_config_desc.hid_epout)); + + /* prepare receive data */ + usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid_handler.data, 2U); + + udev->dev.class_data[CUSTOM_HID_INTERFACE] = (void *)&hid_handler; + + if(NULL != udev->dev.user_data) { + for(uint8_t i = 0U; i < MAX_PERIPH_NUM; i++) { + if(NULL != ((hid_fop_handler *)udev->dev.user_data)->periph_config[i]) { + ((hid_fop_handler *)udev->dev.user_data)->periph_config[i](); + } + } + } + + return USBD_OK; +} + +/*! + \brief deinitialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_deinit(usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_clear(udev, CUSTOMHID_IN_EP); + usbd_ep_clear(udev, CUSTOMHID_OUT_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_req_handler(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE]; + + switch(req->bRequest) { + case GET_REPORT: + break; + + case GET_IDLE: + transc->xfer_buf = (uint8_t *)&hid->idlestate; + transc->remain_len = 1U; + break; + + case GET_PROTOCOL: + transc->xfer_buf = (uint8_t *)&hid->protocol; + transc->remain_len = 1U; + break; + + case SET_REPORT: + hid->reportID = (uint8_t)(req->wValue); + break; + + case SET_IDLE: + hid->idlestate = (uint8_t)(req->wValue >> 8); + break; + + case SET_PROTOCOL: + hid->protocol = (uint8_t)(req->wValue); + break; + + case USB_GET_DESCRIPTOR: + if(USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + transc->remain_len = USB_MIN(DESC_LEN_REPORT, req->wLength); + transc->xfer_buf = (uint8_t *)customhid_report_descriptor; + } + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle custom HID data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_data_in(usb_dev *udev, uint8_t ep_num) +{ + return USBD_OK; +} + +/*! + \brief handle custom HID data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_data_out(usb_dev *udev, uint8_t ep_num) +{ + custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE]; + + /* light the LED */ + switch(hid->data[0]) { + case 0x11U: + if(RESET != hid->data[1]) { + gd_eval_led_on(LED1); + } else { + gd_eval_led_off(LED1); + } + break; + + case 0x12U: + if(RESET != hid->data[1]) { + gd_eval_led_on(LED2); + } else { + gd_eval_led_off(LED2); + } + break; + + case 0x13U: + if(RESET != hid->data[1]) { + gd_eval_led_on(LED3); + } else { + gd_eval_led_off(LED3); + } + break; + + case 0x14U: + break; + + default: + break; + } + + usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid->data, 2U); + + return USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c new file mode 100644 index 00000000000..2a60d758ef2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c @@ -0,0 +1,460 @@ +/*! + \file standard_hid_core.c + \brief HID class driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "standard_hid_core.h" +#include + +#define USBD_VID 0x28e9U +#define USBD_PID 0x0380U + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev hid_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +__ALIGN_BEGIN const usb_hid_desc_config_set hid_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_HID_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, + .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_HID_REPORT_DESC_LEN + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = HID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = HID_IN_PACKET, + .bInterval = 0x10U + } +}; + +__ALIGN_BEGIN const usb_hid_desc_config_set other_speed_hid_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_OTHER_SPD_CONFIG + }, + .wTotalLength = USB_HID_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, + .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_HID_REPORT_DESC_LEN + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = HID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = HID_IN_PACKET, + .bInterval = 0x40U + } +}; + +__ALIGN_BEGIN const uint8_t usbd_qualifier_desc[10] __ALIGN_END = { + 0x0AU, + 0x06U, + 0x00U, + 0x02U, + 0x00U, + 0x00U, + 0x00U, + 0x40U, + 0x01U, + 0x00U +}; + +/* USB language ID Descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(17U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'K', 'e', 'y', 'b', 'o', 'a', 'r', 'd'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +void *const usbd_hid_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc hid_desc = { + .dev_desc = (uint8_t *)&hid_dev_desc, + .config_desc = (uint8_t *)&hid_config_desc, +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + .other_speed_config_desc = (uint8_t *)&other_speed_hid_config_desc, + .qualifier_desc = (uint8_t *)&usbd_qualifier_desc, +#endif + .strings = usbd_hid_strings +}; + +__ALIGN_BEGIN const uint8_t hid_report_desc[USB_HID_REPORT_DESC_LEN] __ALIGN_END = { + 0x05U, 0x01U, /* USAGE_PAGE (Generic Desktop) */ + 0x09U, 0x06U, /* USAGE (Keyboard) */ + 0xa1U, 0x01U, /* COLLECTION (Application) */ + + 0x05U, 0x07U, /* USAGE_PAGE (Keyboard/Keypad) */ + 0x19U, 0xe0U, /* USAGE_MINIMUM (Keyboard LeftControl) */ + 0x29U, 0xe7U, /* USAGE_MAXIMUM (Keyboard Right GUI) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ + 0x95U, 0x08U, /* REPORT_COUNT (8) */ + 0x75U, 0x01U, /* REPORT_SIZE (1) */ + 0x81U, 0x02U, /* INPUT (Data,Var,Abs) */ + + 0x95U, 0x01U, /* REPORT_COUNT (1) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs) */ + + 0x95U, 0x06U, /* REPORT_COUNT (6) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x26U, 0xFFU, 0x00U, /* LOGICAL_MAXIMUM (255) */ + 0x05U, 0x07U, /* USAGE_PAGE (Keyboard/Keypad) */ + 0x19U, 0x00U, /* USAGE_MINIMUM (Reserved (no event indicated)) */ + 0x29U, 0x65U, /* USAGE_MAXIMUM (Keyboard Application) */ + 0x81U, 0x00U, /* INPUT (Data,Ary,Abs) */ + + 0xc0U /* END_COLLECTION */ +}; + +/* local function prototypes ('static') */ +static uint8_t hid_init(usb_dev *udev, uint8_t config_index); +static uint8_t hid_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t hid_req(usb_dev *udev, usb_req *req); +static uint8_t hid_data_in(usb_dev *udev, uint8_t ep_num); + +usb_class_core usbd_hid_cb = { + .command = NO_CMD, + .alter_set = 0U, + + .init = hid_init, + .deinit = hid_deinit, + .req_proc = hid_req, + .data_in = hid_data_in +}; + +/*! + \brief register HID interface operation functions + \param[in] udev: pointer to USB device instance + \param[in] hid_fop: HID operation function structure + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop) +{ + if(NULL != hid_fop) { + udev->dev.user_data = (void *)hid_fop; + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send keyboard report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len) +{ + standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; + + hid->prev_transfer_complete = 0U; + + usbd_ep_send(udev, HID_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN standard_hid_handler hid_handler __ALIGN_END; + + memset((void *)&hid_handler, 0U, sizeof(standard_hid_handler)); + + /* initialize the data TX endpoint */ + usbd_ep_setup(udev, &(hid_config_desc.hid_epin)); + + hid_handler.prev_transfer_complete = 1U; + + udev->dev.class_data[USBD_HID_INTERFACE] = (void *)&hid_handler; + + if(NULL != udev->dev.user_data) { + ((hid_fop_handler *)udev->dev.user_data)->hid_itf_config(); + } + + return USBD_OK; +} + +/*! + \brief deinitialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_deinit(usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_clear(udev, HID_IN_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_req(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; + + switch(req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + transc->xfer_buf = (uint8_t *)&hid->idle_state; + + transc->remain_len = 1U; + break; + + case GET_PROTOCOL: + transc->xfer_buf = (uint8_t *)&hid->protocol; + + transc->remain_len = 1U; + break; + + case SET_REPORT: + /* no use for this driver */ + break; + + case SET_IDLE: + hid->idle_state = (uint8_t)(req->wValue >> 8); + break; + + case SET_PROTOCOL: + hid->protocol = (uint8_t)(req->wValue); + break; + + case USB_GET_DESCRIPTOR: + if(USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + transc->remain_len = USB_MIN(USB_HID_REPORT_DESC_LEN, req->wLength); + transc->xfer_buf = (uint8_t *)hid_report_desc; + + return REQ_SUPP; + } else if(USB_DESCTYPE_HID == (req->wValue >> 8)) { + transc->remain_len = USB_MIN(9U, req->wLength); + transc->xfer_buf = (uint8_t *)(&(hid_config_desc.hid_vendor)); + } else { + /* no operation */ + } + break; + + default: + break; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_data_in(usb_dev *udev, uint8_t ep_num) +{ + standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; + + if(0U != hid->data[2]) { + hid->data[2] = 0x00U; + + usbd_ep_send(udev, HID_IN_EP, hid->data, HID_IN_PACKET); + } else { + hid->prev_transfer_complete = 1U; + } + + return USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h new file mode 100644 index 00000000000..0d4f9efa331 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h @@ -0,0 +1,103 @@ +/*! + \file usb_iap_core.h + \brief the header file of IAP driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USB_IAP_CORE_H +#define USB_IAP_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_SERIAL_STRING_SIZE 0x06U /*!< serial string size */ + +#ifdef USE_USB_FS + #define USB_DESC_LEN_IAP_REPORT 35U /*!< report descriptor length */ +#elif defined(USE_USB_HS) + #ifdef USE_ULPI_PHY + #define USB_DESC_LEN_IAP_REPORT 37U /*!< report descriptor length */ + #else + #define USB_DESC_LEN_IAP_REPORT 35U /*!< report descriptor length */ + #endif /* USE_ULPI_PHY */ +#else + #error "please select 'USE_USB_FS' or 'USE_USB_HS'" +#endif /* USE_USB_FS */ + +#define USB_DESC_LEN_IAP_CONFIG_SET 41U /*!< configuration descriptor length */ + +/* special commands with download request */ +#define IAP_READ_OPTION_BYTE 0x01U +#define IAP_ERASE 0x02U +#define IAP_DOWNLOAD 0x03U +#define IAP_LEAVE 0x04U +#define IAP_GETBIN_ADDRESS 0x05U +#define IAP_WRITE_OPTION_BYTE 0x06U +#define IAP_UPLOAD 0x07U +#define IAP_CHECK_RDP 0x08U + +#define OPERATION_SUCCESS 0x02U +#define OPERATION_FAIL 0x5FU +#define LEAVE_FINISH 0x04U +#define OB_WRITE_SUCCESS 0x03U +#define IS_RDP_MODE 0xBBU +#define IS_NORMAL_MODE 0xA5U + +#define IAP_HOST_ID 0x01U /*!< IAP host ID */ +#define IAP_DEVICE_ID 0x02U /*!< IAP device ID */ + +typedef struct { + __ALIGN_BEGIN uint8_t report_buf[IAP_OUT_PACKET + 1U] __ALIGN_END; + __ALIGN_BEGIN uint8_t option_byte[IAP_IN_PACKET] __ALIGN_END; + + /* state machine variables */ + __ALIGN_BEGIN uint8_t dev_status[IAP_IN_PACKET] __ALIGN_END; /*!< device status */ + __ALIGN_BEGIN uint8_t bin_addr[IAP_IN_PACKET] __ALIGN_END; /*!< load bin address */ + uint8_t reportID; /*!< report id */ + uint8_t flag; /*!< flag */ + uint32_t protocol; /*!< control request protocol */ + uint32_t idlestate; /*!< control request idle state */ + uint16_t transfer_times; /*!< data transfer times */ + uint16_t page_count; /*!< memory page count */ + uint32_t file_length; /*!< file length*/ + uint32_t base_address; /*!< loaded base address */ +} usbd_iap_handler; + +typedef void (*app_func)(void); + +extern usb_desc iap_desc; +extern usb_class_core iap_class; + +/* function declarations */ +/* send IAP report */ +uint8_t iap_report_send(usb_dev *udev, uint8_t *report, uint32_t len); + +#endif /* USB_IAP_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c new file mode 100644 index 00000000000..c2acd3f4e7e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c @@ -0,0 +1,667 @@ +/*! + \file usb_iap_core.c + \brief IAP driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usb_iap_core.h" +#include "flash_operation.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x3228U + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev iap_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +__ALIGN_BEGIN const usb_hid_desc_config_set iap_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_DESC_LEN_IAP_CONFIG_SET, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = 0x00U, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_DESC_LEN_IAP_REPORT + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = IAP_IN_PACKET, + .bInterval = 0x01U + }, + + .hid_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_OUT_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = IAP_OUT_PACKET, + .bInterval = 0x01U + } +}; + +/* USB language ID Descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'I', 'A', 'P'} +}; + +/* USB serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +void *const usbd_iap_strings[] = { + [STR_IDX_LANGID] = (uint8_t *) &usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *) &manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *) &product_string, + [STR_IDX_SERIAL] = (uint8_t *) &serial_string +}; + +usb_desc iap_desc = { + .dev_desc = (uint8_t *) &iap_dev_desc, + .config_desc = (uint8_t *) &iap_config_desc, + .strings = usbd_iap_strings +}; + +/* local function prototypes ('static') */ +static uint8_t iap_init(usb_dev *udev, uint8_t config_index); +static uint8_t iap_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t iap_req_handler(usb_dev *udev, usb_req *req); +static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num); + +/* IAP requests management functions */ +static void iap_req_erase(usb_dev *udev); +static void iap_req_download(usb_dev *udev); +static void iap_req_read_optionbyte(usb_dev *udev); +static void iap_req_write_optionbyte(usb_dev *udev); +static void iap_req_leave(usb_dev *udev); +static void iap_address_send(usb_dev *udev); +static void iap_req_upload(usb_dev *udev); +static void iap_check_rdp(usb_dev *udev); + +usb_class_core iap_class = { + .init = iap_init, + .deinit = iap_deinit, + .req_proc = iap_req_handler, + .data_out = iap_data_out +}; + +/* USB custom HID device report descriptor */ +__ALIGN_BEGIN const uint8_t iap_report_desc[USB_DESC_LEN_IAP_REPORT] __ALIGN_END = { + 0x05U, 0x01U, /* USAGE_PAGE (Generic Desktop) */ + 0x09U, 0x00U, /* USAGE (Custom Device) */ + 0xa1U, 0x01U, /* COLLECTION (Application) */ + + /* IAP command and data */ + 0x85U, 0x01U, /* REPORT_ID (0x01) */ + 0x09U, 0x01U, /* USAGE (IAP command) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0xffU, /* LOGICAL_MAXIMUM (255) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ +#ifdef USE_USB_FS + 0x95U, REPORT_OUT_COUNT, +#else +#ifdef USE_ULPI_PHY + 0x96U, BYTE_LOW(REPORT_OUT_COUNT), BYTE_HIGH(REPORT_OUT_COUNT), +#elif defined(USE_EMBEDDED_PHY) + 0x95U, REPORT_OUT_COUNT, +#endif +#endif + 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* device status and option byte */ + 0x85U, 0x02U, /* REPORT_ID (0x02) */ + 0x09U, 0x02U, /* USAGE (Status and option byte) */ + 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ + 0x25U, 0xffU, /* LOGICAL_MAXIMUM (255) */ + 0x75U, 0x08U, /* REPORT_SIZE (8) */ + +#ifdef USE_USB_FS + 0x95U, REPORT_IN_COUNT, +#else +#ifdef USE_ULPI_PHY + 0x96U, BYTE_LOW(REPORT_IN_COUNT), BYTE_HIGH(REPORT_IN_COUNT), +#elif defined(USE_EMBEDDED_PHY) + 0x95U, REPORT_IN_COUNT, +#endif +#endif + 0x81U, 0x82U, /* INPUT (Data,Var,Abs,Vol) */ + + 0xc0U /* END_COLLECTION */ +}; + +/*! + \brief send IAP report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_report_send(usb_dev *udev, uint8_t *report, uint32_t len) +{ + usbd_ep_send(udev, IAP_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief initialize the IAP device + \param[in] udev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN usbd_iap_handler iap_handler __ALIGN_END; + + /* initialize Tx endpoint */ + usbd_ep_setup(udev, &(iap_config_desc.hid_epin)); + + /* initialize Rx endpoint */ + usbd_ep_setup(udev, &(iap_config_desc.hid_epout)); + + memset((void *)&iap_handler, 0U, sizeof(usbd_iap_handler)); + + /* prepare receive data */ + usbd_ep_recev(udev, IAP_OUT_EP, iap_handler.report_buf, IAP_OUT_PACKET); + + iap_handler.base_address = APP_LOADED_ADDR; + + udev->dev.class_data[USBD_IAP_INTERFACE] = (void *)&iap_handler; + + return USBD_OK; +} + +/*! + \brief deinitialize the IAP device + \param[in] udev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_deinit(usb_dev *udev, uint8_t config_index) +{ + /* deinitialize IAP endpoints */ + usbd_ep_clear(udev, IAP_IN_EP); + usbd_ep_clear(udev, IAP_OUT_EP); + + return USBD_OK; +} + +/*! + \brief handle the IAP class-specific requests + \param[in] udev: pointer to usb device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_req_handler(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + switch(req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + transc->xfer_buf = (uint8_t *)&iap->idlestate; + transc->remain_len = 1U; + break; + + case GET_PROTOCOL: + transc->xfer_buf = (uint8_t *)&iap->protocol; + transc->remain_len = 1U; + break; + + case SET_REPORT: + iap->reportID = (uint8_t)(req->wValue); + break; + + case SET_IDLE: + iap->idlestate = (uint8_t)(req->wValue >> 8U); + break; + + case SET_PROTOCOL: + iap->protocol = (uint8_t)(req->wValue); + break; + + case USB_GET_DESCRIPTOR: + if(USB_DESCTYPE_REPORT == (req->wValue >> 8U)) { + transc->remain_len = USB_MIN(USB_DESC_LEN_IAP_REPORT, req->wLength); + transc->xfer_buf = (uint8_t *)iap_report_desc; + } + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data out stage + \param[in] udev: pointer to usb device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval none +*/ +static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + if(IAP_HOST_ID == iap->report_buf[0]) { + switch(iap->report_buf[1]) { + case IAP_DOWNLOAD: + iap_req_download(udev); + break; + + case IAP_ERASE: + iap_req_erase(udev); + break; + + case IAP_READ_OPTION_BYTE: + iap_req_read_optionbyte(udev); + break; + + case IAP_LEAVE: + iap_req_leave(udev); + break; + + case IAP_GETBIN_ADDRESS: + iap_address_send(udev); + break; + + case IAP_WRITE_OPTION_BYTE: + iap_req_write_optionbyte(udev); + break; + + case IAP_UPLOAD: + iap_req_upload(udev); + break; + + case IAP_CHECK_RDP: + iap_check_rdp(udev); + break; + + default: + break; + } + } + + usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); + + return USBD_OK; +} + +/*! + \brief handle the IAP_DOWNLOAD request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_download(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->dev_status[0] = IAP_DEVICE_ID; + + /* get the target address to download */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; + + /* program the target address */ + if(FMC_READY == iap_data_write(&iap->report_buf[6], iap->base_address, TRANSFER_SIZE)) { + iap->dev_status[1] = OPERATION_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_WRITE_OPTION_BYTE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_write_optionbyte(usb_dev *udev) +{ + uint32_t option_byte_addr = 0U; + uint16_t option_byte_size = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get option byte address address */ + option_byte_addr = iap->report_buf[2]; + option_byte_addr |= (uint32_t)iap->report_buf[3] << 8U; + option_byte_addr |= (uint32_t)iap->report_buf[4] << 16U; + option_byte_addr |= (uint32_t)iap->report_buf[5] << 24U; + + /* get option byte address size */ + if(OPT_BYTE_ADDR1 == option_byte_addr) { + option_byte_size = OPT_BYTE_SIZE1; + } else if(OPT_BYTE_ADDR2 == option_byte_addr) { + option_byte_size = OPT_BYTE_SIZE2; + } else if(EFUSE_BYTE_ADDR == option_byte_addr) { + option_byte_size = EFUSE_BYTE_SIZE; + } + + iap->dev_status[0] = IAP_DEVICE_ID; + /* write option byte address data */ + if(FMC_READY == option_byte_write(option_byte_addr, &iap->report_buf[6], option_byte_size)) { + iap->dev_status[1] = OB_WRITE_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_ERASE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_erase(usb_dev *udev) +{ + uint32_t addr = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get base address to erase */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; + + /* get file length */ + iap->file_length = iap->report_buf[6]; + iap->file_length |= (uint32_t)iap->report_buf[7] << 8U; + iap->file_length |= (uint32_t)iap->report_buf[8] << 16U; + iap->file_length |= (uint32_t)iap->report_buf[9] << 24U; + + /* check if the address is in protected area */ + if(IS_PROTECTED_AREA(iap->base_address)) { + return; + } + + addr = iap->base_address; + iap->dev_status[0] = IAP_DEVICE_ID; + + if(FMC_READY == flash_erase(addr, iap->file_length)) { + iap->dev_status[1] = OPERATION_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_READ_OPTION_BYTE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_read_optionbyte(usb_dev *udev) +{ + uint8_t i = 0U; + uint32_t option_size = 0U, temp = 0U, option_address = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* read option address address */ + option_address = iap->report_buf[2] + (iap->report_buf[3] << 8U) + (iap->report_buf[4] << 16U) + (iap->report_buf[5] << 24U); + + iap->option_byte[0] = IAP_DEVICE_ID; + if(OPT_BYTE_ADDR1 == option_address) { + option_size = OPT_BYTE_SIZE1; + } else if(OPT_BYTE_ADDR2 == option_address) { + option_size = OPT_BYTE_SIZE2; + } else if(EFUSE_BYTE_ADDR == option_address) { + option_size = EFUSE_BYTE_SIZE; + } + + /* read option address content */ + for(i = 0U; i < (option_size / 4U); i++) { + temp = *(uint32_t *)option_address; + iap->option_byte[4 * i + 5] = temp >> 24U; + iap->option_byte[4 * i + 4] = temp >> 16U; + iap->option_byte[4 * i + 3] = temp >> 8U; + iap->option_byte[4 * i + 2] = temp; + option_address = option_address + 4U; + } + iap->option_byte[1] = OPERATION_SUCCESS; + + iap_report_send(udev, iap->option_byte, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_LEAVE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_leave(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get base address to jump */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; + + iap->dev_status[0] = IAP_DEVICE_ID; + iap->dev_status[1] = LEAVE_FINISH; + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); + usbd_disconnect(udev); + + /* reset register */ + register_reset(); + /* jump to target */ + jump_to_execute(iap->base_address); +} + +/*! + \brief handle the IAP_GETBIN_ADDRESS request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_address_send(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->bin_addr[0] = IAP_DEVICE_ID; + /* get app boundary address */ + iap->bin_addr[1] = (uint8_t)(APP_LOADED_ADDR); + iap->bin_addr[2] = (uint8_t)(APP_LOADED_ADDR >> 8U); + iap->bin_addr[3] = (uint8_t)(APP_LOADED_ADDR >> 16U); + iap->bin_addr[4] = (uint8_t)(APP_LOADED_ADDR >> 24U); + + iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_UPLOAD request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_upload(usb_dev *udev) +{ + uint16_t packet_valid_length = 0U, i = 0U; + uint32_t bin_flash_addr = APP_LOADED_ADDR; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->bin_addr[0] = IAP_DEVICE_ID; + /* get target flash address */ + bin_flash_addr = iap->report_buf[2]; + bin_flash_addr |= (uint32_t)iap->report_buf[3] << 8U; + bin_flash_addr |= (uint32_t)iap->report_buf[4] << 16U; + bin_flash_addr |= (uint32_t)iap->report_buf[5] << 24U; + /* get current packet valid length */ + packet_valid_length = iap->report_buf[6]; + packet_valid_length |= iap->report_buf[7] << 8U; + /* get target flash address content */ + for(i = 0; i < packet_valid_length; i++) { + iap->bin_addr[i + 1] = REG8(bin_flash_addr + i); + } + + iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_CHECK_RDP request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_check_rdp(usb_dev *udev) +{ + uint8_t mode = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* check whether the SPC bit of FMC module is normal state */ + if(0xAAU != (uint8_t)(REG16(OPT_BYTE_ADDR1) >> 8U)) { + mode = IS_RDP_MODE; + } else { + mode = IS_NORMAL_MODE; + } + + iap->bin_addr[0] = IAP_DEVICE_ID; + iap->bin_addr[1] = mode; + + iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h new file mode 100644 index 00000000000..a13eba1ee33 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h @@ -0,0 +1,100 @@ +/*! + \file usbd_msc_bbb.h + \brief the header file of the usbd_msc_bbb.c file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_MSC_BBB_H +#define USBD_MSC_BBB_H + +#include "msc_bbb.h" +#include "msc_scsi.h" +#include "usbd_msc_scsi.h" + +/* MSC BBB state */ +enum msc_bbb_state { + BBB_IDLE = 0U, /*!< idle state */ + BBB_DATA_OUT, /*!< data OUT state */ + BBB_DATA_IN, /*!< data IN state */ + BBB_LAST_DATA_IN, /*!< last data IN state */ + BBB_SEND_DATA /*!< send immediate data state */ +}; + +/* MSC BBB status */ +enum msc_bbb_status { + BBB_STATUS_NORMAL = 0U, /*!< normal status */ + BBB_STATUS_RECOVERY, /*!< recovery status*/ + BBB_STATUS_ERROR /*!< error status */ +}; + +typedef struct { + uint8_t bbb_data[MSC_MEDIA_PACKET_SIZE]; /*!< MSC BBB data buff */ + + uint8_t max_lun; /*!< maximum LUN */ + + uint8_t bbb_state; /*!< BBB state */ + uint8_t bbb_status; /*!< BBB status */ + + uint32_t bbb_datalen; /*!< BBB data length */ + + msc_bbb_cbw bbb_cbw; /*!< MSC BBB CBW structural */ + msc_bbb_csw bbb_csw; /*!< MSC BBB CSW structural */ + + uint8_t scsi_sense_head; /*!< SCSI sense header */ + uint8_t scsi_sense_tail; /*!< SCSI sense tail */ + + uint32_t scsi_blk_size[MEM_LUN_NUM]; /*!< SCSI block size */ + uint32_t scsi_blk_nbr[MEM_LUN_NUM]; /*!< SCSI block number */ + + uint32_t scsi_blk_addr; /*!< SCSI block address */ + uint32_t scsi_blk_len; /*!< SCSI block length */ + uint32_t scsi_disk_pop; /*!< SCSI disk pop */ + + msc_scsi_sense scsi_sense[SENSE_LIST_DEEPTH]; /*!< MSC SCSI sense structural buff */ +} usbd_msc_handler; + +/* function declarations */ +/* initialize the BBB process */ +void msc_bbb_init(usb_core_driver *udev); +/* reset the BBB machine */ +void msc_bbb_reset(usb_core_driver *udev); +/* deinitialize the BBB machine */ +void msc_bbb_deinit(usb_core_driver *udev); +/* handle BBB data IN stage */ +void msc_bbb_data_in(usb_core_driver *udev, uint8_t ep_num); +/* handle BBB data OUT stage */ +void msc_bbb_data_out(usb_core_driver *udev, uint8_t ep_num); +/* send the CSW(command status wrapper) */ +void msc_bbb_csw_send(usb_core_driver *udev, uint8_t csw_status); +/* complete the clear feature request */ +void msc_bbb_clrfeature(usb_core_driver *udev, uint8_t ep_num); + +#endif /* USBD_MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h new file mode 100644 index 00000000000..c40bff77f08 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h @@ -0,0 +1,57 @@ +/*! + \file usbd_msc_core.h + \brief the header file of USB MSC device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_MSC_CORE_H +#define USBD_MSC_CORE_H + +#include "usbd_core.h" +#include "usb_msc.h" + +#define USB_MSC_CONFIG_DESC_SIZE 32U /*!< MSC configuration descriptor size */ + +#define MSC_EPIN_SIZE MSC_DATA_PACKET_SIZE /*!< MSC endpoint IN size */ +#define MSC_EPOUT_SIZE MSC_DATA_PACKET_SIZE /*!< MSC endpoint OUT size */ + +/* USB configuration descriptor structure */ +typedef struct { + usb_desc_config config; /*!< configuration descriptor */ + usb_desc_itf msc_itf; /*!< interface descriptor */ + usb_desc_ep msc_epin; /*!< endpoint IN descriptor */ + usb_desc_ep msc_epout; /*!< endpoint OUT descriptor */ +} usb_desc_config_set; + +extern usb_desc msc_desc; +extern usb_class_core msc_class; + +#endif /* USBD_MSC_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h new file mode 100644 index 00000000000..358af93128e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h @@ -0,0 +1,58 @@ +/*! + \file usbd_msc_mem.h + \brief header file for storage memory + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_MSC_MEM_H +#define USBD_MSC_MEM_H + +#include "usbd_conf.h" + +#define USBD_STD_INQUIRY_LENGTH 36U /*!< standard inquiry length */ + +typedef struct { + int8_t (*mem_init)(uint8_t lun); + int8_t (*mem_ready)(uint8_t lun); + int8_t (*mem_protected)(uint8_t lun); + int8_t (*mem_read)(uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_write)(uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_maxlun)(void); + + uint8_t *mem_toc_data; /*!< memory TOC command data pointer */ + uint8_t *mem_inquiry_data[MEM_LUN_NUM]; /*!< memory inquiry data buff */ + uint32_t mem_block_size[MEM_LUN_NUM]; /*!< memory block size buff */ + uint32_t mem_block_len[MEM_LUN_NUM]; /*!< memory block length buff */ +}usbd_mem_cb; + +extern usbd_mem_cb *usbd_mem_fops; + +#endif /* USBD_MSC_MEM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h new file mode 100644 index 00000000000..180685f9f91 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h @@ -0,0 +1,53 @@ +/*! + \file usbd_msc_scsi.h + \brief the header file of the usbd_msc_scsi.c file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_MSC_SCSI_H +#define USBD_MSC_SCSI_H + +#include "usbd_core.h" + +#define SENSE_LIST_DEEPTH 4U /*!< sense list deepth */ + +#define MODE_SENSE6_LENGTH 8U /*!< sense6 mode length */ +#define MODE_SENSE10_LENGTH 8U /*!< sense10 mode length */ +#define INQUIRY_PAGE00_LENGTH 96U /*!< sense page 0 inquiry length */ +#define FORMAT_CAPACITIES_LENGTH 20U /*!< format capacities length */ + +/* function declarations */ +/* process SCSI commands */ +int8_t scsi_process_cmd(usb_core_driver *udev, uint8_t lun, uint8_t *cmd); +/* load the last error code in the error list */ +void scsi_sense_code(usb_core_driver *udev, uint8_t lun, uint8_t skey, uint8_t asc); + +#endif /* USBD_MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c new file mode 100644 index 00000000000..2a00a8f6f55 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c @@ -0,0 +1,287 @@ +/*! + \file usbd_msc_bbb.c + \brief USB BBB(Bulk/Bulk/Bulk) protocol core functions + \note BBB means Bulk-only transport protocol for USB MSC + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_bbb.h" +#include "usbd_msc_mem.h" + +/* local function prototypes ('static') */ +static void msc_bbb_cbw_decode(usb_core_driver *udev); +static void msc_bbb_data_send(usb_core_driver *udev, uint8_t *pbuf, uint32_t Len); +static void msc_bbb_abort(usb_core_driver *udev); + +/*! + \brief initialize the BBB process + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_init(usb_core_driver *udev) +{ + uint8_t lun_num; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; + msc->bbb_status = BBB_STATUS_NORMAL; + + /* initializes the storage logic unit */ + for(lun_num = 0U; lun_num < MEM_LUN_NUM; lun_num++) { + usbd_mem_fops->mem_init(lun_num); + } + + /* flush the RX FIFO */ + usbd_fifo_flush(udev, MSC_OUT_EP); + + /* flush the TX FIFO */ + usbd_fifo_flush(udev, MSC_IN_EP); + + /* prepare endpoint to receive the first BBB CBW */ + usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief reset the BBB machine + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_reset(usb_core_driver *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; + msc->bbb_status = BBB_STATUS_RECOVERY; + + /* prepare endpoint to receive the first BBB command */ + usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief deinitialize the BBB machine + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_deinit(usb_core_driver *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; +} + +/*! + \brief handle BBB data IN stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_in(usb_core_driver *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + switch(msc->bbb_state) { + case BBB_DATA_IN: + if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send(udev, CSW_CMD_FAILED); + } + break; + + case BBB_SEND_DATA: + case BBB_LAST_DATA_IN: + msc_bbb_csw_send(udev, CSW_CMD_PASSED); + break; + + default: + break; + } +} + +/*! + \brief handle BBB data OUT stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_out(usb_core_driver *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + switch(msc->bbb_state) { + case BBB_IDLE: + msc_bbb_cbw_decode(udev); + break; + + case BBB_DATA_OUT: + if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send(udev, CSW_CMD_FAILED); + } + break; + + default: + break; + } +} + +/*! + \brief send the CSW(command status wrapper) + \param[in] udev: pointer to USB device instance + \param[in] csw_status: CSW status + \param[out] none + \retval none +*/ +void msc_bbb_csw_send(usb_core_driver *udev, uint8_t csw_status) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_csw.dCSWSignature = BBB_CSW_SIGNATURE; + msc->bbb_csw.bCSWStatus = csw_status; + msc->bbb_state = BBB_IDLE; + + usbd_ep_send(udev, MSC_IN_EP, (uint8_t *)&msc->bbb_csw, BBB_CSW_LENGTH); + + /* prepare endpoint to receive next command */ + usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief complete the clear feature request + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_clrfeature(usb_core_driver *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if(BBB_STATUS_ERROR == msc->bbb_status) { /* bad CBW signature */ + usbd_ep_stall(udev, MSC_IN_EP); + + msc->bbb_status = BBB_STATUS_NORMAL; + } else if((0x80U == (ep_num & 0x80U)) && (BBB_STATUS_RECOVERY != msc->bbb_status)) { + msc_bbb_csw_send(udev, CSW_CMD_FAILED); + } else { + + } +} + +/*! + \brief decode the CBW command and set the BBB state machine accordingly + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_cbw_decode(usb_core_driver *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_csw.dCSWTag = msc->bbb_cbw.dCBWTag; + msc->bbb_csw.dCSWDataResidue = msc->bbb_cbw.dCBWDataTransferLength; + + if((BBB_CBW_LENGTH != usbd_rxcount_get(udev, MSC_OUT_EP)) || \ + (BBB_CBW_SIGNATURE != msc->bbb_cbw.dCBWSignature) || \ + (msc->bbb_cbw.bCBWLUN > 1U) || \ + (msc->bbb_cbw.bCBWCBLength < 1U) || \ + (msc->bbb_cbw.bCBWCBLength > 16U)) { + /* illegal command handler */ + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + msc->bbb_status = BBB_STATUS_ERROR; + + msc_bbb_abort(udev); + } else { + if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_abort(udev); + } else if((BBB_DATA_IN != msc->bbb_state) && \ + (BBB_DATA_OUT != msc->bbb_state) && \ + (BBB_LAST_DATA_IN != msc->bbb_state)) { /* burst transfer handled internally */ + if(msc->bbb_datalen > 0U) { + msc_bbb_data_send(udev, msc->bbb_data, msc->bbb_datalen); + } else if(0U == msc->bbb_datalen) { + msc_bbb_csw_send(udev, CSW_CMD_PASSED); + } else { + + } + } else { + + } + } +} + +/*! + \brief send the requested data + \param[in] udev: pointer to USB device instance + \param[in] buf: pointer to data buffer + \param[in] len: data length + \param[out] none + \retval none +*/ +static void msc_bbb_data_send(usb_core_driver *udev, uint8_t *buf, uint32_t len) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + len = USB_MIN(msc->bbb_cbw.dCBWDataTransferLength, len); + + msc->bbb_csw.dCSWDataResidue -= len; + msc->bbb_csw.bCSWStatus = CSW_CMD_PASSED; + msc->bbb_state = BBB_SEND_DATA; + + usbd_ep_send(udev, MSC_IN_EP, buf, len); +} + +/*! + \brief abort the current transfer + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_abort(usb_core_driver *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if((0U == msc->bbb_cbw.bmCBWFlags) && \ + (0U != msc->bbb_cbw.dCBWDataTransferLength) && \ + (BBB_STATUS_NORMAL == msc->bbb_status)) { + usbd_ep_stall(udev, MSC_OUT_EP); + } + + usbd_ep_stall(udev, MSC_IN_EP); + + if(BBB_STATUS_ERROR == msc->bbb_status) { + usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c new file mode 100644 index 00000000000..8b063b943d7 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c @@ -0,0 +1,395 @@ +/*! + \file usbd_msc_core.c + \brief USB MSC device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "usbd_enum.h" +#include "usbd_msc_bbb.h" +#include "usbd_msc_core.h" +#include "usbd_msc_mem.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028FU + +/* local function prototypes ('static') */ +static uint8_t msc_core_init(usb_dev *udev, uint8_t config_index); +static uint8_t msc_core_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t msc_core_req(usb_dev *udev, usb_req *req); +static uint8_t msc_core_in(usb_dev *udev, uint8_t ep_num); +static uint8_t msc_core_out(usb_dev *udev, uint8_t ep_num); + +usb_class_core msc_class = { + .init = msc_core_init, + .deinit = msc_core_deinit, + + .req_proc = msc_core_req, + + .data_in = msc_core_in, + .data_out = msc_core_out +}; + +/* note: it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev msc_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_desc_config_set msc_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .msc_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_MSC, + .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, + .iInterface = 0x00U + }, + + .msc_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPIN_SIZE, + .bInterval = 0x00U + }, + + .msc_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPOUT_SIZE, + .bInterval = 0x00U + } +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_desc_config_set other_speed_msc_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_OTHER_SPD_CONFIG + }, + .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .msc_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_MSC, + .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, + .iInterface = 0x00U + }, + + .msc_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = 64U, + .bInterval = 0x00U + }, + + .msc_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = 64U, + .bInterval = 0x00U + } +}; + +__ALIGN_BEGIN const uint8_t usbd_qualifier_desc[10] __ALIGN_END = { + 0x0AU, + 0x06U, + 0x00U, + 0x02U, + 0x00U, + 0x00U, + 0x00U, + 0x40U, + 0x01U, + 0x00U +}; + +/* USB language ID descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'M', 'S', 'C'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB string descriptor */ +static void *const usbd_msc_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc msc_desc = { + .dev_desc = (uint8_t *)&msc_dev_desc, + .config_desc = (uint8_t *)&msc_config_desc, + +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + .other_speed_config_desc = (uint8_t *)&other_speed_msc_config_desc, + .qualifier_desc = (uint8_t *)&usbd_qualifier_desc, +#endif /* USE_USB_HS && USE_ULPI_PHY */ + + .strings = usbd_msc_strings +}; + +static __ALIGN_BEGIN uint8_t usbd_msc_maxlun __ALIGN_END = 0U ; + +/*! + \brief initialize the MSC device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_init(usb_dev *udev, uint8_t config_index) +{ + static __ALIGN_BEGIN usbd_msc_handler msc_handler __ALIGN_END; + + memset((void *)&msc_handler, 0U, sizeof(usbd_msc_handler)); + + udev->dev.class_data[USBD_MSC_INTERFACE] = (void *)&msc_handler; + + /* configure MSC TX endpoint */ + usbd_ep_setup(udev, &(msc_config_desc.msc_epin)); + + /* configure MSC RX endpoint */ + usbd_ep_setup(udev, &(msc_config_desc.msc_epout)); + + /* initialize the BBB layer */ + msc_bbb_init(udev); + + return USBD_OK; +} + +/*! + \brief deinitialize the MSC device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_deinit(usb_dev *udev, uint8_t config_index) +{ + /* clear MSC endpoints */ + usbd_ep_clear(udev, MSC_IN_EP); + usbd_ep_clear(udev, MSC_OUT_EP); + + /* deinitialize the BBB layer */ + msc_bbb_deinit(udev); + + return USBD_OK; +} + +/*! + \brief handle the MSC class-specific and standard requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_req(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + switch(req->bRequest) { + case BBB_GET_MAX_LUN : + if((0U == req->wValue) && \ + (1U == req->wLength) && \ + (0x80U == (req->bmRequestType & 0x80U))) { + usbd_msc_maxlun = (uint8_t)usbd_mem_fops->mem_maxlun(); + + transc->xfer_buf = &usbd_msc_maxlun; + transc->remain_len = 1U; + } else { + return USBD_FAIL; + } + break; + + case BBB_RESET : + if((0U == req->wValue) && \ + (0U == req->wLength) && \ + (0x80U != (req->bmRequestType & 0x80U))) { + msc_bbb_reset(udev); + } else { + return USBD_FAIL; + } + break; + + case USB_CLEAR_FEATURE: + msc_bbb_clrfeature(udev, (uint8_t)req->wIndex); + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data IN stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static uint8_t msc_core_in(usb_dev *udev, uint8_t ep_num) +{ + msc_bbb_data_in(udev, ep_num); + + return USBD_OK; +} + +/*! + \brief handle data OUT stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static uint8_t msc_core_out(usb_dev *udev, uint8_t ep_num) +{ + msc_bbb_data_out(udev, ep_num); + + return USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c new file mode 100644 index 00000000000..36cef6309d2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c @@ -0,0 +1,758 @@ +/*! + \file usbd_msc_scsi.c + \brief USB SCSI layer functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_mem.h" +#include "usbd_msc_bbb.h" +#include "usbd_msc_scsi.h" + +/* USB mass storage page 0 inquiry data */ +const uint8_t msc_page00_inquiry_data[] = { + 0x00U, + 0x00U, + 0x00U, + 0x00U, + (INQUIRY_PAGE00_LENGTH - 4U), + 0x80U, + 0x83U +}; + +/* USB mass storage sense 6 data */ +const uint8_t msc_mode_sense6_data[] = { + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U +}; + +/* USB mass storage sense 10 data */ +const uint8_t msc_mode_sense10_data[] = { + 0x00U, + 0x06U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U +}; + +/* local function prototypes ('static') */ +static int8_t scsi_test_unit_ready(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_select6(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_select10(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_inquiry(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read_format_capacity(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read_capacity10(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_request_sense(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense6(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_toc_cmd_read(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense10(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_write10(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read10(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_verify10(usb_core_driver *udev, uint8_t lun, uint8_t *params); + +static int8_t scsi_process_read(usb_core_driver *udev, uint8_t lun); +static int8_t scsi_process_write(usb_core_driver *udev, uint8_t lun); + +static inline int8_t scsi_check_address_range(usb_core_driver *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr); +static inline int8_t scsi_format_cmd(usb_core_driver *udev, uint8_t lun); +static inline int8_t scsi_start_stop_unit(usb_core_driver *udev, uint8_t lun, uint8_t *params); +static inline int8_t scsi_allow_medium_removal(usb_core_driver *udev, uint8_t lun, uint8_t *params); + +/*! + \brief process SCSI commands + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +int8_t scsi_process_cmd(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + switch(params[0]) { + case SCSI_TEST_UNIT_READY: + return scsi_test_unit_ready(udev, lun, params); + + case SCSI_REQUEST_SENSE: + return scsi_request_sense(udev, lun, params); + + case SCSI_INQUIRY: + return scsi_inquiry(udev, lun, params); + + case SCSI_START_STOP_UNIT: + return scsi_start_stop_unit(udev, lun, params); + + case SCSI_ALLOW_MEDIUM_REMOVAL: + return scsi_allow_medium_removal(udev, lun, params); + + case SCSI_MODE_SENSE6: + return scsi_mode_sense6(udev, lun, params); + + case SCSI_MODE_SENSE10: + return scsi_mode_sense10(udev, lun, params); + + case SCSI_READ_FORMAT_CAPACITIES: + return scsi_read_format_capacity(udev, lun, params); + + case SCSI_READ_CAPACITY10: + return scsi_read_capacity10(udev, lun, params); + + case SCSI_READ10: + return scsi_read10(udev, lun, params); + + case SCSI_WRITE10: + return scsi_write10(udev, lun, params); + + case SCSI_VERIFY10: + return scsi_verify10(udev, lun, params); + + case SCSI_FORMAT_UNIT: + return scsi_format_cmd(udev, lun); + + case SCSI_READ_TOC_DATA: + return scsi_toc_cmd_read(udev, lun, params); + + case SCSI_MODE_SELECT6: + return scsi_mode_select6(udev, lun, params); + + case SCSI_MODE_SELECT10: + return scsi_mode_select10(udev, lun, params); + + default: + scsi_sense_code(udev, lun, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } +} + +/*! + \brief load the last error code in the error list + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] skey: sense key + \param[in] asc: additional sense key + \param[out] none + \retval none +*/ +void scsi_sense_code(usb_core_driver *udev, uint8_t lun, uint8_t skey, uint8_t asc) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->scsi_sense[msc->scsi_sense_tail].SenseKey = skey; + msc->scsi_sense[msc->scsi_sense_tail].ASC = asc; + msc->scsi_sense_tail++; + + if(SENSE_LIST_DEEPTH == msc->scsi_sense_tail) { + msc->scsi_sense_tail = 0U; + } +} + +/*! + \brief process SCSI Test Unit Ready command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_test_unit_ready(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + /* case 9 : Hi > D0 */ + if(0U != msc->bbb_cbw.dCBWDataTransferLength) { + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if(0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process mode select 6 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_select6(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process mode select 10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_select10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Inquiry command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_inquiry(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint8_t *page = NULL; + uint16_t len = 0U; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if(params[1] & 0x01U) { + page = (uint8_t *)msc_page00_inquiry_data; + + len = INQUIRY_PAGE00_LENGTH; + } else { + page = (uint8_t *)usbd_mem_fops->mem_inquiry_data[lun]; + + len = (uint16_t)(page[4] + 5U); + + if(params[4] <= len) { + len = params[4]; + } + } + + msc->bbb_datalen = len; + + while(len) { + len--; + msc->bbb_data[len] = page[len]; + } + + return 0; +} + +/*! + \brief process Read Capacity 10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read_capacity10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun] - 1U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->scsi_blk_nbr[lun] = usbd_mem_fops->mem_block_len[lun]; + msc->scsi_blk_size[lun] = usbd_mem_fops->mem_block_size[lun]; + + msc->bbb_data[0] = (uint8_t)(blk_num >> 24); + msc->bbb_data[1] = (uint8_t)(blk_num >> 16); + msc->bbb_data[2] = (uint8_t)(blk_num >> 8); + msc->bbb_data[3] = (uint8_t)(blk_num); + + msc->bbb_data[4] = (uint8_t)(msc->scsi_blk_size[lun] >> 24); + msc->bbb_data[5] = (uint8_t)(msc->scsi_blk_size[lun] >> 16); + msc->bbb_data[6] = (uint8_t)(msc->scsi_blk_size[lun] >> 8); + msc->bbb_data[7] = (uint8_t)(msc->scsi_blk_size[lun]); + + msc->bbb_datalen = 8U; + + return 0; +} + +/*! + \brief process Read Format Capacity command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read_format_capacity(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint16_t i = 0U; + uint32_t blk_size = usbd_mem_fops->mem_block_size[lun]; + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun]; + uint32_t blk_nbr = blk_num - 1U; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + for(i = 0U; i < 12U; i++) { + msc->bbb_data[i] = 0U; + } + + msc->bbb_data[3] = 0x08U; + msc->bbb_data[4] = (uint8_t)(blk_nbr >> 24); + msc->bbb_data[5] = (uint8_t)(blk_nbr >> 16); + msc->bbb_data[6] = (uint8_t)(blk_nbr >> 8); + msc->bbb_data[7] = (uint8_t)(blk_nbr); + + msc->bbb_data[8] = 0x02U; + msc->bbb_data[9] = (uint8_t)(blk_size >> 16); + msc->bbb_data[10] = (uint8_t)(blk_size >> 8); + msc->bbb_data[11] = (uint8_t)(blk_size); + + msc->bbb_datalen = 12U; + + return 0; +} + +/*! + \brief process Mode Sense6 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_sense6(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = len; + + while(len) { + len--; + msc->bbb_data[len] = msc_mode_sense6_data[len]; + } + + return 0; +} + +/*! + \brief process Mode Sense10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_sense10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = len; + + while(len) { + len--; + msc->bbb_data[len] = msc_mode_sense10_data[len]; + } + + return 0; +} + +/*! + \brief process Request Sense command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_request_sense(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint8_t i = 0U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + for(i = 0U; i < REQUEST_SENSE_DATA_LEN; i++) { + msc->bbb_data[i] = 0U; + } + + msc->bbb_data[0] = 0x70U; + msc->bbb_data[7] = REQUEST_SENSE_DATA_LEN - 6U; + + if((msc->scsi_sense_head != msc->scsi_sense_tail)) { + msc->bbb_data[2] = msc->scsi_sense[msc->scsi_sense_head].SenseKey; + msc->bbb_data[12] = msc->scsi_sense[msc->scsi_sense_head].ASC; + msc->bbb_data[13] = msc->scsi_sense[msc->scsi_sense_head].ASCQ; + msc->scsi_sense_head++; + + if(SENSE_LIST_DEEPTH == msc->scsi_sense_head) { + msc->scsi_sense_head = 0U; + } + } + + msc->bbb_datalen = USB_MIN(REQUEST_SENSE_DATA_LEN, params[4]); + + return 0; +} + +/*! + \brief process Start Stop Unit command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static inline int8_t scsi_start_stop_unit(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + msc->scsi_disk_pop = 1U; + + return 0; +} + +/*! + \brief process Allow Medium Removal command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static inline int8_t scsi_allow_medium_removal(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Read10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if(BBB_IDLE == msc->bbb_state) { + /* direction is from device to host */ + if(0x80U != (msc->bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if(0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + msc->scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ + (params[4] << 8) | params[5]; + + msc->scsi_blk_len = (params[7] << 8) | params[8]; + + if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->bbb_state = BBB_DATA_IN; + + msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; + msc->scsi_blk_len *= msc->scsi_blk_size[lun]; + + /* cases 4,5 : Hi <> Dn */ + if(msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + } + + msc->bbb_datalen = MSC_MEDIA_PACKET_SIZE; + + return scsi_process_read(udev, lun); +} + +/*! + \brief process Write10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_write10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if(BBB_IDLE == msc->bbb_state) { + /* case 8 : Hi <> Do */ + if(0x80U == (msc->bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* check whether media is ready */ + if(0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + /* check if media is write-protected */ + if(0 != usbd_mem_fops->mem_protected(lun)) { + scsi_sense_code(udev, lun, NOT_READY, WRITE_PROTECTED); + + return -1; + } + + msc->scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ + (params[4] << 8) | params[5]; + + msc->scsi_blk_len = (params[7] << 8) | params[8]; + + /* check if LBA address is in the right range */ + if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; + msc->scsi_blk_len *= msc->scsi_blk_size[lun]; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if(msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { + scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* prepare endpoint to receive first data packet */ + msc->bbb_state = BBB_DATA_OUT; + + usbd_ep_recev(udev, \ + MSC_OUT_EP, \ + msc->bbb_data, \ + USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } else { /* write process ongoing */ + return scsi_process_write(udev, lun); + } + + return 0; +} + +/*! + \brief process Verify10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_verify10(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if(0x02U == (params[1] & 0x02U)) { + scsi_sense_code(udev, lun, ILLEGAL_REQUEST, INVALID_FIELD_IN_COMMAND); + + return -1; /* error, verify mode not supported*/ + } + + if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief check address range + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] blk_offset: block offset + \param[in] blk_nbr: number of block to be processed + \param[out] none + \retval status +*/ +static inline int8_t scsi_check_address_range(usb_core_driver *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + if((blk_offset + blk_nbr) > msc->scsi_blk_nbr[lun]) { + scsi_sense_code(udev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + + return -1; + } + + return 0; +} + +/*! + \brief handle read process + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_process_read(usb_core_driver *udev, uint8_t lun) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if(usbd_mem_fops->mem_read(lun, \ + msc->bbb_data, \ + msc->scsi_blk_addr, \ + (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { + scsi_sense_code(udev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); + + return -1; + } + + usbd_ep_send(udev, MSC_IN_EP, msc->bbb_data, len); + + msc->scsi_blk_addr += len; + msc->scsi_blk_len -= len; + + /* case 6 : Hi = Di */ + msc->bbb_csw.dCSWDataResidue -= len; + + if(0U == msc->scsi_blk_len) { + msc->bbb_state = BBB_LAST_DATA_IN; + } + + return 0; +} + +/*! + \brief handle write process + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_process_write(usb_core_driver *udev, uint8_t lun) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if(usbd_mem_fops->mem_write(lun, \ + msc->bbb_data, \ + msc->scsi_blk_addr, \ + (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { + scsi_sense_code(udev, lun, HARDWARE_ERROR, WRITE_FAULT); + + return -1; + } + + msc->scsi_blk_addr += len; + msc->scsi_blk_len -= len; + + /* case 12 : Ho = Do */ + msc->bbb_csw.dCSWDataResidue -= len; + + if(0U == msc->scsi_blk_len) { + msc_bbb_csw_send(udev, CSW_CMD_PASSED); + } else { + /* prepare endpoint to receive next packet */ + usbd_ep_recev(udev, \ + MSC_OUT_EP, \ + msc->bbb_data, \ + USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } + + return 0; +} + +/*! + \brief process Format Unit command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static inline int8_t scsi_format_cmd(usb_core_driver *udev, uint8_t lun) +{ + return 0; +} + +/*! + \brief process Read_Toc command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_toc_cmd_read(usb_core_driver *udev, uint8_t lun, uint8_t *params) +{ + uint8_t *pPage; + uint16_t len; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; + + pPage = (uint8_t *)&usbd_mem_fops->mem_toc_data[lun * READ_TOC_CMD_LEN]; + len = (uint16_t)pPage[1] + 2U; + + msc->bbb_datalen = len; + + while(len) { + len--; + msc->bbb_data[len] = pPage[len]; + } + + return 0; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h new file mode 100644 index 00000000000..d3799652321 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h @@ -0,0 +1,78 @@ +/*! + \file printer_core.h + \brief the header file of USB printer device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef PRINTER_CORE_H +#define PRINTER_CORE_H + +#include "usbd_enum.h" + +/* USB printing device class code */ +#define USB_CLASS_PRINTER 0x07U + +/* printing device subclass code */ +#define USB_SUBCLASS_PRINTER 0x01U + +/* printing device protocol code */ +#define PROTOCOL_UNIDIRECTIONAL_ITF 0x01U /*!< unidirectional interface */ +#define PROTOCOL_BI_DIRECTIONAL_ITF 0x02U /*!< BI directional interface */ +#define PROTOCOL_1284_4_ITF 0x03U /*!< 1284.4 interface */ +#define PROTOCOL_VENDOR 0xFFU /*!< vendor */ + +/* device id length */ +#define DEVICE_ID_LEN 103U + +/* printer configuration descriptor length */ +#define USB_PRINTER_CONFIG_DESC_LEN 32U + +/* printing device specific-class request */ +#define GET_DEVICE_ID 0x00U /*!< get device id request */ +#define GET_PORT_STATUS 0x01U /*!< get port status request */ +#define SOFT_RESET 0x02U /*!< soft reset request */ + +#pragma pack(1) + +/* USB configuration descriptor structure */ +typedef struct { + usb_desc_config config; /*!< printer configuration descriptor */ + usb_desc_itf printer_itf; /*!< printer interface descriptor */ + usb_desc_ep printer_epin; /*!< endpoint IN descriptor */ + usb_desc_ep printer_epout; /*!< endpoint OUT descriptor */ +} usb_printer_desc_config_set; + +#pragma pack() + +extern usb_desc printer_desc; +extern usb_class_core usbd_printer_cb; + +#endif /* PRINTER_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c new file mode 100644 index 00000000000..175c9d7a5b5 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c @@ -0,0 +1,302 @@ +/*! + \file printer_core.c + \brief USB printer device class core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "printer_core.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028DU + +/* printer port status: paper not empty/selected/no error */ +static uint8_t g_port_status = 0x18U; + +uint8_t g_printer_data_buf[PRINTER_OUT_PACKET]; + +__ALIGN_BEGIN uint8_t PRINTER_DEVICE_ID[DEVICE_ID_LEN] __ALIGN_END = { + 0x00U, 0x67U, + 'M', 'A', 'N', 'U', 'F', 'A', 'C', 'T', 'U', 'R', 'E', 'R', ':', + 'G', 'I', 'G', 'A', ' ', 'D', 'E', 'V', 'I', 'C', 'E', '-', ';', + 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'C', 'L', ',', 'M', 'P', 'L', ';', + 'M', 'O', 'D', 'E', 'L', ':', + 'L', 'a', 's', 'e', 'r', 'B', 'e', 'a', 'm', '?', ';', + 'C', 'O', 'M', 'M', 'E', 'N', 'T', ':', + 'G', 'o', 'o', 'd', ' ', '!', ';', + 'A', 'C', 'T', 'I', 'V', 'E', ' ', 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'C', 'L', ';' +}; + +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev printer_dev_desc __ALIGN_END = { + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +__ALIGN_BEGIN const usb_printer_desc_config_set printer_config_desc __ALIGN_END = { + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_PRINTER_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .printer_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_PRINTER, + .bInterfaceSubClass = USB_SUBCLASS_PRINTER, + .bInterfaceProtocol = PROTOCOL_BI_DIRECTIONAL_ITF, + .iInterface = 0x00U + }, + + .printer_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = PRINTER_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = PRINTER_IN_PACKET, + .bInterval = 0x00U + }, + + .printer_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = PRINTER_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = PRINTER_OUT_PACKET, + .bInterval = 0x00U + }, +}; + +/* USB language ID Descriptor */ +static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(16U), + .bDescriptorType = USB_DESCTYPE_STR + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'P', 'r', 'i', 'n', 't', 'e', 'r'} +}; + +/* USBD serial string */ +static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR + } +}; + +/* USB string descriptor */ +static void *const usbd_printer_strings[] = { + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc printer_desc = { + .dev_desc = (uint8_t *)&printer_dev_desc, + .config_desc = (uint8_t *)&printer_config_desc, + .strings = usbd_printer_strings +}; + +/* local function prototypes ('static') */ +static uint8_t printer_init(usb_dev *udev, uint8_t config_index); +static uint8_t printer_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t printer_req(usb_dev *udev, usb_req *req); +static uint8_t printer_in(usb_dev *udev, uint8_t ep_num); +static uint8_t printer_out(usb_dev *udev, uint8_t ep_num); + +usb_class_core usbd_printer_cb = { + .init = printer_init, + .deinit = printer_deinit, + + .req_proc = printer_req, + + .data_in = printer_in, + .data_out = printer_out +}; + +/*! + \brief initialize the printer device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_init(usb_dev *udev, uint8_t config_index) +{ + /* initialize the data TX endpoint */ + usbd_ep_setup(udev, &(printer_config_desc.printer_epin)); + + /* initialize the data RX endpoint */ + usbd_ep_setup(udev, &(printer_config_desc.printer_epout)); + + /* prepare to receive data */ + usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); + + return USBD_OK; +} + +/*! + \brief deinitialize the printer device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_deinit(usb_dev *udev, uint8_t config_index) +{ + /* deinitialize the data TX/RX endpoint */ + usbd_ep_clear(udev, PRINTER_IN_EP); + usbd_ep_clear(udev, PRINTER_OUT_EP); + + return USBD_OK; +} + +/*! + \brief handle the printer class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_req(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + switch(req->bRequest) { + case GET_DEVICE_ID: + transc->xfer_buf = (uint8_t *)PRINTER_DEVICE_ID; + transc->remain_len = DEVICE_ID_LEN; + break; + + case GET_PORT_STATUS: + transc->xfer_buf = (uint8_t *)&g_port_status; + transc->remain_len = 1U; + break; + + case SOFT_RESET: + usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle printer data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_in(usb_dev *udev, uint8_t ep_num) +{ + return USBD_OK; +} + +/*! + \brief handle printer data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_out(usb_dev *udev, uint8_t ep_num) +{ + return USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h new file mode 100644 index 00000000000..6a610f8c8a5 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h @@ -0,0 +1,102 @@ +/*! + \file usbd_core.h + \brief USB device mode core functions prototype + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_CORE_H +#define USBD_CORE_H + +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +typedef enum { + USBD_OK = 0U, /*!< status OK */ + USBD_BUSY, /*!< status busy */ + USBD_FAIL /*!< status fail */ +} usbd_status; + +enum _usbd_status { + USBD_DEFAULT = 1U, /*!< default status */ + USBD_ADDRESSED = 2U, /*!< address send status */ + USBD_CONFIGURED = 3U, /*!< configured status */ + USBD_SUSPENDED = 4U /*!< suspended status */ +}; + +/* static inline function definitions */ + +/*! + \brief set USB device address + \param[in] udev: pointer to USB core instance + \param[in] addr: device address to set + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_addr_set(usb_core_driver *udev, uint8_t addr) +{ + usb_devaddr_set(udev, addr); +} + +/*! + \brief get the received data length + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval received data length +*/ +__STATIC_INLINE uint16_t usbd_rxcount_get(usb_core_driver *udev, uint8_t ep_num) +{ + return (uint16_t)udev->dev.transc_out[ep_num].xfer_count; +} + +/* function declarations */ +/* initializes the USB device-mode stack and load the class driver */ +void usbd_init(usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core); +/* endpoint initialization */ +uint32_t usbd_ep_setup(usb_core_driver *udev, const usb_desc_ep *ep_desc); +/* configure the endpoint when it is disabled */ +uint32_t usbd_ep_clear(usb_core_driver *udev, uint8_t ep_addr); +/* endpoint prepare to receive data */ +uint32_t usbd_ep_recev(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len); +/* endpoint prepare to transmit data */ +uint32_t usbd_ep_send(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len); +/* set an endpoint to STALL status */ +uint32_t usbd_ep_stall(usb_core_driver *udev, uint8_t ep_addr); +/* clear endpoint STALLed status */ +uint32_t usbd_ep_stall_clear(usb_core_driver *udev, uint8_t ep_addr); +/* flush the endpoint FIFOs */ +uint32_t usbd_fifo_flush(usb_core_driver *udev, uint8_t ep_addr); +/* device connect */ +void usbd_connect(usb_core_driver *udev); +/* device disconnect */ +void usbd_disconnect(usb_core_driver *udev); + +#endif /* USBD_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h new file mode 100644 index 00000000000..b68d82744fa --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h @@ -0,0 +1,98 @@ +/*! + \file usbd_enum.h + \brief USB enumeration definitions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_ENUM_H +#define USBD_ENUM_H + +#include "usbd_core.h" +#include + +typedef enum _usb_reqsta { + REQ_SUPP = 0x0U, /*!< request support */ + REQ_NOTSUPP = 0x1U /*!< request not support */ +} usb_reqsta; + +/* string descriptor index */ +enum _str_index { + STR_IDX_LANGID = 0x00U, /*!< language ID string index */ + STR_IDX_MFC = 0x01U, /*!< manufacturer string index */ + STR_IDX_PRODUCT = 0x02U, /*!< product string index */ + STR_IDX_SERIAL = 0x03U, /*!< serial string index */ + STR_IDX_CONFIG = 0x04U, /*!< configuration string index */ + STR_IDX_ITF = 0x05U, /*!< interface string index */ +#ifndef WINUSB_EXEMPT_DRIVER + STR_IDX_MAX = 0x0AU, /*!< string maximum index */ +#else + STR_IDX_MAX = 0xEFU /*!< string maximum index */ +#endif /* WINUSB_EXEMPT_DRIVER */ +}; + +typedef enum _usb_pwrsta { + USB_PWRSTA_SELF_POWERED = 0x1U, /*!< USB is in self powered status */ + USB_PWRSTA_REMOTE_WAKEUP = 0x2U /*!< USB is in remote wakeup status */ +} usb_pwrsta; + +typedef enum _usb_feature { + USB_FEATURE_EP_HALT = 0x0U, /*!< USB has endpoint halt feature */ + USB_FEATURE_REMOTE_WAKEUP = 0x1U, /*!< USB has endpoint remote wakeup feature */ + USB_FEATURE_TEST_MODE = 0x2U /*!< USB has endpoint test mode feature */ +} usb_feature; + +#define ENG_LANGID 0x0409U /*!< english language ID */ +#define CHN_LANGID 0x0804U /*!< chinese language ID */ + +/* USB device exported macros */ +#define CTL_EP(ep) ((0x00U == (ep)) || (0x80U == (ep))) + +#define DEVICE_ID1 (0x1FFF7A1BU) /*!< device ID1 */ +#define DEVICE_ID2 (0x1FFF7A1FU) /*!< device ID2 */ +#define DEVICE_ID3 (0x1FFF7A23U) /*!< device ID3 */ + +#define DEVICE_ID (0x40023D00U) /*!< product reserved ID */ + +/* function declarations */ +/* handle USB standard device request */ +usb_reqsta usbd_standard_request(usb_core_driver *udev, usb_req *req); +/* handle USB device class request */ +usb_reqsta usbd_class_request(usb_core_driver *udev, usb_req *req); +/* handle USB vendor request */ +usb_reqsta usbd_vendor_request(usb_core_driver *udev, usb_req *req); +/* handle USB enumeration error */ +void usbd_enum_error(usb_core_driver *udev, usb_req *req); +/* convert hex 32bits value into Unicode char */ +void int_to_unicode(uint32_t value, uint8_t *pbuf, uint8_t len); +/* get serial string */ +void serial_string_get(uint16_t *unicode_str); + +#endif /* USBD_ENUM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h new file mode 100644 index 00000000000..8364f38f733 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h @@ -0,0 +1,56 @@ +/*! + \file usbd_transc.h + \brief USB transaction core functions prototype + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_TRANSC_H +#define USBD_TRANSC_H + +#include "usbd_core.h" + +/* function declarations */ +/* USB send data in the control transaction */ +usbd_status usbd_ctl_send(usb_core_driver *udev); +/* USB receive data in the control transaction */ +usbd_status usbd_ctl_recev(usb_core_driver *udev); +/* USB send control transaction status */ +usbd_status usbd_ctl_status_send(usb_core_driver *udev); +/* USB control receive status */ +usbd_status usbd_ctl_status_recev(usb_core_driver *udev); +/* USB SETUP stage processing */ +uint8_t usbd_setup_transc(usb_core_driver *udev); +/* data OUT stage processing */ +uint8_t usbd_out_transc(usb_core_driver *udev, uint8_t ep_num); +/* data IN stage processing */ +uint8_t usbd_in_transc(usb_core_driver *udev, uint8_t ep_num); + +#endif /* USBD_TRANSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c new file mode 100644 index 00000000000..eccc9b0ba65 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c @@ -0,0 +1,320 @@ +/*! + \file usbd_core.c + \brief USB device mode core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_core.h" +#include "usbd_enum.h" +#include "drv_usb_hw.h" + +/* endpoint type */ +const uint32_t ep_type[] = { + [USB_EP_ATTR_CTL] = (uint32_t)USB_EPTYPE_CTRL, + [USB_EP_ATTR_BULK] = (uint32_t)USB_EPTYPE_BULK, + [USB_EP_ATTR_INT] = (uint32_t)USB_EPTYPE_INTR, + [USB_EP_ATTR_ISO] = (uint32_t)USB_EPTYPE_ISOC +}; + +/*! + \brief initializes the USB device-mode stack and load the class driver + \param[in] udev: pointer to USB core instance + \param[in] core: USB core type + \param[in] desc: pointer to USB descriptor + \param[in] class_core: class driver + \param[out] none + \retval none +*/ +void usbd_init(usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core) +{ + udev->dev.desc = desc; + + /* class callbacks */ + udev->dev.class_core = class_core; + + /* create serial string */ + serial_string_get(udev->dev.desc->strings[STR_IDX_SERIAL]); + + /* configure USB capabilities */ + (void)usb_basic_init(&udev->bp, &udev->regs, core); + + usb_globalint_disable(&udev->regs); + + /* initializes the USB core*/ + (void)usb_core_init(udev->bp, &udev->regs); + + /* set device disconnect */ + usbd_disconnect(udev); + +#ifndef USE_OTG_MODE + usb_curmode_set(&udev->regs, DEVICE_MODE); +#endif /* USE_OTG_MODE */ + + /* initializes device mode */ + (void)usb_devcore_init(udev); + + usb_globalint_enable(&udev->regs); + + /* set device connect */ + usbd_connect(udev); + + udev->dev.cur_status = (uint8_t)USBD_DEFAULT; +} + +/*! + \brief endpoint initialization + \param[in] udev: pointer to USB core instance + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +uint32_t usbd_ep_setup(usb_core_driver *udev, const usb_desc_ep *ep_desc) +{ + usb_transc *transc; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + uint16_t max_len = ep_desc->wMaxPacketSize & EP_MAX_PACKET_SIZE_MASK; + + /* set endpoint direction */ + if(EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + transc->ep_addr.dir = 1U; + } else { + transc = &udev->dev.transc_out[ep_addr]; + + transc->ep_addr.dir = 0U; + } + + transc->ep_addr.num = EP_ID(ep_addr); + transc->max_len = max_len; + transc->ep_type = (uint8_t)ep_type[ep_desc->bmAttributes & (uint8_t)USB_EPTYPE_MASK]; + + /* active USB endpoint function */ + (void)usb_transc_active(udev, transc); + + return 0U; +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_clear(usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc; + + if(EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + /* deactivate USB endpoint function */ + (void)usb_transc_deactivate(udev, transc); + + return 0U; +} + +/*! + \brief endpoint prepare to receive data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: user buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_recev(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len) +{ + usb_transc *transc = &udev->dev.transc_out[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0U; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + (void)usb_transc_outxfer(udev, transc); + + return 0U; +} + +/*! + \brief endpoint prepare to transmit data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: transmit buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_send(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len) +{ + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0U; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + (void)usb_transc_inxfer(udev, transc); + + return 0U; +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall(usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if(EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 1U; + + (void)usb_transc_stall(udev, transc); + + return (0U); +} + +/*! + \brief clear endpoint STALLed status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall_clear(usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if(EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 0U; + + (void)usb_transc_clrstall(udev, transc); + + return (0U); +} + +/*! + \brief flush the endpoint FIFOs + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_fifo_flush(usb_core_driver *udev, uint8_t ep_addr) +{ + if(EP_DIR(ep_addr)) { + (void)usb_txfifo_flush(&udev->regs, EP_ID(ep_addr)); + } else { + (void)usb_rxfifo_flush(&udev->regs); + } + + return (0U); +} + +/*! + \brief device connect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_connect(usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* connect device */ + usb_dev_connect(udev); + + usb_mdelay(3U); +#endif /* USE_OTG_MODE */ +} + +/*! + \brief device disconnect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_disconnect(usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* disconnect device for 3ms */ + usb_dev_disconnect(udev); + + usb_mdelay(3U); +#endif /* USE_OTG_MODE */ +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c new file mode 100644 index 00000000000..bb1d28cf6c1 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c @@ -0,0 +1,816 @@ +/*! + \file usbd_enum.c + \brief USB enumeration function + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" + +#ifdef WINUSB_EXEMPT_DRIVER + +extern usbd_status usbd_OEM_req(usb_dev *udev, usb_req *req); + +#endif /* WINUSB_EXEMPT_DRIVER */ + +/* local function prototypes ('static') */ +static usb_reqsta _usb_std_reserved(usb_core_driver *udev, usb_req *req); +static uint8_t *_usb_dev_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t *_usb_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) +static uint8_t *_usb_other_speed_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t *_usb_qualifier_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +#endif +static uint8_t *_usb_bos_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t *_usb_str_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); +static usb_reqsta _usb_std_getstatus(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_clearfeature(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setfeature(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setaddress(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getdescriptor(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setdescriptor(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getconfiguration(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setconfiguration(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getinterface(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setinterface(usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_synchframe(usb_core_driver *udev, usb_req *req); + +static usb_reqsta(*_std_dev_req[])(usb_core_driver *udev, usb_req *req) = { + [USB_GET_STATUS] = _usb_std_getstatus, + [USB_CLEAR_FEATURE] = _usb_std_clearfeature, + [USB_RESERVED2] = _usb_std_reserved, + [USB_SET_FEATURE] = _usb_std_setfeature, + [USB_RESERVED4] = _usb_std_reserved, + [USB_SET_ADDRESS] = _usb_std_setaddress, + [USB_GET_DESCRIPTOR] = _usb_std_getdescriptor, + [USB_SET_DESCRIPTOR] = _usb_std_setdescriptor, + [USB_GET_CONFIGURATION] = _usb_std_getconfiguration, + [USB_SET_CONFIGURATION] = _usb_std_setconfiguration, + [USB_GET_INTERFACE] = _usb_std_getinterface, + [USB_SET_INTERFACE] = _usb_std_setinterface, + [USB_SYNCH_FRAME] = _usb_std_synchframe, +}; + +/* get standard descriptor handler */ +static uint8_t *(*std_desc_get[])(usb_core_driver *udev, uint8_t index, uint16_t *len) = { + [(uint8_t)USB_DESCTYPE_DEV - 1U] = _usb_dev_desc_get, + [(uint8_t)USB_DESCTYPE_CONFIG - 1U] = _usb_config_desc_get, + [(uint8_t)USB_DESCTYPE_STR - 1U] = _usb_str_desc_get, +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + [(uint8_t)USB_DESCTYPE_DEV_QUALIFIER - 3U] = _usb_qualifier_desc_get, + [(uint8_t)USB_DESCTYPE_OTHER_SPD_CONFIG - 3U] = _usb_other_speed_config_desc_get, +#endif +}; + +/*! + \brief handle USB standard device request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_standard_request(usb_core_driver *udev, usb_req *req) +{ + return (*_std_dev_req[req->bRequest])(udev, req); +} + +/*! + \brief handle USB device class request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device class request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_class_request(usb_core_driver *udev, usb_req *req) +{ + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + /* call device class handle function */ + return (usb_reqsta)udev->dev.class_core->req_proc(udev, req); + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB vendor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB vendor request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_vendor_request(usb_core_driver *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* added by user... */ +#ifdef WINUSB_EXEMPT_DRIVER + usbd_OEM_req(udev, req); +#endif + + return REQ_SUPP; +} + +/*! + \brief handle USB enumeration error + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval none +*/ +void usbd_enum_error(usb_core_driver *udev, usb_req *req) +{ + (void)req; + + (void)usbd_ep_stall(udev, 0x80U); + (void)usbd_ep_stall(udev, 0x00U); + + usb_ctlep_startout(udev); +} + +/*! + \brief convert hex 32bits value into Unicode char + \param[in] value: hex 32bits value + \param[in] pbuf: buffer pointer to store Unicode char + \param[in] len: value length + \param[out] none + \retval none +*/ +void int_to_unicode(uint32_t value, uint8_t *pbuf, uint8_t len) +{ + uint8_t index; + + for(index = 0U; index < len; index++) { + if((value >> 28) < 0x0AU) { + pbuf[2 * index] = (uint8_t)((value >> 28) + '0'); + } else { + pbuf[2 * index] = (uint8_t)((value >> 28) + 'A' - 10U); + } + + value = value << 4; + + pbuf[2U * index + 1U] = 0U; + } +} + +/*! + \brief convert hex 32bits value into Unicode char + \param[in] unicode_str: pointer to Unicode string + \param[out] none + \retval none +*/ +void serial_string_get(uint16_t *unicode_str) +{ + if(6U != (unicode_str[0] & 0x00FFU)) { + uint32_t DeviceSerial0, DeviceSerial1, DeviceSerial2; + + DeviceSerial0 = *(uint32_t *)DEVICE_ID1; + DeviceSerial1 = *(uint32_t *)DEVICE_ID2; + DeviceSerial2 = *(uint32_t *)DEVICE_ID3; + + DeviceSerial0 += DeviceSerial2; + + if(0U != DeviceSerial0) { + int_to_unicode(DeviceSerial0, (uint8_t *)&(unicode_str[1]), 8U); + int_to_unicode(DeviceSerial1, (uint8_t *)&(unicode_str[9]), 4U); + } + } else { + uint32_t device_serial = *(uint32_t *)DEVICE_ID; + + if(0U != device_serial) { + unicode_str[1] = (uint16_t)(device_serial & 0x0000FFFFU); + unicode_str[2] = (uint16_t)((device_serial & 0xFFFF0000U) >> 16); + + } + } +} + +/*! + \brief no operation, just for reserved + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB vendor request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_reserved(usb_core_driver *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no operation... */ + + return REQ_NOTSUPP; +} + +/*! + \brief get the device descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_dev_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->dev.desc->dev_desc[0]; + + return udev->dev.desc->dev_desc; +} + +/*! + \brief get the configuration descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->dev.desc->config_desc[2] | (udev->dev.desc->config_desc[3] << 8); + + return udev->dev.desc->config_desc; +} + +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + +/*! + \brief get the other speed configuration descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_other_speed_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->dev.desc->other_speed_config_desc[2]; + + return udev->dev.desc->other_speed_config_desc; +} + +/*! + \brief get the other speed configuration descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_qualifier_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->dev.desc->qualifier_desc[0]; + + return udev->dev.desc->qualifier_desc; +} + +#endif /* USE_USB_HS && USE_ULPI_PHY */ + +/*! + \brief get the BOS descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_bos_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->dev.desc->bos_desc[2]; + + return udev->dev.desc->bos_desc; +} + +/*! + \brief get string descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: string descriptor index + \param[out] len: pointer to string length + \retval descriptor buffer pointer +*/ +static uint8_t *_usb_str_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + uint8_t *desc = udev->dev.desc->strings[index]; + + *len = desc[0]; + + return desc; +} + +/*! + \brief handle Get_Status request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getstatus(usb_core_driver *udev, usb_req *req) +{ + uint8_t recp = BYTE_LOW(req->wIndex); + usb_reqsta req_status = REQ_NOTSUPP; + usb_transc *transc = &udev->dev.transc_in[0]; + + static uint8_t status[2] = {0}; + + switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ + ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { + + if(udev->dev.pm.power_mode) { + status[0] = USB_STATUS_SELF_POWERED; + } else { + status[0] = 0U; + } + + if(udev->dev.pm.dev_remote_wakeup) { + status[0] |= USB_STATUS_REMOTE_WAKEUP; + } else { + status[0] = 0U; + } + + req_status = REQ_SUPP; + } + break; + + case USB_RECPTYPE_ITF: + if(((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) && (recp <= USBD_ITF_MAX_NUM)) { + req_status = REQ_SUPP; + } + break; + + case USB_RECPTYPE_EP: + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + if(0x80U == (recp & 0x80U)) { + status[0] = udev->dev.transc_in[EP_ID(recp)].ep_stall; + } else { + status[0] = udev->dev.transc_out[recp].ep_stall; + } + + req_status = REQ_SUPP; + } + break; + + default: + break; + } + + if(REQ_SUPP == req_status) { + transc->xfer_buf = status; + transc->remain_len = 2U; + } + + return req_status; +} + +/*! + \brief handle USB Clear_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_clearfeature(usb_core_driver *udev, usb_req *req) +{ + uint8_t ep = 0U; + + switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ + ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { + + /* clear device remote wakeup feature */ + if((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->dev.pm.dev_remote_wakeup = 0U; + + return REQ_SUPP; + } + } + break; + + case USB_RECPTYPE_ITF: + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + /* clear endpoint halt feature */ + if(((uint16_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + (void)usbd_ep_stall_clear(udev, ep); + + (void)udev->dev.class_core->req_proc(udev, req); + } + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setfeature(usb_core_driver *udev, usb_req *req) +{ + uint8_t ep = 0U; + + switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ + ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { + /* set device remote wakeup feature */ + if((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->dev.pm.dev_remote_wakeup = 1U; + } + + return REQ_SUPP; + } + break; + + case USB_RECPTYPE_ITF: + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + /* set endpoint halt feature */ + if(((uint16_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + (void)usbd_ep_stall(udev, ep); + } + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Address request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setaddress(usb_core_driver *udev, usb_req *req) +{ + if((0U == req->wIndex) && (0U == req->wLength)) { + udev->dev.dev_addr = (uint8_t)(req->wValue) & 0x7FU; + + if((uint8_t)USBD_CONFIGURED != udev->dev.cur_status) { + usbd_addr_set(udev, udev->dev.dev_addr); + + if(udev->dev.dev_addr) { + udev->dev.cur_status = (uint8_t)USBD_ADDRESSED; + } else { + udev->dev.cur_status = (uint8_t)USBD_DEFAULT; + } + + return REQ_SUPP; + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Get_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getdescriptor(usb_core_driver *udev, usb_req *req) +{ + uint8_t desc_type = 0U; + uint8_t desc_index = 0U; + + usb_reqsta status = REQ_NOTSUPP; + + usb_transc *transc = &udev->dev.transc_in[0]; + + /* get device standard descriptor */ + switch(req->bmRequestType & USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + desc_type = BYTE_HIGH(req->wValue); + desc_index = BYTE_LOW(req->wValue); + + switch(desc_type) { + case USB_DESCTYPE_DEV: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + + if(64U == req->wLength) { + transc->remain_len = 8U; + } + break; + + case USB_DESCTYPE_CONFIG: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; + + case USB_DESCTYPE_STR: + if(desc_index < (uint8_t)STR_IDX_MAX) { + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + } + break; + + case USB_DESCTYPE_ITF: + case USB_DESCTYPE_EP: + break; + +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + case USB_DESCTYPE_DEV_QUALIFIER: + transc->xfer_buf = std_desc_get[desc_type - 3U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; + + case USB_DESCTYPE_OTHER_SPD_CONFIG: + transc->xfer_buf = std_desc_get[desc_type - 3U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; +#endif + + case USB_DESCTYPE_ITF_POWER: + break; + + case USB_DESCTYPE_BOS: + transc->xfer_buf = _usb_bos_desc_get(udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; + + default: + break; + } + break; + + case USB_RECPTYPE_ITF: + /* get device class special descriptor */ + status = (usb_reqsta)(udev->dev.class_core->req_proc(udev, req)); + break; + + case USB_RECPTYPE_EP: + break; + + default: + break; + } + + if((0U != transc->remain_len) && (0U != req->wLength)) { + if(transc->remain_len < req->wLength) { + if((transc->remain_len >= transc->max_len) && (0U == (transc->remain_len % transc->max_len))) { + udev->dev.control.ctl_zlp = 1U; + } + } else { + transc->remain_len = req->wLength; + } + + status = REQ_SUPP; + } + + return status; +} + +/*! + \brief handle USB Set_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setdescriptor(usb_core_driver *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no handle... */ + return REQ_SUPP; +} + +/*! + \brief handle USB Get_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getconfiguration(usb_core_driver *udev, usb_req *req) +{ + (void)req; + + usb_reqsta req_status = REQ_NOTSUPP; + usb_transc *transc = &udev->dev.transc_in[0]; + + switch(udev->dev.cur_status) { + case USBD_ADDRESSED: + if(USB_DEFAULT_CONFIG == udev->dev.config) { + req_status = REQ_SUPP; + } + break; + + case USBD_CONFIGURED: + if(USB_DEFAULT_CONFIG != udev->dev.config) { + req_status = REQ_SUPP; + } + break; + + default: + break; + } + + if(REQ_SUPP == req_status) { + transc->xfer_buf = &(udev->dev.config); + transc->remain_len = 1U; + } + + return req_status; +} + +/*! + \brief handle USB Set_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setconfiguration(usb_core_driver *udev, usb_req *req) +{ + static uint8_t config; + usb_reqsta status = REQ_NOTSUPP; + + config = (uint8_t)(req->wValue); + + if(config <= USBD_CFG_MAX_NUM) { + switch(udev->dev.cur_status) { + case USBD_ADDRESSED: + if(config) { + (void)udev->dev.class_core->init(udev, config); + + udev->dev.config = config; + udev->dev.cur_status = (uint8_t)USBD_CONFIGURED; + } + + status = REQ_SUPP; + break; + + case USBD_CONFIGURED: + if(USB_DEFAULT_CONFIG == config) { + (void)udev->dev.class_core->deinit(udev, config); + + udev->dev.config = config; + udev->dev.cur_status = (uint8_t)USBD_ADDRESSED; + } else if(config != udev->dev.config) { + /* clear old configuration */ + (void)udev->dev.class_core->deinit(udev, config); + + /* set new configuration */ + udev->dev.config = config; + + (void)udev->dev.class_core->init(udev, config); + } else { + /* no operation */ + } + + status = REQ_SUPP; + break; + + case USBD_DEFAULT: + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief handle USB Get_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getinterface(usb_core_driver *udev, usb_req *req) +{ + switch(udev->dev.cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + usb_transc *transc = &udev->dev.transc_in[0]; + + transc->xfer_buf = &(udev->dev.class_core->alter_set); + transc->remain_len = 1U; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setinterface(usb_core_driver *udev, usb_req *req) +{ + switch(udev->dev.cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + if(NULL != udev->dev.class_core->set_intf) { + (void)udev->dev.class_core->set_intf(udev, req); + } + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB SynchFrame request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_synchframe(usb_core_driver *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no handle */ + return REQ_SUPP; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c new file mode 100644 index 00000000000..7ebb19d3959 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c @@ -0,0 +1,264 @@ +/*! + \file usbd_transc.c + \brief USB transaction core functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_transc.h" + +/*! + \brief USB send data in the control transaction + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_send(usb_core_driver *udev) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + (void)usbd_ep_send(udev, 0U, transc->xfer_buf, transc->remain_len); + + if(transc->remain_len > transc->max_len) { + udev->dev.control.ctl_state = (uint8_t)USB_CTL_DATA_IN; + } else { + udev->dev.control.ctl_state = (uint8_t)USB_CTL_LAST_DATA_IN; + } + + return USBD_OK; +} + +/*! + \brief USB receive data in the control transaction + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_recev(usb_core_driver *udev) +{ + usb_transc *transc = &udev->dev.transc_out[0]; + + (void)usbd_ep_recev(udev, 0U, transc->xfer_buf, transc->remain_len); + + if(transc->remain_len > transc->max_len) { + udev->dev.control.ctl_state = (uint8_t)USB_CTL_DATA_OUT; + } else { + udev->dev.control.ctl_state = (uint8_t)USB_CTL_LAST_DATA_OUT; + } + + return USBD_OK; +} + +/*! + \brief USB send control transaction status + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_status_send(usb_core_driver *udev) +{ + udev->dev.control.ctl_state = (uint8_t)USB_CTL_STATUS_IN; + + (void)usbd_ep_send(udev, 0U, NULL, 0U); + + usb_ctlep_startout(udev); + + return USBD_OK; +} + +/*! + \brief USB control receive status + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_status_recev(usb_core_driver *udev) +{ + udev->dev.control.ctl_state = (uint8_t)USB_CTL_STATUS_OUT; + + (void)usbd_ep_recev(udev, 0U, NULL, 0U); + + usb_ctlep_startout(udev); + + return USBD_OK; +} + +/*! + \brief USB SETUP stage processing + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_setup_transc(usb_core_driver *udev) +{ + usb_reqsta reqstat = REQ_NOTSUPP; + + usb_req req = udev->dev.control.req; + + switch(req.bmRequestType & USB_REQTYPE_MASK) { + /* standard device request */ + case USB_REQTYPE_STRD: + reqstat = usbd_standard_request(udev, &req); + break; + + /* device class request */ + case USB_REQTYPE_CLASS: + reqstat = usbd_class_request(udev, &req); + break; + + /* vendor defined request */ + case USB_REQTYPE_VENDOR: + reqstat = usbd_vendor_request(udev, &req); + break; + + default: + break; + } + + if(REQ_SUPP == reqstat) { + if(0U == req.wLength) { + (void)usbd_ctl_status_send(udev); + } else { + if(req.bmRequestType & 0x80U) { + (void)usbd_ctl_send(udev); + } else { + (void)usbd_ctl_recev(udev); + } + } + } else { + usbd_enum_error(udev, &req); + } + + return (uint8_t)USBD_OK; +} + +/*! + \brief data OUT stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_out_transc(usb_core_driver *udev, uint8_t ep_num) +{ + if(0U == ep_num) { + usb_transc *transc = &udev->dev.transc_out[0]; + + switch(udev->dev.control.ctl_state) { + case USB_CTL_DATA_OUT: + /* update transfer length */ + transc->remain_len -= transc->max_len; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + transc->xfer_buf += transc->max_len; + } + + (void)usbd_ctl_recev(udev); + break; + + case USB_CTL_LAST_DATA_OUT: + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + if(NULL != udev->dev.class_core->ctlx_out) { + (void)udev->dev.class_core->ctlx_out(udev); + } + } + + transc->remain_len = 0U; + + (void)usbd_ctl_status_send(udev); + break; + + default: + break; + } + } else if((NULL != udev->dev.class_core->data_out) && ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { + (void)udev->dev.class_core->data_out(udev, ep_num); + } else { + /* no operation */ + } + + return (uint8_t)USBD_OK; +} + +/*! + \brief data IN stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_in_transc(usb_core_driver *udev, uint8_t ep_num) +{ + if(0U == ep_num) { + usb_transc *transc = &udev->dev.transc_in[0]; + + switch(udev->dev.control.ctl_state) { + case USB_CTL_DATA_IN: + /* update transfer length */ + transc->remain_len -= transc->max_len; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + transc->xfer_buf += transc->max_len; + } + + (void)usbd_ctl_send(udev); + break; + + case USB_CTL_LAST_DATA_IN: + /* last packet is MPS multiple, so send ZLP packet */ + if(udev->dev.control.ctl_zlp) { + (void)usbd_ep_send(udev, 0U, NULL, 0U); + + udev->dev.control.ctl_zlp = 0U; + } else { + if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { + if(NULL != udev->dev.class_core->ctlx_in) { + (void)udev->dev.class_core->ctlx_in(udev); + } + } + + transc->remain_len = 0U; + + (void)usbd_ctl_status_recev(udev); + } + break; + + default: + break; + } + } else { + if(((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) && (NULL != udev->dev.class_core->data_in)) { + (void)udev->dev.class_core->data_in(udev, ep_num); + } + } + + return (uint8_t)USBD_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h new file mode 100644 index 00000000000..50cf0b8bb42 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h @@ -0,0 +1,347 @@ +/*! + \file drv_usb_core.h + \brief USB core low level driver header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USB_CORE_H +#define DRV_USB_CORE_H + +#include "drv_usb_regs.h" +#include "usb_ch9_std.h" + +#define USB_FS_EP0_MAX_LEN 64U /*!< maximum packet size of endpoint 0 */ +#define HC_MAX_PACKET_COUNT 140U /*!< maximum packet count */ + +#define EP_ID(x) ((uint8_t)((x) & 0x7FU)) /*!< endpoint number */ +#define EP_DIR(x) ((uint8_t)((x) >> 7)) /*!< endpoint direction */ + +#define EP_MAX_PACKET_SIZE_MASK 0x07FFU /*!< endpoint maximum packet size mask */ + +enum _usb_mode { + DEVICE_MODE = 0U, /*!< device mode */ + HOST_MODE, /*!< host mode */ + OTG_MODE /*!< OTG mode */ +}; + +enum _usb_eptype { + USB_EPTYPE_CTRL = 0U, /*!< control endpoint type */ + USB_EPTYPE_ISOC = 1U, /*!< isochronous endpoint type */ + USB_EPTYPE_BULK = 2U, /*!< bulk endpoint type */ + USB_EPTYPE_INTR = 3U, /*!< interrupt endpoint type */ + USB_EPTYPE_MASK = 3U /*!< endpoint type mask */ +}; + +typedef enum { + USB_OTG_OK = 0U, /*!< USB OTG status succeed */ + USB_OTG_FAIL /*!< USB OTG status fail */ +} usb_otg_status; + +typedef enum { + USB_OK = 0U, /*!< USB status succeed */ + USB_FAIL /*!< USB status fail */ +} usb_status; + +typedef enum { + USB_USE_FIFO = 0U, /*!< USB use FIFO transfer mode */ + USB_USE_DMA /*!< USB use DMA transfer mode */ +} usb_transfer_mode; + +typedef struct { + uint8_t core_enum; /*!< USB core type */ + uint8_t core_speed; /*!< USB core speed */ + uint8_t num_pipe; /*!< USB host channel numbers */ + uint8_t num_ep; /*!< USB device endpoint numbers */ + uint8_t transfer_mode; /*!< USB transfer mode */ + uint8_t phy_itf; /*!< USB core PHY interface */ + uint8_t sof_enable; /*!< USB SOF output */ + uint8_t low_power; /*!< USB low power */ + uint8_t lpm_enable; /*!< USB link power mode(LPM) */ + uint8_t vbus_sensing_enable; /*!< USB VBUS sensing feature */ + uint8_t use_dedicated_ep1; /*!< USB dedicated endpoint1 interrupt */ + uint8_t use_external_vbus; /*!< enable or disable the use of the external VBUS */ + uint32_t base_reg; /*!< base register address */ +} usb_core_basic; + +#ifdef USE_DEVICE_MODE + +/* USB descriptor */ +typedef struct _usb_desc { + uint8_t *dev_desc; /*!< device descriptor */ + uint8_t *config_desc; /*!< configure descriptor */ + uint8_t *bos_desc; /*!< BOS descriptor */ + +#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) + uint8_t *other_speed_config_desc; /*!< other speed configuration descriptor */ + uint8_t *qualifier_desc; /*!< qualifier descriptor */ +#endif + + void* const *strings; /*!< string descriptor */ +} usb_desc; + +/* USB power management */ +typedef struct _usb_pm { + uint8_t power_mode; /*!< power mode */ + uint8_t power_low; /*!< power low */ + uint8_t dev_remote_wakeup; /*!< remote wakeup */ + uint8_t remote_wakeup_on; /*!< remote wakeup on */ +} usb_pm; + +/* USB control information */ +typedef struct _usb_control { + usb_req req; /*!< USB standard device request */ + + uint8_t ctl_state; /*!< USB control transfer state */ + uint8_t ctl_zlp; /*!< zero length package */ +} usb_control; + +typedef struct { + struct { + uint8_t num: 4U; /*!< the endpoint number.it can be from 0 to 6 */ + uint8_t pad: 3U; /*!< padding between number and direction */ + uint8_t dir: 1U; /*!< the endpoint direction */ + } ep_addr; + + uint8_t ep_type; /*!< USB endpoint type */ + uint8_t ep_stall; /*!< USB endpoint STALL status */ + + uint8_t frame_num; /*!< number of frame */ + uint16_t max_len; /*!< maximum packet length */ + + /* transaction level variables */ + uint8_t *xfer_buf; /*!< transmit buffer */ + uint32_t xfer_len; /*!< transmit buffer length */ + uint32_t xfer_count; /*!< transmit buffer count */ + + uint32_t remain_len; /*!< remain packet length */ + + uint32_t dma_addr; /*!< DMA address */ +} usb_transc; + +typedef struct _usb_core_driver usb_dev; + +typedef struct _usb_class_core { + uint8_t command; /*!< device class request command */ + uint8_t alter_set; /*!< alternative set */ + + uint8_t (*init)(usb_dev *udev, uint8_t config_index); /*!< initialize handler */ + uint8_t (*deinit)(usb_dev *udev, uint8_t config_index); /*!< de-initialize handler */ + + uint8_t (*req_proc)(usb_dev *udev, usb_req *req); /*!< device request handler */ + + uint8_t (*set_intf)(usb_dev *udev, usb_req *req); /*!< device set interface callback */ + + uint8_t (*ctlx_in)(usb_dev *udev); /*!< device control IN callback */ + uint8_t (*ctlx_out)(usb_dev *udev); /*!< device control OUT callback */ + + uint8_t (*data_in)(usb_dev *udev, uint8_t ep_num); /*!< device data IN handler */ + uint8_t (*data_out)(usb_dev *udev, uint8_t ep_num); /*!< device data OUT handler */ + + uint8_t (*SOF)(usb_dev *udev); /*!< start of frame handler */ + + uint8_t (*incomplete_isoc_in)(usb_dev *udev); /*!< incomplete synchronization IN transfer handler */ + uint8_t (*incomplete_isoc_out)(usb_dev *udev); /*!< incomplete synchronization OUT transfer handler */ +} usb_class_core; + +typedef struct _usb_perp_dev { + uint8_t config; /*!< configuration */ + uint8_t dev_addr; /*!< device address */ + + __IO uint8_t cur_status; /*!< current status */ + __IO uint8_t backup_status; /*!< backup status */ + + usb_transc transc_in[USBFS_MAX_TX_FIFOS]; /*!< endpoint IN transaction */ + usb_transc transc_out[USBFS_MAX_TX_FIFOS]; /*!< endpoint OUT transaction */ + + usb_pm pm; /*!< power management */ + usb_control control; /*!< USB control information */ + usb_desc *desc; /*!< USB descriptors pointer */ + usb_class_core *class_core; /*!< class driver */ + void *class_data[6]; /*!< class data pointer */ + void *user_data; /*!< user data pointer */ + void *pdata; /*!< reserved data pointer */ +} usb_perp_dev; + +#endif /* USE_DEVICE_MODE */ + +#ifdef USE_HOST_MODE + +typedef enum _usb_pipe_status { + PIPE_IDLE = 0U, /*!< host pipe IDLE status */ + PIPE_XF, /*!< host pipe transfer completed status */ + PIPE_HALTED, /*!< host pipe halted status */ + PIPE_NAK, /*!< host pipe NAK status */ + PIPE_NYET, /*!< host pipe NYET status */ + PIPE_STALL, /*!< host pipe STALL status */ + PIPE_TRACERR, /*!< host pipe transaction error status */ + PIPE_BBERR, /*!< host pipe babble error status */ + PIPE_REQOVR, /*!< host pipe frame overrun status */ + PIPE_DTGERR /*!< host pipe data toggle error status */ +} usb_pipe_status; + +typedef enum _usb_pipe_mode { + PIPE_PERIOD = 0U, /*!< USB host pipe PERIOD mode */ + PIPE_NON_PERIOD = 1U /*!< USB host pipe NOT PERIOD mode */ +} usb_pipe_mode; + +typedef enum _usb_urb_state { + URB_IDLE = 0U, /*!< USB URB IDLE state */ + URB_DONE, /*!< USB URB DONE state */ + URB_NOTREADY, /*!< USB URB NOT READY state */ + URB_ERROR, /*!< USB URB ERROR state */ + URB_STALL, /*!< USB URB STALL state */ + URB_PING /*!< USB URB PING state */ +} usb_urb_state; + +typedef struct _usb_pipe { + uint8_t in_used; /*!< pipe used */ + uint8_t dev_addr; /*!< USB device address */ + uint32_t dev_speed; /*!< USB device speed */ + + struct { + uint8_t num; /*!< endpoint numbers */ + uint8_t dir; /*!< endpoint direction */ + uint8_t type; /*!< endpoint transfer type */ + uint16_t mps; /*!< endpoint max packet size */ + } ep; + + __IO uint8_t supp_ping; /*!< host pipe support PING */ + __IO uint8_t do_ping; /*!< host pipe do PING */ + __IO uint32_t DPID; /*!< data PID */ + + uint8_t *xfer_buf; /*!< USB transfer buffer */ + uint32_t xfer_len; /*!< USB transfer length */ + uint32_t xfer_count; /*!< USB transfer count */ + + uint8_t data_toggle_in; /*!< toggle DATA IN */ + uint8_t data_toggle_out; /*!< toggle DATA OUT */ + + __IO uint32_t err_count; /*!< error count */ + __IO usb_pipe_status pp_status; /*!< USB pipe status */ + __IO usb_urb_state urb_state; /*!< USB urb state */ +} usb_pipe; + +typedef struct _usb_host_drv { + __IO uint32_t connect_status; /*!< connect status */ + __IO uint32_t port_enabled; /*!< USB port enable */ + __IO uint32_t backup_xfercount[USBFS_MAX_TX_FIFOS]; /*!< USB backup transfer data count */ + + usb_pipe pipe[USBFS_MAX_TX_FIFOS]; /*!< USB host pipe handles */ + void *data; /*!< user data pointer */ +} usb_host_drv; + +#endif /* USE_HOST_MODE */ + +typedef struct _usb_core_driver { + usb_core_basic bp; /*!< USB basic parameters */ + usb_core_regs regs; /*!< USB registers */ + +#ifdef USE_DEVICE_MODE + usb_perp_dev dev; /*!< USB peripheral device */ +#endif /* USE_DEVICE_MODE */ + +#ifdef USE_HOST_MODE + usb_host_drv host; /*!< USB peripheral host */ +#endif /* USE_HOST_MODE */ +} usb_core_driver; + +/* static inline function definitions */ + +/*! + \brief get the global interrupts + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval interrupt status +*/ +__STATIC_INLINE uint32_t usb_coreintr_get(usb_core_regs *usb_regs) +{ + uint32_t reg_data = usb_regs->gr->GINTEN; + + reg_data &= usb_regs->gr->GINTF; + + return reg_data; +} + +/*! + \brief set USB RX FIFO size + \param[in] usb_regs: pointer to USB core registers + \param[in] size: assigned FIFO size + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_set_rxfifo(usb_core_regs *usb_regs, uint16_t size) +{ + usb_regs->gr->GRFLEN = size; +} + +/*! + \brief enable the global interrupts + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_globalint_enable(usb_core_regs *usb_regs) +{ + /* enable USB global interrupt */ + usb_regs->gr->GAHBCS |= GAHBCS_GINTEN; +} + +/*! + \brief disable the global interrupts + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_globalint_disable(usb_core_regs *usb_regs) +{ + /* disable USB global interrupt */ + usb_regs->gr->GAHBCS &= ~GAHBCS_GINTEN; +} + +/* function declarations */ +/* configure core capabilities */ +usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs, usb_core_enum usb_core); +/* initializes the USB controller registers and prepares the core device mode or host mode operation */ +usb_status usb_core_init(usb_core_basic usb_basic, usb_core_regs *usb_regs); +/* write a packet into the TX FIFO associated with the endpoint */ +usb_status usb_txfifo_write(usb_core_regs *usb_regs, uint8_t *src_buf, uint8_t fifo_num, uint16_t byte_count); +/* read a packet from the RX FIFO associated with the endpoint */ +void *usb_rxfifo_read(usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count); +/* flush a TX FIFO or all TX FIFOs */ +usb_status usb_txfifo_flush(usb_core_regs *usb_regs, uint8_t fifo_num); +/* flush the entire RX FIFO */ +usb_status usb_rxfifo_flush(usb_core_regs *usb_regs); +/* set endpoint or channel TX FIFO size */ +void usb_set_txfifo(usb_core_regs *usb_regs, uint8_t fifo, uint16_t size); +/* set USB current mode */ +void usb_curmode_set(usb_core_regs *usb_regs, uint8_t mode); + +#endif /* DRV_USB_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h new file mode 100644 index 00000000000..09bc32f105c --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h @@ -0,0 +1,197 @@ +/*! + \file drv_usb_dev.h + \brief USB device low level driver header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USB_DEV_H +#define DRV_USB_DEV_H + +#include "usbd_conf.h" +#include "drv_usb_core.h" + +#define EP_IN(x) ((uint8_t)(0x80U | (x))) /*!< device IN endpoint */ +#define EP_OUT(x) ((uint8_t)(x)) /*!< device OUT endpoint */ + +enum usb_ctl_status { + USB_CTL_IDLE = 0U, /*!< USB control transfer idle state */ + USB_CTL_DATA_IN, /*!< USB control transfer data IN state */ + USB_CTL_LAST_DATA_IN, /*!< USB control transfer last data IN state */ + USB_CTL_DATA_OUT, /*!< USB control transfer data OUT state */ + USB_CTL_LAST_DATA_OUT, /*!< USB control transfer last data OUT state */ + USB_CTL_STATUS_IN, /*!< USB control transfer status IN state*/ + USB_CTL_STATUS_OUT /*!< USB control transfer status OUT state */ +}; + +/* static inline function definitions */ + +/*! + \brief configure the USB device to be disconnected + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_dev_disconnect(usb_core_driver *udev) +{ + udev->regs.dr->DCTL |= DCTL_SD; +} + +/*! + \brief configure the USB device to be connected + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_dev_connect(usb_core_driver *udev) +{ + udev->regs.dr->DCTL &= ~DCTL_SD; +} + +/*! + \brief set the USB device address + \param[in] udev: pointer to USB device + \param[in] dev_addr: device address for setting + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_devaddr_set(usb_core_driver *udev, uint8_t dev_addr) +{ + udev->regs.dr->DCFG &= ~DCFG_DAR; + udev->regs.dr->DCFG |= (uint32_t)dev_addr << 4; +} + +/*! + \brief read device all OUT endpoint interrupt register + \param[in] udev: pointer to USB device + \param[out] none + \retval interrupt status +*/ +__STATIC_INLINE uint32_t usb_oepintnum_read(usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return (value & DAEPINT_OEPITB) >> 16; +} + +/*! + \brief read device OUT endpoint interrupt flag register + \param[in] udev: pointer to USB device + \param[in] ep_num: endpoint number + \param[out] none + \retval interrupt status +*/ +__STATIC_INLINE uint32_t usb_oepintr_read(usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = udev->regs.er_out[ep_num]->DOEPINTF; + + value &= udev->regs.dr->DOEPINTEN; + + return value; +} + +/*! + \brief read device all IN endpoint interrupt register + \param[in] udev: pointer to USB device + \param[out] none + \retval interrupt status +*/ +__STATIC_INLINE uint32_t usb_iepintnum_read(usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return value & DAEPINT_IEPITB; +} + +/*! + \brief set remote wakeup signaling + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_rwkup_set(usb_core_driver *udev) +{ + if(udev->dev.pm.dev_remote_wakeup) { + /* enable remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + } +} + +/*! + \brief reset remote wakeup signaling + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_rwkup_reset(usb_core_driver *udev) +{ + if(udev->dev.pm.dev_remote_wakeup) { + /* disable remote wakeup signaling */ + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } +} + +/* function declarations */ +/* initialize USB core registers for device mode */ +usb_status usb_devcore_init(usb_core_driver *udev); +/* enable the USB device mode interrupts */ +usb_status usb_devint_enable(usb_core_driver *udev); +/* active the USB endpoint 0 transaction */ +usb_status usb_transc0_active(usb_core_driver *udev, usb_transc *transc); +/* active the USB transaction */ +usb_status usb_transc_active(usb_core_driver *udev, usb_transc *transc); +/* deactivate the USB transaction */ +usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc); +/* configure USB transaction to start IN transfer */ +usb_status usb_transc_inxfer(usb_core_driver *udev, usb_transc *transc); +/* configure USB transaction to start OUT transfer */ +usb_status usb_transc_outxfer(usb_core_driver *udev, usb_transc *transc); +/* set the USB transaction STALL status */ +usb_status usb_transc_stall(usb_core_driver *udev, usb_transc *transc); +/* clear the USB transaction STALL status */ +usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc); +/* read device IN endpoint interrupt flag register */ +uint32_t usb_iepintr_read(usb_core_driver *udev, uint8_t ep_num); +/* configures OUT endpoint 0 to receive SETUP packets */ +void usb_ctlep_startout(usb_core_driver *udev); +/* active remote wakeup signaling */ +void usb_rwkup_active(usb_core_driver *udev); +/* active USB core clock */ +void usb_clock_active(usb_core_driver *udev); +/* USB device suspend */ +void usb_dev_suspend(usb_core_driver *udev); +/* stop the device and clean up FIFOs */ +void usb_dev_stop(usb_core_driver *udev); + +#endif /* DRV_USB_DEV_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h new file mode 100644 index 00000000000..8ab66de1d2e --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h @@ -0,0 +1,115 @@ +/*! + \file drv_usb_host.h + \brief USB host mode low level driver header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USB_HOST_H +#define DRV_USB_HOST_H + +#include "drv_usb_core.h" + +/*! + \brief get USB even frame + \param[in] udev: pointer to USB device + \param[out] none + \retval USB even or odd frame +*/ +__STATIC_INLINE uint8_t usb_frame_even(usb_core_driver *udev) +{ + return (uint8_t)!(udev->regs.hr->HFINFR & 0x01U); +} + +/*! + \brief configure USB clock of PHY + \param[in] udev: pointer to USB device + \param[in] clock: PHY clock + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_phyclock_config(usb_core_driver *udev, uint8_t clock) +{ + udev->regs.hr->HCTL &= ~HCTL_CLKSEL; + udev->regs.hr->HCTL |= clock; +} + +/*! + \brief read USB port + \param[in] udev: pointer to USB device + \param[out] none + \retval port status +*/ +__STATIC_INLINE uint32_t usb_port_read(usb_core_driver *udev) +{ + return *udev->regs.HPCS & ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); +} + +/*! + \brief get USB current speed + \param[in] udev: pointer to USB device + \param[out] none + \retval USB current speed +*/ +__STATIC_INLINE uint32_t usb_curspeed_get(usb_core_driver *udev) +{ + return *udev->regs.HPCS & HPCS_PS; +} + +/*! + \brief get USB current frame + \param[in] udev: pointer to USB device + \param[out] none + \retval USB current frame +*/ +__STATIC_INLINE uint32_t usb_curframe_get(usb_core_driver *udev) +{ + return (udev->regs.hr->HFINFR & 0xFFFFU); +} + +/* function declarations */ +/* initializes USB core for host mode */ +usb_status usb_host_init(usb_core_driver *udev); +/* control the VBUS to power */ +void usb_portvbus_switch(usb_core_driver *udev, uint8_t state); +/* reset host port */ +uint32_t usb_port_reset(usb_core_driver *udev); +/* initialize host pipe */ +usb_status usb_pipe_init(usb_core_driver *udev, uint8_t pipe_num); +/* prepare host pipe for transferring packets */ +usb_status usb_pipe_xfer(usb_core_driver *udev, uint8_t pipe_num); +/* halt host pipe */ +usb_status usb_pipe_halt(usb_core_driver *udev, uint8_t pipe_num); +/* configure host pipe to do ping operation */ +usb_status usb_pipe_ping(usb_core_driver *udev, uint8_t pipe_num); +/* stop the USB host and clean up FIFO */ +void usb_host_stop(usb_core_driver *udev); + +#endif /* DRV_USB_HOST_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h new file mode 100644 index 00000000000..6a1dcd08b46 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h @@ -0,0 +1,62 @@ +/*! + \file drv_usb_hw.h + \brief usb hardware configuration header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USB_HW_H +#define DRV_USB_HW_H + +#include "usb_conf.h" + +/* function declarations */ +/* configure USB clock */ +void usb_rcu_config(void); +/* configure USB data line gpio */ +void usb_gpio_config(void); +/* configure USB interrupt */ +void usb_intr_config(void); +/* initializes delay unit using Timer2 */ +void usb_timer_init(void); +/* delay in micro seconds */ +void usb_udelay(const uint32_t usec); +/* delay in milliseconds */ +void usb_mdelay(const uint32_t msec); +/* configures system clock after wakeup from STOP mode */ +void system_clk_config_stop(void); +#ifdef USE_HOST_MODE +/* configure USB VBus */ +void usb_vbus_config(void); +/* drive USB VBus */ +void usb_vbus_drive(uint8_t State); +#endif /* USE_HOST_MODE */ + +#endif /* DRV_USB_HW_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h new file mode 100644 index 00000000000..38fec2cb552 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h @@ -0,0 +1,656 @@ +/*! + \file drv_usb_regs.h + \brief USB cell registers definition and handle macros + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USB_REGS_H +#define DRV_USB_REGS_H + +#include "usb_conf.h" + +#define USBHS_REG_BASE 0x40040000L /*!< base address of USBHS registers */ +#define USBFS_REG_BASE 0x50000000L /*!< base address of USBFS registers */ + +#define USBFS_MAX_TX_FIFOS 15U /*!< FIFO number */ + +#define USBFS_MAX_PACKET_SIZE 64U /*!< USBFS max packet size */ +#define USBFS_MAX_CHANNEL_COUNT 8U /*!< USBFS host channel count */ +#define USBFS_MAX_EP_COUNT 4U /*!< USBFS device endpoint count */ +#define USBFS_MAX_FIFO_WORDLEN 320U /*!< USBFS max FIFO size in words */ + +#define USBHS_MAX_PACKET_SIZE 512U /*!< USBHS max packet size */ +#define USBHS_MAX_CHANNEL_COUNT 12U /*!< USBHS host channel count */ +#define USBHS_MAX_EP_COUNT 6U /*!< USBHS device endpoint count */ +#define USBHS_MAX_FIFO_WORDLEN 1280U /*!< USBHS max FIFO size in words */ + +#define USB_DATA_FIFO_OFFSET 0x1000U /*!< USB data FIFO offset */ +#define USB_DATA_FIFO_SIZE 0x1000U /*!< USB data FIFO size */ + +typedef enum { + USB_CORE_ENUM_HS = 0U, /*!< USB core type is HS */ + USB_CORE_ENUM_FS = 1U /*!< USB core type is FS */ +} usb_core_enum; + +enum USB_SPEED { + USB_SPEED_UNKNOWN = 0U, /*!< USB speed unknown */ + USB_SPEED_LOW, /*!< USB speed low */ + USB_SPEED_FULL, /*!< USB speed full */ + USB_SPEED_HIGH /*!< USB speed high */ +}; + +enum usb_reg_offset { + USB_REG_OFFSET_CORE = 0x0000U, /*!< global OTG control and status register */ + USB_REG_OFFSET_DEV = 0x0800U, /*!< device mode control and status registers */ + USB_REG_OFFSET_EP = 0x0020U, + USB_REG_OFFSET_EP_IN = 0x0900U, /*!< device IN endpoint 0 control register */ + USB_REG_OFFSET_EP_OUT = 0x0B00U, /*!< device OUT endpoint 0 control register */ + USB_REG_OFFSET_HOST = 0x0400U, /*!< host control register */ + USB_REG_OFFSET_CH = 0x0020U, + USB_REG_OFFSET_PORT = 0x0440U, /*!< host port control and status register */ + USB_REG_OFFSET_CH_INOUT = 0x0500U, /*!< Host channel-x control registers */ + USB_REG_OFFSET_PWRCLKCTL = 0x0E00U /*!< power and clock register */ +}; + +typedef struct { + __IO uint32_t GOTGCS; /*!< USB global OTG control and status register 000h */ + __IO uint32_t GOTGINTF; /*!< USB global OTG interrupt flag register 004h */ + __IO uint32_t GAHBCS; /*!< USB global AHB control and status register 008h */ + __IO uint32_t GUSBCS; /*!< USB global USB control and status register 00Ch */ + __IO uint32_t GRSTCTL; /*!< USB global reset control register 010h */ + __IO uint32_t GINTF; /*!< USB global interrupt flag register 014h */ + __IO uint32_t GINTEN; /*!< USB global interrupt enable register 018h */ + __IO uint32_t GRSTATR; /*!< USB receive status debug read register 01Ch */ + __IO uint32_t GRSTATP; /*!< USB receive status and pop register 020h */ + __IO uint32_t GRFLEN; /*!< USB global receive FIFO length register 024h */ + __IO uint32_t DIEP0TFLEN_HNPTFLEN; /*!< USB device IN endpoint 0/host non-periodic transmit FIFO length register 028h */ + __IO uint32_t HNPTFQSTAT; /*!< USB host non-periodic FIFO/queue status register 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< USB global core configuration register 038h */ + __IO uint32_t CID; /*!< USB core ID register 03Ch */ + uint32_t Reserved40[48]; /*!< Reserved 040h-0FFh */ + __IO uint32_t HPTFLEN; /*!< USB host periodic transmit FIFO length register 100h */ + __IO uint32_t DIEPTFLEN[15]; /*!< USB device IN endpoint transmit FIFO length register 104h */ +} usb_gr; + +typedef struct { + __IO uint32_t HCTL; /*!< USB host control register 400h */ + __IO uint32_t HFT; /*!< USB host frame interval register 404h */ + __IO uint32_t HFINFR; /*!< USB host frame information remaining register 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTFQSTAT; /*!< USB host periodic transmit FIFO/queue status register 410h */ + __IO uint32_t HACHINT; /*!< USB host all channels interrupt register 414h */ + __IO uint32_t HACHINTEN; /*!< USB host all channels interrupt enable register 418h */ +} usb_hr; + +typedef struct { + __IO uint32_t HCHCTL; /*!< USB host channel control register 500h */ + __IO uint32_t HCHSTCTL; /*!< Reserved 504h */ + __IO uint32_t HCHINTF; /*!< USB host channel interrupt flag register 508h */ + __IO uint32_t HCHINTEN; /*!< USB host channel interrupt enable register 50Ch */ + __IO uint32_t HCHLEN; /*!< USB host channel transfer length register 510h */ + __IO uint32_t HCHDMAADDR; /*!< USB host channel-x DMA address register 514h*/ + uint32_t Reserved[2]; +} usb_pr; + +typedef struct { + __IO uint32_t DCFG; /*!< USB device configuration register 800h */ + __IO uint32_t DCTL; /*!< USB device control register 804h */ + __IO uint32_t DSTAT; /*!< USB device status register 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPINTEN; /*!< USB device IN endpoint common interrupt enable register 810h */ + __IO uint32_t DOEPINTEN; /*!< USB device OUT endpoint common interrupt enable register 814h */ + __IO uint32_t DAEPINT; /*!< USB device all endpoints interrupt register 818h */ + __IO uint32_t DAEPINTEN; /*!< USB device all endpoints interrupt enable register 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved24; /*!< Reserved 824h */ + __IO uint32_t DVBUSDT; /*!< USB device VBUS discharge time register 828h */ + __IO uint32_t DVBUSPT; /*!< USB device VBUS pulsing time register 82Ch */ + __IO uint32_t DTHRCTL; /*!< device threshold control 830h */ + __IO uint32_t DIEPFEINTEN; /*!< USB Device IN endpoint FIFO empty interrupt enable register 834h */ + __IO uint32_t DEP1INT; /*!< USB device endpoint 1 interrupt register 838h */ + __IO uint32_t DEP1INTEN; /*!< USB device endpoint 1 interrupt enable register 83Ch */ + uint32_t Reserved40; /*!< Reserved 840h */ + __IO uint32_t DIEP1INTEN; /*!< USB device IN endpoint-1 interrupt enable register 844h */ + uint32_t Reserved48[15]; /*!< Reserved 848-880h */ + __IO uint32_t DOEP1INTEN; /*!< USB device OUT endpoint-1 interrupt enable register 884h */ +} usb_dr; + +typedef struct { + __IO uint32_t DIEPCTL; /*!< USB device IN endpoint control register 900h + (EpNum * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (EpNum * 20h) + 04h */ + __IO uint32_t DIEPINTF; /*!< USB device IN endpoint interrupt flag register 900h + (EpNum * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (EpNum * 20h) + 0Ch */ + __IO uint32_t DIEPLEN; /*!< USB device IN endpoint transfer length register 900h + (EpNum * 20h) + 10h */ + __IO uint32_t DIEPDMAADDR; /*!< Device IN endpoint-x DMA address register 900h + (EpNum * 20h) + 14h */ + __IO uint32_t DIEPTFSTAT; /*!< USB device IN endpoint transmit FIFO status register 900h + (EpNum * 20h) + 18h */ +} usb_erin; + +typedef struct { + __IO uint32_t DOEPCTL; /*!< USB device IN endpoint control register B00h + (EpNum * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (EpNum * 20h) + 04h */ + __IO uint32_t DOEPINTF; /*!< USB device IN endpoint interrupt flag register B00h + (EpNum * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (EpNum * 20h) + 0Ch */ + __IO uint32_t DOEPLEN; /*!< USB device IN endpoint transfer length register B00h + (EpNum * 20h) + 10h */ + __IO uint32_t DOEPDMAADDR; /*!< Device OUT endpoint-x DMA address register B00h + (EpNum * 20h) + 0Ch */ +} usb_erout; + +typedef struct _usb_regs { + usb_gr *gr; /*!< USBFS global registers */ + usb_dr *dr; /*!< Device control and status registers */ + usb_hr *hr; /*!< Host control and status registers */ + usb_erin *er_in[6]; /*!< USB device IN endpoint register */ + usb_erout *er_out[6]; /*!< USB device OUT endpoint register */ + usb_pr *pr[15]; /*!< USB Host channel-x control register */ + + __IO uint32_t *HPCS; /*!< USB host port control and status register */ + __IO uint32_t *DFIFO[USBFS_MAX_TX_FIFOS]; + __IO uint32_t *PWRCLKCTL; /*!< USB power and clock control register */ +} usb_core_regs; + +/* global OTG control and status register bits definitions */ +#define GOTGCS_BSV BIT(19) /*!< B-Session Valid */ +#define GOTGCS_ASV BIT(18) /*!< A-session valid */ +#define GOTGCS_DI BIT(17) /*!< debounce interval */ +#define GOTGCS_IDPS BIT(16) /*!< id pin status */ +#define GOTGCS_DHNPEN BIT(11) /*!< device HNP enable */ +#define GOTGCS_HHNPEN BIT(10) /*!< host HNP enable */ +#define GOTGCS_HNPREQ BIT(9) /*!< HNP request */ +#define GOTGCS_HNPS BIT(8) /*!< HNP successes */ +#define GOTGCS_SRPREQ BIT(1) /*!< SRP request */ +#define GOTGCS_SRPS BIT(0) /*!< SRP successes */ + +/* global OTG interrupt flag register bits definitions */ +#define GOTGINTF_DF BIT(19) /*!< debounce finish */ +#define GOTGINTF_ADTO BIT(18) /*!< A-device timeout */ +#define GOTGINTF_HNPDET BIT(17) /*!< host negotiation request detected */ +#define GOTGINTF_HNPEND BIT(9) /*!< HNP end */ +#define GOTGINTF_SRPEND BIT(8) /*!< SRP end */ +#define GOTGINTF_SESEND BIT(2) /*!< session end */ + +/* global AHB control and status register bits definitions */ +#define GAHBCS_PTXFTH BIT(8) /*!< periodic TX FIFO threshold */ +#define GAHBCS_TXFTH BIT(7) /*!< TX FIFO threshold */ +#define GAHBCS_DMAEN BIT(5) /*!< DMA function Enable */ +#define GAHBCS_BURST BITS(1, 4) /*!< the AHB burst type used by DMA */ +#define GAHBCS_GINTEN BIT(0) /*!< global interrupt enable */ + +/* global USB control and status register bits definitions */ +#define GUSBCS_FDM BIT(30) /*!< force device mode */ +#define GUSBCS_FHM BIT(29) /*!< force host mode */ +#define GUSBCS_ULPIEOI BIT(21) /*!< ULPI external over-current indicator */ +#define GUSBCS_ULPIEVD BIT(20) /*!< ULPI external VBUS driver */ +#define GUSBCS_UTT BITS(10, 13) /*!< USB turnaround time */ +#define GUSBCS_HNPCEN BIT(9) /*!< HNP capability enable */ +#define GUSBCS_SRPCEN BIT(8) /*!< SRP capability enable */ +#define GUSBCS_EMBPHY BIT(6) /*!< embedded PHY selected */ +#define GUSBCS_HS_CUR_FE BIT(4) /*!< HS current software enable */ +#define GUSBCS_TOC BITS(0, 2) /*!< timeout calibration */ + +/* global reset control register bits definitions */ +#define GRSTCTL_DMAIDL BIT(31) /*!< DMA idle state */ +#define GRSTCTL_DMABSY BIT(30) /*!< DMA busy */ +#define GRSTCTL_TXFNUM BITS(6, 10) /*!< tx FIFO number */ +#define GRSTCTL_TXFF BIT(5) /*!< tx FIFO flush */ +#define GRSTCTL_RXFF BIT(4) /*!< rx FIFO flush */ +#define GRSTCTL_HFCRST BIT(2) /*!< host frame counter reset */ +#define GRSTCTL_HCSRST BIT(1) /*!< HCLK soft reset */ +#define GRSTCTL_CSRST BIT(0) /*!< core soft reset */ + +/* global interrupt flag register bits definitions */ +#define GINTF_WKUPIF BIT(31) /*!< wakeup interrupt flag */ +#define GINTF_SESIF BIT(30) /*!< session interrupt flag */ +#define GINTF_DISCIF BIT(29) /*!< disconnect interrupt flag */ +#define GINTF_IDPSC BIT(28) /*!< id pin status change */ +#define GINTF_PTXFEIF BIT(26) /*!< periodic tx FIFO empty interrupt flag */ +#define GINTF_HCIF BIT(25) /*!< host channels interrupt flag */ +#define GINTF_HPIF BIT(24) /*!< host port interrupt flag */ +#define GINTF_PXNCIF BIT(21) /*!< periodic transfer not complete interrupt flag */ +#define GINTF_ISOONCIF BIT(21) /*!< isochronous OUT transfer not complete interrupt flag */ +#define GINTF_ISOINCIF BIT(20) /*!< isochronous IN transfer not complete interrupt flag */ +#define GINTF_OEPIF BIT(19) /*!< OUT endpoint interrupt flag */ +#define GINTF_IEPIF BIT(18) /*!< IN endpoint interrupt flag */ +#define GINTF_EOPFIF BIT(15) /*!< end of periodic frame interrupt flag */ +#define GINTF_ISOOPDIF BIT(14) /*!< isochronous OUT packet dropped interrupt flag */ +#define GINTF_ENUMFIF BIT(13) /*!< enumeration finished */ +#define GINTF_RST BIT(12) /*!< USB reset */ +#define GINTF_SP BIT(11) /*!< USB suspend */ +#define GINTF_ESP BIT(10) /*!< early suspend */ +#define GINTF_GONAK BIT(7) /*!< global OUT NAK effective */ +#define GINTF_GNPINAK BIT(6) /*!< global IN non-periodic NAK effective */ +#define GINTF_NPTXFEIF BIT(5) /*!< non-periodic tx FIFO empty interrupt flag */ +#define GINTF_RXFNEIF BIT(4) /*!< rx FIFO non-empty interrupt flag */ +#define GINTF_SOF BIT(3) /*!< start of frame */ +#define GINTF_OTGIF BIT(2) /*!< OTG interrupt flag */ +#define GINTF_MFIF BIT(1) /*!< mode fault interrupt flag */ +#define GINTF_COPM BIT(0) /*!< current operation mode */ + +/* global interrupt enable register bits definitions */ +#define GINTEN_WKUPIE BIT(31) /*!< wakeup interrupt enable */ +#define GINTEN_SESIE BIT(30) /*!< session interrupt enable */ +#define GINTEN_DISCIE BIT(29) /*!< disconnect interrupt enable */ +#define GINTEN_IDPSCIE BIT(28) /*!< id pin status change interrupt enable */ +#define GINTEN_PTXFEIE BIT(26) /*!< periodic tx FIFO empty interrupt enable */ +#define GINTEN_HCIE BIT(25) /*!< host channels interrupt enable */ +#define GINTEN_HPIE BIT(24) /*!< host port interrupt enable */ +#define GINTEN_IPXIE BIT(21) /*!< periodic transfer not complete interrupt enable */ +#define GINTEN_ISOONCIE BIT(21) /*!< isochronous OUT transfer not complete interrupt enable */ +#define GINTEN_ISOINCIE BIT(20) /*!< isochronous IN transfer not complete interrupt enable */ +#define GINTEN_OEPIE BIT(19) /*!< OUT endpoints interrupt enable */ +#define GINTEN_IEPIE BIT(18) /*!< IN endpoints interrupt enable */ +#define GINTEN_EOPFIE BIT(15) /*!< end of periodic frame interrupt enable */ +#define GINTEN_ISOOPDIE BIT(14) /*!< isochronous OUT packet dropped interrupt enable */ +#define GINTEN_ENUMFIE BIT(13) /*!< enumeration finish enable */ +#define GINTEN_RSTIE BIT(12) /*!< USB reset interrupt enable */ +#define GINTEN_SPIE BIT(11) /*!< USB suspend interrupt enable */ +#define GINTEN_ESPIE BIT(10) /*!< early suspend interrupt enable */ +#define GINTEN_GONAKIE BIT(7) /*!< global OUT NAK effective interrupt enable */ +#define GINTEN_GNPINAKIE BIT(6) /*!< global non-periodic IN NAK effective interrupt enable */ +#define GINTEN_NPTXFEIE BIT(5) /*!< non-periodic TX FIFO empty interrupt enable */ +#define GINTEN_RXFNEIE BIT(4) /*!< receive FIFO non-empty interrupt enable */ +#define GINTEN_SOFIE BIT(3) /*!< start of frame interrupt enable */ +#define GINTEN_OTGIE BIT(2) /*!< OTG interrupt enable */ +#define GINTEN_MFIE BIT(1) /*!< mode fault interrupt enable */ + +/* global receive status read and pop register bits definitions */ +#define GRSTATRP_RPCKST BITS(17, 20) /*!< received packet status */ +#define GRSTATRP_DPID BITS(15, 16) /*!< data PID */ +#define GRSTATRP_BCOUNT BITS(4, 14) /*!< byte count */ +#define GRSTATRP_CNUM BITS(0, 3) /*!< channel number */ +#define GRSTATRP_EPNUM BITS(0, 3) /*!< endpoint number */ + +/* global receive FIFO length register bits definitions */ +#define GRFLEN_RXFD BITS(0, 15) /*!< rx FIFO depth */ + +/* host non-periodic transmit FIFO length register bits definitions */ +#define HNPTFLEN_HNPTXFD BITS(16, 31) /*!< non-periodic TX FIFO depth */ +#define HNPTFLEN_HNPTXRSAR BITS(0, 15) /*!< non-periodic TX RAM start address */ + +/* USB IN endpoint 0 transmit FIFO length register bits definitions */ +#define DIEP0TFLEN_IEP0TXFD BITS(16, 31) /*!< IN Endpoint 0 TX FIFO depth */ +#define DIEP0TFLEN_IEP0TXRSAR BITS(0, 15) /*!< IN Endpoint 0 TX RAM start address */ + +/* host non-periodic transmit FIFO/queue status register bits definitions */ +#define HNPTFQSTAT_NPTXRQTOP BITS(24, 30) /*!< top entry of the non-periodic TX request queue */ +#define HNPTFQSTAT_NPTXRQS BITS(16, 23) /*!< non-periodic TX request queue space */ +#define HNPTFQSTAT_NPTXFS BITS(0, 15) /*!< non-periodic TX FIFO space */ +#define HNPTFQSTAT_CNUM BITS(27, 30) /*!< channel number*/ +#define HNPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ +#define HNPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ +#define HNPTFQSTAT_TMF BIT(24) /*!< terminate flag */ + +/* global core configuration register bits definitions */ +#define GCCFG_VBUSIG BIT(21) /*!< vbus ignored */ +#define GCCFG_SOFOEN BIT(20) /*!< SOF output enable */ +#define GCCFG_VBUSBCEN BIT(19) /*!< the VBUS B-device comparer enable */ +#define GCCFG_VBUSACEN BIT(18) /*!< the VBUS A-device comparer enable */ +#define GCCFG_PWRON BIT(16) /*!< power on */ + +/* core ID register bits definitions */ +#define CID_CID BITS(0, 31) /*!< core ID */ + +/* host periodic transmit FIFO length register bits definitions */ +#define HPTFLEN_HPTXFD BITS(16, 31) /*!< host periodic TX FIFO depth */ +#define HPTFLEN_HPTXFSAR BITS(0, 15) /*!< host periodic TX RAM start address */ + +/* device IN endpoint transmit FIFO length register bits definitions */ +#define DIEPTFLEN_IEPTXFD BITS(16, 31) /*!< IN endpoint TX FIFO x depth */ +#define DIEPTFLEN_IEPTXRSAR BITS(0, 15) /*!< IN endpoint FIFOx TX x RAM start address */ + +/* host control register bits definitions */ +#define HCTL_SPDFSLS BIT(2) /*!< speed limited to FS and LS */ +#define HCTL_CLKSEL BITS(0, 1) /*!< clock select for USB clock */ + +/* host frame interval register bits definitions */ +#define HFT_FRI BITS(0, 15) /*!< frame interval */ + +/* host frame information remaining register bits definitions */ +#define HFINFR_FRT BITS(16, 31) /*!< frame remaining time */ +#define HFINFR_FRNUM BITS(0, 15) /*!< frame number */ + +/* host periodic transmit FIFO/queue status register bits definitions */ +#define HPTFQSTAT_PTXREQT BITS(24, 31) /*!< top entry of the periodic TX request queue */ +#define HPTFQSTAT_PTXREQS BITS(16, 23) /*!< periodic TX request queue space */ +#define HPTFQSTAT_PTXFS BITS(0, 15) /*!< periodic TX FIFO space */ +#define HPTFQSTAT_OEFRM BIT(31) /*!< odd/eveb frame */ +#define HPTFQSTAT_CNUM BITS(27, 30) /*!< channel number */ +#define HPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ +#define HPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ +#define HPTFQSTAT_TMF BIT(24) /*!< terminate flag */ + +#define TFQSTAT_TXFS BITS(0, 15) +#define TFQSTAT_CNUM BITS(27, 30) + +/* host all channels interrupt register bits definitions */ +#define HACHINT_HACHINT BITS(0, 11) /*!< host all channel interrupts */ + +/* host all channels interrupt enable register bits definitions */ +#define HACHINTEN_CINTEN BITS(0, 11) /*!< channel interrupt enable */ + +/* host port control and status register bits definitions */ +#define HPCS_PS BITS(17, 18) /*!< port speed */ +#define HPCS_PTEST BITS(13, 16) /*!< port test control */ +#define HPCS_PP BIT(12) /*!< port power */ +#define HPCS_PLST BITS(10, 11) /*!< port line status */ +#define HPCS_PRST BIT(8) /*!< port reset */ +#define HPCS_PSP BIT(7) /*!< port suspend */ +#define HPCS_PREM BIT(6) /*!< port resume */ +#define HPCS_PEDC BIT(3) /*!< port enable/disable change */ +#define HPCS_PE BIT(2) /*!< port enable */ +#define HPCS_PCD BIT(1) /*!< port connect detected */ +#define HPCS_PCST BIT(0) /*!< port connect status */ + +/* host channel-x control register bits definitions */ +#define HCHCTL_CEN BIT(31) /*!< channel enable */ +#define HCHCTL_CDIS BIT(30) /*!< channel disable */ +#define HCHCTL_ODDFRM BIT(29) /*!< odd frame */ +#define HCHCTL_DAR BITS(22, 28) /*!< device address */ +#define HCHCTL_MPC BITS(20, 21) /*!< multiple packet count */ +#define HCHCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define HCHCTL_LSD BIT(17) /*!< low-speed device */ +#define HCHCTL_EPDIR BIT(15) /*!< endpoint direction */ +#define HCHCTL_EPNUM BITS(11, 14) /*!< endpoint number */ +#define HCHCTL_MPL BITS(0, 10) /*!< maximum packet length */ + +/* host channel-x split transaction register bits definitions */ +#define HCHSTCTL_SPLEN BIT(31) /*!< enable high-speed split transaction */ +#define HCHSTCTL_CSPLT BIT(16) /*!< complete-split enable */ +#define HCHSTCTL_ISOPCE BITS(14, 15) /*!< isochronous OUT payload continuation encoding */ +#define HCHSTCTL_HADDR BITS(7, 13) /*!< HUB address */ +#define HCHSTCTL_PADDR BITS(0, 6) /*!< port address */ + +/* host channel-x interrupt flag register bits definitions */ +#define HCHINTF_DTER BIT(10) /*!< data toggle error */ +#define HCHINTF_REQOVR BIT(9) /*!< request queue overrun */ +#define HCHINTF_BBER BIT(8) /*!< babble error */ +#define HCHINTF_USBER BIT(7) /*!< USB bus Error */ +#define HCHINTF_NYET BIT(6) /*!< NYET */ +#define HCHINTF_ACK BIT(5) /*!< ACK */ +#define HCHINTF_NAK BIT(4) /*!< NAK */ +#define HCHINTF_STALL BIT(3) /*!< STALL */ +#define HCHINTF_DMAER BIT(2) /*!< DMA error */ +#define HCHINTF_CH BIT(1) /*!< channel halted */ +#define HCHINTF_TF BIT(0) /*!< transfer finished */ + +/* host channel-x interrupt enable register bits definitions */ +#define HCHINTEN_DTERIE BIT(10) /*!< data toggle error interrupt enable */ +#define HCHINTEN_REQOVRIE BIT(9) /*!< request queue overrun interrupt enable */ +#define HCHINTEN_BBERIE BIT(8) /*!< babble error interrupt enable */ +#define HCHINTEN_USBERIE BIT(7) /*!< USB bus error interrupt enable */ +#define HCHINTEN_NYETIE BIT(6) /*!< NYET interrupt enable */ +#define HCHINTEN_ACKIE BIT(5) /*!< ACK interrupt enable */ +#define HCHINTEN_NAKIE BIT(4) /*!< NAK interrupt enable */ +#define HCHINTEN_STALLIE BIT(3) /*!< STALL interrupt enable */ +#define HCHINTEN_DMAERIE BIT(2) /*!< DMA error interrupt enable */ +#define HCHINTEN_CHIE BIT(1) /*!< channel halted interrupt enable */ +#define HCHINTEN_TFIE BIT(0) /*!< transfer finished interrupt enable */ + +/* host channel-x transfer length register bits definitions */ +#define HCHLEN_PING BIT(31) /*!< PING token request */ +#define HCHLEN_DPID BITS(29, 30) /*!< data PID */ +#define HCHLEN_PCNT BITS(19, 28) /*!< packet count */ +#define HCHLEN_TLEN BITS(0, 18) /*!< transfer length */ + +/* host channel-x DMA address register bits definitions */ +#define HCHDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + +#define PORT_SPEED(x) (((uint32_t)(x) << 17) & HPCS_PS) /*!< Port speed */ + +#define PORT_SPEED_HIGH PORT_SPEED(0U) /*!< high speed */ +#define PORT_SPEED_FULL PORT_SPEED(1U) /*!< full speed */ +#define PORT_SPEED_LOW PORT_SPEED(2U) /*!< low speed */ + +#define PIPE_CTL_DAR(x) (((uint32_t)(x) << 22) & HCHCTL_DAR) /*!< device address */ +#define PIPE_CTL_EPTYPE(x) (((uint32_t)(x) << 18) & HCHCTL_EPTYPE) /*!< endpoint type */ +#define PIPE_CTL_EPNUM(x) (((uint32_t)(x) << 11) & HCHCTL_EPNUM) /*!< endpoint number */ +#define PIPE_CTL_EPDIR(x) (((uint32_t)(x) << 15) & HCHCTL_EPDIR) /*!< endpoint direction */ +#define PIPE_CTL_EPMPL(x) (((uint32_t)(x) << 0) & HCHCTL_MPL) /*!< maximum packet length */ +#define PIPE_CTL_LSD(x) (((uint32_t)(x) << 17) & HCHCTL_LSD) /*!< low-Speed device */ + +#define PIPE_XFER_PCNT(x) (((uint32_t)(x) << 19) & HCHLEN_PCNT) /*!< packet count */ +#define PIPE_XFER_DPID(x) (((uint32_t)(x) << 29) & HCHLEN_DPID) /*!< data PID */ + +#define PIPE_DPID_DATA0 PIPE_XFER_DPID(0U) /*!< DATA0 */ +#define PIPE_DPID_DATA1 PIPE_XFER_DPID(2U) /*!< DATA1 */ +#define PIPE_DPID_DATA2 PIPE_XFER_DPID(1U) /*!< DATA2 */ +#define PIPE_DPID_SETUP PIPE_XFER_DPID(3U) /*!< MDATA (non-control)/SETUP (control) */ + +extern const uint32_t PIPE_DPID[2]; + +/* device configuration registers bits definitions */ +#define DCFG_EOPFT BITS(11, 12) /*!< end of periodic frame time */ +#define DCFG_DAR BITS(4, 10) /*!< device address */ +#define DCFG_NZLSOH BIT(2) /*!< non-zero-length status OUT handshake */ +#define DCFG_DS BITS(0, 1) /*!< device speed */ + +/* device control registers bits definitions */ +#define DCTL_POIF BIT(11) /*!< power-on initialization finished */ +#define DCTL_CGONAK BIT(10) /*!< clear global OUT NAK */ +#define DCTL_SGONAK BIT(9) /*!< set global OUT NAK */ +#define DCTL_CGINAK BIT(8) /*!< clear global IN NAK */ +#define DCTL_SGINAK BIT(7) /*!< set global IN NAK */ +#define DCTL_DTEST BITS(4, 6) /*!< device test control */ +#define DCTL_GONS BIT(3) /*!< global OUT NAK status */ +#define DCTL_GINS BIT(2) /*!< global IN NAK status */ +#define DCTL_SD BIT(1) /*!< soft disconnect */ +#define DCTL_RWKUP BIT(0) /*!< remote wakeup */ + +/* device status registers bits definitions */ +#define DSTAT_FNRSOF BITS(8, 21) /*!< the frame number of the received SOF. */ +#define DSTAT_ES BITS(1, 2) /*!< enumerated speed */ +#define DSTAT_SPST BIT(0) /*!< suspend status */ + +/* device IN endpoint common interrupt enable registers bits definitions */ +#define DIEPINTEN_NAKEN BIT(13) /*!< NAK handshake sent by USB interrupt enable bit */ +#define DIEPINTEN_TXFEEN BIT(7) /*!< transmit FIFO empty interrupt enable bit */ +#define DIEPINTEN_IEPNEEN BIT(6) /*!< IN endpoint NAK effective interrupt enable bit */ +#define DIEPINTEN_EPTXFUDEN BIT(4) /*!< endpoint TX FIFO underrun interrupt enable bit */ +#define DIEPINTEN_CITOEN BIT(3) /*!< control In Timeout interrupt enable bit */ +#define DIEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ +#define DIEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ + +/* device OUT endpoint common interrupt enable registers bits definitions */ +#define DOEPINTEN_NYETEN BIT(14) /*!< NYET handshake is sent interrupt enable bit */ +#define DOEPINTEN_BTBSTPEN BIT(6) /*!< back-to-back SETUP packets interrupt enable bit */ +#define DOEPINTEN_EPRXFOVREN BIT(4) /*!< endpoint RX FIFO overrun interrupt enable bit */ +#define DOEPINTEN_STPFEN BIT(3) /*!< SETUP phase finished interrupt enable bit */ +#define DOEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ +#define DOEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ + +/* device all endpoints interrupt registers bits definitions */ +#define DAEPINT_OEPITB BITS(16, 21) /*!< device all OUT endpoint interrupt bits */ +#define DAEPINT_IEPITB BITS(0, 5) /*!< device all IN endpoint interrupt bits */ + +/* device all endpoints interrupt enable registers bits definitions */ +#define DAEPINTEN_OEPIE BITS(16, 21) /*!< OUT endpoint interrupt enable */ +#define DAEPINTEN_IEPIE BITS(0, 3) /*!< IN endpoint interrupt enable */ + +/* device Vbus discharge time registers bits definitions */ +#define DVBUSDT_DVBUSDT BITS(0, 15) /*!< device VBUS discharge time */ + +/* device Vbus pulsing time registers bits definitions */ +#define DVBUSPT_DVBUSPT BITS(0, 11) /*!< device VBUS pulsing time */ + +/* device IN endpoint FIFO empty interrupt enable register bits definitions */ +#define DIEPFEINTEN_IEPTXFEIE BITS(0, 5) /*!< IN endpoint TX FIFO empty interrupt enable bits */ + +/* device endpoint 0 control register bits definitions */ +#define DEP0CTL_EPEN BIT(31) /*!< endpoint enable */ +#define DEP0CTL_EPD BIT(30) /*!< endpoint disable */ +#define DEP0CTL_SNAK BIT(27) /*!< set NAK */ +#define DEP0CTL_CNAK BIT(26) /*!< clear NAK */ +#define DIEP0CTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ +#define DEP0CTL_STALL BIT(21) /*!< STALL handshake */ +#define DOEP0CTL_SNOOP BIT(20) /*!< snoop mode */ +#define DEP0CTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define DEP0CTL_NAKS BIT(17) /*!< NAK status */ +#define DEP0CTL_EPACT BIT(15) /*!< endpoint active */ +#define DEP0CTL_MPL BITS(0, 1) /*!< maximum packet length */ + +/* device endpoint x control register bits definitions */ +#define DEPCTL_EPEN BIT(31) /*!< endpoint enable */ +#define DEPCTL_EPD BIT(30) /*!< endpoint disable */ +#define DEPCTL_SODDFRM BIT(29) /*!< set odd frame */ +#define DEPCTL_SD1PID BIT(29) /*!< set DATA1 PID */ +#define DEPCTL_SEVNFRM BIT(28) /*!< set even frame */ +#define DEPCTL_SD0PID BIT(28) /*!< set DATA0 PID */ +#define DEPCTL_SNAK BIT(27) /*!< set NAK */ +#define DEPCTL_CNAK BIT(26) /*!< clear NAK */ +#define DIEPCTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ +#define DEPCTL_STALL BIT(21) /*!< STALL handshake */ +#define DOEPCTL_SNOOP BIT(20) /*!< snoop mode */ +#define DEPCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define DEPCTL_NAKS BIT(17) /*!< NAK status */ +#define DEPCTL_EOFRM BIT(16) /*!< even/odd frame */ +#define DEPCTL_DPID BIT(16) /*!< endpoint data PID */ +#define DEPCTL_EPACT BIT(15) /*!< endpoint active */ +#define DEPCTL_MPL BITS(0, 10) /*!< maximum packet length */ + +/* device IN endpoint-x interrupt flag register bits definitions */ +#define DIEPINTF_NAK BIT(13) /*!< NAK handshake sent by USB */ +#define DIEPINTF_TXFE BIT(7) /*!< transmit FIFO empty */ +#define DIEPINTF_IEPNE BIT(6) /*!< IN endpoint NAK effective */ +#define DIEPINTF_EPTXFUD BIT(4) /*!< endpoint TX FIFO underrun */ +#define DIEPINTF_CITO BIT(3) /*!< control In Timeout interrupt */ +#define DIEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ +#define DIEPINTF_TF BIT(0) /*!< transfer finished */ + +/* device OUT endpoint-x interrupt flag register bits definitions */ +#define DOEPINTF_NYET BIT(14) /*!< NYET handshake is sent */ +#define DOEPINTF_BTBSTP BIT(6) /*!< back-to-back SETUP packets */ +#define DOEPINTF_EPRXFOVR BIT(4) /*!< endpoint RX FIFO overrun */ +#define DOEPINTF_STPF BIT(3) /*!< SETUP phase finished */ +#define DOEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ +#define DOEPINTF_TF BIT(0) /*!< transfer finished */ + +/* device IN endpoint 0 transfer length register bits definitions */ +#define DIEP0LEN_PCNT BITS(19, 20) /*!< packet count */ +#define DIEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ + +/* device OUT endpoint 0 transfer length register bits definitions */ +#define DOEP0LEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ +#define DOEP0LEN_PCNT BIT(19) /*!< packet count */ +#define DOEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ + +/* device OUT endpoint-x transfer length register bits definitions */ +#define DOEPLEN_RXDPID BITS(29, 30) /*!< received data PID */ +#define DOEPLEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ +#define DIEPLEN_MCNT BITS(29, 30) /*!< multi count */ +#define DEPLEN_PCNT BITS(19, 28) /*!< packet count */ +#define DEPLEN_TLEN BITS(0, 18) /*!< transfer length */ + +/* device IN endpoint-x DMA address register bits definitions */ +#define DIEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + +/* device OUT endpoint-x DMA address register bits definitions */ +#define DOEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + +/* device IN endpoint-x transmit FIFO status register bits definitions */ +#define DIEPTFSTAT_IEPTFS BITS(0, 15) /*!< IN endpoint TX FIFO space remaining */ + +/* USB power and clock registers bits definition */ +#define PWRCLKCTL_SHCLK BIT(1) /*!< stop HCLK */ +#define PWRCLKCTL_SUCLK BIT(0) /*!< stop the USB clock */ + +#define RSTAT_GOUT_NAK 1U /*!< global OUT NAK (triggers an interrupt) */ +#define RSTAT_DATA_UPDT 2U /*!< OUT data packet received */ +#define RSTAT_XFER_COMP 3U /*!< OUT transfer completed (triggers an interrupt) */ +#define RSTAT_SETUP_COMP 4U /*!< SETUP transaction completed (triggers an interrupt) */ +#define RSTAT_SETUP_UPDT 6U /*!< SETUP data packet received */ + +#define DSTAT_EM_HS_PHY_30MHZ_60MHZ 0U /*!< USB enumerate speed use high-speed PHY clock in 30MHz or 60MHz */ +#define DSTAT_EM_FS_PHY_30MHZ_60MHZ 1U /*!< USB enumerate speed use full-speed PHY clock in 30MHz or 60MHz */ +#define DSTAT_EM_LS_PHY_6MHZ 2U /*!< USB enumerate speed use low-speed PHY clock in 6MHz */ +#define DSTAT_EM_FS_PHY_48MHZ 3U /*!< USB enumerate speed use full-speed PHY clock in 48MHz */ + +#define DPID_DATA0 0U /*!< device endpoint data PID is DATA0 */ +#define DPID_DATA1 2U /*!< device endpoint data PID is DATA1 */ +#define DPID_DATA2 1U /*!< device endpoint data PID is DATA2 */ +#define DPID_MDATA 3U /*!< device endpoint data PID is MDATA */ + +#define GAHBCS_DMAINCR(regval) (GAHBCS_BURST & ((regval) << 1)) /*!< AHB burst type used by DMA*/ + +#define DMA_INCR0 GAHBCS_DMAINCR(0U) /*!< single burst type used by DMA*/ +#define DMA_INCR1 GAHBCS_DMAINCR(1U) /*!< 4-beat incrementing burst type used by DMA*/ +#define DMA_INCR4 GAHBCS_DMAINCR(3U) /*!< 8-beat incrementing burst type used by DMA*/ +#define DMA_INCR8 GAHBCS_DMAINCR(5U) /*!< 16-beat incrementing burst type used by DMA*/ +#define DMA_INCR16 GAHBCS_DMAINCR(7U) /*!< 32-beat incrementing burst type used by DMA*/ + +#define DCFG_PFRI(regval) (DCFG_EOPFT & ((regval) << 11)) /*!< end of periodic frame time configuration */ + +#define FRAME_INTERVAL_80 DCFG_PFRI(0U) /*!< 80% of the frame time */ +#define FRAME_INTERVAL_85 DCFG_PFRI(1U) /*!< 85% of the frame time */ +#define FRAME_INTERVAL_90 DCFG_PFRI(2U) /*!< 90% of the frame time */ +#define FRAME_INTERVAL_95 DCFG_PFRI(3U) /*!< 95% of the frame time */ + +#define DCFG_DEVSPEED(regval) (DCFG_DS & ((regval) << 0)) /*!< device speed configuration */ + +#define USB_SPEED_EXP_HIGH DCFG_DEVSPEED(0U) /*!< device external PHY high speed */ +#define USB_SPEED_EXP_FULL DCFG_DEVSPEED(1U) /*!< device external PHY full speed */ +#define USB_SPEED_INP_FULL DCFG_DEVSPEED(3U) /*!< device internal PHY full speed */ + +#define DEP0_MPL(regval) (DEP0CTL_MPL & ((regval) << 0)) /*!< maximum packet length configuration */ + +#define EP0MPL_64 DEP0_MPL(0U) /*!< maximum packet length 64 bytes */ +#define EP0MPL_32 DEP0_MPL(1U) /*!< maximum packet length 32 bytes */ +#define EP0MPL_16 DEP0_MPL(2U) /*!< maximum packet length 16 bytes */ +#define EP0MPL_8 DEP0_MPL(3U) /*!< maximum packet length 8 bytes */ + +#define DOEP0_TLEN(regval) (DOEP0LEN_TLEN & ((regval) << 0)) /*!< transfer length */ +#define DOEP0_PCNT(regval) (DOEP0LEN_PCNT & ((regval) << 19)) /*!< packet count */ +#define DOEP0_STPCNT(regval) (DOEP0LEN_STPCNT & ((regval) << 29)) /*!< SETUP packet count */ + +#define USB_ULPI_PHY 1U /*!< ULPI interface external PHY */ +#define USB_EMBEDDED_PHY 2U /*!< embedded PHY */ + +#define GRXSTS_PKTSTS_IN 2U +#define GRXSTS_PKTSTS_IN_XFER_COMP 3U +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U +#define GRXSTS_PKTSTS_CH_HALTED 7U + +#define HCTL_30_60MHZ 0U /*!< USB clock 30-60MHZ */ +#define HCTL_48MHZ 1U /*!< USB clock 48MHZ */ +#define HCTL_6MHZ 2U /*!< USB clock 6MHZ */ + +#define EP0_OUT ((uint8_t)0x00U) /*!< endpoint OUT 0 */ +#define EP0_IN ((uint8_t)0x80U) /*!< endpoint IN 0 */ +#define EP1_OUT ((uint8_t)0x01U) /*!< endpoint OUT 1 */ +#define EP1_IN ((uint8_t)0x81U) /*!< endpoint IN 1 */ +#define EP2_OUT ((uint8_t)0x02U) /*!< endpoint OUT 2 */ +#define EP2_IN ((uint8_t)0x82U) /*!< endpoint IN 2 */ +#define EP3_OUT ((uint8_t)0x03U) /*!< endpoint OUT 3 */ +#define EP3_IN ((uint8_t)0x83U) /*!< endpoint IN 3 */ +#define EP4_OUT ((uint8_t)0x04U) /*!< endpoint OUT 4 */ +#define EP4_IN ((uint8_t)0x84U) /*!< endpoint IN 4 */ +#define EP5_OUT ((uint8_t)0x05U) /*!< endpoint OUT 5 */ +#define EP5_IN ((uint8_t)0x85U) /*!< endpoint IN 5 */ + +#endif /* DRV_USB_REGS_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h new file mode 100644 index 00000000000..351690ecf31 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h @@ -0,0 +1,50 @@ +/*! + \file drv_usbd_int.h + \brief USB device mode interrupt header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USBD_INT_H +#define DRV_USBD_INT_H + +#include "drv_usb_dev.h" + +/* function declarations */ +/* USB device-mode interrupts global service routine handler */ +void usbd_isr(usb_core_driver *udev); +#ifdef USB_HS_DEDICATED_EP1_ENABLED +/* USB dedicated IN endpoint 1 interrupt service routine handler */ +uint32_t usbd_int_dedicated_ep1in(usb_core_driver *udev); +/* USB dedicated OUT endpoint 1 interrupt service routine handler */ +uint32_t usbd_int_dedicated_ep1out(usb_core_driver *udev); +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + +#endif /* DRV_USBD_INT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h new file mode 100644 index 00000000000..74c56b6c4bd --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h @@ -0,0 +1,53 @@ +/*! + \file drv_usbh_int.h.h + \brief USB host mode interrupt management header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DRV_USBH_INT_H +#define DRV_USBH_INT_H + +#include "drv_usb_host.h" +#include "usbh_core.h" + +typedef struct _usbh_ev_cb { + uint8_t (*connect)(usbh_host *uhost); + uint8_t (*disconnect)(usbh_host *uhost); + uint8_t (*SOF)(usbh_host *uhost); +} usbh_ev_cb; + +extern usbh_ev_cb *usbh_int_fop; + +/* function declarations */ +/* handle global host interrupt */ +uint32_t usbh_isr(usb_core_driver *udev); + +#endif /* DRV_USBH_INT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c new file mode 100644 index 00000000000..0b650f632d2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c @@ -0,0 +1,371 @@ +/*! + \file drv_usb_core.c + \brief USB core driver which can operate in host and device mode + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_core.h" +#include "drv_usb_hw.h" + +/* local function prototypes ('static') */ +static void usb_core_reset(usb_core_regs *usb_regs); + +/*! + \brief configure USB core basic + \param[in] usb_basic: pointer to USB capabilities + \param[in] usb_regs: USB core registers + \param[in] usb_core: USB core + \param[out] none + \retval operation status +*/ +usb_status usb_basic_init(usb_core_basic *usb_basic, \ + usb_core_regs *usb_regs, \ + usb_core_enum usb_core) +{ + /* configure USB default transfer mode as FIFO mode */ + usb_basic->transfer_mode = (uint8_t)USB_USE_FIFO; + + /* USB default speed is full-speed */ + usb_basic->core_speed = (uint8_t)USB_SPEED_FULL; + + usb_basic->core_enum = (uint8_t)usb_core; + + switch(usb_core) { + case USB_CORE_ENUM_HS: + usb_basic->base_reg = (uint32_t)USBHS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBHS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBHS_MAX_EP_COUNT; + +#ifdef USB_ULPI_PHY_ENABLED + usb_basic->phy_itf = USB_ULPI_PHY; +#else + usb_basic->phy_itf = USB_EMBEDDED_PHY; +#endif /* USB_ULPI_PHY_ENABLED */ + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + usb_basic->transfer_mode = USB_USE_DMA; +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ + +#ifdef USB_HS_CORE + /* configure the SOF output and the low power support */ + usb_basic->sof_enable = USBHS_SOF_OUTPUT; + usb_basic->low_power = USBHS_LOW_POWER; +#endif /* USB_HS_CORE */ + break; + + case USB_CORE_ENUM_FS: + usb_basic->base_reg = (uint32_t)USBFS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBFS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBFS_MAX_EP_COUNT; + + /* USBFS core use embedded physical layer */ + usb_basic->phy_itf = USB_EMBEDDED_PHY; + +#ifdef USB_FS_CORE + /* configure the SOF output and the low power support */ + usb_basic->sof_enable = USBFS_SOF_OUTPUT; + usb_basic->low_power = USBFS_LOW_POWER; +#endif /* USB_FS_CORE */ + break; + + default: + return USB_FAIL; + } + + /* assign main registers address */ + *usb_regs = (usb_core_regs) { + .gr = (usb_gr *)(usb_basic->base_reg + USB_REG_OFFSET_CORE), + .hr = (usb_hr *)(usb_basic->base_reg + USB_REG_OFFSET_HOST), + .dr = (usb_dr *)(usb_basic->base_reg + USB_REG_OFFSET_DEV), + + .HPCS = (uint32_t *)(usb_basic->base_reg + USB_REG_OFFSET_PORT), + .PWRCLKCTL = (uint32_t *)(usb_basic->base_reg + USB_REG_OFFSET_PWRCLKCTL) + }; + + /* assign device endpoint registers address */ + for(uint8_t i = 0U; i < usb_basic->num_ep; i++) { + usb_regs->er_in[i] = (usb_erin *) \ + (usb_basic->base_reg + USB_REG_OFFSET_EP_IN + (i * USB_REG_OFFSET_EP)); + + usb_regs->er_out[i] = (usb_erout *)\ + (usb_basic->base_reg + USB_REG_OFFSET_EP_OUT + (i * USB_REG_OFFSET_EP)); + } + + /* assign host pipe registers address */ + for(uint8_t i = 0U; i < usb_basic->num_pipe; i++) { + usb_regs->pr[i] = (usb_pr *) \ + (usb_basic->base_reg + USB_REG_OFFSET_CH_INOUT + (i * USB_REG_OFFSET_CH)); + + usb_regs->DFIFO[i] = (uint32_t *) \ + (usb_basic->base_reg + USB_DATA_FIFO_OFFSET + (i * USB_DATA_FIFO_SIZE)); + } + + return USB_OK; +} + +/*! + \brief initializes the USB controller registers and + prepares the core device mode or host mode operation + \param[in] usb_basic: pointer to USB capabilities + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval operation status +*/ +usb_status usb_core_init(usb_core_basic usb_basic, usb_core_regs *usb_regs) +{ + if(USB_ULPI_PHY == usb_basic.phy_itf) { + usb_regs->gr->GCCFG &= ~GCCFG_PWRON; + + if(usb_basic.sof_enable) { + usb_regs->gr->GCCFG |= GCCFG_SOFOEN; + } + + /* initialize the ULPI interface */ + usb_regs->gr->GUSBCS &= ~(GUSBCS_EMBPHY | GUSBCS_ULPIEOI); + +#ifdef USBHS_EXTERNAL_VBUS_ENABLED + /* use external VBUS driver */ + usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; +#else + /* use internal VBUS driver */ + usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; +#endif /* USBHS_EXTERNAL_VBUS_ENABLED */ + + /* soft reset the core */ + usb_core_reset(usb_regs); + } else { + usb_regs->gr->GUSBCS |= GUSBCS_EMBPHY; + + /* soft reset the core */ + usb_core_reset(usb_regs); + + /* active the transceiver and enable VBUS sensing */ + usb_regs->gr->GCCFG |= GCCFG_PWRON | GCCFG_VBUSACEN | GCCFG_VBUSBCEN; + +#ifndef VBUS_SENSING_ENABLED + usb_regs->gr->GCCFG |= GCCFG_VBUSIG; +#endif /* VBUS_SENSING_ENABLED */ + + /* enable SOF output */ + if(usb_basic.sof_enable) { + usb_regs->gr->GCCFG |= GCCFG_SOFOEN; + } + + usb_mdelay(20U); + } + + if((uint8_t)USB_USE_DMA == usb_basic.transfer_mode) { + usb_regs->gr->GAHBCS &= ~GAHBCS_BURST; + usb_regs->gr->GAHBCS |= DMA_INCR8 | GAHBCS_DMAEN; + } + +#ifdef USE_OTG_MODE + + /* enable USB OTG features */ + usb_regs->gr->GUSBCS |= GUSBCS_HNPCEN | GUSBCS_SRPCEN; + + /* enable the USB wakeup and suspend interrupts */ + usb_regs->gr->GINTF = 0xBFFFFFFFU; + + usb_regs->gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE | \ + GINTEN_OTGIE | GINTEN_SESIE | GINTEN_CIDPSCIE; + +#endif /* USE_OTG_MODE */ + + return USB_OK; +} + +/*! + \brief write a packet into the TX FIFO associated with the endpoint + \param[in] usb_regs: pointer to USB core registers + \param[in] src_buf: pointer to source buffer + \param[in] fifo_num: FIFO number which is in (0..3 or 0..5) + \param[in] byte_count: packet byte count + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_write(usb_core_regs *usb_regs, \ + uint8_t *src_buf, \ + uint8_t fifo_num, \ + uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[fifo_num]; + + while(word_count-- > 0U) { + *fifo = *((uint32_t *)src_buf); + + src_buf += 4U; + } + + return USB_OK; +} + +/*! + \brief read a packet from the RX FIFO associated with the endpoint + \param[in] usb_regs: pointer to USB core registers + \param[in] dest_buf: pointer to destination buffer + \param[in] byte_count: packet byte count + \param[out] none + \retval void type pointer +*/ +void *usb_rxfifo_read(usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[0]; + + while(word_count-- > 0U) { + *(uint32_t *)dest_buf = *fifo; + + dest_buf += 4U; + } + + return ((void *)dest_buf); +} + +/*! + \brief flush a TX FIFO or all TX FIFOs + \param[in] usb_regs: pointer to USB core registers + \param[in] fifo_num: FIFO number which is in (0..3 or 0..5) + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_flush(usb_core_regs *usb_regs, uint8_t fifo_num) +{ + usb_regs->gr->GRSTCTL = ((uint32_t)fifo_num << 6) | GRSTCTL_TXFF; + + /* wait for TX FIFO flush bit is set */ + while(usb_regs->gr->GRSTCTL & GRSTCTL_TXFF) { + /* no operation */ + } + + /* wait for 3 PHY clocks*/ + usb_udelay(3U); + + return USB_OK; +} + +/*! + \brief flush the entire RX FIFO + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval operation status +*/ +usb_status usb_rxfifo_flush(usb_core_regs *usb_regs) +{ + usb_regs->gr->GRSTCTL = GRSTCTL_RXFF; + + /* wait for RX FIFO flush bit is set */ + while(usb_regs->gr->GRSTCTL & GRSTCTL_RXFF) { + /* no operation */ + } + + /* wait for 3 PHY clocks */ + usb_udelay(3U); + + return USB_OK; +} + +/*! + \brief set endpoint or channel TX FIFO size + \param[in] usb_regs: pointer to USB core registers + \param[in] fifo: TX FIFO number + \param[in] size: assigned TX FIFO size + \param[out] none + \retval none +*/ +void usb_set_txfifo(usb_core_regs *usb_regs, uint8_t fifo, uint16_t size) +{ + uint32_t tx_offset = usb_regs->gr->GRFLEN; + + if(0U == fifo) { + usb_regs->gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)size << 16) | tx_offset; + } else { + tx_offset += (usb_regs->gr->DIEP0TFLEN_HNPTFLEN) >> 16; + + for(uint8_t i = 0U; i < (fifo - 1U); i++) { + tx_offset += (usb_regs->gr->DIEPTFLEN[i] >> 16); + } + + /* multiply Tx_Size by 2 to get higher performance */ + usb_regs->gr->DIEPTFLEN[fifo - 1U] = ((uint32_t)size << 16) | tx_offset; + } +} + +/*! + \brief set USB current mode + \param[in] usb_regs: pointer to USB core registers + \param[in] mode: USB current mode + \param[out] none + \retval none +*/ +void usb_curmode_set(usb_core_regs *usb_regs, uint8_t mode) +{ + usb_regs->gr->GUSBCS &= ~(GUSBCS_FDM | GUSBCS_FHM); + + if(DEVICE_MODE == mode) { + usb_regs->gr->GUSBCS |= GUSBCS_FDM; + } else if(HOST_MODE == mode) { + usb_regs->gr->GUSBCS |= GUSBCS_FHM; + } else { + /* OTG mode and other mode can not be here! */ + } +} + +/*! + \brief configure USB core to soft reset + \param[in] usb_regs: pointer to USB core registers + \param[out] none + \retval none +*/ +static void usb_core_reset(usb_core_regs *usb_regs) +{ + /* enable core soft reset */ + usb_regs->gr->GRSTCTL |= GRSTCTL_CSRST; + + /* wait for the core to be soft reset */ + while(usb_regs->gr->GRSTCTL & GRSTCTL_CSRST) { + /* no operation */ + } + + /* wait for additional 3 PHY clocks */ + usb_udelay(3U); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c new file mode 100644 index 00000000000..0cb2744e9ee --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c @@ -0,0 +1,660 @@ +/*! + \file drv_usb_dev.c + \brief USB device mode low level driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_dev.h" + +/* endpoint 0 max packet length */ +static const uint8_t EP0_MAXLEN[4] = { + [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_48MHZ] = EP0MPL_64, + [DSTAT_EM_LS_PHY_6MHZ] = EP0MPL_8 +}; + +#ifdef USB_FS_CORE + +/* USBFS endpoint TX FIFO size */ +static uint16_t USBFS_TX_FIFO_SIZE[USBFS_MAX_EP_COUNT] = { + (uint16_t)TX0_FIFO_FS_SIZE, + (uint16_t)TX1_FIFO_FS_SIZE, + (uint16_t)TX2_FIFO_FS_SIZE, + (uint16_t)TX3_FIFO_FS_SIZE +}; + +#endif /* USBFS_CORE */ + +#ifdef USB_HS_CORE + +/* USBHS endpoint TX FIFO size */ +uint16_t USBHS_TX_FIFO_SIZE[USBHS_MAX_EP_COUNT] = { + (uint16_t)TX0_FIFO_HS_SIZE, + (uint16_t)TX1_FIFO_HS_SIZE, + (uint16_t)TX2_FIFO_HS_SIZE, + (uint16_t)TX3_FIFO_HS_SIZE, + (uint16_t)TX4_FIFO_HS_SIZE, + (uint16_t)TX5_FIFO_HS_SIZE +}; + +#endif /* USBHS_CORE */ + +/*! + \brief initialize USB core registers for device mode + \param[in] udev: pointer to USB device + \param[out] none + \retval operation status +*/ +usb_status usb_devcore_init(usb_core_driver *udev) +{ + uint8_t i = 0U; + + /* restart the PHY clock (maybe don't need to...) */ + *udev->regs.PWRCLKCTL = 0U; + + /* configure periodic frame interval to default value */ + udev->regs.dr->DCFG &= ~DCFG_EOPFT; + udev->regs.dr->DCFG |= FRAME_INTERVAL_80; + + udev->regs.dr->DCFG &= ~DCFG_DS; + +#ifdef USB_FS_CORE + if((uint8_t)USB_CORE_ENUM_FS == udev->bp.core_enum) { + /* set full-speed PHY */ + udev->regs.dr->DCFG |= USB_SPEED_INP_FULL; + + /* set RX FIFO size */ + usb_set_rxfifo(&udev->regs, RX_FIFO_FS_SIZE); + + /* set endpoint 0 to 3's TX FIFO length and RAM address */ + for(i = 0U; i < USBFS_MAX_EP_COUNT; i++) { + usb_set_txfifo(&udev->regs, i, USBFS_TX_FIFO_SIZE[i]); + } + } +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + if(USB_CORE_ENUM_HS == udev->bp.core_enum) { + if(USB_ULPI_PHY == udev->bp.phy_itf) { + udev->regs.dr->DCFG |= USB_SPEED_EXP_HIGH; + } else {/* set high speed PHY in full speed mode */ + udev->regs.dr->DCFG |= USB_SPEED_EXP_FULL; + } + + /* Set RX FIFO size */ + usb_set_rxfifo(&udev->regs, RX_FIFO_HS_SIZE); + + /* set endpoint 0 to 6's TX FIFO length and RAM address */ + for(i = 0U; i < USBHS_MAX_EP_COUNT; i++) { + usb_set_txfifo(&udev->regs, i, USBHS_TX_FIFO_SIZE[i]); + } + } +#endif /* USB_FS_CORE */ + + /* make sure all FIFOs are flushed */ + + /* flush all TX FIFOs */ + (void)usb_txfifo_flush(&udev->regs, 0x10U); + + /* flush entire RX FIFO */ + (void)usb_rxfifo_flush(&udev->regs); + + /* clear all pending device interrupts */ + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + udev->regs.dr->DAEPINTEN = 0U; + + /* configure all IN/OUT endpoints */ + for(i = 0U; i < udev->bp.num_ep; i++) { + if(udev->regs.er_in[i]->DIEPCTL & DEPCTL_EPEN) { + udev->regs.er_in[i]->DIEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_in[i]->DIEPCTL = 0U; + } + + /* set IN endpoint transfer length to 0 */ + udev->regs.er_in[i]->DIEPLEN = 0U; + + /* clear all pending IN endpoint interrupts */ + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + + if(udev->regs.er_out[i]->DOEPCTL & DEPCTL_EPEN) { + udev->regs.er_out[i]->DOEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_out[i]->DOEPCTL = 0U; + } + + /* set OUT endpoint transfer length to 0 */ + udev->regs.er_out[i]->DOEPLEN = 0U; + + /* clear all pending OUT endpoint interrupts */ + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + udev->regs.dr->DIEPINTEN |= DIEPINTEN_EPTXFUDEN; + + (void)usb_devint_enable(udev); + + return USB_OK; +} + +/*! + \brief enable the USB device mode interrupts + \param[in] udev: pointer to USB device + \param[out] none + \retval operation status +*/ +usb_status usb_devint_enable(usb_core_driver *udev) +{ + /* clear any pending USB OTG interrupts */ + udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; + + /* clear any pending interrupts */ + udev->regs.gr->GINTF = 0xBFFFFFFFU; + + /* enable the USB wakeup and suspend interrupts */ + udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; + + /* enable device_mode-related interrupts */ + if((uint8_t)USB_USE_FIFO == udev->bp.transfer_mode) { + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + } + + udev->regs.gr->GINTEN |= GINTEN_RSTIE | GINTEN_ENUMFIE | GINTEN_IEPIE | \ + GINTEN_OEPIE | GINTEN_SOFIE | GINTEN_ISOONCIE | GINTEN_ISOINCIE; + +#ifdef VBUS_SENSING_ENABLED + udev->regs.gr->GINTEN |= GINTEN_SESIE | GINTEN_OTGIE; +#endif /* VBUS_SENSING_ENABLED */ + + return USB_OK; +} + +/*! + \brief active the USB endpoint0 transaction + \param[in] udev: pointer to USB device + \param[in] transc: the USB endpoint0 transaction + \param[out] none + \retval operation status +*/ +usb_status usb_transc0_active(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint32_t enum_speed = udev->regs.dr->DSTAT & DSTAT_ES; + + /* get the endpoint number */ + uint8_t ep_num = transc->ep_addr.num; + + if(ep_num) { + /* not endpoint 0 */ + return USB_FAIL; + } + + if(transc->ep_addr.dir) { + reg_addr = &udev->regs.er_in[0]->DIEPCTL; + } else { + reg_addr = &udev->regs.er_out[0]->DOEPCTL; + } + + /* endpoint 0 is activated after USB clock is enabled */ + *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); + + /* set endpoint 0 maximum packet length */ + *reg_addr |= EP0_MAXLEN[enum_speed]; + + /* activate endpoint */ + *reg_addr |= ((uint32_t)transc->ep_type << 18) | ((uint32_t)ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; + + return USB_OK; +} + +/*! + \brief active the USB transaction + \param[in] udev: pointer to USB device + \param[in] transc: the USB transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_active(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + uint32_t epinten = 0U; + uint32_t enum_speed = udev->regs.dr->DSTAT & DSTAT_ES; + + /* get the endpoint number */ + uint8_t ep_num = transc->ep_addr.num; + + /* enable endpoint interrupt number */ + if(transc->ep_addr.dir) { + reg_addr = &udev->regs.er_in[ep_num]->DIEPCTL; + + epinten = 1U << ep_num; + } else { + reg_addr = &udev->regs.er_out[ep_num]->DOEPCTL; + + epinten = 1U << (16U + ep_num); + } + + /* if the endpoint is not active, need change the endpoint control register */ + if(!(*reg_addr & DEPCTL_EPACT)) { + *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); + + /* set endpoint maximum packet length */ + if(0U == ep_num) { + *reg_addr |= EP0_MAXLEN[enum_speed]; + } else { + *reg_addr |= transc->max_len; + } + + /* activate endpoint */ + *reg_addr |= ((uint32_t)transc->ep_type << 18) | ((uint32_t)ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; + } + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + if((1U == ep_num) && (USB_CORE_ENUM_HS == udev->bp.core_enum)) { + udev->regs.dr->DEP1INTEN |= epinten; + } else +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + { + /* enable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN |= epinten; + } + + return USB_OK; +} + +/*! + \brief deactivate the USB transaction + \param[in] udev: pointer to USB device + \param[in] transc: the USB transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc) +{ + uint32_t epinten = 0U; + + uint8_t ep_num = transc->ep_addr.num; + + /* disable endpoint interrupt number */ + if(transc->ep_addr.dir) { + epinten = 1U << ep_num; + + udev->regs.er_in[ep_num]->DIEPCTL &= ~DEPCTL_EPACT; + } else { + epinten = 1U << (ep_num + 16U); + + udev->regs.er_out[ep_num]->DOEPCTL &= ~DEPCTL_EPACT; + } + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + if((1U == ep_num) && (USB_CORE_ENUM_HS == udev->bp.core_enum)) { + udev->regs.dr->DEP1INTEN &= ~epinten; + } else +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + { + /* disable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN &= ~epinten; + } + + return USB_OK; +} + +/*! + \brief configure USB transaction to start IN transfer + \param[in] udev: pointer to USB device + \param[in] transc: the USB IN transaction + \param[out] none + \retval operation status +*/ +usb_status usb_transc_inxfer(usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + __IO uint32_t epctl = udev->regs.er_in[ep_num]->DIEPCTL; + __IO uint32_t eplen = udev->regs.er_in[ep_num]->DIEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if(0U == transc->xfer_len) { + /* set transfer packet count to 1 */ + eplen |= 1U << 19; + } else { + /* set transfer packet count */ + if(0U == ep_num) { + transc->xfer_len = USB_MIN(transc->xfer_len, transc->max_len); + + eplen |= 1U << 19; + } else { + eplen |= (((transc->xfer_len - 1U) + transc->max_len) / transc->max_len) << 19; + } + + /* set endpoint transfer length */ + eplen |= transc->xfer_len; + + if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { + eplen |= DIEPLEN_MCNT & (1U << 29); + } + } + + udev->regs.er_in[ep_num]->DIEPLEN = eplen; + + if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { + if(((udev->regs.dr->DSTAT & DSTAT_FNRSOF) >> 8) & 0x01U) { + epctl |= DEPCTL_SEVNFRM; + } else { + epctl |= DEPCTL_SODDFRM; + } + } + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_in[ep_num]->DIEPDMAADDR = transc->dma_addr; + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_CNAK | DEPCTL_EPEN; + + udev->regs.er_in[ep_num]->DIEPCTL = epctl; + + if((uint8_t)USB_USE_FIFO == udev->bp.transfer_mode) { + if((uint8_t)USB_EPTYPE_ISOC != transc->ep_type) { + /* enable the TX FIFO empty interrupt for this endpoint */ + if(transc->xfer_len > 0U) { + udev->regs.dr->DIEPFEINTEN |= 1U << ep_num; + } + } else { + (void)usb_txfifo_write(&udev->regs, transc->xfer_buf, ep_num, (uint16_t)transc->xfer_len); + } + } + + return status; +} + +/*! + \brief configure USB transaction to start OUT transfer + \param[in] udev: pointer to USB device + \param[in] transc: the USB OUT transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_outxfer(usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + uint32_t epctl = udev->regs.er_out[ep_num]->DOEPCTL; + uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if((0U == transc->xfer_len) || (0U == ep_num)) { + /* set the transfer length to max packet size */ + eplen |= transc->max_len; + + /* set the transfer packet count to 1 */ + eplen |= 1U << 19; + } else { + /* configure the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + uint32_t packet_count = (transc->xfer_len + transc->max_len - 1U) / transc->max_len; + + eplen |= packet_count << 19; + eplen |= packet_count * transc->max_len; + +#ifdef INT_HIGH_BW + if(transc->ep_type == (uint8_t)USB_EPTYPE_INTR) { + eplen |= DIEPLEN_MCNT & (3U << 29); + } +#endif /* INT_HIGH_BW */ + } + + udev->regs.er_out[ep_num]->DOEPLEN = eplen; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[ep_num]->DOEPDMAADDR = transc->dma_addr; + } + + if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { + if(transc->frame_num) { + epctl |= DEPCTL_SD1PID; + } else { + epctl |= DEPCTL_SD0PID; + } + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_EPEN | DEPCTL_CNAK; + + udev->regs.er_out[ep_num]->DOEPCTL = epctl; + + return status; +} + +/*! + \brief set the USB transaction STALL status + \param[in] udev: pointer to USB device + \param[in] transc: the USB transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_stall(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if(transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + + /* set the endpoint disable bit */ + if(*reg_addr & DEPCTL_EPEN) { + *reg_addr |= DEPCTL_EPD; + } + } else { + /* set the endpoint STALL bit */ + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* set the endpoint STALL bit */ + *reg_addr |= DEPCTL_STALL; + + return USB_OK; +} + +/*! + \brief clear the USB transaction STALL status + \param[in] udev: pointer to USB device + \param[in] transc: the USB transaction + \param[out] none + \retval operation status +*/ +usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if(transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + } else { + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* clear the endpoint STALL bit */ + *reg_addr &= ~DEPCTL_STALL; + + /* reset data PID of the periodic endpoints */ + if(((uint8_t)USB_EPTYPE_INTR == transc->ep_type) || ((uint8_t)USB_EPTYPE_BULK == transc->ep_type)) { + *reg_addr |= DEPCTL_SD0PID; + } + + return USB_OK; +} + +/*! + \brief read device IN endpoint interrupt flag register + \param[in] udev: pointer to USB device + \param[in] ep_num: endpoint number + \param[out] none + \retval interrupt value +*/ +uint32_t usb_iepintr_read(usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = 0U, fifoemptymask, commonintmask; + + commonintmask = udev->regs.dr->DIEPINTEN; + fifoemptymask = udev->regs.dr->DIEPFEINTEN; + + /* check FIFO empty interrupt enable bit */ + commonintmask |= ((fifoemptymask >> ep_num) & 0x1U) << 7; + + value = udev->regs.er_in[ep_num]->DIEPINTF & commonintmask; + + return value; +} + +/*! + \brief configures OUT endpoint 0 to receive SETUP packets + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_ctlep_startout(usb_core_driver *udev) +{ + /* set OUT endpoint 0 receive length to 24 bytes, 1 packet and 3 SETUP packets */ + udev->regs.er_out[0]->DOEPLEN = DOEP0_TLEN(8U * 3U) | DOEP0_PCNT(1U) | DOEP0_STPCNT(3U); + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[0]->DOEPDMAADDR = (uint32_t)&udev->dev.control.req; + + /* endpoint enable */ + udev->regs.er_out[0]->DOEPCTL |= DEPCTL_EPACT | DEPCTL_EPEN; + } +} + +/*! + \brief active remote wakeup signaling + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_rwkup_active(usb_core_driver *udev) +{ + if(udev->dev.pm.dev_remote_wakeup) { + if(udev->regs.dr->DSTAT & DSTAT_SPST) { + if(udev->bp.low_power) { + /* ungate USB core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + + /* active remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + + usb_mdelay(5U); + + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } + } +} + +/*! + \brief active USB core clock + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_clock_active(usb_core_driver *udev) +{ + if(udev->bp.low_power) { + if(udev->regs.dr->DSTAT & DSTAT_SPST) { + /* ungate USB Core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + } +} + +/*! + \brief USB device suspend + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_dev_suspend(usb_core_driver *udev) +{ + __IO uint32_t devstat = udev->regs.dr->DSTAT; + + if((udev->bp.low_power) && (devstat & DSTAT_SPST)) { + /* switch-off the USB clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; + + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); + } +} + +/*! + \brief stop the device and clean up FIFOs + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_dev_stop(usb_core_driver *udev) +{ + uint32_t i; + + udev->dev.cur_status = 1U; + + /* clear all interrupt flag and enable bits */ + for(i = 0U; i < udev->bp.num_ep; i++) { + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + + /* flush the FIFO */ + (void)usb_rxfifo_flush(&udev->regs); + (void)usb_txfifo_flush(&udev->regs, 0x10U); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c new file mode 100644 index 00000000000..51de1523138 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c @@ -0,0 +1,472 @@ +/*! + \file drv_usb_host.c + \brief USB host mode low level driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_host.h" + +const uint32_t PIPE_DPID[2] = { + PIPE_DPID_DATA0, + PIPE_DPID_DATA1 +}; + +/*! + \brief initializes USB core for host mode + \param[in] udev: pointer to selected USB host + \param[out] none + \retval operation status +*/ +usb_status usb_host_init(usb_core_driver *udev) +{ + uint32_t i = 0U, inten = 0U; + + uint32_t nptxfifolen = 0U; + uint32_t ptxfifolen = 0U; + + /* restart the PHY Clock */ + *udev->regs.PWRCLKCTL = 0U; + + /* configure USB clock of PHY */ + if(USB_ULPI_PHY == udev->bp.phy_itf) { + usb_phyclock_config(udev, HCTL_30_60MHZ); + } else { + usb_phyclock_config(udev, HCTL_48MHZ); + } + + /* support FS/LS only */ + udev->regs.hr->HCTL &= ~HCTL_SPDFSLS; + + /* configure data FIFOs size */ +#ifdef USB_FS_CORE + if(USB_CORE_ENUM_FS == udev->bp.core_enum) { + /* set RX FIFO size */ + udev->regs.gr->GRFLEN = USB_RX_FIFO_FS_SIZE; + + /* set non-periodic TX FIFO size and address */ + nptxfifolen |= USB_RX_FIFO_FS_SIZE; + nptxfifolen |= USB_HTX_NPFIFO_FS_SIZE << 16; + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; + + /* set periodic TX FIFO size and address */ + ptxfifolen |= USB_RX_FIFO_FS_SIZE + USB_HTX_NPFIFO_FS_SIZE; + ptxfifolen |= USB_HTX_PFIFO_FS_SIZE << 16; + udev->regs.gr->HPTFLEN = ptxfifolen; + } +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + if(USB_CORE_ENUM_HS == udev->bp.core_enum) { + /* set RX FIFO size */ + udev->regs.gr->GRFLEN = USB_RX_FIFO_HS_SIZE; + + /* set non-periodic TX FIFO size and address */ + nptxfifolen |= USB_RX_FIFO_HS_SIZE; + nptxfifolen |= USB_HTX_NPFIFO_HS_SIZE << 16; + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; + + /* set periodic TX FIFO size and address */ + ptxfifolen |= USB_RX_FIFO_HS_SIZE + USB_HTX_NPFIFO_HS_SIZE; + ptxfifolen |= USB_HTX_PFIFO_HS_SIZE << 16; + udev->regs.gr->HPTFLEN = ptxfifolen; + } +#endif /* USB_HS_CORE */ + +#ifdef USE_OTG_MODE + /* clear host set HNP enable in the usb_otg control register */ + udev->regs.gr->GOTGCS &= ~GOTGCS_HHNPEN; +#endif /* USE_OTG_MODE */ + + /* make sure the FIFOs are flushed */ + + /* flush all TX FIFOs in device or host mode */ + usb_txfifo_flush(&udev->regs, 0x10U); + + /* flush the entire RX FIFO */ + usb_rxfifo_flush(&udev->regs); + + /* disable all interrupts */ + udev->regs.gr->GINTEN = 0U; + + /* clear any pending USB OTG interrupts */ + udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; + + /* enable the USB wakeup and suspend interrupts */ + udev->regs.gr->GINTF = 0xBFFFFFFFU; + + /* clear all pending host channel interrupts */ + for(i = 0U; i < udev->bp.num_pipe; i++) { + udev->regs.pr[i]->HCHINTF = 0xFFFFFFFFU; + udev->regs.pr[i]->HCHINTEN = 0U; + } + +#ifndef USE_OTG_MODE + usb_portvbus_switch(udev, 1U); +#endif /* USE_OTG_MODE */ + + udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; + + /* enable host_mode-related interrupts */ + if(USB_USE_FIFO == udev->bp.transfer_mode) { + inten = GINTEN_RXFNEIE; + } + + inten |= GINTEN_SESIE | GINTEN_HPIE | GINTEN_HCIE | GINTEN_ISOINCIE; + + udev->regs.gr->GINTEN |= inten; + + inten = GINTEN_DISCIE | GINTEN_SOFIE; + + udev->regs.gr->GINTEN &= ~inten; + + return USB_OK; +} + +/*! + \brief control the VBUS to power + \param[in] udev: pointer to selected USB host + \param[in] state: VBUS state + \param[out] none + \retval none +*/ +void usb_portvbus_switch(usb_core_driver *udev, uint8_t state) +{ + uint32_t port = 0U; + + /* enable or disable the external charge pump */ + usb_vbus_drive(state); + + /* turn on the host port power. */ + port = usb_port_read(udev); + + if(!(port & HPCS_PP) && (1U == state)) { + port |= HPCS_PP; + } + + if((port & HPCS_PP) && (0U == state)) { + port &= ~HPCS_PP; + } + + *udev->regs.HPCS = port; + + usb_mdelay(200U); +} + +/*! + \brief reset host port + \param[in] udev: pointer to USB device + \param[out] none + \retval operation status +*/ +uint32_t usb_port_reset(usb_core_driver *udev) +{ + __IO uint32_t port = usb_port_read(udev); + + *udev->regs.HPCS = port | HPCS_PRST; + + usb_mdelay(20U); /* see note */ + + *udev->regs.HPCS = port & ~HPCS_PRST; + + usb_mdelay(20U); + + return 1U; +} + +/*! + \brief initialize host pipe + \param[in] udev: pointer to USB device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_init(usb_core_driver *udev, uint8_t pipe_num) +{ + usb_status status = USB_OK; + + __IO uint32_t pp_ctl = 0U; + __IO uint32_t pp_inten = HCHINTEN_TFIE; + + usb_pipe *pp = &udev->host.pipe[pipe_num]; + + /* clear old interrupt conditions for this host channel */ + udev->regs.pr[pipe_num]->HCHINTF = 0xFFFFFFFFU; + + if(USB_USE_DMA == udev->bp.transfer_mode) { + pp_inten |= HCHINTEN_DMAERIE; + } + + if(pp->ep.dir) { + pp_inten |= HCHINTEN_BBERIE; + } + + /* enable channel interrupts required for this transfer */ + switch(pp->ep.type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE \ + | HCHINTEN_DTERIE | HCHINTEN_NAKIE; + + if(!pp->ep.dir) { + if(PORT_SPEED_HIGH == pp->dev_speed) { + pp_inten |= HCHINTEN_NYETIE; + pp_inten |= HCHINTEN_ACKIE; + } + } + break; + + case USB_EPTYPE_INTR: + pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE | HCHINTEN_DTERIE \ + | HCHINTEN_NAKIE | HCHINTEN_REQOVRIE; + break; + + case USB_EPTYPE_ISOC: + pp_inten |= HCHINTEN_REQOVRIE | HCHINTEN_ACKIE; + + if(pp->ep.dir) { + pp_inten |= HCHINTEN_USBERIE; + } + break; + + default: + break; + } + + udev->regs.pr[pipe_num]->HCHINTEN = pp_inten; + + /* enable the top level host channel interrupt */ + udev->regs.hr->HACHINTEN |= 1U << pipe_num; + + /* make sure host channel interrupts are enabled */ + udev->regs.gr->GINTEN |= GINTEN_HCIE; + + /* program the host channel control register */ + pp_ctl |= PIPE_CTL_DAR(pp->dev_addr); + pp_ctl |= PIPE_CTL_EPNUM(pp->ep.num); + pp_ctl |= PIPE_CTL_EPDIR(pp->ep.dir); + pp_ctl |= PIPE_CTL_EPTYPE(pp->ep.type); + pp_ctl |= PIPE_CTL_LSD(PORT_SPEED_LOW == pp->dev_speed); + + pp_ctl |= pp->ep.mps; + pp_ctl |= ((uint32_t)(USB_EPTYPE_INTR == pp->ep.type) << 29) & HCHCTL_ODDFRM; + + udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return status; +} + +/*! + \brief prepare host channel for transferring packets + \param[in] udev: pointer to USB device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_xfer(usb_core_driver *udev, uint8_t pipe_num) +{ + usb_status status = USB_OK; + + uint16_t dword_len = 0U; + uint16_t packet_count = 0U; + + __IO uint32_t pp_ctl = 0U; + + usb_pipe *pp = &udev->host.pipe[pipe_num]; + + uint16_t max_packet_len = pp->ep.mps; + + /* compute the expected number of packets associated to the transfer */ + if(pp->xfer_len > 0U) { + packet_count = (uint16_t)((pp->xfer_len + max_packet_len - 1U) / max_packet_len); + + if(packet_count > HC_MAX_PACKET_COUNT) { + packet_count = HC_MAX_PACKET_COUNT; + pp->xfer_len = (uint16_t)(packet_count * max_packet_len); + } + } else { + packet_count = 1U; + } + + if(pp->ep.dir) { + pp->xfer_len = (uint16_t)(packet_count * max_packet_len); + } + + /* initialize the host channel transfer information */ + udev->regs.pr[pipe_num]->HCHLEN = pp->xfer_len | pp->DPID | PIPE_XFER_PCNT(packet_count); + + if(USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.pr[pipe_num]->HCHDMAADDR = (unsigned int)pp->xfer_buf; + } + + pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; + + if(usb_frame_even(udev)) { + pp_ctl |= HCHCTL_ODDFRM; + } else { + pp_ctl &= ~HCHCTL_ODDFRM; + } + + /* set host channel enabled */ + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + if(USB_USE_FIFO == udev->bp.transfer_mode) { + if((0U == pp->ep.dir) && (pp->xfer_len > 0U)) { + switch(pp->ep.type) { + /* non-periodic transfer */ + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + dword_len = (uint16_t)((pp->xfer_len + 3U) / 4U); + + /* check if there is enough space in FIFO space */ + if(dword_len > (udev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { + /* need to process data in nptxfempty interrupt */ + udev->regs.gr->GINTEN |= GINTEN_NPTXFEIE; + } + break; + + /* periodic transfer */ + case USB_EPTYPE_INTR: + case USB_EPTYPE_ISOC: + dword_len = (uint16_t)((pp->xfer_len + 3U) / 4U); + + /* check if there is enough space in FIFO space */ + if(dword_len > (udev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { + /* need to process data in ptxfempty interrupt */ + udev->regs.gr->GINTEN |= GINTEN_PTXFEIE; + } + break; + + default: + break; + } + + /* write packet into the TX FIFO */ + usb_txfifo_write(&udev->regs, pp->xfer_buf, pipe_num, (uint16_t)pp->xfer_len); + } + } + + return status; +} + +/*! + \brief halt pipe + \param[in] udev: pointer to USB device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_halt(usb_core_driver *udev, uint8_t pipe_num) +{ + __IO uint32_t pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; + + uint8_t ep_type = (uint8_t)((pp_ctl & HCHCTL_EPTYPE) >> 18U); + + pp_ctl |= HCHCTL_CEN | HCHCTL_CDIS; + + switch(ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + if(0U == (udev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { + pp_ctl &= ~HCHCTL_CEN; + } + break; + + case USB_EPTYPE_INTR: + case USB_EPTYPE_ISOC: + if(0U == (udev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { + pp_ctl &= ~HCHCTL_CEN; + } + break; + + default: + break; + } + + udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return USB_OK; +} + +/*! + \brief configure host pipe to do ping operation + \param[in] udev: pointer to USB device + \param[in] pipe_num: host pipe number which is in (0..7 or 0..11) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_ping(usb_core_driver *udev, uint8_t pipe_num) +{ + uint32_t pp_ctl = 0U; + + udev->regs.pr[pipe_num]->HCHLEN = HCHLEN_PING; + + pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; + + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return USB_OK; +} + +/*! + \brief stop the USB host and clean up FIFO + \param[in] udev: pointer to USB device + \param[out] none + \retval none +*/ +void usb_host_stop(usb_core_driver *udev) +{ + uint32_t i; + __IO uint32_t pp_ctl = 0U; + + udev->regs.hr->HACHINTEN = 0x0U; + udev->regs.hr->HACHINT = 0xFFFFFFFFU; + + /* flush out any leftover queued requests. */ + for(i = 0U; i < udev->bp.num_pipe; i++) { + pp_ctl = udev->regs.pr[i]->HCHCTL; + + pp_ctl &= ~(HCHCTL_CEN | HCHCTL_EPDIR); + pp_ctl |= HCHCTL_CDIS; + + udev->regs.pr[i]->HCHCTL = pp_ctl; + } + + /* flush the FIFO */ + usb_rxfifo_flush(&udev->regs); + usb_txfifo_flush(&udev->regs, 0x10U); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c new file mode 100644 index 00000000000..2a0ed2a578b --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c @@ -0,0 +1,576 @@ +/*! + \file drv_usbd_int.c + \brief USB device mode interrupt routines + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "usbd_transc.h" + +static const uint8_t USB_SPEED[4] = { + [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = (uint8_t)USB_SPEED_HIGH, + [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = (uint8_t)USB_SPEED_FULL, + [DSTAT_EM_FS_PHY_48MHZ] = (uint8_t)USB_SPEED_FULL, + [DSTAT_EM_LS_PHY_6MHZ] = (uint8_t)USB_SPEED_LOW +}; + +/* local function prototypes ('static') */ +static uint32_t usbd_int_epout(usb_core_driver *udev); +static uint32_t usbd_int_epin(usb_core_driver *udev); +static uint32_t usbd_int_rxfifo(usb_core_driver *udev); +static uint32_t usbd_int_reset(usb_core_driver *udev); +static uint32_t usbd_int_enumfinish(usb_core_driver *udev); +static uint32_t usbd_int_suspend(usb_core_driver *udev); +static uint32_t usbd_emptytxfifo_write(usb_core_driver *udev, uint32_t ep_num); + +/*! + \brief USB device-mode interrupts global service routine handler + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_isr(usb_core_driver *udev) +{ + if(HOST_MODE != (udev->regs.gr->GINTF & GINTF_COPM)) { + uint32_t intr = udev->regs.gr->GINTF; + intr &= udev->regs.gr->GINTEN; + + /* there are no interrupts, avoid spurious interrupt */ + if(!intr) { + return; + } + + /* OUT endpoints interrupts */ + if(intr & GINTF_OEPIF) { + (void)usbd_int_epout(udev); + } + + /* IN endpoints interrupts */ + if(intr & GINTF_IEPIF) { + (void)usbd_int_epin(udev); + } + + /* suspend interrupt */ + if(intr & GINTF_SP) { + (void)usbd_int_suspend(udev); + } + + /* wakeup interrupt */ + if(intr & GINTF_WKUPIF) { + if(USBD_SUSPENDED == udev->dev.cur_status) { + /* inform upper layer by the resume event */ + udev->dev.cur_status = udev->dev.backup_status; + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_WKUPIF; + } + + /* start of frame interrupt */ + if(intr & GINTF_SOF) { + if(udev->dev.class_core->SOF) { + (void)udev->dev.class_core->SOF(udev); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_SOF; + } + + /* receive FIFO not empty interrupt */ + if(intr & GINTF_RXFNEIF) { + (void)usbd_int_rxfifo(udev); + } + + /* USB reset interrupt */ + if(intr & GINTF_RST) { + (void)usbd_int_reset(udev); + } + + /* enumeration has been done interrupt */ + if(intr & GINTF_ENUMFIF) { + (void)usbd_int_enumfinish(udev); + } + + /* incomplete synchronization IN transfer interrupt*/ + if(intr & GINTF_ISOINCIF) { + if(NULL != udev->dev.class_core->incomplete_isoc_in) { + (void)udev->dev.class_core->incomplete_isoc_in(udev); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ISOINCIF; + } + + /* incomplete synchronization OUT transfer interrupt*/ + if(intr & GINTF_ISOONCIF) { + if(NULL != udev->dev.class_core->incomplete_isoc_out) { + (void)udev->dev.class_core->incomplete_isoc_out(udev); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ISOONCIF; + } + +#ifdef VBUS_SENSING_ENABLED + + /* session request interrupt */ + if(intr & GINTF_SESIF) { + udev->regs.gr->GINTF = GINTF_SESIF; + } + + /* OTG mode interrupt */ + if(intr & GINTF_OTGIF) { + if(udev->regs.gr->GOTGINTF & GOTGINTF_SESEND) { + + } + + /* clear OTG interrupt */ + udev->regs.gr->GINTF = GINTF_OTGIF; + } +#endif /* VBUS_SENSING_ENABLED */ + } +} + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + +/*! + \brief USB dedicated OUT endpoint 1 interrupt service routine handler + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +uint32_t usbd_int_dedicated_ep1out(usb_core_driver *udev) +{ + uint32_t oepintr = 0U; + uint32_t oeplen = 0U; + + oepintr = udev->regs.er_out[1]->DOEPINTF; + oepintr &= udev->regs.dr->DOEP1INTEN; + + /* transfer complete */ + if(oepintr & DOEPINTF_TF) { + /* clear the bit in DOEPINTn for this interrupt */ + udev->regs.er_out[1]->DOEPINTF = DOEPINTF_TF; + + if(USB_USE_DMA == udev->bp.transfer_mode) { + usb_transc *transc = &udev->dev.transc_out[1]; + uint32_t set_len = ((transc->xfer_len + transc->max_len - 1U) / transc->max_len) * transc->max_len; + oeplen = udev->regs.er_out[1]->DOEPLEN; + + /* to do : handle more than one single max packet size packet */ + udev->dev.transc_out[1].xfer_count = set_len - (oeplen & DEPLEN_TLEN); + } + + /* RX complete */ + usbd_out_transc(udev, 1U); + } + + return 1U; +} + +/*! + \brief USB dedicated IN endpoint 1 interrupt service routine handler + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +uint32_t usbd_int_dedicated_ep1in(usb_core_driver *udev) +{ + uint32_t inten, intr, emptyen; + + inten = udev->regs.dr->DIEP1INTEN; + emptyen = udev->regs.dr->DIEPFEINTEN; + + inten |= ((emptyen >> 1U) & 0x1U) << 7; + + intr = udev->regs.er_in[1]->DIEPINTF & inten; + + if(intr & DIEPINTF_TF) { + udev->regs.dr->DIEPFEINTEN &= ~(0x1U << 1); + + udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TF; + + /* TX complete */ + usbd_in_transc(udev, 1U); + } + + if(intr & DIEPINTF_TXFE) { + usbd_emptytxfifo_write(udev, 1U); + + udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TXFE; + } + + return 1U; +} + +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + +/*! + \brief indicates that an OUT endpoint has a pending interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_epout(usb_core_driver *udev) +{ + uint32_t epintnum = 0U; + uint8_t ep_num = 0U; + + for(epintnum = usb_oepintnum_read(udev); epintnum; epintnum >>= 1, ep_num++) { + if(epintnum & 0x01U) { + __IO uint32_t oepintr = usb_oepintr_read(udev, ep_num); + + /* transfer complete interrupt */ + if(oepintr & DOEPINTF_TF) { + /* clear the bit in DOEPINTF for this interrupt */ + udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_TF; + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + usb_transc *transc = &udev->dev.transc_out[ep_num]; + __IO uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; + uint32_t set_len = ((transc->xfer_len + transc->max_len - 1U) / transc->max_len) * transc->max_len; + + udev->dev.transc_out[ep_num].xfer_count = set_len - (eplen & DEPLEN_TLEN); + } + + /* inform upper layer: data ready */ + (void)usbd_out_transc(udev, ep_num); + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + if((0U == ep_num) && ((uint8_t)USB_CTL_STATUS_OUT == udev->dev.control.ctl_state)) { + usb_ctlep_startout(udev); + } + } + } + + /* SETUP phase finished interrupt (control endpoints) */ + if(oepintr & DOEPINTF_STPF) { + /* inform the upper layer that a SETUP packet is available */ + (void)usbd_setup_transc(udev); + + udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_STPF; + } + } + } + + return 1U; +} + +/*! + \brief indicates that an IN endpoint has a pending interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_epin(usb_core_driver *udev) +{ + uint32_t epintnum = 0U; + uint8_t ep_num = 0U; + + for(epintnum = usb_iepintnum_read(udev); epintnum; epintnum >>= 1, ep_num++) { + if(epintnum & 0x1U) { + __IO uint32_t iepintr = usb_iepintr_read(udev, ep_num); + + if(iepintr & DIEPINTF_TF) { + udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TF; + + /* data transmission is completed */ + (void)usbd_in_transc(udev, ep_num); + + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + if((0U == ep_num) && ((uint8_t)USB_CTL_STATUS_IN == udev->dev.control.ctl_state)) { + usb_ctlep_startout(udev); + } + } + } + + if(iepintr & DIEPINTF_TXFE) { + usbd_emptytxfifo_write(udev, (uint32_t)ep_num); + + udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TXFE; + } + } + } + + return 1U; +} + +/*! + \brief handle the RX status queue level interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_rxfifo(usb_core_driver *udev) +{ + usb_transc *transc = NULL; + + uint8_t data_PID = 0U; + uint32_t bcount = 0U; + + __IO uint32_t devrxstat = 0U; + + /* disable the RX status queue non-empty interrupt */ + udev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; + + /* get the status from the top of the FIFO */ + devrxstat = udev->regs.gr->GRSTATP; + + uint8_t ep_num = (uint8_t)(devrxstat & GRSTATRP_EPNUM); + + transc = &udev->dev.transc_out[ep_num]; + + bcount = (devrxstat & GRSTATRP_BCOUNT) >> 4; + data_PID = (uint8_t)((devrxstat & GRSTATRP_DPID) >> 15); + + switch((devrxstat & GRSTATRP_RPCKST) >> 17) { + case RSTAT_GOUT_NAK: + break; + + case RSTAT_DATA_UPDT: + if(bcount > 0U) { + (void)usb_rxfifo_read(&udev->regs, transc->xfer_buf, (uint16_t)bcount); + + transc->xfer_buf += bcount; + transc->xfer_count += bcount; + } + break; + + case RSTAT_XFER_COMP: + /* trigger the OUT endpoint interrupt */ + break; + + case RSTAT_SETUP_COMP: + /* trigger the OUT endpoint interrupt */ + break; + + case RSTAT_SETUP_UPDT: + if((0U == transc->ep_addr.num) && (8U == bcount) && (DPID_DATA0 == data_PID)) { + /* copy the SETUP packet received in FIFO into the setup buffer in RAM */ + (void)usb_rxfifo_read(&udev->regs, (uint8_t *)&udev->dev.control.req, (uint16_t)bcount); + + transc->xfer_count += bcount; + } + break; + + default: + break; + } + + /* enable the RX status queue level interrupt */ + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + + return 1U; +} + +/*! + \brief handle USB reset interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval status +*/ +static uint32_t usbd_int_reset(usb_core_driver *udev) +{ + uint32_t i; + + /* clear the remote wakeup signaling */ + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + + /* flush the TX FIFO */ + (void)usb_txfifo_flush(&udev->regs, 0U); + + for(i = 0U; i < udev->bp.num_ep; i++) { + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + /* clear all pending device endpoint interrupts */ + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + + /* enable endpoint 0 interrupts */ + udev->regs.dr->DAEPINTEN = 1U | (1U << 16); + + /* enable OUT endpoint interrupts */ + udev->regs.dr->DOEPINTEN = DOEPINTEN_STPFEN | DOEPINTEN_TFEN; + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + udev->regs.dr->DOEP1INTEN = DOEPINTEN_STPFEN | DOEPINTEN_TFEN; +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + + /* enable IN endpoint interrupts */ + udev->regs.dr->DIEPINTEN = DIEPINTEN_TFEN; + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + udev->regs.dr->DIEP1INTEN = DIEPINTEN_TFEN; +#endif /* USB_HS_DEDICATED_EP1_ENABLED */ + + /* reset device address */ + udev->regs.dr->DCFG &= ~DCFG_DAR; + + /* configure endpoint 0 to receive SETUP packets */ + usb_ctlep_startout(udev); + + /* clear USB reset interrupt */ + udev->regs.gr->GINTF = GINTF_RST; + + udev->dev.transc_out[0] = (usb_transc) { + .ep_type = USB_EPTYPE_CTRL, + .max_len = USB_FS_EP0_MAX_LEN + }; + + (void)usb_transc_active(udev, &udev->dev.transc_out[0]); + + udev->dev.transc_in[0] = (usb_transc) { + .ep_addr = { + .dir = 1U + }, + + .ep_type = USB_EPTYPE_CTRL, + .max_len = USB_FS_EP0_MAX_LEN + }; + + (void)usb_transc_active(udev, &udev->dev.transc_in[0]); + + /* upon reset call user call back */ + udev->dev.cur_status = (uint8_t)USBD_DEFAULT; + + return 1U; +} + +/*! + \brief handle USB speed enumeration finish interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval status +*/ +static uint32_t usbd_int_enumfinish(usb_core_driver *udev) +{ + uint8_t enum_speed = (uint8_t)((udev->regs.dr->DSTAT & DSTAT_ES) >> 1); + + udev->regs.dr->DCTL &= ~DCTL_CGINAK; + udev->regs.dr->DCTL |= DCTL_CGINAK; + + udev->regs.gr->GUSBCS &= ~GUSBCS_UTT; + + /* set USB turn-around time based on device speed and PHY interface */ + if((uint8_t)USB_SPEED_HIGH == USB_SPEED[enum_speed]) { + udev->bp.core_speed = (uint8_t)USB_SPEED_HIGH; + + udev->regs.gr->GUSBCS |= 0x09U << 10; + } else { + udev->bp.core_speed = (uint8_t)USB_SPEED_FULL; + + udev->regs.gr->GUSBCS |= 0x05U << 10; + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ENUMFIF; + + return 1U; +} + +/*! + \brief USB suspend interrupt handler + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_suspend(usb_core_driver *udev) +{ + __IO uint8_t low_power = udev->bp.low_power; + __IO uint8_t suspend = (uint8_t)(udev->regs.dr->DSTAT & DSTAT_SPST); + __IO uint8_t is_configured = ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) ? 1U : 0U; + + udev->dev.backup_status = udev->dev.cur_status; + udev->dev.cur_status = (uint8_t)USBD_SUSPENDED; + + if(low_power && suspend && is_configured) { + /* switch-off the USB clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SUCLK | PWRCLKCTL_SHCLK; + + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_SP; + + return 1U; +} + +/*! + \brief check FIFO for the next packet to be loaded + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier which is in (0..3) + \param[out] none + \retval status +*/ +static uint32_t usbd_emptytxfifo_write(usb_core_driver *udev, uint32_t ep_num) +{ + uint32_t len; + uint32_t word_count; + + usb_transc *transc = &udev->dev.transc_in[ep_num]; + + len = transc->xfer_len - transc->xfer_count; + + /* get the data length to write */ + if(len > transc->max_len) { + len = transc->max_len; + } + + word_count = (len + 3U) / 4U; + + while(((udev->regs.er_in[ep_num]->DIEPTFSTAT & DIEPTFSTAT_IEPTFS) >= word_count) && \ + (transc->xfer_count < transc->xfer_len)) { + len = transc->xfer_len - transc->xfer_count; + + if(len > transc->max_len) { + len = transc->max_len; + } + + /* write FIFO in word(4bytes) */ + word_count = (len + 3U) / 4U; + + /* write the FIFO */ + (void)usb_txfifo_write(&udev->regs, transc->xfer_buf, (uint8_t)ep_num, (uint16_t)len); + + transc->xfer_buf += len; + transc->xfer_count += len; + + if(transc->xfer_count == transc->xfer_len) { + /* disable the device endpoint FIFO empty interrupt */ + udev->regs.dr->DIEPFEINTEN &= ~(0x01U << ep_num); + } + } + + return 1U; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c new file mode 100644 index 00000000000..d103a184635 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c @@ -0,0 +1,639 @@ +/*! + \file drv_usbh_int.c + \brief USB host mode interrupt handler file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbh_int.h" + +#if defined (__CC_ARM) /*!< ARM compiler */ + #pragma O0 +#elif defined (__GNUC__) /*!< GNU compiler */ + #pragma GCC optimize ("O0") +#elif defined (__TASKING__) /*!< TASKING compiler */ + #pragma optimize=0 +#endif /* __CC_ARM */ + +/* local function prototypes ('static') */ +static uint32_t usbh_int_port(usb_core_driver *udev); +static uint32_t usbh_int_pipe(usb_core_driver *udev); +static uint32_t usbh_int_pipe_in(usb_core_driver *udev, uint32_t pp_num); +static uint32_t usbh_int_pipe_out(usb_core_driver *udev, uint32_t pp_num); +static uint32_t usbh_int_rxfifonoempty(usb_core_driver *udev); +static uint32_t usbh_int_txfifoempty(usb_core_driver *udev, usb_pipe_mode pp_mode); + +/*! + \brief handle global host interrupt + \param[in] udev: pointer to USB core instance + \param[out] none + \retval operation status +*/ +uint32_t usbh_isr(usb_core_driver *udev) +{ + uint32_t retval = 0U; + + __IO uint32_t intr = 0U; + + /* check if host mode */ + if(HOST_MODE == (udev->regs.gr->GINTF & GINTF_COPM)) { + intr = usb_coreintr_get(&udev->regs); + + if(!intr) { + return 0U; + } + + if(intr & GINTF_SOF) { + usbh_int_fop->SOF(udev->host.data); + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_SOF; + } + + if(intr & GINTF_RXFNEIF) { + retval |= usbh_int_rxfifonoempty(udev); + } + + if(intr & GINTF_NPTXFEIF) { + retval |= usbh_int_txfifoempty(udev, PIPE_NON_PERIOD); + } + + if(intr & GINTF_PTXFEIF) { + retval |= usbh_int_txfifoempty(udev, PIPE_PERIOD); + } + + if(intr & GINTF_HCIF) { + retval |= usbh_int_pipe(udev); + } + + if(intr & GINTF_HPIF) { + retval |= usbh_int_port(udev); + } + + if(intr & GINTF_WKUPIF) { + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_WKUPIF; + } + + if(intr & GINTF_DISCIF) { + usbh_int_fop->disconnect(udev->host.data); + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_DISCIF; + } + + if(intr & GINTF_ISOONCIF) { + udev->regs.pr[0]->HCHCTL |= HCHCTL_CEN | HCHCTL_CDIS; + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ISOONCIF; + } + + if(intr & GINTF_SESIF) { + usb_portvbus_switch(udev, 1U); + + udev->regs.gr->GINTF = GINTF_SESIF; + } + } + + return retval; +} + +/*! + \brief handle USB pipe halt + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pp_num: host channel number which is in (0..7) + \param[in] pp_int: pipe interrupt + \param[in] pp_status: pipe status + \param[out] none + \retval none +*/ +static inline void usb_pp_halt(usb_core_driver *udev, \ + uint8_t pp_num, \ + uint32_t pp_int, \ + usb_pipe_status pp_status) +{ + udev->regs.pr[pp_num]->HCHINTEN |= HCHINTEN_CHIE; + + usb_pipe_halt(udev, pp_num); + + udev->regs.pr[pp_num]->HCHINTF = pp_int; + + udev->host.pipe[pp_num].pp_status = pp_status; +} + +/*! + \brief handle the host port interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +#if defined (__ICCARM__) /*!< IAR compiler */ + #pragma optimize = none +#endif /* __ICCARM */ +static uint32_t usbh_int_port(usb_core_driver *udev) +{ + uint32_t retval = 0U; + + /* note: when the USB PHY use USB HS PHY, the flag is needed */ + uint8_t port_reset = 0U; + + __IO uint32_t port_state = *udev->regs.HPCS; + + /* clear the interrupt bit in GINTF */ + port_state &= ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); + + /* port connect detected */ + if(*udev->regs.HPCS & HPCS_PCD) { + port_state |= HPCS_PCD; + + usbh_int_fop->connect(udev->host.data); + + retval |= 1U; + } + + /* port enable changed */ + if(*udev->regs.HPCS & HPCS_PEDC) { + port_state |= HPCS_PEDC; + + if(*udev->regs.HPCS & HPCS_PE) { + uint32_t port_speed = usb_curspeed_get(udev); + uint32_t clock_type = udev->regs.hr->HCTL & HCTL_CLKSEL; + + udev->host.connect_status = 1U; + + if(PORT_SPEED_LOW == port_speed) { + udev->regs.hr->HFT = 6000U; + + if(HCTL_6MHZ != clock_type) { + if(USB_EMBEDDED_PHY == udev->bp.phy_itf) { + usb_phyclock_config(udev, HCTL_6MHZ); + } + + port_reset = 1U; + } + } else if(PORT_SPEED_FULL == port_speed) { + udev->regs.hr->HFT = 48000U; + + if(HCTL_48MHZ != clock_type) { + if(USB_EMBEDDED_PHY == udev->bp.phy_itf) { + usb_phyclock_config(udev, HCTL_48MHZ); + } + + port_reset = 1U; + } + } else { + /* for high speed device and others */ + port_reset = 1U; + } + + udev->host.port_enabled = 1U; + + udev->regs.gr->GINTEN |= GINTEN_DISCIE | GINTEN_SOFIE; + } else { + udev->host.port_enabled = 0U; + } + } + + if(port_reset) { + usb_port_reset(udev); + } + + /* clear port interrupts */ + *udev->regs.HPCS = port_state; + + return retval; +} + +/*! + \brief handle all host channels interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbh_int_pipe(usb_core_driver *udev) +{ + uint32_t pp_num = 0U; + uint32_t retval = 0U; + + for(pp_num = 0U; pp_num < udev->bp.num_pipe; pp_num++) { + if((udev->regs.hr->HACHINT & HACHINT_HACHINT) & (1UL << pp_num)) { + if(udev->regs.pr[pp_num]->HCHCTL & HCHCTL_EPDIR) { + retval |= usbh_int_pipe_in(udev, pp_num); + } else { + retval |= usbh_int_pipe_out(udev, pp_num); + } + } + } + + return retval; +} + +/*! + \brief handle the IN channel interrupt + \param[in] udev: pointer to USB device instance + \param[in] pp_num: host channel number which is in (0..7) + \param[out] none + \retval operation status +*/ +#if defined (__ICCARM__) /*!< IAR compiler */ + #pragma optimize = none +#endif /* __ICCARM */ +static uint32_t usbh_int_pipe_in(usb_core_driver *udev, uint32_t pp_num) +{ + usb_pr *pp_reg = udev->regs.pr[pp_num]; + + usb_pipe *pp = &udev->host.pipe[pp_num]; + + uint32_t intr_pp = pp_reg->HCHINTF; + intr_pp &= pp_reg->HCHINTEN; + + uint8_t ep_type = (uint8_t)((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18); + + if(intr_pp & HCHINTF_ACK) { + pp_reg->HCHINTF = HCHINTF_ACK; + } else if(intr_pp & HCHINTF_STALL) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_STALL, PIPE_STALL); + pp_reg->HCHINTF = HCHINTF_NAK; + + /* note: When there is a 'STALL', reset also NAK, + else, the udev->host.pp_status = HC_STALL + will be overwritten by 'NAK' in code below */ + intr_pp &= ~HCHINTF_NAK; + } else if(intr_pp & HCHINTF_DTER) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_DTER, PIPE_DTGERR); + pp_reg->HCHINTF = HCHINTF_NAK; + } else { + /* no operation */ + } + + if(intr_pp & HCHINTF_REQOVR) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_REQOVR, PIPE_REQOVR); + } else if(intr_pp & HCHINTF_TF) { + if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { + udev->host.backup_xfercount[pp_num] = pp->xfer_len - (pp_reg->HCHLEN & HCHLEN_TLEN); + } + + pp->pp_status = PIPE_XF; + pp->err_count = 0U; + + pp_reg->HCHINTF = HCHINTF_TF; + + switch(ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_XF); + + pp->data_toggle_in ^= 1U; + break; + + case USB_EPTYPE_INTR: + case USB_EPTYPE_ISOC: + pp_reg->HCHCTL |= HCHCTL_ODDFRM; + pp->urb_state = URB_DONE; + break; + + default: + break; + } + } else if(intr_pp & HCHINTF_CH) { + pp_reg->HCHINTEN &= ~HCHINTEN_CHIE; + + switch(pp->pp_status) { + case PIPE_XF: + pp->urb_state = URB_DONE; + break; + + case PIPE_STALL: + pp->urb_state = URB_STALL; + break; + + case PIPE_TRACERR: + case PIPE_DTGERR: + pp->err_count = 0U; + pp->urb_state = URB_ERROR; + + pp->data_toggle_in ^= 1U; + break; + + case PIPE_IDLE: + case PIPE_HALTED: + case PIPE_NAK: + case PIPE_NYET: + case PIPE_BBERR: + case PIPE_REQOVR: + default: + if((uint8_t)USB_EPTYPE_INTR == ep_type) { + pp->data_toggle_in ^= 1U; + } + break; + } + + pp_reg->HCHINTF = HCHINTF_CH; + } else if(intr_pp & HCHINTF_USBER) { + pp->err_count++; + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_USBER, PIPE_TRACERR); + } else if(intr_pp & HCHINTF_NAK) { + switch(ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + /* re-activate the channel */ + pp_reg->HCHCTL = (pp_reg->HCHCTL | HCHCTL_CEN) & ~HCHCTL_CDIS; + break; + + case USB_EPTYPE_INTR: + pp_reg->HCHINTEN |= HCHINTEN_CHIE; + + (void)usb_pipe_halt(udev, (uint8_t)pp_num); + break; + + default: + break; + } + + pp->pp_status = PIPE_NAK; + + pp_reg->HCHINTF = HCHINTF_NAK; + } else { + /* no operation */ + } + + return 1U; +} + +/*! + \brief handle the OUT channel interrupt + \param[in] udev: pointer to USB device instance + \param[in] pp_num: host channel number which is in (0..7) + \param[out] none + \retval operation status +*/ +#if defined (__ICCARM__) /*!< IAR compiler */ + #pragma optimize = none +#endif /* __ICCARM */ +static uint32_t usbh_int_pipe_out(usb_core_driver *udev, uint32_t pp_num) +{ + usbh_host *uhost = udev->host.data; + usb_pr *pp_reg = udev->regs.pr[pp_num]; + usb_pipe *pp = &udev->host.pipe[pp_num]; + uint32_t intr_pp = pp_reg->HCHINTF; + intr_pp &= pp_reg->HCHINTEN; + + if(intr_pp & HCHINTF_ACK) { + if(1U == udev->host.pipe[pp_num].do_ping) { + udev->host.pipe[pp_num].do_ping = 0U; + pp->err_count = 0U; + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_ACK, PIPE_NAK); + } + + pp_reg->HCHINTF = HCHINTF_ACK; + } else if(intr_pp & HCHINTF_STALL) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_STALL, PIPE_STALL); + } else if(intr_pp & HCHINTF_DTER) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_DTER, PIPE_DTGERR); + pp_reg->HCHINTF = HCHINTF_NAK; + } else if(intr_pp & HCHINTF_REQOVR) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_REQOVR, PIPE_REQOVR); + } else if(intr_pp & HCHINTF_TF) { + pp->err_count = 0U; + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_TF, PIPE_XF); + } else if(intr_pp & HCHINTF_NAK) { + if(0U == udev->host.pipe[pp_num].do_ping) { + if(1U == udev->host.pipe[pp_num].supp_ping) { + udev->host.pipe[pp_num].do_ping = 1U; + } + } + + pp->err_count = 0U; + if(USB_USE_FIFO == udev->bp.transfer_mode) { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_NAK); + } else { + pp_reg->HCHINTF = HCHINTF_NAK; + } + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_NAK); + } else if(intr_pp & HCHINTF_USBER) { + pp->err_count++; + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_USBER, PIPE_TRACERR); + } else if(intr_pp & HCHINTF_NYET) { + if(CTL_STATUS_OUT != uhost->control.ctl_state) { + if(0U == udev->host.pipe[pp_num].do_ping) { + if(1U == udev->host.pipe[pp_num].supp_ping) { + udev->host.pipe[pp_num].do_ping = 1U; + } + } + + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NYET, PIPE_NYET); + } else { + usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NYET, PIPE_XF); + } + + pp->err_count = 0U; + } else if(intr_pp & HCHINTF_CH) { + udev->regs.pr[pp_num]->HCHINTEN &= ~HCHINTEN_CHIE; + + switch(pp->pp_status) { + case PIPE_XF: + pp->urb_state = URB_DONE; + + if((uint8_t)USB_EPTYPE_BULK == ((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18)) { + pp->data_toggle_out ^= 1U; + } + break; + + case PIPE_NAK: + pp->urb_state = URB_NOTREADY; + break; + case PIPE_NYET: + pp->urb_state = URB_DONE; + + if((uint8_t)USB_EPTYPE_BULK == ((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18)) { + pp->data_toggle_out ^= 1U; + } + break; + + case PIPE_STALL: + pp->urb_state = URB_STALL; + break; + + case PIPE_TRACERR: + if(3U == pp->err_count) { + pp->urb_state = URB_ERROR; + pp->err_count = 0U; + } + break; + + case PIPE_IDLE: + case PIPE_HALTED: + case PIPE_BBERR: + case PIPE_REQOVR: + case PIPE_DTGERR: + default: + break; + } + + pp_reg->HCHINTF = HCHINTF_CH; + } else { + /* no operation */ + } + + return 1U; +} + +/*! + \brief handle the RX FIFO non-empty interrupt + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +#if defined (__ICCARM__) /*!< IAR compiler */ + #pragma optimize = none +#endif /* __ICCARM */ +static uint32_t usbh_int_rxfifonoempty(usb_core_driver *udev) +{ + uint32_t count = 0U, xfer_count = 0U; + + __IO uint8_t pp_num = 0U; + __IO uint32_t rx_stat = 0U; + + /* disable the RX status queue level interrupt */ + udev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; + + rx_stat = udev->regs.gr->GRSTATP; + pp_num = (uint8_t)(rx_stat & GRSTATRP_CNUM); + + switch((rx_stat & GRSTATRP_RPCKST) >> 17) { + case GRXSTS_PKTSTS_IN: + count = (rx_stat & GRSTATRP_BCOUNT) >> 4; + + /* read the data into the host buffer. */ + if((count > 0U) && (NULL != udev->host.pipe[pp_num].xfer_buf)) { + (void)usb_rxfifo_read(&udev->regs, udev->host.pipe[pp_num].xfer_buf, (uint16_t)count); + + /* manage multiple transfer packet */ + udev->host.pipe[pp_num].xfer_buf += count; + udev->host.pipe[pp_num].xfer_count += count; + + xfer_count = udev->host.pipe[pp_num].xfer_count; + + udev->host.backup_xfercount[pp_num] = xfer_count; + + if(udev->regs.pr[pp_num]->HCHLEN & HCHLEN_PCNT) { + /* re-activate the channel when more packets are expected */ + uint32_t pp_ctl = udev->regs.pr[pp_num]->HCHCTL; + + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + udev->regs.pr[pp_num]->HCHCTL = pp_ctl; + } + } + break; + + case GRXSTS_PKTSTS_IN_XFER_COMP: + break; + + case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: + count = (rx_stat & GRSTATRP_BCOUNT) >> 4; + + while(count > 0U) { + rx_stat = udev->regs.gr->GRSTATP; + count--; + } + break; + + case GRXSTS_PKTSTS_CH_HALTED: + break; + + default: + break; + } + + /* enable the RX status queue level interrupt */ + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + + return 1U; +} + +/*! + \brief handle the TX FIFO empty interrupt + \param[in] udev: pointer to USB device instance + \param[in] pp_mode: pipe mode + \param[out] none + \retval operation status +*/ +#if defined (__ICCARM__) /*!< IAR compiler */ + #pragma optimize = none +#endif /* __ICCARM */ +static uint32_t usbh_int_txfifoempty(usb_core_driver *udev, usb_pipe_mode pp_mode) +{ + uint8_t pp_num = 0U; + uint16_t word_count = 0U, len = 0U; + __IO uint32_t *txfiforeg = 0U, txfifostate = 0U; + + if(PIPE_NON_PERIOD == pp_mode) { + txfiforeg = &udev->regs.gr->HNPTFQSTAT; + } else if(PIPE_PERIOD == pp_mode) { + txfiforeg = &udev->regs.hr->HPTFQSTAT; + } else { + return 0U; + } + + txfifostate = *txfiforeg; + + pp_num = (uint8_t)((txfifostate & TFQSTAT_CNUM) >> 27); + + word_count = (uint16_t)(udev->host.pipe[pp_num].xfer_len + 3U) / 4U; + + while(((txfifostate & TFQSTAT_TXFS) >= word_count) && (0U != udev->host.pipe[pp_num].xfer_len)) { + len = (uint16_t)(txfifostate & TFQSTAT_TXFS) * 4U; + + if(len > udev->host.pipe[pp_num].xfer_len) { + /* last packet */ + len = (uint16_t)udev->host.pipe[pp_num].xfer_len; + + if(PIPE_NON_PERIOD == pp_mode) { + udev->regs.gr->GINTEN &= ~GINTEN_NPTXFEIE; + } else { + udev->regs.gr->GINTEN &= ~GINTEN_PTXFEIE; + } + } + + word_count = (uint16_t)((udev->host.pipe[pp_num].xfer_len + 3U) / 4U); + usb_txfifo_write(&udev->regs, udev->host.pipe[pp_num].xfer_buf, pp_num, len); + + udev->host.pipe[pp_num].xfer_buf += len; + udev->host.pipe[pp_num].xfer_len -= len; + udev->host.pipe[pp_num].xfer_count += len; + + txfifostate = *txfiforeg; + } + + return 1U; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h new file mode 100644 index 00000000000..118e27ba023 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h @@ -0,0 +1,116 @@ +/*! + \file usbh_hid_core.h + \brief header file for the usbh_hid_core.c + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_HID_CORE_H +#define USBH_HID_CORE_H + +#include "usb_hid.h" +#include "usbh_enum.h" +#include "usbh_transc.h" + +#define HID_MIN_POLL 10U /*!< HID minimum polling */ +#define HID_REPORT_SIZE 16U /*!< HID report size */ +#define HID_QUEUE_SIZE 10U /*!< HID queue size */ + +#define USB_HID_DESC_SIZE 9U /*!< HID descriptor size */ + +/* states for HID state machine */ +typedef enum { + HID_INIT = 0U, /*!< HID init state */ + HID_IDLE, /*!< HID idle state */ + HID_SEND_DATA, /*!< HID send data state */ + HID_BUSY, /*!< HID busy state */ + HID_GET_DATA, /*!< HID get data state */ + HID_SYNC, /*!< HID synchronous state */ + HID_POLL, /*!< HID polling state */ + HID_ERROR /*!< HID error state */ +} hid_state; + +/* state types of HID control request */ +typedef enum { + HID_REQ_INIT = 0U, /*!< HID init request */ + HID_REQ_IDLE, /*!< HID idle request */ + HID_REQ_GET_REPORT_DESC, /*!< get report descriptor request */ + HID_REQ_GET_HID_DESC, /*!< get HID descriptor request */ + HID_REQ_SET_IDLE, /*!< set idle request */ + HID_REQ_SET_PROTOCOL, /*!< set protocol request */ + HID_REQ_SET_REPORT /*!< set report request */ +} hid_ctlstate; + +/* HID types */ +typedef enum { + HID_MOUSE = 0x01U, /*!< HID mouse type */ + HID_KEYBOARD = 0x02U, /*!< HID keyboard type */ + HID_UNKNOWN = 0xFFU /*!< unknown type */ +} hid_type; + +typedef struct { + uint8_t *buf; /*!< data FIFO buff pointer */ + uint16_t head; /*!< data FIFO header */ + uint16_t tail; /*!< data FIFO tail */ + uint16_t size; /*!< data FIFO size */ + uint8_t lock; /*!< data FIFO lock */ +} data_fifo; + +/* structure for HID process */ +typedef struct _hid_process { + uint8_t pipe_in; /*!< pipe IN */ + uint8_t pipe_out; /*!< pipe OUT */ + uint8_t ep_addr; /*!< endpoint address */ + uint8_t ep_in; /*!< endpoint IN */ + uint8_t ep_out; /*!< endpoint OUT */ + uint8_t *pdata; /*!< HID data pointer */ + __IO uint8_t data_ready; /*!< HID data ready */ + uint16_t len; /*!< HID data length */ + uint16_t poll; /*!< HID polling */ + __IO uint32_t timer; /*!< HID timer */ + usb_desc_hid hid_desc; /*!< HID descriptor */ + hid_state state; /*!< HID state structure */ + hid_ctlstate ctl_state; /*!< control request state structure */ + usbh_status (*init)(usb_core_driver *udev, usbh_host *uhost); + usbh_status (*decode)(uint8_t *data); +} usbh_hid_handler; + +extern usbh_class usbh_hid; + +/* function declarations */ +/* set HID report */ +usbh_status usbh_set_report(usb_core_driver *udev, \ + usbh_host *uhost, \ + uint8_t report_type, \ + uint8_t report_ID, \ + uint8_t report_len, \ + uint8_t *report_buf); + +#endif /* USBH_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h new file mode 100644 index 00000000000..f6f175bc0b8 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h @@ -0,0 +1,96 @@ +/*! + \file usbh_standard_hid.h + \brief header file for usbh_standard_hid.c + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_STANDARD_HID_H +#define USBH_STANDARD_HID_H + +#include "usbh_hid_core.h" + +//#define AZERTY_KEYBOARD +#define QWERTY_KEYBOARD + +#define MOUSE_BUTTON_1 0x01U /*!< mouse button 1 */ +#define MOUSE_BUTTON_2 0x02U /*!< mouse button 2 */ +#define MOUSE_BUTTON_3 0x04U /*!< mouse button 3 */ + +#define KBD_LEFT_CTRL 0x01U /*!< keyboard left ctrl key */ +#define KBD_LEFT_SHIFT 0x02U /*!< keyboard left shift key */ +#define KBD_LEFT_ALT 0x04U /*!< keyboard left alt key */ +#define KBD_LEFT_GUI 0x08U /*!< keyboard left gui key */ +#define KBD_RIGHT_CTRL 0x10U /*!< keyboard right ctrl key */ +#define KBD_RIGHT_SHIFT 0x20U /*!< keyboard right shift key */ +#define KBD_RIGHT_ALT 0x40U /*!< keyboard right alt key */ +#define KBD_RIGHT_GUI 0x80U /*!< keyboard right gui key */ + +#define KBD_PRESSED_MAX_NUM 6U /*!< keyboard pressed maximum number */ + +typedef struct _mouse_report_data { + uint8_t x; /*!< X coordinate value */ + uint8_t y; /*!< Y coordinate value */ + uint8_t buttons[3]; /*!< button buff */ +} mouse_report_data; + +typedef struct { + uint8_t state; /*!< keyboard state */ + uint8_t lctrl; /*!< keyboard left ctrl */ + uint8_t lshift; /*!< keyboard left shift */ + uint8_t lalt; /*!< keyboard left alt */ + uint8_t lgui; /*!< keyboard left gui */ + uint8_t rctrl; /*!< keyboard right ctrl */ + uint8_t rshift; /*!< keyboard right shift */ + uint8_t ralt; /*!< keyboard right alt */ + uint8_t rgui; /*!< keyboard right gui */ + uint8_t keys[6]; /*!< keyboard keys buff */ +} hid_keybd_info; + +/* function declarations */ +/* initialize mouse */ +void usr_mouse_init(void); +/* process mouse data */ +void usr_mouse_process_data(mouse_report_data *data); +/* initialize mouse function */ +usbh_status usbh_hid_mouse_init(usb_core_driver *udev, usbh_host *uhost); +/* decode mouse information */ +usbh_status usbh_hid_mouse_decode(uint8_t *data); + +/* initialize keyboard */ +void usr_keybrd_init(void); +/* process keyboard data */ +void usr_keybrd_process_data(uint8_t pbuf); +/* initialize the keyboard function */ +usbh_status usbh_hid_keybrd_init(usb_core_driver *udev, usbh_host *uhost); +/* decode keyboard information */ +usbh_status usbh_hid_keybrd_decode(uint8_t *data); + +#endif /* USBH_STANDARD_HID_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c new file mode 100644 index 00000000000..0501db83cde --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c @@ -0,0 +1,582 @@ +/*! + \file usbh_hid_core.c + \brief USB host HID class driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "usbh_pipe.h" +#include "usbh_hid_core.h" +#include "usbh_standard_hid.h" + +/* local function prototypes ('static') */ +static void usbh_hiddesc_parse(usb_desc_hid *hid_desc, uint8_t *buf); +static void usbh_hid_itf_deinit(usbh_host *uhost); +static usbh_status usbh_hid_itf_init(usbh_host *uhost); +static usbh_status usbh_hid_class_req(usbh_host *uhost); +static usbh_status usbh_hid_handle(usbh_host *uhost); +static usbh_status usbh_hid_reportdesc_get(usbh_host *uhost, uint16_t len); +static usbh_status usbh_hid_sof(usbh_host *uhost); +static usbh_status usbh_hid_desc_get(usbh_host *uhost, uint16_t len); +static usbh_status usbh_set_idle(usbh_host *uhost, uint8_t duration, uint8_t report_ID); +static usbh_status usbh_set_protocol(usbh_host *uhost, uint8_t protocol); + +usbh_class usbh_hid = { + USB_HID_CLASS, + usbh_hid_itf_init, + usbh_hid_itf_deinit, + usbh_hid_class_req, + usbh_hid_handle, + usbh_hid_sof +}; + +/*! + \brief get report + \param[in] uhost: pointer to USB host + \param[in] report_type: duration for HID set idle request + \param[in] report_ID: targeted report ID for HID set idle request + \param[in] report_len: length of data report to be send + \param[in] report_buf: report buffer + \param[out] none + \retval operation status +*/ +usbh_status usbh_get_report(usbh_host *uhost, \ + uint8_t report_type, \ + uint8_t report_ID, \ + uint8_t report_len, \ + uint8_t *report_buf) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = GET_REPORT, + .wValue = (report_type << 8) | report_ID, + .wIndex = 0U, + .wLength = report_len + }; + + usbh_ctlstate_config(uhost, report_buf, report_len); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set report + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[in] report_type: duration for HID set idle request + \param[in] report_ID: targeted report ID for HID set idle request + \param[in] report_len: length of data report to be send + \param[in] report_buf: report buffer + \param[out] none + \retval operation status +*/ +usbh_status usbh_set_report(usb_core_driver *udev, \ + usbh_host *uhost, \ + uint8_t report_type, \ + uint8_t report_ID, \ + uint8_t report_len, \ + uint8_t *report_buf) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_REPORT, + .wValue = (report_type << 8) | report_ID, + .wIndex = 0U, + .wLength = report_len + }; + + usbh_ctlstate_config(uhost, report_buf, report_len); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief deinitialize the host pipes used for the HID class + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +void usbh_hid_itf_deinit(usbh_host *uhost) +{ + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + if(0x00U != hid->pipe_in) { + usb_pipe_halt(uhost->data, hid->pipe_in); + + usbh_pipe_free(uhost->data, hid->pipe_in); + + /* reset the pipe as free */ + hid->pipe_in = 0U; + } + + if(0x00U != hid->pipe_out) { + usb_pipe_halt(uhost->data, hid->pipe_out); + + usbh_pipe_free(uhost->data, hid->pipe_out); + + /* reset the channel as free */ + hid->pipe_out = 0U; + } +} + +/*! + \brief return device type + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[out] none + \retval hid_type +*/ +hid_type usbh_hid_device_type_get(usb_core_driver *udev, usbh_host *uhost) +{ + hid_type type = HID_UNKNOWN; + uint8_t interface_protocol; + + if(HOST_CLASS_HANDLER == uhost->cur_state) { + interface_protocol = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bInterfaceProtocol; + + if(USB_HID_PROTOCOL_KEYBOARD == interface_protocol) { + type = HID_KEYBOARD; + } else { + if(USB_HID_PROTOCOL_MOUSE == interface_protocol) { + type = HID_MOUSE; + } + } + } + + return type; +} + +/*! + \brief return HID device poll time + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[out] none + \retval poll time (ms) +*/ +uint8_t usbh_hid_poll_interval_get(usb_core_driver *udev, usbh_host *uhost) +{ + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + if((HOST_CLASS_ENUM == uhost->cur_state) || \ + (HOST_USER_INPUT == uhost->cur_state) || \ + (HOST_CLASS_CHECK == uhost->cur_state) || \ + (HOST_CLASS_HANDLER == uhost->cur_state)) { + return (uint8_t)(hid->poll); + } else { + return 0U; + } +} + +/*! + \brief initialize the hid class + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_itf_init(usbh_host *uhost) +{ + uint8_t num = 0U, ep_num = 0U, interface = 0U; + usbh_status status = USBH_BUSY; + + interface = usbh_interface_find(&uhost->dev_prop, USB_HID_CLASS, USB_HID_SUBCLASS_BOOT_ITF, 0xFFU); + + if(0xFFU == interface) { + uhost->usr_cb->dev_not_supported(); + + status = USBH_FAIL; + } else { + usbh_interface_select(&uhost->dev_prop, interface); + + static usbh_hid_handler hid_handler; + + memset((void *)&hid_handler, 0U, sizeof(usbh_hid_handler)); + + hid_handler.state = HID_ERROR; + + uint8_t itf_protocol = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bInterfaceProtocol; + if(USB_HID_PROTOCOL_KEYBOARD == itf_protocol) { + hid_handler.init = usbh_hid_keybrd_init; + hid_handler.decode = usbh_hid_keybrd_decode; + } else if(USB_HID_PROTOCOL_MOUSE == itf_protocol) { + hid_handler.init = usbh_hid_mouse_init; + hid_handler.decode = usbh_hid_mouse_decode; + } else { + status = USBH_FAIL; + } + + hid_handler.state = HID_INIT; + hid_handler.ctl_state = HID_REQ_INIT; + hid_handler.ep_addr = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].bEndpointAddress; + hid_handler.len = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].wMaxPacketSize; + hid_handler.poll = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].bInterval; + + if(hid_handler.poll < HID_MIN_POLL) { + hid_handler.poll = HID_MIN_POLL; + } + + /* check for available number of endpoints */ + /* find the number of endpoints in the interface descriptor */ + /* choose the lower number in order not to overrun the buffer allocated */ + ep_num = USB_MIN(uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bNumEndpoints, USBH_MAX_EP_NUM); + + /* decode endpoint IN and OUT address from interface descriptor */ + for(num = 0U; num < ep_num; num++) { + usb_desc_ep *ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[num]; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + + if(ep_addr & 0x80U) { + hid_handler.ep_in = ep_addr; + hid_handler.pipe_in = usbh_pipe_allocate(uhost->data, ep_addr); + + /* open channel for IN endpoint */ + usbh_pipe_create(uhost->data, \ + &uhost->dev_prop, \ + hid_handler.pipe_in, \ + USB_EPTYPE_INTR, \ + hid_handler.len); + + usbh_pipe_toggle_set(uhost->data, hid_handler.pipe_in, 0U); + } else { + hid_handler.ep_out = ep_addr; + hid_handler.pipe_out = usbh_pipe_allocate(uhost->data, ep_addr); + + /* open channel for OUT endpoint */ + usbh_pipe_create(uhost->data, \ + &uhost->dev_prop, \ + hid_handler.pipe_out, \ + USB_EPTYPE_INTR, \ + hid_handler.len); + + usbh_pipe_toggle_set(uhost->data, hid_handler.pipe_out, 0U); + } + } + + uhost->active_class->class_data = (void *)&hid_handler; + + status = USBH_OK; + } + + return status; +} + +/*! + \brief handle HID class requests for HID class + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_class_req(usbh_host *uhost) +{ + usbh_status status = USBH_BUSY; + usbh_status class_req_status = USBH_BUSY; + + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + /* handle HID control state machine */ + switch(hid->ctl_state) { + case HID_REQ_INIT: + case HID_REQ_GET_HID_DESC: + /* get HID descriptor */ + if(USBH_OK == usbh_hid_desc_get(uhost, USB_HID_DESC_SIZE)) { + usbh_hiddesc_parse(&hid->hid_desc, uhost->dev_prop.data); + + hid->ctl_state = HID_REQ_GET_REPORT_DESC; + } + break; + + case HID_REQ_GET_REPORT_DESC: + /* get report descriptor */ + if(USBH_OK == usbh_hid_reportdesc_get(uhost, hid->hid_desc.wDescriptorLength)) { + hid->ctl_state = HID_REQ_SET_IDLE; + } + break; + + case HID_REQ_SET_IDLE: + class_req_status = usbh_set_idle(uhost, 0U, 0U); + + /* set idle */ + if(USBH_OK == class_req_status) { + hid->ctl_state = HID_REQ_SET_PROTOCOL; + } else { + if(USBH_NOT_SUPPORTED == class_req_status) { + hid->ctl_state = HID_REQ_SET_PROTOCOL; + } + } + break; + + case HID_REQ_SET_PROTOCOL: + /* set protocol */ + if(USBH_OK == usbh_set_protocol(uhost, 0U)) { + hid->ctl_state = HID_REQ_IDLE; + + /* all requests performed */ + status = USBH_OK; + } + break; + + case HID_REQ_IDLE: + default: + break; + } + + return status; +} + +/*! + \brief manage state machine for HID data transfers + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_handle(usbh_host *uhost) +{ + usbh_status status = USBH_OK; + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + switch(hid->state) { + case HID_INIT: + hid->init(uhost->data, uhost); + hid->state = HID_IDLE; + break; + + case HID_IDLE: + hid->state = HID_SYNC; + status = USBH_OK; + break; + + case HID_SYNC: + /* sync with start of even frame */ + if(1U == usb_frame_even(uhost->data)) { + hid->state = HID_GET_DATA; + } + break; + + case HID_GET_DATA: + usbh_data_recev(uhost->data, hid->pdata, hid->pipe_in, hid->len); + + hid->state = HID_POLL; + hid->timer = usb_curframe_get(uhost->data); + hid->data_ready = 0U; + break; + + case HID_POLL: + if(URB_DONE == usbh_urbstate_get(uhost->data, hid->pipe_in)) { + if(0U == hid->data_ready) { + hid->data_ready = 1U; + + hid->decode(hid->pdata); + } + } else { + /* check IN endpoint STALL status */ + if(URB_STALL == usbh_urbstate_get(uhost->data, hid->pipe_in)) { + /* issue clear feature on interrupt IN endpoint */ + if(USBH_OK == (usbh_clrfeature(uhost, hid->ep_addr, hid->pipe_in))) { + /* change state to issue next IN token */ + hid->state = HID_GET_DATA; + } + } + } + break; + + default: + break; + } + return status; +} + +/*! + \brief send get report descriptor command to the device + \param[in] uhost: pointer to USB host + \param[in] len: HID report descriptor length + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_reportdesc_get(usbh_host *uhost, uint16_t len) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_REPORT), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief managing the SOF process + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_sof(usbh_host *uhost) +{ + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + if(HID_POLL == hid->state) { + uint32_t frame_count = usb_curframe_get(uhost->data); + + if((frame_count > hid->timer) && ((frame_count - hid->timer) >= hid->poll)) { + hid->state = HID_GET_DATA; + } else if((frame_count < hid->timer) && ((frame_count + 0x3FFFU - hid->timer) >= hid->poll)) { + hid->state = HID_GET_DATA; + } else { + /* no operation */ + } + } + + return USBH_OK; +} + +/*! + \brief send the command of get HID descriptor to the device + \param[in] uhost: pointer to USB host + \param[in] len: HID descriptor length + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_desc_get(usbh_host *uhost, uint16_t len) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_HID), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set idle state + \param[in] uhost: pointer to USB host + \param[in] duration: duration for HID set idle request + \param[in] report_ID: targeted report ID for HID set idle request + \param[out] none + \retval operation status +*/ +static usbh_status usbh_set_idle(usbh_host *uhost, uint8_t duration, uint8_t report_ID) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_IDLE, + .wValue = (duration << 8) | report_ID, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set protocol state + \param[in] uhost: pointer to USB host + \param[in] protocol: boot/report protocol + \param[out] none + \retval operation status +*/ +static usbh_status usbh_set_protocol(usbh_host *uhost, uint8_t protocol) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_PROTOCOL, + .wValue = !protocol, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief parse the HID descriptor + \param[in] hid_desc: pointer to HID descriptor + \param[in] buf: pointer to buffer where the source descriptor is available + \param[out] none + \retval none +*/ +static void usbh_hiddesc_parse(usb_desc_hid *hid_desc, uint8_t *buf) +{ + hid_desc->header.bLength = *(uint8_t *)(buf + 0U); + hid_desc->header.bDescriptorType = *(uint8_t *)(buf + 1U); + hid_desc->bcdHID = BYTE_SWAP(buf + 2U); + hid_desc->bCountryCode = *(uint8_t *)(buf + 4U); + hid_desc->bNumDescriptors = *(uint8_t *)(buf + 5U); + hid_desc->bDescriptorType = *(uint8_t *)(buf + 6U); + hid_desc->wDescriptorLength = BYTE_SWAP(buf + 7U); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c new file mode 100644 index 00000000000..ebfa3d9f370 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c @@ -0,0 +1,271 @@ +/*! + \file usbh_standard_hid.c + \brief USB host HID keyboard and mouse driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_standard_hid.h" + +mouse_report_data mouse_info; +hid_keybd_info keybd_info; + +__ALIGN_BEGIN uint8_t hid_mouse_info[8] __ALIGN_END = {0U}; +__ALIGN_BEGIN uint32_t keybd_report_data[2] __ALIGN_END; + +/* local constants */ +static const uint8_t kbd_codes[] = { + 0, 0, 0, 0, 31, 50, 48, 33, + 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */ + 52, 51, 25, 26, 17, 20, 32, 21, + 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */ + 4, 5, 6, 7, 8, 9, 10, 11, + 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */ + 28, 29, 42, 40, 41, 1, 53, 54, + 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */ + 118, 119, 120, 121, 122, 123, 124, 125, + 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */ + 79, 84, 83, 90, 95, 100, 105, 106, + 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */ + 96, 101, 99, 104, 45, 129, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */ + 0, 0, 0, 0, 0, 107, 0, 56, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ + 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */ +}; + +#ifdef QWERTY_KEYBOARD + +static const int8_t kbd_key[] = { + '\0', '`', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', '\0', '\r', + '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', + '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', + 'k', 'l', ';', '\'', '\0', '\n', + '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', + 'm', ',', '.', '/', '\0', '\0', + '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '7', '4', '1', + '\0', '/', '8', '5', '2', + '0', '*', '9', '6', '3', + '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0' +}; + +static const int8_t kbd_key_shift[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', + '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', + 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G', + 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', + 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +#else + +static const int8_t kbd_key[] = { + '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g', + 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x', + 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0', + '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1', '\0', '/', + '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0', + '\n', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +static const int8_t kbd_key_shift[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', + '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', + 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K', + 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N', + '?', '.', '/', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +#endif /* QWERTY_KEYBOARD */ + +/*! + \brief initialize the mouse function + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +usbh_status usbh_hid_mouse_init(usb_core_driver *udev, usbh_host *uhost) +{ + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + mouse_info.x = 0U; + mouse_info.y = 0U; + mouse_info.buttons[0] = 0U; + mouse_info.buttons[1] = 0U; + mouse_info.buttons[2] = 0U; + + if(hid->len > sizeof(hid_mouse_info)) { + hid->len = sizeof(hid_mouse_info); + } + + hid->pdata = (uint8_t *)(void *)hid_mouse_info; + + usr_mouse_init(); + + return USBH_OK; +} + +/*! + \brief decode mouse information + \param[in] data: pointer to input data + \param[out] none + \retval operation status +*/ +usbh_status usbh_hid_mouse_decode(uint8_t *data) +{ + mouse_info.buttons[0] = data[0] & MOUSE_BUTTON_1; + mouse_info.buttons[1] = data[0] & MOUSE_BUTTON_2; + mouse_info.buttons[2] = data[0] & MOUSE_BUTTON_3; + + mouse_info.x = data[1]; + mouse_info.y = data[2]; + + /* handle mouse data position */ + usr_mouse_process_data(&mouse_info); + + return USBH_FAIL; +} + +/*! + \brief initialize the keyboard function + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_hid_keybrd_init(usb_core_driver *udev, usbh_host *uhost) +{ + usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; + + keybd_info.lctrl = keybd_info.lshift = 0U; + keybd_info.lalt = keybd_info.lgui = 0U; + keybd_info.rctrl = keybd_info.rshift = 0U; + keybd_info.ralt = keybd_info.rgui = 0U; + + for(uint32_t x = 0U; x < (sizeof(keybd_report_data) / sizeof(uint32_t)); x++) { + keybd_report_data[x] = 0U; + } + + if(hid->len > (sizeof(keybd_report_data) / sizeof(uint32_t))) { + hid->len = (sizeof(keybd_report_data) / sizeof(uint32_t)); + } + + hid->pdata = (uint8_t *)(void *)keybd_report_data; + + /* call user initialization*/ + usr_keybrd_init(); + + return USBH_OK; +} + +/*! + \brief get ASCII code + \param[in] info: keyboard information + \param[out] none + \retval output +*/ +uint8_t usbh_hid_ascii_code_get(hid_keybd_info *info) +{ + uint8_t output = 0U; + + if((1U == info->lshift) || (info->rshift)) { + output = kbd_key_shift[kbd_codes[info->keys[0]]]; + } else { + output = kbd_key[kbd_codes[info->keys[0]]]; + } + + return output; +} + +/*! + \brief decode keyboard information + \param[in] udev: pointer to USB core instance + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_hid_keybrd_decode(uint8_t *data) +{ + uint8_t output = 0U; + + keybd_info.lshift = data[0] & KBD_LEFT_SHIFT; + keybd_info.rshift = data[0] & KBD_RIGHT_SHIFT; + + keybd_info.keys[0] = data[2]; + + if(keybd_info.lshift || keybd_info.rshift) { + output = kbd_key_shift[kbd_codes[keybd_info.keys[0]]]; + } else { + output = kbd_key[kbd_codes[keybd_info.keys[0]]]; + } + + if(0U != output) { + usr_keybrd_process_data(output); + } + + return USBH_OK; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h new file mode 100644 index 00000000000..1ba83f601b2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h @@ -0,0 +1,148 @@ +/*! + \file usbh_msc_bbb.h + \brief header file for usbh_msc_bbb.c + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_MSC_BBB_H +#define USBH_MSC_BBB_H + +#include "msc_bbb.h" +#include "usbh_core.h" + +#define USBH_MSC_BBB_CBW_TAG 0x20304050U /*!< MSC BBB CBW tag */ + +#define USBH_MSC_CSW_MAX_LENGTH 63U /*!< MSC CSW maximum length */ + +#define USBH_MSC_SEND_CSW_DISABLE 0U /*!< MSC send CSW disable */ +#define USBH_MSC_SEND_CSW_ENABLE 1U /*!< MSC send CSW enable */ + +#define USBH_MSC_DIR_IN 0U /*!< MSC data transfer IN */ +#define USBH_MSC_DIR_OUT 1U /*!< MSC data transfer OUT */ +#define USBH_MSC_BOTH_DIR 2U /*!< MSC data transfer IN/OUT */ + +#define USBH_MSC_PAGE_LENGTH 512U /*!< MSC memory page length */ + +#define CBW_CB_LENGTH 16U /*!< MSC CBW CB length */ +#define CBW_LENGTH 10U /*!< MSC CBW length */ +#define CBW_LENGTH_TEST_UNIT_READY 0U /*!< MSC CBW test unit ready length */ + +#define MAX_BULK_STALL_COUNT_LIMIT 0x04U /*!< if STALL is seen on bulk + endpoint continously, this means + that device and host has phase error + hence a reset is needed */ + +typedef union { + msc_bbb_cbw field; /*!< MSC BBB CBW structure */ + + uint8_t CBWArray[31]; /*!< MSC BBB CBW array buff */ +}usbh_cbw_pkt; + +typedef union { + msc_bbb_csw field; /*!< MSC BBB CSW structure */ + + uint8_t CSWArray[13]; /*!< MSC BBB CSW array buff */ +}usbh_csw_pkt; + +enum usbh_msc_state { + USBH_MSC_BBB_INIT_STATE = 0U, /*!< MSC BBB init state */ + USBH_MSC_BBB_RESET, /*!< MSC BBB reset state */ + USBH_MSC_GET_MAX_LUN, /*!< MSC init state */ + USBH_MSC_TEST_UNIT_READY, /*!< MSC test unit ready state */ + USBH_MSC_READ_CAPACITY10, /*!< MSC read capacity10 state */ + USBH_MSC_MODE_SENSE6, /*!< MSC sense6 mode state */ + USBH_MSC_REQUEST_SENSE, /*!< MSC request sense state */ + USBH_MSC_BBB_USB_TRANSFERS, /*!< MSC BBB transfers state */ + USBH_MSC_DEFAULT_APPLI_STATE, /*!< MSC default application state */ + USBH_MSC_CTRL_ERROR_STATE, /*!< MSC control error state */ + USBH_MSC_UNRECOVERED_STATE /*!< MSC unrecovered state */ +}; + +/* MSC BBB status types */ +typedef enum { + BBB_OK = 0U, /*!< MSC BBB OK status */ + BBB_FAIL, /*!< MSC BBB fail status */ + BBB_PHASE_ERROR, /*!< MSC BBB phase error status */ + BBB_BUSY /*!< MSC BBB busy status */ +} bbb_status; + +/* MSC BBB command state types */ +typedef enum { + BBB_CMD_IDLE = 0U, /*!< MSC BBB command idle state */ + BBB_CMD_SEND, /*!< MSC BBB command send state */ + BBB_CMD_WAIT /*!< MSC BBB command wait state */ +} bbb_cmd_state; + +/* CSW status definitions */ +typedef enum { + BBB_CSW_CMD_PASSED = 0U, /*!< MSC BBB CSW command passed status */ + BBB_CSW_CMD_FAILED, /*!< MSC BBB CSW command failed status */ + BBB_CSW_PHASE_ERROR /*!< MSC BBB CSW phase error status */ +} bbb_csw_status; + +/* MSC BBB state types */ +typedef enum { + BBB_SEND_CBW = 1U, /*!< MSC BBB send CBW state */ + BBB_SEND_CBW_WAIT, /*!< MSC BBB send CBW wait state */ + BBB_DATA_IN, /*!< MSC BBB data IN state */ + BBB_DATA_IN_WAIT, /*!< MSC BBB data IN wait state */ + BBB_DATA_OUT, /*!< MSC BBB data OUT state */ + BBB_DATA_OUT_WAIT, /*!< MSC BBB data OUT wait state */ + BBB_RECEIVE_CSW, /*!< MSC BBB receive CSW state */ + BBB_RECEIVE_CSW_WAIT, /*!< MSC BBB receive CSW wait state */ + BBB_ERROR_IN, /*!< MSC BBB error IN state */ + BBB_ERROR_OUT, /*!< MSC BBB error OUT state */ + BBB_UNRECOVERED_ERROR /*!< MSC BBB unrecovered error state */ +} bbb_state; + +typedef struct { + uint8_t *pbuf; /*!< MSC BBB data buff pointer */ + uint32_t data[16]; /*!< MSC BBB data buff */ + bbb_state state; /*!< MSC BBB state */ + bbb_state prev_state; /*!< MSC BBB previous state */ + bbb_cmd_state cmd_state; /*!< MSC BBB command state */ + usbh_cbw_pkt cbw; /*!< MSC CBW pocket structure */ + usbh_csw_pkt csw; /*!< MSC CSW pocket structure */ +} bbb_handle; + +/* function declarations */ +/* initialize the mass storage parameters */ +void usbh_msc_bbb_init(usbh_host *uhost); +/* manage the different states of BBB transfer and updates the status to upper layer */ +usbh_status usbh_msc_bbb_process(usbh_host *uhost, uint8_t lun); +/* manages the different error handling for STALL */ +usbh_status usbh_msc_bbb_abort(usbh_host *uhost, uint8_t direction); +/* reset MSC BBB request structure */ +usbh_status usbh_msc_bbb_reset(usbh_host *uhost); +/* decode the CSW received by the device and updates the same to upper layer */ +bbb_csw_status usbh_msc_csw_decode(usbh_host *uhost); + +#endif /* USBH_MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h new file mode 100644 index 00000000000..d35bf9cd711 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h @@ -0,0 +1,122 @@ +/*! + \file usbh_core.h + \brief header file for the usbh_core.c + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_MSC_CORE_H +#define USBH_MSC_CORE_H + +#include "usb_msc.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" + +#define MSC_MAX_SUPPORTED_LUN 2U + +/* MSC state types */ +typedef enum { + MSC_INIT = 0U, /*!< MSC init state */ + MSC_IDLE, /*!< MSC idle state */ + MSC_TEST_UNIT_READY, /*!< MSC test unit ready state */ + MSC_READ_CAPACITY10, /*!< MSC read capacity10 state */ + MSC_READ_INQUIRY, /*!< MSC read inquiry state */ + MSC_REQUEST_SENSE, /*!< MSC request sense state */ + MSC_READ, /*!< MSC read state */ + MSC_WRITE, /*!< MSC write state */ + MSC_UNRECOVERED_ERROR, /*!< MSC unrecovered state */ + MSC_PERIODIC_CHECK /*!< MSC periodic check state */ +} msc_state; + +/* MSC error types */ +typedef enum { + MSC_OK = 0U, /*!< MSC no error */ + MSC_NOT_READY, /*!< MSC not ready */ + MSC_ERROR /*!< MSC error */ +} msc_error; + +/* MSC request types */ +typedef enum { + MSC_REQ_IDLE = 0U, /*!< MSC idle request state */ + MSC_REQ_RESET, /*!< MSC reset request state */ + MSC_REQ_GET_MAX_LUN, /*!< MSC get maximum LUN request state */ + MSC_REQ_ERROR /*!< MSC error request state */ +} msc_req_state; + +/* structure for LUN */ +typedef struct { + msc_state state; /*!< MSC LUN state */ + msc_error error; /*!< MSC LUN error */ + msc_scsi_sense sense; /*!< MSC SCSI sense */ + scsi_capacity capacity; /*!< MSC SCSI capacity */ + scsi_std_inquiry_data inquiry; /*!< MSC SCSI standard inquiry data */ + usbh_status prev_ready_state; /*!< MSC previous ready state */ + uint8_t state_changed; /*!< MSC state changed */ +} msc_lun; + +/* structure for MSC process */ +typedef struct _msc_process { + uint8_t pipe_in; /*!< MSC pipe IN */ + uint8_t pipe_out; /*!< MSC pipe OUT */ + uint8_t ep_in; /*!< MSC endpoint IN */ + uint8_t ep_out; /*!< MSC endpoint OUT */ + uint16_t ep_size_in; /*!< MSC endpoint IN size */ + uint16_t ep_size_out; /*!< MSC endpoint OUT size */ + uint8_t cur_lun; /*!< MSC current LUN */ + uint16_t rw_lun; /*!< MSC review LUN */ + uint32_t max_lun; /*!< MSC maximum LUN */ + msc_state state; /*!< MSC state */ + msc_error error; /*!< MSC error */ + msc_req_state req_state; /*!< MSC request state */ + msc_req_state prev_req_state; /*!< MSC previous request state */ + bbb_handle bbb; /*!< MSC BBB correlation parameter handle */ + msc_lun unit[MSC_MAX_SUPPORTED_LUN]; /*!< MSC LUN unit buff */ + uint32_t timer; /*!< MSC read/write timer */ +} usbh_msc_handler; + +extern usbh_class usbh_msc; + +/* function declarations */ +/* get MSC logic unit information */ +usbh_status usbh_msc_lun_info_get(usbh_host *uhost, uint8_t lun, msc_lun *info); +/* MSC read interface */ +usbh_status usbh_msc_read(usbh_host *uhost, \ + uint8_t lun, \ + uint32_t address, \ + uint8_t *pbuf, \ + uint32_t length); +/* MSC write interface */ +usbh_status usbh_msc_write(usbh_host *uhost, \ + uint8_t lun, \ + uint32_t address, \ + uint8_t *pbuf, \ + uint32_t length); + +#endif /* USBH_MSC_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h new file mode 100644 index 00000000000..a4df7e91bac --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h @@ -0,0 +1,97 @@ +/*! + \file usbh_msc_scsi.h + \brief header file for usbh_msc_scsi.c + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_MSC_SCSI_H +#define USBH_MSC_SCSI_H + +#include "msc_scsi.h" +#include "usbh_enum.h" + +#define DESC_REQUEST_SENSE 00U /*!< sense request descriptor */ +#define ALLOCATION_LENGTH_REQUEST_SENSE 63U /*!< sense request allocation length */ +#define XFER_LEN_MODE_SENSE6 63U /*!< MSC sense6 mode transfer length */ + +#define MASK_MODE_SENSE_WRITE_PROTECT 0x80U /*!< sense write protect mask mode */ +#define MODE_SENSE_PAGE_CONTROL_FIELD 0x00U /*!< sense page control field mode */ +#define MODE_SENSE_PAGE_CODE 0x3FU /*!< sense page code mode */ +#define DISK_WRITE_PROTECTED 0x01U /*!< disk write protected */ + +/* capacity data */ +typedef struct { + uint32_t block_nbr; /*!< MSC SCSI block number */ + uint16_t block_size; /*!< MSC SCSI block size */ +} scsi_capacity; + +/* inquiry data */ +typedef struct { + uint8_t peripheral_qualifier; /*!< MSC SCSI standard peripheral qualifier */ + uint8_t device_type; /*!< MSC SCSI standard inquiry device types */ + uint8_t removable_media; /*!< MSC SCSI standard inquiry removable media */ + uint8_t vendor_id[9]; /*!< MSC SCSI standard inquiry vendor id buff */ + uint8_t product_id[17]; /*!< MSC SCSI standard inquiry product id buff */ + uint8_t revision_id[5]; /*!< MSC SCSI standard inquiry revision id buff */ +} scsi_std_inquiry_data; + +typedef struct { + uint32_t msc_capacity; /*!< MSC capacity */ + uint32_t msc_sense_key; /*!< MSC sense key */ + uint16_t msc_page_len; /*!< MSC memory page length */ + uint8_t msc_write_protect; /*!< MSC write protect */ +}usbh_msc_parameter; + +/* function declarations */ +/* send 'inquiry' command to the device */ +usbh_status usbh_msc_scsi_inquiry(usbh_host *uhost, uint8_t lun, scsi_std_inquiry_data *inquiry); +/* send 'test unit ready' command to the device */ +usbh_status usbh_msc_test_unitready(usbh_host *uhost, uint8_t lun); +/* send the read capacity command to the device */ +usbh_status usbh_msc_read_capacity10(usbh_host *uhost, uint8_t lun, scsi_capacity *capacity); +/* send the mode sense6 command to the device */ +usbh_status usbh_msc_mode_sense6(usbh_host *uhost, uint8_t lun); +/* send the request sense command to the device */ +usbh_status usbh_msc_request_sense(usbh_host *uhost, uint8_t lun, msc_scsi_sense *sense_data); +/* send the write10 command to the device */ +usbh_status usbh_msc_write10(usbh_host *uhost, \ + uint8_t lun, \ + uint8_t *data_buf, \ + uint32_t addr, \ + uint32_t byte_num); +/* send the read10 command to the device */ +usbh_status usbh_msc_read10(usbh_host *uhost, \ + uint8_t lun, \ + uint8_t *data_buf, \ + uint32_t addr, \ + uint32_t byte_num); + +#endif /* USBH_MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c new file mode 100644 index 00000000000..85b8c32beb3 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c @@ -0,0 +1,360 @@ +/*! + \file usbh_msc_bbb.c + \brief USB MSC BBB protocol related functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" +#include "usbh_transc.h" +#include "usbh_msc_core.h" +#include "usbh_msc_bbb.h" + +/*! + \brief initialize the mass storage parameters + \param[in] uhost: pointer to USB host handler + \param[out] none + \retval none +*/ +void usbh_msc_bbb_init(usbh_host *uhost) +{ + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + msc->bbb.cbw.field.dCBWSignature = BBB_CBW_SIGNATURE; + msc->bbb.cbw.field.dCBWTag = USBH_MSC_BBB_CBW_TAG; + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_SEND; +} + +/*! + \brief manage the different states of BBB transfer and updates the status to upper layer + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_bbb_process(usbh_host *uhost, uint8_t lun) +{ + bbb_csw_status csw_status = BBB_CSW_CMD_FAILED; + usbh_status status = USBH_BUSY; + usbh_status error = USBH_BUSY; + usb_urb_state urb_status = URB_IDLE; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.state) { + case BBB_SEND_CBW: + msc->bbb.cbw.field.bCBWLUN = lun; + msc->bbb.state = BBB_SEND_CBW_WAIT; + /* send CBW */ + usbh_data_send(uhost->data, \ + msc->bbb.cbw.CBWArray, \ + msc->pipe_out, \ + BBB_CBW_LENGTH); + break; + + case BBB_SEND_CBW_WAIT: + urb_status = usbh_urbstate_get(uhost->data, msc->pipe_out); + + if(URB_DONE == urb_status) { + if(0U != msc->bbb.cbw.field.dCBWDataTransferLength) { + if(USB_TRX_IN == (msc->bbb.cbw.field.bmCBWFlags & USB_TRX_MASK)) { + msc->bbb.state = BBB_DATA_IN; + } else { + msc->bbb.state = BBB_DATA_OUT; + } + } else { + msc->bbb.state = BBB_RECEIVE_CSW; + } + + } else if(URB_NOTREADY == urb_status) { + msc->bbb.state = BBB_SEND_CBW; + } else { + if(URB_STALL == urb_status) { + msc->bbb.state = BBB_ERROR_OUT; + } + } + break; + + case BBB_DATA_IN: + usbh_data_recev(uhost->data, \ + msc->bbb.pbuf, \ + msc->pipe_in, \ + msc->ep_size_in); + + msc->bbb.state = BBB_DATA_IN_WAIT; + break; + + case BBB_DATA_IN_WAIT: + urb_status = usbh_urbstate_get(uhost->data, msc->pipe_in); + + /* BBB DATA IN stage */ + if(URB_DONE == urb_status) { + if(msc->bbb.cbw.field.dCBWDataTransferLength > msc->ep_size_in) { + msc->bbb.pbuf += msc->ep_size_in; + msc->bbb.cbw.field.dCBWDataTransferLength -= msc->ep_size_in; + } else { + msc->bbb.cbw.field.dCBWDataTransferLength = 0U; + } + + if(msc->bbb.cbw.field.dCBWDataTransferLength > 0U) { + usbh_data_recev(uhost->data, \ + msc->bbb.pbuf, \ + msc->pipe_in, \ + msc->ep_size_in); + } else { + msc->bbb.state = BBB_RECEIVE_CSW; + } + } else if(URB_STALL == urb_status) { + /* this is data stage STALL condition */ + msc->bbb.state = BBB_ERROR_IN; + } else { + /* no operation */ + } + break; + + case BBB_DATA_OUT: + usbh_data_send(uhost->data, \ + msc->bbb.pbuf, \ + msc->pipe_out, \ + msc->ep_size_out); + + msc->bbb.state = BBB_DATA_OUT_WAIT; + break; + + case BBB_DATA_OUT_WAIT: + /* BBB DATA OUT stage */ + urb_status = usbh_urbstate_get(uhost->data, msc->pipe_out); + if(URB_DONE == urb_status) { + if(msc->bbb.cbw.field.dCBWDataTransferLength > msc->ep_size_out) { + msc->bbb.pbuf += msc->ep_size_out; + msc->bbb.cbw.field.dCBWDataTransferLength -= msc->ep_size_out; + } else { + msc->bbb.cbw.field.dCBWDataTransferLength = 0U; /* reset this value and keep in same state */ + } + + if(msc->bbb.cbw.field.dCBWDataTransferLength > 0U) { + usbh_data_send(uhost->data, \ + msc->bbb.pbuf, \ + msc->pipe_out, \ + msc->ep_size_out); + } else { + msc->bbb.state = BBB_RECEIVE_CSW; + } + } else if(URB_NOTREADY == urb_status) { + msc->bbb.state = BBB_DATA_OUT; + } else if(URB_STALL == urb_status) { + msc->bbb.state = BBB_ERROR_OUT; + } else { + /* no operation */ + } + break; + + case BBB_RECEIVE_CSW: + /* BBB CSW stage */ + usbh_data_recev(uhost->data, \ + msc->bbb.csw.CSWArray, \ + msc->pipe_in, \ + BBB_CSW_LENGTH); + + msc->bbb.state = BBB_RECEIVE_CSW_WAIT; + break; + + case BBB_RECEIVE_CSW_WAIT: + urb_status = usbh_urbstate_get(uhost->data, msc->pipe_in); + + /* decode CSW */ + if(URB_DONE == urb_status) { + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_SEND; + + csw_status = usbh_msc_csw_decode(uhost); + if(BBB_CSW_CMD_PASSED == csw_status) { + status = USBH_OK; + } else { + status = USBH_FAIL; + } + } else if(URB_STALL == urb_status) { + msc->bbb.state = BBB_ERROR_IN; + } else { + /* no operation */ + } + break; + + case BBB_ERROR_IN: + error = usbh_msc_bbb_abort(uhost, USBH_MSC_DIR_IN); + + if(USBH_OK == error) { + msc->bbb.state = BBB_RECEIVE_CSW; + } else if(USBH_UNRECOVERED_ERROR == status) { + /* this means that there is a STALL error limit, do reset recovery */ + msc->bbb.state = BBB_UNRECOVERED_ERROR; + } else { + /* no operation */ + } + break; + + case BBB_ERROR_OUT: + status = usbh_msc_bbb_abort(uhost, USBH_MSC_DIR_OUT); + + if(USBH_OK == status) { + uint8_t toggle = usbh_pipe_toggle_get(uhost->data, msc->pipe_out); + usbh_pipe_toggle_set(uhost->data, msc->pipe_out, 1U - toggle); + usbh_pipe_toggle_set(uhost->data, msc->pipe_in, 0U); + msc->bbb.state = BBB_ERROR_IN; + } else { + if(USBH_UNRECOVERED_ERROR == status) { + msc->bbb.state = BBB_UNRECOVERED_ERROR; + } + } + break; + + case BBB_UNRECOVERED_ERROR: + status = usbh_msc_bbb_reset(uhost); + if(USBH_OK == status) { + msc->bbb.state = BBB_SEND_CBW; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief manages the different error handling for stall + \param[in] uhost: pointer to USB host handler + \param[in] direction: data IN or OUT + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_bbb_abort(usbh_host *uhost, uint8_t direction) +{ + usbh_status status = USBH_BUSY; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(direction) { + case USBH_MSC_DIR_IN : + /* send clrfeature command on bulk IN endpoint */ + status = usbh_clrfeature(uhost, \ + msc->ep_in, \ + msc->pipe_in); + break; + + case USBH_MSC_DIR_OUT : + /*send clrfeature command on bulk OUT endpoint */ + status = usbh_clrfeature(uhost, \ + msc->ep_out, \ + msc->pipe_out); + break; + + default: + break; + } + + return status; +} + +/*! + \brief reset MSC BBB transfer + \param[in] uhost: pointer to USB host handler + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_bbb_reset(usbh_host *uhost) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_REQTYPE_CLASS | USB_RECPTYPE_ITF, + .bRequest = BBB_RESET, + .wValue = 0U, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief decode the CSW received by the device and updates the same to upper layer + \param[in] uhost: pointer to USB host + \param[out] none + \retval on success USBH_MSC_OK, on failure USBH_MSC_FAIL + \notes + Refer to USB Mass-Storage Class: BBB (www.usb.org) + 6.3.1 Valid CSW Conditions : + The host shall consider the CSW valid when: + 1. dCSWSignature is equal to 53425355h + 2. the CSW is 13 (Dh) bytes in length, + 3. dCSWTag matches the dCBWTag from the corresponding CBW. +*/ +bbb_csw_status usbh_msc_csw_decode(usbh_host *uhost) +{ + bbb_csw_status status = BBB_CSW_CMD_FAILED; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + /* checking if the transfer length is different than 13 */ + if(BBB_CSW_LENGTH != usbh_xfercount_get(uhost->data, msc->pipe_in)) { + status = BBB_CSW_PHASE_ERROR; + } else { + /* CSW length is correct */ + + /* check validity of the CSW Signature and CSWStatus */ + if(BBB_CSW_SIGNATURE == msc->bbb.csw.field.dCSWSignature) { + /* check condition 1. dCSWSignature is equal to 53425355h */ + if(msc->bbb.csw.field.dCSWTag == msc->bbb.cbw.field.dCBWTag) { + /* check condition 3. dCSWTag matches the dCBWTag from the corresponding CBW */ + if(0U == msc->bbb.csw.field.bCSWStatus) { + status = BBB_CSW_CMD_PASSED; + } else if(1U == msc->bbb.csw.field.bCSWStatus) { + status = BBB_CSW_CMD_FAILED; + } else if(2U == msc->bbb.csw.field.bCSWStatus) { + status = BBB_CSW_PHASE_ERROR; + } else { + /* no operation */ + } + } + } else { + /* if the CSW signature is not valid, we shall return the phase error to + upper layers for reset recovery */ + status = BBB_CSW_PHASE_ERROR; + } + } + + return status; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c new file mode 100644 index 00000000000..5e19cae3b39 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c @@ -0,0 +1,551 @@ +/*! + \file usbh_core.c + \brief USB MSC(mass storage device) class driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_msc_core.h" +#include "usbh_pipe.h" +#include "usbh_transc.h" +#include + +/* local function prototypes ('static') */ +static void usbh_msc_itf_deinit(usbh_host *uhost); +static usbh_status usbh_msc_itf_init(usbh_host *uhost); +static usbh_status usbh_msc_req(usbh_host *uhost); +static usbh_status usbh_msc_handle(usbh_host *uhost); +static usbh_status usbh_msc_maxlun_get(usbh_host *uhost, uint8_t *maxlun); +static usbh_status usbh_msc_rdwr_process(usbh_host *uhost, uint8_t lun); + +usbh_class usbh_msc = { + USB_CLASS_MSC, + usbh_msc_itf_init, + usbh_msc_itf_deinit, + usbh_msc_req, + usbh_msc_handle +}; + +/*! + \brief get MSC logic unit information + \param[in] uhost: pointer to USB host + \param[in] lun: logic unit number + \param[in] info: pointer to logic unit information + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_lun_info_get(usbh_host *uhost, uint8_t lun, msc_lun *info) +{ + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + if(HOST_CLASS_HANDLER == uhost->cur_state) { + memcpy(info, &msc->unit[lun], sizeof(msc_lun)); + + return USBH_OK; + } else { + return USBH_FAIL; + } +} + +/*! + \brief MSC read interface + \param[in] uhost: pointer to USB host + \param[in] lun: logic unit number + \param[in] address: address to be read + \param[in] pbuf: pointer to user buffer + \param[in] length: length to be read + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_read(usbh_host *uhost, \ + uint8_t lun, \ + uint32_t address, \ + uint8_t *pbuf, \ + uint32_t length) +{ + uint32_t timeout = 0U; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + usb_core_driver *udev = (usb_core_driver *)uhost->data; + + if((0U == udev->host.connect_status) || \ + (HOST_CLASS_HANDLER != uhost->cur_state) || \ + (MSC_IDLE != msc->unit[lun].state)) { + return USBH_FAIL; + } + + msc->state = MSC_READ; + msc->unit[lun].state = MSC_READ; + msc->rw_lun = lun; + + usbh_msc_read10(uhost, lun, pbuf, address, length); + + timeout = uhost->control.timer; + + while(USBH_BUSY == usbh_msc_rdwr_process(uhost, lun)) { + if(((uhost->control.timer - timeout) > (10000U * length)) || (0U == udev->host.connect_status)) { + msc->state = MSC_IDLE; + return USBH_FAIL; + } + } + + msc->state = MSC_IDLE; + + return USBH_OK; +} + +/*! + \brief MSC write interface + \param[in] uhost: pointer to USB host + \param[in] lun: logic unit number + \param[in] address: address to be written + \param[in] pbuf: pointer to user buffer + \param[in] length: length to be written + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_write(usbh_host *uhost, \ + uint8_t lun, \ + uint32_t address, \ + uint8_t *pbuf, \ + uint32_t length) +{ + uint32_t timeout = 0U; + usb_core_driver *udev = (usb_core_driver *)uhost->data; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + if((0U == udev->host.connect_status) || \ + (HOST_CLASS_HANDLER != uhost->cur_state) || \ + (MSC_IDLE != msc->unit[lun].state)) { + return USBH_FAIL; + } + + msc->state = MSC_WRITE; + msc->unit[lun].state = MSC_WRITE; + msc->rw_lun = lun; + + usbh_msc_write10(uhost, lun, pbuf, address, length); + + timeout = uhost->control.timer; + + while(USBH_BUSY == usbh_msc_rdwr_process(uhost, lun)) { + if(((uhost->control.timer - timeout) > (10000U * length)) || (0U == udev->host.connect_status)) { + msc->state = MSC_IDLE; + return USBH_FAIL; + } + } + + msc->state = MSC_IDLE; + + return USBH_OK; +} + +/*! + \brief de-initialize interface by freeing host channels allocated to interface + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static void usbh_msc_itf_deinit(usbh_host *uhost) +{ + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + if(msc->pipe_out) { + usb_pipe_halt(uhost->data, msc->pipe_out); + usbh_pipe_free(uhost->data, msc->pipe_out); + + msc->pipe_out = 0U; + } + + if(msc->pipe_in) { + usb_pipe_halt(uhost->data, msc->pipe_in); + usbh_pipe_free(uhost->data, msc->pipe_in); + + msc->pipe_in = 0U; + } +} + +/*! + \brief interface initialization for MSC class + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_itf_init(usbh_host *uhost) +{ + usbh_status status = USBH_OK; + + uint8_t interface = usbh_interface_find(&uhost->dev_prop, MSC_CLASS, USB_MSC_SUBCLASS_SCSI, MSC_PROTOCOL); + + if(0xFFU == interface) { + uhost->usr_cb->dev_not_supported(); + + status = USBH_FAIL; + } else { + static usbh_msc_handler msc_handler; + + memset((void *)&msc_handler, 0U, sizeof(usbh_msc_handler)); + + uhost->active_class->class_data = (void *)&msc_handler; + + usbh_interface_select(&uhost->dev_prop, interface); + + usb_desc_ep *ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[interface][0].ep_desc[0]; + + if(ep_desc->bEndpointAddress & 0x80U) { + msc_handler.ep_in = ep_desc->bEndpointAddress; + msc_handler.ep_size_in = ep_desc->wMaxPacketSize; + } else { + msc_handler.ep_out = ep_desc->bEndpointAddress; + msc_handler.ep_size_out = ep_desc->wMaxPacketSize; + } + + ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[interface][0].ep_desc[1]; + + if(ep_desc->bEndpointAddress & 0x80U) { + msc_handler.ep_in = ep_desc->bEndpointAddress; + msc_handler.ep_size_in = ep_desc->wMaxPacketSize; + } else { + msc_handler.ep_out = ep_desc->bEndpointAddress; + msc_handler.ep_size_out = ep_desc->wMaxPacketSize; + } + + msc_handler.state = MSC_INIT; + msc_handler.error = MSC_OK; + msc_handler.req_state = MSC_REQ_IDLE; + msc_handler.pipe_out = usbh_pipe_allocate(uhost->data, msc_handler.ep_out); + msc_handler.pipe_in = usbh_pipe_allocate(uhost->data, msc_handler.ep_in); + + usbh_msc_bbb_init(uhost); + + /* open the new channels */ + usbh_pipe_create(uhost->data, \ + &uhost->dev_prop, \ + msc_handler.pipe_out, \ + USB_EPTYPE_BULK, \ + msc_handler.ep_size_out); + + usbh_pipe_create(uhost->data, \ + &uhost->dev_prop, \ + msc_handler.pipe_in, \ + USB_EPTYPE_BULK, \ + msc_handler.ep_size_in); + + usbh_pipe_toggle_set(uhost->data, msc_handler.pipe_out, 0U); + usbh_pipe_toggle_set(uhost->data, msc_handler.pipe_in, 0U); + } + + return status; +} + +/*! + \brief initialize the MSC state machine + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_req(usbh_host *uhost) +{ + usbh_status status = USBH_BUSY; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->req_state) { + case MSC_REQ_IDLE: + case MSC_REQ_GET_MAX_LUN: + /* issue Get_MaxLun request */ + status = usbh_msc_maxlun_get(uhost, (uint8_t *)&msc->max_lun); + + if(USBH_OK == status) { + msc->max_lun = ((uint8_t)msc->max_lun > MSC_MAX_SUPPORTED_LUN) ? MSC_MAX_SUPPORTED_LUN : (uint8_t)msc->max_lun + 1U; + + for(uint8_t i = 0U; i < msc->max_lun; i++) { + msc->unit[i].prev_ready_state = USBH_FAIL; + msc->unit[i].state_changed = 0U; + } + } else { + if(USBH_NOT_SUPPORTED == status) { + msc->max_lun = 0U; + status = USBH_OK; + } + } + break; + + case MSC_REQ_ERROR: + /* issue clearfeature request */ + if(USBH_OK == usbh_clrfeature(uhost, 0x00U, uhost->control.pipe_out_num)) { + msc->req_state = msc->prev_req_state; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief MSC state machine handler + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_handle(usbh_host *uhost) +{ + usbh_status status = USBH_BUSY; + uint8_t scsi_status = USBH_BUSY; + uint8_t ready_status = USBH_BUSY; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->state) { + case MSC_INIT: + if(msc->cur_lun < msc->max_lun) { + msc->unit[msc->cur_lun].error = MSC_NOT_READY; + + switch(msc->unit[msc->cur_lun].state) { + case MSC_INIT: + msc->unit[msc->cur_lun].state = MSC_READ_INQUIRY; + msc->timer = uhost->control.timer; + break; + + case MSC_READ_INQUIRY: + scsi_status = usbh_msc_scsi_inquiry(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].inquiry); + + if(USBH_OK == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_TEST_UNIT_READY; + } else if(USBH_FAIL == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; + } else { + if(USBH_UNRECOVERED_ERROR == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->unit[msc->cur_lun].error = MSC_ERROR; + } + } + break; + + case MSC_TEST_UNIT_READY: + /* issue SCSI command TestUnitReady */ + ready_status = usbh_msc_test_unitready(uhost, msc->cur_lun); + + if(USBH_OK == ready_status) { + if(USBH_OK != msc->unit[msc->cur_lun].prev_ready_state) { + msc->unit[msc->cur_lun].state_changed = 1U; + } else { + msc->unit[msc->cur_lun].state_changed = 0U; + } + + msc->unit[msc->cur_lun].state = MSC_READ_CAPACITY10; + msc->unit[msc->cur_lun].error = MSC_OK; + msc->unit[msc->cur_lun].prev_ready_state = USBH_OK; + } else if(USBH_FAIL == ready_status) { + if(USBH_FAIL != msc->unit[msc->cur_lun].prev_ready_state) { + msc->unit[msc->cur_lun].state_changed = 1U; + } else { + msc->unit[msc->cur_lun].state_changed = 0U; + } + + msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; + msc->unit[msc->cur_lun].error = MSC_NOT_READY; + msc->unit[msc->cur_lun].prev_ready_state = USBH_FAIL; + } else { + if(USBH_UNRECOVERED_ERROR == ready_status) { + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->unit[msc->cur_lun].error = MSC_ERROR; + } + } + break; + + case MSC_READ_CAPACITY10: + /* issue READ_CAPACITY10 SCSI command */ + scsi_status = usbh_msc_read_capacity10(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].capacity); + + if(USBH_OK == scsi_status) { + if(1U == msc->unit[msc->cur_lun].state_changed) { + } + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->unit[msc->cur_lun].error = MSC_OK; + msc->cur_lun ++; + } else if(USBH_FAIL == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; + } else { + if(USBH_UNRECOVERED_ERROR == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->unit[msc->cur_lun].error = MSC_ERROR; + } + } + break; + + case MSC_REQUEST_SENSE: + /* issue RequestSense SCSI command for retrieving error code */ + scsi_status = usbh_msc_request_sense(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].sense); + if(USBH_OK == scsi_status) { + if((UNIT_ATTENTION == msc->unit[msc->cur_lun].sense.SenseKey) || (NOT_READY == msc->unit[msc->cur_lun].sense.SenseKey)) { + if((uhost->control.timer - msc->timer) < 10000U) { + msc->unit[msc->cur_lun].state = MSC_TEST_UNIT_READY; + break; + } + } + + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->cur_lun++; + } else if(USBH_FAIL == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_UNRECOVERED_ERROR; + } else { + if(MSC_UNRECOVERED_ERROR == scsi_status) { + msc->unit[msc->cur_lun].state = MSC_IDLE; + msc->unit[msc->cur_lun].error = MSC_ERROR; + } + } + break; + + case MSC_UNRECOVERED_ERROR: + msc->cur_lun++; + break; + + default: + break; + } + } else { + msc->cur_lun = 0U; + msc->state = MSC_IDLE; + } + break; + + case MSC_IDLE: + uhost->usr_cb->dev_user_app(); + status = USBH_OK; + break; + + default: + break; + } + + return status; +} + +/*! + \brief get max lun of the mass storage device + \param[in] uhost: pointer to USB host + \param[in] maxlun: pointer to max lun + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_maxlun_get(usbh_host *uhost, uint8_t *maxlun) +{ + usbh_status status = USBH_BUSY; + + if(CTL_IDLE == uhost->control.ctl_state) { + uhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_REQTYPE_CLASS | USB_RECPTYPE_ITF, + .bRequest = BBB_GET_MAX_LUN, + .wValue = 0U, + .wIndex = 0U, + .wLength = 1U + }; + + usbh_ctlstate_config(uhost, maxlun, 1U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief get max lun of the mass storage device + \param[in] uhost: pointer to USB host + \param[in] lun: logic unit number + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_rdwr_process(usbh_host *uhost, uint8_t lun) +{ + usbh_status error = USBH_BUSY; + usbh_status scsi_status = USBH_BUSY; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + /* switch msc req state machine */ + switch(msc->unit[lun].state) { + case MSC_READ: + scsi_status = usbh_msc_read10(uhost, lun, NULL, 0U, 0U); + + if(USBH_OK == scsi_status) { + msc->unit[lun].state = MSC_IDLE; + error = USBH_OK; + } else if(USBH_FAIL == scsi_status) { + msc->unit[lun].state = MSC_REQUEST_SENSE; + } else { + if(USBH_UNRECOVERED_ERROR == scsi_status) { + msc->unit[lun].state = MSC_UNRECOVERED_ERROR; + error = USBH_FAIL; + } + } + break; + + case MSC_WRITE: + scsi_status = usbh_msc_write10(uhost, lun, NULL, 0U, 0U); + + if(USBH_OK == scsi_status) { + msc->unit[lun].state = MSC_IDLE; + error = USBH_OK; + } else if(USBH_FAIL == scsi_status) { + msc->unit[lun].state = MSC_REQUEST_SENSE; + } else { + if(USBH_UNRECOVERED_ERROR == scsi_status) { + msc->unit[lun].state = MSC_UNRECOVERED_ERROR; + error = USBH_FAIL; + } + } + break; + + case MSC_REQUEST_SENSE: + scsi_status = usbh_msc_request_sense(uhost, lun, &msc->unit[lun].sense); + + if(USBH_OK == scsi_status) { + msc->unit[lun].state = MSC_IDLE; + msc->unit[lun].error = MSC_ERROR; + + error = USBH_FAIL; + } + + if(USBH_FAIL == scsi_status) { + } else { + if(USBH_UNRECOVERED_ERROR == scsi_status) { + msc->unit[lun].state = MSC_UNRECOVERED_ERROR; + error = USBH_FAIL; + } + } + break; + + default: + break; + } + + return error; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c new file mode 100644 index 00000000000..a97a40b0c98 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c @@ -0,0 +1,232 @@ +/*! + \file usbh_msc_fatfs.c + \brief USB MSC host FATFS related functions + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "diskio.h" +#include "usbh_msc_core.h" + +static volatile DSTATUS state = STA_NOINIT; /* disk status */ + +extern usbh_host usb_host_msc; + +/*! + \brief initialize the disk drive + \param[in] drv: physical drive number (0) + \param[out] none + \retval operation status +*/ +DSTATUS disk_initialize(BYTE drv) +{ + usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; + + if(udev->host.connect_status) { + state &= ~STA_NOINIT; + } + + return state; +} + +/*! + \brief get disk status + \param[in] drv: physical drive number (0) + \param[out] none + \retval operation status +*/ +DSTATUS disk_status(BYTE drv) +{ + if(drv) { + return STA_NOINIT; /* supports only single drive */ + } + + return state; +} + +/*! + \brief read sectors + \param[in] drv: physical drive number (0) + \param[in] buff: pointer to the data buffer to store read data + \param[in] sector: start sector number (LBA) + \param[in] count: sector count (1..255) + \param[out] none + \retval operation status +*/ +DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count) +{ + BYTE status = USBH_OK; + usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; + + if(drv || (!count)) { + return RES_PARERR; + } + + if(state & STA_NOINIT) { + return RES_NOTRDY; + } + + if(udev->host.connect_status) { + do { + status = usbh_msc_read(&usb_host_msc, drv, sector, buff, count); + + if(!udev->host.connect_status) { + return RES_ERROR; + } + } while(USBH_BUSY == status); + } + + if(USBH_OK == status) { + return RES_OK; + } + + return RES_ERROR; +} + +#if _READONLY == 0U + +/*! + \brief write sectors + \param[in] drv: physical drive number (0) + \param[in] buff: pointer to the data buffer to store read data + \param[in] sector: start sector number (LBA) + \param[in] count: sector count (1..255) + \param[out] none + \retval operation status +*/ +DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count) +{ + BYTE status = USBH_OK; + usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; + + if((!count) || drv) { + return RES_PARERR; + } + + if(state & STA_NOINIT) { + return RES_NOTRDY; + } + + if(state & STA_PROTECT) { + return RES_WRPRT; + } + + if(udev->host.connect_status) { + do { + status = usbh_msc_write(&usb_host_msc, drv, sector, (BYTE *)buff, count); + + if(!udev->host.connect_status) { + return RES_ERROR; + } + } while(USBH_BUSY == status); + } + + if(USBH_OK == status) { + return RES_OK; + } + + return RES_ERROR; +} + +#endif /* _READONLY == 0 */ + +/*! + \brief I/O control function + \param[in] drv: physical drive number (0) + \param[in] ctrl: control code + \param[in] buff: pointer to the data buffer to store read data + \param[out] none + \retval operation status +*/ +DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff) +{ + DRESULT res = RES_OK; + msc_lun info; + + if(drv) { + return RES_PARERR; + } + + res = RES_ERROR; + + if(state & STA_NOINIT) { + return RES_NOTRDY; + } + + switch(ctrl) { + /* make sure that no pending write process */ + case CTRL_SYNC: + res = RES_OK; + break; + + /* get number of sectors on the disk (dword) */ + case GET_SECTOR_COUNT: + if(USBH_OK == usbh_msc_lun_info_get(&usb_host_msc, drv, &info)) { + *(DWORD *)buff = (DWORD)info.capacity.block_nbr; + res = RES_OK; + } + break; + + /* get r/w sector size (word) */ + case GET_SECTOR_SIZE: + if(USBH_OK == usbh_msc_lun_info_get(&usb_host_msc, drv, &info)) { + *(WORD *)buff = (DWORD)info.capacity.block_size; + res = RES_OK; + } + break; + + /* get erase block size in unit of sector (dword) */ + case GET_BLOCK_SIZE: + *(DWORD *)buff = 512U; + break; + + default: + res = RES_PARERR; + break; + } + + return res; +} + +/*! + \brief get fat time + \param[in] none + \param[out] none + \retval time value +*/ +DWORD get_fattime(void) +{ + return ((DWORD)(2019U - 1980U) << 25) /* year 2019 */ + | ((DWORD)1U << 21) /* month 1 */ + | ((DWORD)1U << 16) /* day 1 */ + | ((DWORD)0U << 11) /* hour 0 */ + | ((DWORD)0U << 5) /* min 0 */ + | ((DWORD)0U >> 1); /* sec 0 */ +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c new file mode 100644 index 00000000000..13b0686136a --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c @@ -0,0 +1,396 @@ +/*! + \file usbh_msc_scsi.c + \brief USB MSC SCSI commands implementation + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" + +/*! + \brief send 'Inquiry' command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[in] inquiry: pointer to the inquiry structure + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_scsi_inquiry(usbh_host *uhost, uint8_t lun, scsi_std_inquiry_data *inquiry) +{ + usbh_status error = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the cbw and relevant field*/ + msc->bbb.cbw.field.dCBWDataTransferLength = STANDARD_INQUIRY_DATA_LEN; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_INQUIRY; + msc->bbb.cbw.field.CBWCB[1] = (lun << 5); + msc->bbb.cbw.field.CBWCB[4] = 0x24U; + + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; + error = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + error = usbh_msc_bbb_process(uhost, lun); + + if(USBH_OK == error) { + memset(inquiry, 0U, sizeof(scsi_std_inquiry_data)); + + /* assign inquiry data */ + inquiry->device_type = msc->bbb.pbuf[0] & 0x1FU; + inquiry->peripheral_qualifier = msc->bbb.pbuf[0] >> 5; + + if(0x80U == ((uint32_t)msc->bbb.pbuf[1] & 0x80U)) { + inquiry->removable_media = 1U; + } else { + inquiry->removable_media = 0U; + } + + memcpy(inquiry->vendor_id, &msc->bbb.pbuf[8], 8U); + memcpy(inquiry->product_id, &msc->bbb.pbuf[16], 16U); + memcpy(inquiry->revision_id, &msc->bbb.pbuf[32], 4U); + } + break; + + default: + break; + } + + return error; +} + +/*! + \brief send 'Test unit ready' command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_test_unitready(usbh_host *uhost, uint8_t lun) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the CBW and relevant field */ + msc->bbb.cbw.field.dCBWDataTransferLength = CBW_LENGTH_TEST_UNIT_READY; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_OUT; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_TEST_UNIT_READY; + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + break; + + default: + break; + } + + return status; +} + +/*! + \brief send the read capacity command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[in] capacity: pointer to SCSI capacity + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_read_capacity10(usbh_host *uhost, uint8_t lun, scsi_capacity *capacity) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the CBW and relevant field */ + msc->bbb.cbw.field.dCBWDataTransferLength = READ_CAPACITY10_DATA_LEN; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_READ_CAPACITY10; + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + + if(USBH_OK == status) { + capacity->block_nbr = msc->bbb.pbuf[3] | \ + ((uint32_t)msc->bbb.pbuf[2] << 8) | \ + ((uint32_t)msc->bbb.pbuf[1] << 16) | \ + ((uint32_t)msc->bbb.pbuf[0] << 24); + + capacity->block_size = (uint16_t)(msc->bbb.pbuf[7] | ((uint32_t)msc->bbb.pbuf[6] << 8)); + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief send the mode sense6 command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_mode_sense6(usbh_host *uhost, uint8_t lun) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the CBW and relevant field */ + msc->bbb.cbw.field.dCBWDataTransferLength = XFER_LEN_MODE_SENSE6; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_MODE_SENSE6; + msc->bbb.cbw.field.CBWCB[2] = MODE_SENSE_PAGE_CONTROL_FIELD | MODE_SENSE_PAGE_CODE; + msc->bbb.cbw.field.CBWCB[4] = XFER_LEN_MODE_SENSE6; + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + + if(USBH_OK == status) { + if(msc->bbb.data[2] & MASK_MODE_SENSE_WRITE_PROTECT) { + + } else { + + } + } + break; + + default: + break; + } + + + return status; +} + +/*! + \brief send the Request Sense command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[in] sense_data: pointer to sense data + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_request_sense(usbh_host *uhost, uint8_t lun, msc_scsi_sense *sense_data) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the CBW and relevant field */ + msc->bbb.cbw.field.dCBWDataTransferLength = ALLOCATION_LENGTH_REQUEST_SENSE; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_REQUEST_SENSE; + msc->bbb.cbw.field.CBWCB[1] = (lun << 5); + msc->bbb.cbw.field.CBWCB[4] = ALLOCATION_LENGTH_REQUEST_SENSE; + + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + + if(USBH_OK == status) { + /* get sense data */ + sense_data->SenseKey = msc->bbb.pbuf[2] & 0x0FU; + sense_data->ASC = msc->bbb.pbuf[12]; + sense_data->ASCQ = msc->bbb.pbuf[13]; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief send the write10 command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[in] data_buf: data buffer contains the data to write + \param[in] addr: address to which the data will be written + \param[in] sector_num: number of sector to be written + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_write10(usbh_host *uhost, uint8_t lun, uint8_t *data_buf, uint32_t addr, uint32_t sector_num) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + msc->bbb.cbw.field.dCBWDataTransferLength = sector_num * msc->unit[lun].capacity.block_size; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_OUT; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_WRITE10; + + /* logical block address */ + msc->bbb.cbw.field.CBWCB[2] = (((uint8_t *)&addr)[3]); + msc->bbb.cbw.field.CBWCB[3] = (((uint8_t *)&addr)[2]); + msc->bbb.cbw.field.CBWCB[4] = (((uint8_t *)&addr)[1]); + msc->bbb.cbw.field.CBWCB[5] = (((uint8_t *)&addr)[0]); + + /* transfer length */ + msc->bbb.cbw.field.CBWCB[7] = (((uint8_t *)§or_num)[1]); + msc->bbb.cbw.field.CBWCB[8] = (((uint8_t *)§or_num)[0]); + + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = data_buf; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + break; + + default: + break; + } + + return status; +} + +/*! + \brief send the read10 command to the device + \param[in] uhost: pointer to USB host handler + \param[in] lun: logic unit number + \param[in] data_buf: data buffer contains the data to write + \param[in] addr: address to which the data will be read + \param[in] sector_num: number of sector to be read + \param[out] none + \retval operation status +*/ +usbh_status usbh_msc_read10(usbh_host *uhost, uint8_t lun, uint8_t *data_buf, uint32_t addr, uint32_t sector_num) +{ + usbh_status status = USBH_FAIL; + usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; + + switch(msc->bbb.cmd_state) { + case BBB_CMD_SEND: + /* prepare the CBW and relevant field */ + msc->bbb.cbw.field.dCBWDataTransferLength = sector_num * msc->unit[lun].capacity.block_size; + msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; + msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; + + memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); + + msc->bbb.cbw.field.CBWCB[0] = SCSI_READ10; + + /* logical block address */ + msc->bbb.cbw.field.CBWCB[2] = (((uint8_t *)&addr)[3]); + msc->bbb.cbw.field.CBWCB[3] = (((uint8_t *)&addr)[2]); + msc->bbb.cbw.field.CBWCB[4] = (((uint8_t *)&addr)[1]); + msc->bbb.cbw.field.CBWCB[5] = (((uint8_t *)&addr)[0]); + + /* transfer length */ + msc->bbb.cbw.field.CBWCB[7] = (((uint8_t *)§or_num)[1]); + msc->bbb.cbw.field.CBWCB[8] = (((uint8_t *)§or_num)[0]); + + msc->bbb.state = BBB_SEND_CBW; + msc->bbb.cmd_state = BBB_CMD_WAIT; + msc->bbb.pbuf = data_buf; + + status = USBH_BUSY; + break; + + case BBB_CMD_WAIT: + status = usbh_msc_bbb_process(uhost, lun); + break; + + default: + break; + } + + return status; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h new file mode 100644 index 00000000000..8ec2236b17a --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h @@ -0,0 +1,262 @@ +/*! + \file usbh_core.h + \brief USB host core state machine header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_CORE_H +#define USBH_CORE_H + +#include "usbh_conf.h" +#include "drv_usb_host.h" + +#define MSC_CLASS 0x08U /*!< USB MSC class */ +#define HID_CLASS 0x03U /*!< USB HID class */ +#define MSC_PROTOCOL 0x50U /*!< USB MSC protocol */ +#define CBI_PROTOCOL 0x01U /*!< USB CBI protocol */ + +#define USBH_MAX_ERROR_COUNT 3U /*!< USBH maximum error count */ + +#define USBH_DEV_ADDR_DEFAULT 0U /*!< USBH device address default */ +#define USBH_DEV_ADDR 1U /*!< USBH device address */ + +typedef enum { + USBH_OK = 0U, /*!< USB host OK status */ + USBH_BUSY, /*!< USB host busy status */ + USBH_FAIL, /*!< USB host fail status */ + USBH_NOT_SUPPORTED, /*!< USB host not support status */ + USBH_UNRECOVERED_ERROR, /*!< USB host unrecovered error status */ + USBH_SPEED_UNKNOWN_ERROR, /*!< USB host speed unknown error status */ + USBH_APPLY_DEINIT /*!< USB host apply deinit status */ +} usbh_status; + +/* USB host global operation state */ +typedef enum { + HOST_DEFAULT = 0U, /*!< USB host global operation default state */ + HOST_DETECT_DEV_SPEED, /*!< USB host global operation detect device speed state */ + HOST_DEV_CONNECT, /*!< USB host global operation device connect state */ + HOST_DEV_DETACHED, /*!< USB host global operation device detached state */ + HOST_DEV_ENUM, /*!< USB host global operation device enumeration state */ + HOST_PWR_FEATURE_SET, /*!< USB host global operation setting power feature state */ + HOST_CLASS_CHECK, /*!< USB host global operation class check state */ + HOST_CLASS_ENUM, /*!< USB host global operation class enumeration state */ + HOST_CLASS_HANDLER, /*!< USB host global operation class handler state */ + HOST_USER_INPUT, /*!< USB host global operation user input state */ + HOST_SUSPEND, /*!< USB host global operation suspend state */ + HOST_WAKEUP, /*!< USB host global operation wakeup state */ + HOST_ERROR /*!< USB host global operation error state */ +} usb_host_state; + +/* USB host enumeration state */ +typedef enum { + ENUM_DEFAULT = 0U, /*!< USB host enumeration default state */ + ENUM_GET_DEV_DESC, /*!< USB host enumeration get device descriptor state */ + ENUM_SET_ADDR, /*!< USB host enumeration set address state */ + ENUM_GET_CFG_DESC, /*!< USB host enumeration get configuration descriptor state */ + ENUM_GET_CFG_DESC_SET, /*!< USB host enumeration set configuration descriptor state */ + ENUM_GET_STR_DESC, /*!< USB host enumeration get string descriptor state */ +#ifdef USB_MTP + ENUM_GET_MTP_STR, /*!< USB host enumeration get MTP string state */ +#endif /* USB_MTP */ + ENUM_SET_CONFIGURATION, /*!< USB host enumeration set configuration state */ + ENUM_DEV_CONFIGURED /*!< USB host enumeration device configured state */ +} usbh_enum_state; + +/* USB host control transfer state */ +typedef enum { + CTL_IDLE = 0U, /*!< USB host control transfer idle state */ + CTL_SETUP, /*!< USB host control transfer SETUP state */ + CTL_SETUP_WAIT, /*!< USB host control transfer SETUP wait state */ + CTL_DATA_IN, /*!< USB host control transfer data IN state */ + CTL_DATA_IN_WAIT, /*!< USB host control transfer data IN wait state */ + CTL_DATA_OUT, /*!< USB host control transfer data OUT state */ + CTL_DATA_OUT_WAIT, /*!< USB host control transfer data OUT wait state */ + CTL_STATUS_IN, /*!< USB host control transfer status IN state */ + CTL_STATUS_IN_WAIT, /*!< USB host control transfer status IN wait state */ + CTL_STATUS_OUT, /*!< USB host control transfer status OUT state */ + CTL_STATUS_OUT_WAIT, /*!< USB host control transfer status OUT wait state */ + CTL_ERROR, /*!< USB host control transfer error state */ + CTL_FINISH /*!< USB host control transfer finish state */ +} usbh_ctl_state; + +/* user action state */ +typedef enum { + USR_IN_NO_RESP = 0U, /*!< user action IN no response state */ + USR_IN_RESP_OK = 1U /*!< user action IN response OK state */ +} usbh_user_status; + +/* USB host wakeup mode */ +typedef enum { + NORMAL_WORK = 0U, + GENERAL_WAKEUP = 1U, + REMOTE_WAKEUP = 2 +} usbh_wakeup_mode; + +/* control transfer information */ +typedef struct _usbh_control { + uint8_t pipe_in_num; /*!< the number of IN pipe*/ + uint8_t pipe_out_num; /*!< the number of OUT pipe */ + uint8_t max_len; /*!< maximum length of control transfer */ + uint8_t error_count; /*!< the count of control error */ + + uint8_t *buf; /*!< control transfer buffer */ + uint16_t ctl_len; /*!< the length of control transfer */ + __IO uint32_t timer; /*!< control transfer timer */ + + usb_setup setup; /*!< control transfer SETUP packet */ + usbh_ctl_state ctl_state; /*!< host control transfer state */ +} usbh_control; + +/* USB interface descriptor set */ +typedef struct _usb_desc_itf_set { + usb_desc_itf itf_desc; /*!< USB interface descriptor */ + usb_desc_ep ep_desc[USBH_MAX_EP_NUM]; /*!< USB endpoint descriptor */ +} usb_desc_itf_set; + +/* USB configure descriptor set */ +typedef struct _usb_desc_cfg_set { + usb_desc_config cfg_desc; /*!< USB configuration descriptor */ + usb_desc_itf_set itf_desc_set[USBH_MAX_INTERFACES_NUM][USBH_MAX_ALT_SETTING]; /*!< USB interface descriptor set*/ +} usb_desc_cfg_set; + +/* USB device property */ +typedef struct { + uint8_t data[USBH_DATA_BUF_MAX_LEN]; /*!< if DMA is used, the data array must be located in the first position */ + uint8_t cur_itf; /*!< USB device current interface */ + uint8_t addr; /*!< USB device address */ + + uint32_t speed; /*!< USB device speed */ + + usb_desc_dev dev_desc; /*!< USB device descriptor */ + usb_desc_cfg_set cfg_desc_set; /*!< USB interface descriptor set */ + +#if (1U == USBH_CFG_DESC_KEEP) + uint8_t cfgdesc_rawdata[USBH_CFGSET_MAX_LEN]; /*!< USB configuration descriptor raw data*/ +#endif /* (1U == USBH_CFG_DESC_KEEP) */ +} usb_dev_prop; + +struct _usbh_host; + +/* device class callbacks */ +typedef struct { + uint8_t class_code; /*!< USB class type */ + usbh_status (*class_init)(struct _usbh_host *phost); + void (*class_deinit)(struct _usbh_host *phost); + usbh_status (*class_requests)(struct _usbh_host *phost); + usbh_status (*class_machine)(struct _usbh_host *phost); + usbh_status (*class_sof)(struct _usbh_host *uhost); + void *class_data; /*!< USB class data pointer */ +} usbh_class; + +/* user callbacks */ +typedef struct { + void (*dev_init)(void); + void (*dev_deinit)(void); + void (*dev_attach)(void); + void (*dev_reset)(void); + void (*dev_detach)(void); + void (*dev_over_currented)(void); + void (*dev_speed_detected)(uint32_t dev_speed); + void (*dev_devdesc_assigned)(void *dev_desc); + void (*dev_address_set)(void); + + void (*dev_cfgdesc_assigned)(usb_desc_config *cfg_desc, \ + usb_desc_itf *itf_desc, \ + usb_desc_ep *ep_desc); + + void (*dev_mfc_str)(void *mfc_str); + void (*dev_prod_str)(void *prod_str); + void (*dev_seral_str)(void *serial_str); + void (*dev_enumerated)(void); + usbh_user_status (*dev_user_input)(void); + int (*dev_user_app)(void); + void (*dev_not_supported)(void); + void (*dev_error)(void); +} usbh_user_cb; + +/* host information */ +typedef struct _usbh_host { + usb_host_state cur_state; /*!< host state machine value */ + usb_host_state backup_state; /*!< backup of previous state machine value */ + usbh_enum_state enum_state; /*!< enumeration state machine */ + usbh_control control; /*!< USB host control state machine */ + usb_dev_prop dev_prop; /*!< USB device property */ + + usbh_class *uclass[USBH_MAX_SUPPORTED_CLASS]; /*!< USB host supported class */ + usbh_class *active_class; /*!< USB active class */ + usbh_user_cb *usr_cb; /*!< USB user callback */ + + uint8_t class_num; /*!< USB class number */ + + void *data; /*!< used for... */ + + uint8_t suspend_flag; /*!< host suspend flag */ + uint8_t dev_supp_remote_wkup; /*!< record device remote wakeup function */ + usbh_wakeup_mode wakeup_mode; /*!< record wakeup mode */ +} usbh_host; + +/*! + \brief get USB URB state + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[out] none + \retval URB state +*/ +static inline usb_urb_state usbh_urbstate_get(usb_core_driver *udev, uint8_t pp_num) +{ + return udev->host.pipe[pp_num].urb_state; +} + +/*! + \brief get USB transfer data count + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[out] none + \retval transfer data count +*/ +static inline uint32_t usbh_xfercount_get(usb_core_driver *udev, uint8_t pp_num) +{ + return udev->host.backup_xfercount[pp_num]; +} + +/* function declarations */ +/* USB host stack initializations */ +void usbh_init(usbh_host *uhost, usb_core_driver *udev, usb_core_enum usb_core, usbh_user_cb *user_cb); +/* USB host register device class */ +usbh_status usbh_class_register(usbh_host *uhost, usbh_class *puclass); +/* de-initialize USB host */ +usbh_status usbh_deinit(usbh_host *uhost); +/* USB host core main state machine process */ +void usbh_core_task(usbh_host *uhost); +/* handle the error on USB host side */ +void usbh_error_handler(usbh_host *uhost, usbh_status err_type); + +#endif /* USBH_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h new file mode 100644 index 00000000000..82bffa3d6aa --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h @@ -0,0 +1,70 @@ +/*! + \file usbh_enum.h + \brief USB host mode USB enumeration header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_ENUM_H +#define USBH_ENUM_H + +#include "usbh_core.h" + +/* function declarations */ +/* configure USB control status parameters */ +void usbh_ctlstate_config(usbh_host *uhost, uint8_t *buf, uint16_t len); +/* get device descriptor from the USB device */ +usbh_status usbh_devdesc_get(usbh_host *uhost, uint8_t len); +/* get configuration descriptor from the USB device */ +usbh_status usbh_cfgdesc_get(usbh_host *uhost, uint16_t len); +/* get string descriptor from the USB device */ +usbh_status usbh_strdesc_get(usbh_host *uhost,uint8_t str_index, uint8_t *buf, uint16_t len); +/* set the address to the connected device */ +usbh_status usbh_setaddress(usbh_host *uhost, uint8_t dev_addr); +/* set the configuration value to the connected device */ +usbh_status usbh_setcfg(usbh_host *uhost, uint16_t config); +/* set the interface value to the connected device */ +usbh_status usbh_setinterface(usbh_host *uhost, uint8_t itf_num, uint8_t alter_setting); +/* set or enable a specific device feature */ +usbh_status usbh_setdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex); +/* clear or disable a specific device feature */ +usbh_status usbh_clrdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex); +/* clear or disable a specific feature */ +usbh_status usbh_clrfeature(usbh_host *uhost, uint8_t ep_addr, uint8_t pp_num); +/* get the next descriptor header */ +usb_desc_header *usbh_nextdesc_get(uint8_t *pbuf, uint16_t *ptr); +/* select an interface */ +usbh_status usbh_interface_select(usb_dev_prop *udev, uint8_t interface); +/* find the interface index for a specific class */ +uint8_t usbh_interface_find(usb_dev_prop *udev, uint8_t main_class, uint8_t sub_class, uint8_t protocol); +/* find the interface index for a specific class interface and alternate setting number */ +uint8_t usbh_interfaceindex_find(usb_dev_prop *udev, uint8_t interface_number, uint8_t alt_settings); + +#endif /* USBH_ENUM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h new file mode 100644 index 00000000000..285de18682f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h @@ -0,0 +1,102 @@ +/*! + \file usbh_pipe.h + \brief USB host mode pipe header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_PIPE_H +#define USBH_PIPE_H + +#include "usbh_core.h" + +/* host pipe maximum */ +#define HP_MAX 8U + +/* host pipe status */ +#define HP_OK 0x0000U /*!< host pipe status */ +#define HP_USED 0x8000U /*!< host pipe used status */ +#define HP_ERROR 0xFFFFU /*!< host pipe error status */ +#define HP_USED_MASK 0x7FFFU /*!< host pipe used mask */ + +/*! + \brief set toggle for a pipe + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[in] toggle: toggle (0/1) + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbh_pipe_toggle_set(usb_core_driver *udev, uint8_t pp_num, uint8_t toggle) +{ + if(udev->host.pipe[pp_num].ep.dir) { + udev->host.pipe[pp_num].data_toggle_in = toggle; + } else { + udev->host.pipe[pp_num].data_toggle_out = toggle; + } +} + +/*! + \brief get toggle flag of pipe + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[out] none + \retval toggle flag +*/ +__STATIC_INLINE uint8_t usbh_pipe_toggle_get(usb_core_driver *udev, uint8_t pp_num) +{ + if(udev->host.pipe[pp_num].ep.dir) { + return udev->host.pipe[pp_num].data_toggle_in; + } else { + return udev->host.pipe[pp_num].data_toggle_out; + } +} + +/* function declarations */ +/* create a pipe */ +uint8_t usbh_pipe_create(usb_core_driver *udev, \ + usb_dev_prop *dev, \ + uint8_t pp_num, \ + uint8_t ep_type, \ + uint16_t ep_mpl); +/* modify a pipe */ +uint8_t usbh_pipe_update(usb_core_driver *udev, \ + uint8_t pp_num, \ + uint8_t dev_addr, \ + uint32_t dev_speed, \ + uint16_t ep_mpl); +/* allocate a new pipe */ +uint8_t usbh_pipe_allocate(usb_core_driver *udev, uint8_t ep_addr); +/* free a pipe */ +uint8_t usbh_pipe_free(usb_core_driver *udev, uint8_t pp_num); +/* delete all USB host pipe */ +uint8_t usbh_pipe_delete(usb_core_driver *udev); + +#endif /* USBH_PIPE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h new file mode 100644 index 00000000000..2427a8a5948 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h @@ -0,0 +1,50 @@ +/*! + \file usbh_transc.h + \brief USB host mode transactions header file + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_TRANSC_H +#define USBH_TRANSC_H + +#include "usbh_core.h" + +/* function declarations */ +/* send the SETUP packet to the USB device */ +usbh_status usbh_ctlsetup_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num); +/* send a data packet to the USB device */ +usbh_status usbh_data_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len); +/* receive a data packet from the USB device */ +usbh_status usbh_data_recev(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len); +/* USB control transfer handler */ +usbh_status usbh_ctl_handler(usbh_host *uhost); + +#endif /* USBH_TRANSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c new file mode 100644 index 00000000000..45b3dd2f143 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c @@ -0,0 +1,655 @@ +/*! + \file usbh_core.c + \brief USB host core state machine driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "usbh_pipe.h" +#include "usbh_enum.h" +#include "usbh_core.h" +#include "drv_usbh_int.h" + +/* local function prototypes ('static') */ +static uint8_t usb_ev_sof(usbh_host *uhost); +static uint8_t usb_ev_connect(usbh_host *uhost); +static uint8_t usb_ev_disconnect(usbh_host *uhost); +static usbh_status usbh_enum_task(usbh_host *uhost); +#if USBFS_LOW_POWER || USBHS_LOW_POWER +static void usb_hwp_suspend(usb_core_driver *udev); +static void usb_hwp_resume(usb_core_driver *udev); +#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ + +usbh_ev_cb usbh_int_op = { + usb_ev_connect, + usb_ev_disconnect, + usb_ev_sof +}; + +usbh_ev_cb *usbh_int_fop = &usbh_int_op; + +/*! + \brief USB host stack initializations + \param[in] uhost: pointer to USB host + \param[in] udev: pointer to USB device instance + \param[in] usb_core: USB core type + \param[in] user_cb: pointer to user callback + \param[out] none + \retval none +*/ +void usbh_init(usbh_host *uhost, usb_core_driver *udev, usb_core_enum usb_core, usbh_user_cb *user_cb) +{ + /* link driver to the stack */ + udev->host.data = (void *)uhost; + uhost->data = (void *)udev; + + /* host deinitialization */ + usbh_deinit(uhost); + + uhost->usr_cb = user_cb; + + udev->host.connect_status = 0U; + + for(uint8_t i = 0U; i < USBFS_MAX_TX_FIFOS; i++) { + udev->host.pipe[i].err_count = 0U; + udev->host.pipe[i].pp_status = PIPE_IDLE; + udev->host.backup_xfercount[i] = 0U; + } + + udev->host.pipe[0].ep.mps = 8U; + + usb_basic_init(&udev->bp, &udev->regs, usb_core); + +#ifndef DUAL_ROLE_MODE_ENABLED + usb_globalint_disable(&udev->regs); + + usb_core_init(udev->bp, &udev->regs); + +#ifndef USE_OTG_MODE + usb_curmode_set(&udev->regs, HOST_MODE); +#endif /* USE_OTG_MODE */ + + usb_host_init(udev); + + usb_globalint_enable(&udev->regs); +#endif /* DUAL_ROLE_MODE_ENABLED */ + + /* upon initialize call usr call back */ + uhost->usr_cb->dev_init(); +} + +/*! + \brief USB host register device class + \param[in] uhost: pointer to USB host instance + \param[in] uclass: pointer to USB device class + \param[out] none + \retval operation status +*/ +usbh_status usbh_class_register(usbh_host *uhost, usbh_class *uclass) +{ + usbh_status status = USBH_OK; + + if(NULL != uclass) { + if(uhost->class_num < USBH_MAX_SUPPORTED_CLASS) { + uhost->uclass[uhost->class_num++] = uclass; + } else { + status = USBH_FAIL; + } + } else { + status = USBH_FAIL; + } + + return status; +} + +/*! + \brief deinitialize USB host + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_deinit(usbh_host *uhost) +{ + usb_core_driver *udev = (usb_core_driver *)uhost->data; + + /* software initialize */ + uhost->cur_state = HOST_DEFAULT; + uhost->backup_state = HOST_DEFAULT; + uhost->enum_state = ENUM_DEFAULT; + + uhost->control.ctl_state = CTL_IDLE; + uhost->control.max_len = USB_FS_EP0_MAX_LEN; + + uhost->dev_prop.addr = USBH_DEV_ADDR_DEFAULT; + uhost->dev_prop.speed = PORT_SPEED_FULL; + uhost->dev_prop.cur_itf = 0xFFU; + + usbh_pipe_free(udev, uhost->control.pipe_in_num); + usbh_pipe_free(udev, uhost->control.pipe_out_num); + + return USBH_OK; +} + +/*! + \brief USB host core main state machine process + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +void usbh_core_task(usbh_host *uhost) +{ + volatile usbh_status status = USBH_FAIL; + usb_core_driver *udev = (usb_core_driver *)uhost->data; + + /* check for host port events */ + if(((0U == udev->host.connect_status) || (0U == udev->host.port_enabled)) && (HOST_DEFAULT != uhost->cur_state)) { + if(HOST_DEV_DETACHED != uhost->cur_state) { + uhost->cur_state = HOST_DEV_DETACHED; + } + } + + switch(uhost->cur_state) { + case HOST_DEFAULT: + if(udev->host.connect_status) { + uhost->cur_state = HOST_DETECT_DEV_SPEED; + + usb_mdelay(100U); + + usb_port_reset(udev); + + uhost->usr_cb->dev_reset(); + } + break; + + case HOST_DETECT_DEV_SPEED: + if(udev->host.port_enabled) { + uhost->cur_state = HOST_DEV_CONNECT; + + uhost->dev_prop.speed = usb_curspeed_get(udev); + + uhost->usr_cb->dev_speed_detected(uhost->dev_prop.speed); + + usb_mdelay(50U); + } + break; + + case HOST_DEV_CONNECT: + uhost->usr_cb->dev_attach(); + uhost->control.pipe_out_num = usbh_pipe_allocate(udev, 0x00U); + uhost->control.pipe_in_num = usbh_pipe_allocate(udev, 0x80U); + + /* open IN control pipe */ + usbh_pipe_create(udev, \ + &uhost->dev_prop, \ + uhost->control.pipe_in_num, \ + USB_EPTYPE_CTRL, \ + (uint16_t)uhost->control.max_len); + + /* open OUT control pipe */ + usbh_pipe_create(udev, \ + &uhost->dev_prop, \ + uhost->control.pipe_out_num, \ + USB_EPTYPE_CTRL, \ + (uint16_t)uhost->control.max_len); + + uhost->cur_state = HOST_DEV_ENUM; + break; + + case HOST_DEV_ENUM: + /* check for enumeration status */ + if(USBH_OK == usbh_enum_task(uhost)) { + /* the function shall return USBH_OK when full enumeration is complete */ + + /* user callback for end of device basic enumeration */ + uhost->usr_cb->dev_enumerated(); + +#if USBFS_LOW_POWER || USBHS_LOW_POWER + uhost->cur_state = HOST_SUSPEND; + + /* judge device remote wakeup function */ + if((uhost->dev_prop.cfg_desc_set.cfg_desc.bmAttributes) & (1U << 5)) { + uhost->dev_supp_remote_wkup = 1U; + } else { + uhost->dev_supp_remote_wkup = 0U; + } +#else + uhost->cur_state = HOST_PWR_FEATURE_SET; +#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ + } + break; + + case HOST_PWR_FEATURE_SET: + if((uhost->dev_prop.cfg_desc_set.cfg_desc.bmAttributes) & (1U << 5)) { + if(USBH_OK == usbh_setdevfeature(uhost, FEATURE_SELECTOR_REMOTEWAKEUP, 0U)) { + uhost->cur_state = HOST_CLASS_CHECK; + } + } else { + uhost->cur_state = HOST_CLASS_CHECK; + } + break; + + case HOST_CLASS_CHECK: + if(0U == uhost->class_num) { + uhost->cur_state = HOST_ERROR; + } else { + uhost->active_class = NULL; + + uint8_t itf_class = uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].itf_desc.bInterfaceClass; + + for(uint8_t index = 0U; index < uhost->class_num; index++) { + if((uhost->uclass[index]->class_code == itf_class) || (0xFFU == itf_class)) { + uhost->active_class = uhost->uclass[index]; + } + } + + if(NULL != uhost->active_class) { + uhost->cur_state = HOST_USER_INPUT; + } else { + uhost->cur_state = HOST_ERROR; + } + } + break; + + case HOST_USER_INPUT: + /* the function should return user response true to move to class state */ + if(USR_IN_RESP_OK == uhost->usr_cb->dev_user_input()) { + if((USBH_OK == uhost->active_class->class_init(uhost))) { + uhost->cur_state = HOST_CLASS_ENUM; + } + } + break; + +#if USBFS_LOW_POWER || USBHS_LOW_POWER + case HOST_SUSPEND: + if(uhost->dev_supp_remote_wkup) { + /* send set feature command*/ + if(USBH_OK == usbh_setdevfeature(uhost, FEATURE_SELECTOR_REMOTEWAKEUP, 0U)) { + + usb_hwp_suspend(udev); + + usb_mdelay(20U); + uhost->suspend_flag = 1U; + uhost->usr_cb->dev_user_input(); + + /* MCU enter deep-sleep*/ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); + uhost->cur_state = HOST_WAKEUP; + } + } else { + /* host suspend */ + usb_hwp_suspend(udev); + + usb_mdelay(20U); + uhost->suspend_flag = 1U; + uhost->usr_cb->dev_user_input(); + + /* MCU enter deep-sleep */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); + uhost->cur_state = HOST_WAKEUP; + } + break; + + case HOST_WAKEUP: + /* judge suspend status */ + if(0U == uhost->suspend_flag) { + usb_hwp_resume(udev); + usb_mdelay(500U); + + if(uhost->dev_supp_remote_wkup) { + if(USBH_OK == usbh_clrdevfeature(uhost, FEATURE_SELECTOR_DEV, 0U)) { + /* user callback for initialization */ + uhost->usr_cb->dev_init(); + uhost->cur_state = HOST_CLASS_CHECK; + } + } else { + uhost->cur_state = HOST_CLASS_CHECK; + } + } + break; +#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ + + case HOST_CLASS_ENUM: + /* process class standard control requests state machine */ + status = uhost->active_class->class_requests(uhost); + + if(USBH_OK == status) { + uhost->cur_state = HOST_CLASS_HANDLER; + } else { + usbh_error_handler(uhost, status); + } + break; + + case HOST_CLASS_HANDLER: + /* process class state machine */ + status = uhost->active_class->class_machine(uhost); + + usbh_error_handler(uhost, status); + break; + + case HOST_ERROR: + /* deinitialize host for new enumeration */ + usbh_deinit(uhost); + uhost->usr_cb->dev_deinit(); + uhost->active_class->class_deinit(uhost); + break; + + case HOST_DEV_DETACHED: + /* manage user disconnect operations*/ + uhost->usr_cb->dev_detach(); + + /* re-initialize host for new enumeration */ + usbh_deinit(uhost); + uhost->usr_cb->dev_deinit(); + uhost->active_class->class_deinit(uhost); + usbh_pipe_delete(udev); + uhost->cur_state = HOST_DEFAULT; + break; + + default: + break; + } +} + +/*! + \brief handle the error on USB host side + \param[in] uhost: pointer to USB host + \param[in] err_type: type of error or busy/OK state + \param[out] none + \retval none +*/ +void usbh_error_handler(usbh_host *uhost, usbh_status err_type) +{ + /* error unrecovered or not supported device speed */ + if((USBH_SPEED_UNKNOWN_ERROR == err_type) || (USBH_UNRECOVERED_ERROR == err_type)) { + uhost->usr_cb->dev_error(); + + uhost->cur_state = HOST_ERROR; + } else if(USBH_APPLY_DEINIT == err_type) { + uhost->cur_state = HOST_ERROR; + + /* user callback for initialization */ + uhost->usr_cb->dev_init(); + } else { + /* no operation */ + } +} + +/*! + \brief USB SOF event function from the interrupt + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static uint8_t usb_ev_sof(usbh_host *uhost) +{ + /* update timer variable */ + uhost->control.timer++; + + /* this callback could be used to implement a scheduler process */ + if(NULL != uhost->active_class) { + if(NULL != uhost->active_class->class_sof) { + uhost->active_class->class_sof(uhost); + } + } + + return 0U; +} + +/*! + \brief USB connect event function from the interrupt + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static uint8_t usb_ev_connect(usbh_host *uhost) +{ + usb_core_driver *udev = (usb_core_driver *)uhost->data; + udev->host.connect_status = 1U; + + return 0U; +} + +/*! + \brief USB disconnect event function from the interrupt + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +static uint8_t usb_ev_disconnect(usbh_host *uhost) +{ + usb_core_driver *udev = (usb_core_driver *)uhost->data; + udev->host.connect_status = 0U; + + return 0U; +} + +/*! + \brief handle the USB enumeration task + \param[in] uhost: pointer to host + \param[out] none + \retval none +*/ +static usbh_status usbh_enum_task(usbh_host *uhost) +{ + uint8_t str_buf[512]; + usbh_status status = USBH_BUSY; + usb_core_driver *udev = (usb_core_driver *)uhost->data; + + static uint8_t index_mfc_str = 0U, index_prod_str = 0U, index_serial_str = 0U; + + switch(uhost->enum_state) { + case ENUM_DEFAULT: + /* get device descriptor for only 1st 8 bytes : to get ep0 max packet size */ + if(USBH_OK == usbh_devdesc_get(uhost, 8U)) { + uhost->control.max_len = uhost->dev_prop.dev_desc.bMaxPacketSize0; + + /* modify control channels configuration for maximum packet size */ + usbh_pipe_update(udev, \ + uhost->control.pipe_out_num, \ + 0U, 0U, \ + (uint16_t)uhost->control.max_len); + + usbh_pipe_update(udev, \ + uhost->control.pipe_in_num, \ + 0U, 0U, \ + (uint16_t)uhost->control.max_len); + + uhost->enum_state = ENUM_GET_DEV_DESC; + } + break; + + case ENUM_GET_DEV_DESC: + /* get full device descriptor */ + if(USBH_OK == usbh_devdesc_get(uhost, USB_DEV_DESC_LEN)) { + uhost->usr_cb->dev_devdesc_assigned(&uhost->dev_prop.dev_desc); + + index_mfc_str = uhost->dev_prop.dev_desc.iManufacturer; + index_prod_str = uhost->dev_prop.dev_desc.iProduct; + index_serial_str = uhost->dev_prop.dev_desc.iSerialNumber; + + uhost->enum_state = ENUM_SET_ADDR; + } + break; + + case ENUM_SET_ADDR: + /* set address */ + if(USBH_OK == usbh_setaddress(uhost, USBH_DEV_ADDR)) { + usb_mdelay(2U); + + uhost->dev_prop.addr = USBH_DEV_ADDR; + + /* user callback for device address assigned */ + uhost->usr_cb->dev_address_set(); + + /* modify control channels to update device address */ + usbh_pipe_update(udev, \ + uhost->control.pipe_in_num, \ + uhost->dev_prop.addr, \ + 0U, 0U); + + usbh_pipe_update(udev, \ + uhost->control.pipe_out_num, \ + uhost->dev_prop.addr, \ + 0U, 0U); + + uhost->enum_state = ENUM_GET_CFG_DESC; + } + break; + + case ENUM_GET_CFG_DESC: + /* get standard configuration descriptor */ + if(USBH_OK == usbh_cfgdesc_get(uhost, USB_CFG_DESC_LEN)) { + uhost->enum_state = ENUM_GET_CFG_DESC_SET; + } + break; + + case ENUM_GET_CFG_DESC_SET: + /* get full configure descriptor (config, interface, endpoints) */ + if(USBH_OK == usbh_cfgdesc_get(uhost, uhost->dev_prop.cfg_desc_set.cfg_desc.wTotalLength)) { + /* user callback for configuration descriptors available */ + uhost->usr_cb->dev_cfgdesc_assigned(&uhost->dev_prop.cfg_desc_set.cfg_desc, \ + &uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].itf_desc, \ + &uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].ep_desc[0]); + + uhost->enum_state = ENUM_GET_STR_DESC; + } + break; + + case ENUM_GET_STR_DESC: + if(index_mfc_str) { + if(USBH_OK == usbh_strdesc_get(uhost, \ + uhost->dev_prop.dev_desc.iManufacturer, \ + str_buf, \ + 0xFFU)) { + /* user callback for manufacturing string */ + uhost->usr_cb->dev_mfc_str(str_buf); + + index_mfc_str = 0U; + } + } else { + if(index_prod_str) { + /* check that product string is available */ + if(USBH_OK == usbh_strdesc_get(uhost, \ + uhost->dev_prop.dev_desc.iProduct, \ + str_buf, \ + 0xFFU)) { + uhost->usr_cb->dev_prod_str(str_buf); + + index_prod_str = 0U; + } + } else { + if(index_serial_str) { + if(USBH_OK == usbh_strdesc_get(uhost, \ + uhost->dev_prop.dev_desc.iSerialNumber, \ + str_buf, \ + 0xFFU)) { + uhost->usr_cb->dev_seral_str(str_buf); + uhost->enum_state = ENUM_SET_CONFIGURATION; + index_serial_str = 0U; + } + } else { + uhost->enum_state = ENUM_SET_CONFIGURATION; + } + } + } + break; + + case ENUM_SET_CONFIGURATION: + if(USBH_OK == usbh_setcfg(uhost, (uint16_t)uhost->dev_prop.cfg_desc_set.cfg_desc.bConfigurationValue)) { + uhost->enum_state = ENUM_DEV_CONFIGURED; + } + break; + + case ENUM_DEV_CONFIGURED: + status = USBH_OK; + break; + + default: + break; + } + + return status; +} + +#if USBFS_LOW_POWER || USBHS_LOW_POWER + +/*! + \brief handles the USB resume from suspend mode + \param[in] udev: pointer to selected USB device + \param[out] none + \retval none +*/ +static void usb_hwp_resume(usb_core_driver *udev) +{ + __IO uint32_t hprt = 0U; + + /* switch-on the clocks */ + *udev->regs.PWRCLKCTL &= ~PWRCLKCTL_SUCLK; + + *udev->regs.PWRCLKCTL &= ~PWRCLKCTL_SHCLK; + + hprt = usb_port_read(udev); + + hprt &= ~HPCS_PSP; + hprt |= HPCS_PREM; + + *udev->regs.HPCS = hprt; + + usb_mdelay(20U); + + hprt &= ~HPCS_PREM; + + *udev->regs.HPCS = hprt; +} + +/*! + \brief handles the USB enter to suspend mode + \param[in] udev: pointer to selected USB device + \param[out] none + \retval none +*/ +static void usb_hwp_suspend(usb_core_driver *udev) +{ + __IO uint32_t hprt = 0U; + + hprt = usb_port_read(udev); + + hprt |= HPCS_PSP; + + *udev->regs.HPCS = hprt; + + /* switch-off the clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SUCLK; + + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; +} + +#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c new file mode 100644 index 00000000000..bbeb76ac1cc --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c @@ -0,0 +1,693 @@ +/*! + \file usbh_enum.c + \brief USB host mode enumeration driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" +#include "usbh_transc.h" +#include "usbh_enum.h" + +/* local function prototypes ('static') */ +static void usbh_devdesc_parse(usb_desc_dev *dev_desc, uint8_t *buf, uint16_t len); +static void usbh_cfgdesc_parse(usb_desc_config *cfg_desc, uint8_t *buf); +static void usbh_cfgset_parse(usb_dev_prop *udev, uint8_t *buf); +static void usbh_itfdesc_parse(usb_desc_itf *itf_desc, uint8_t *buf); +static void usbh_epdesc_parse(usb_desc_ep *ep_desc, uint8_t *buf); +static void usbh_strdesc_parse(uint8_t *psrc, uint8_t *pdest, uint16_t len); + +/*! + \brief configure USB control status parameters + \param[in] uhost: pointer to USB host + \param[in] buf: control transfer data buffer pointer + \param[in] len: length of the data buffer + \param[out] none + \retval none +*/ +void usbh_ctlstate_config(usbh_host *uhost, uint8_t *buf, uint16_t len) +{ + /* prepare the transactions */ + uhost->control.buf = buf; + uhost->control.ctl_len = len; + + uhost->control.ctl_state = CTL_SETUP; +} + +/*! + \brief get device descriptor from the USB device + \param[in] uhost: pointer to USB host + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_devdesc_get(usbh_host *uhost, uint8_t len) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_DEV), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config(uhost, uhost->dev_prop.data, (uint16_t)len); + } + + status = usbh_ctl_handler(uhost); + + if(USBH_OK == status) { + /* commands successfully sent and response received */ + usbh_devdesc_parse(&uhost->dev_prop.dev_desc, uhost->dev_prop.data, (uint16_t)len); + } + + return status; +} + +/*! + \brief get configuration descriptor from the USB device + \param[in] uhost: pointer to USB host + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_cfgdesc_get(usbh_host *uhost, uint16_t len) +{ + uint8_t *pdata = NULL; + + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + +#if (USBH_CFG_DESC_KEEP == 1U) + pdata = uhost->dev_prop.cfgdesc_rawdata; +#else + pdata = uhost->dev_prop.data; +#endif /* (USBH_CFG_DESC_KEEP == 1U) */ + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_CONFIG), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config(uhost, pdata, len); + } + + status = usbh_ctl_handler(uhost); + + if(USBH_OK == status) { + if(len <= USB_CFG_DESC_LEN) { + usbh_cfgdesc_parse(&uhost->dev_prop.cfg_desc_set.cfg_desc, pdata); + } else { + usbh_cfgset_parse(&uhost->dev_prop, pdata); + } + } + + return status; +} + +/*! + \brief get string descriptor from the USB device + \param[in] uhost: pointer to USB host + \param[in] str_index: index for the string descriptor + \param[in] buf: buffer pointer to the string descriptor + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_strdesc_get(usbh_host *uhost, \ + uint8_t str_index, \ + uint8_t *buf, \ + uint16_t len) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_STR) | str_index, + .wIndex = 0x0409U, + .wLength = len + }; + + usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); + } + + status = usbh_ctl_handler(uhost); + + if(USBH_OK == status) { + /* commands successfully sent and response received */ + usbh_strdesc_parse(uhost->dev_prop.data, buf, len); + } + + return status; +} + +/*! + \brief set the address to the connected device + \param[in] uhost: pointer to USB host + \param[in] dev_addr: device address to assign + \param[out] none + \retval operation status +*/ +usbh_status usbh_setaddress(usbh_host *uhost, uint8_t dev_addr) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_SET_ADDRESS, + .wValue = (uint16_t)dev_addr, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set the configuration value to the connected device + \param[in] uhost: pointer to USB host + \param[in] config_index: configuration value + \param[out] none + \retval operation status +*/ +usbh_status usbh_setcfg(usbh_host *uhost, uint16_t config_index) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_SET_CONFIGURATION, + .wValue = config_index, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set the interface value to the connected device + \param[in] uhost: pointer to USB host + \param[in] itf_num: interface number + \param[in] set: alternated setting value + \param[out] none + \retval operation status +*/ +usbh_status usbh_setinterface(usbh_host *uhost, uint8_t itf_num, uint8_t set) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_SET_INTERFACE, + .wValue = set, + .wIndex = itf_num, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief set the interface value to the connected device + \param[in] uhost: pointer to USB host + \param[in] feature_selector: feature selector + \param[in] windex: index value + \param[out] none + \retval operation status +*/ +usbh_status usbh_setdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_SET_FEATURE, + .wValue = feature_selector, + .wIndex = windex, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief clear the interface value to the connected device + \param[in] uhost: pointer to USB host + \param[in] feature_selector: feature selector + \param[in] windex: index value + \param[out] none + \retval operation status +*/ +usbh_status usbh_clrdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &uhost->control; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_CLEAR_FEATURE, + .wValue = feature_selector, + .wIndex = windex, + .wLength = 0U + }; + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief clear or disable a specific feature + \param[in] uhost: pointer to USB host + \param[in] ep_addr: endpoint address + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +usbh_status usbh_clrfeature(usbh_host *uhost, uint8_t ep_addr, uint8_t pp_num) +{ + usbh_status status = USBH_BUSY; + usbh_control *usb_ctl = &uhost->control; + usb_core_driver *udev = (usb_core_driver *)uhost->data; + + if(CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_EP | USB_REQTYPE_STRD, + .bRequest = USB_CLEAR_FEATURE, + .wValue = FEATURE_SELECTOR_EP, + .wIndex = ep_addr, + .wLength = 0U + }; + + if(EP_ID(ep_addr) == udev->host.pipe[pp_num].ep.num) { + usbh_pipe_toggle_set(udev, pp_num, 0U); + } else { + return USBH_FAIL; + } + + usbh_ctlstate_config(uhost, NULL, 0U); + } + + status = usbh_ctl_handler(uhost); + + return status; +} + +/*! + \brief get the next descriptor header + \param[in] pbuf: pointer to buffer where the configuration descriptor set is available + \param[in] ptr: data pointer inside the configuration descriptor set + \param[out] none + \retval return descriptor header +*/ +usb_desc_header *usbh_nextdesc_get(uint8_t *pbuf, uint16_t *ptr) +{ + usb_desc_header *pnext; + + *ptr += ((usb_desc_header *)pbuf)->bLength; + + pnext = (usb_desc_header *)((uint8_t *)pbuf + ((usb_desc_header *)pbuf)->bLength); + + return (pnext); +} + +/*! + \brief get the next descriptor header + \param[in] udev: pointer to device property + \param[in] interface: interface number + \param[out] none + \retval operation status +*/ +usbh_status usbh_interface_select(usb_dev_prop *udev, uint8_t interface) +{ + usbh_status status = USBH_OK; + + if(interface < udev->cfg_desc_set.cfg_desc.bNumInterfaces) { + udev->cur_itf = interface; + } else { + status = USBH_FAIL; + } + + return status; +} + +/*! + \brief find the interface index for a specific class + \param[in] udev: pointer to device property + \param[in] main_class: class code + \param[in] sub_class: subclass code + \param[in] protocol: protocol code + \param[out] none + \retval interface index in the configuration structure + \note interface index 0xFF means interface index not found +*/ +uint8_t usbh_interface_find(usb_dev_prop *udev, uint8_t main_class, uint8_t sub_class, uint8_t protocol) +{ + usb_desc_itf *pif; + + uint8_t if_ix = 0U; + + pif = (usb_desc_itf *)0U; + + while(if_ix < udev->cfg_desc_set.cfg_desc.bNumInterfaces) { + pif = &udev->cfg_desc_set.itf_desc_set[if_ix][0].itf_desc; + + if(((pif->bInterfaceClass == main_class) || (0xFFU == main_class)) && \ + ((pif->bInterfaceSubClass == sub_class) || (0xFFU == sub_class)) && \ + ((pif->bInterfaceProtocol == protocol) || (0xFFU == protocol))) { + return if_ix; + } + + if_ix++; + } + + return 0xFFU; +} + +/*! + \brief find the interface index for a specific class interface and alternate setting number + \param[in] udev: pointer to device property + \param[in] interface_number: interface number + \param[in] alt_settings: alternate setting number + \param[out] none + \retval interface index in the configuration structure + \note interface index 0xFF means interface index not found +*/ +uint8_t usbh_interfaceindex_find(usb_dev_prop *udev, uint8_t interface_number, uint8_t alt_settings) +{ + usb_desc_itf *pif; + + uint8_t if_ix = 0U; + + pif = (usb_desc_itf *)0U; + + while(if_ix < USBH_MAX_INTERFACES_NUM) { + pif = &udev->cfg_desc_set.itf_desc_set[if_ix][alt_settings].itf_desc; + + if((pif->bInterfaceNumber == interface_number) && (pif->bAlternateSetting == alt_settings)) { + return if_ix; + } + + if_ix++; + } + + return 0xFFU; +} + +/*! + \brief parse the device descriptor + \param[in] dev_desc: pointer to USB device descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[in] len: length of the descriptor + \param[out] none + \retval none +*/ +static void usbh_devdesc_parse(usb_desc_dev *dev_desc, uint8_t *buf, uint16_t len) +{ + *dev_desc = (usb_desc_dev) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U) + }, + + .bcdUSB = BYTE_SWAP(buf + 2U), + .bDeviceClass = *(uint8_t *)(buf + 4U), + .bDeviceSubClass = *(uint8_t *)(buf + 5U), + .bDeviceProtocol = *(uint8_t *)(buf + 6U), + .bMaxPacketSize0 = *(uint8_t *)(buf + 7U) + }; + + if(len > 8U) { + /* for 1st time after device connection, host may issue only 8 bytes for device descriptor length */ + dev_desc->idVendor = BYTE_SWAP(buf + 8U); + dev_desc->idProduct = BYTE_SWAP(buf + 10U); + dev_desc->bcdDevice = BYTE_SWAP(buf + 12U); + dev_desc->iManufacturer = *(uint8_t *)(buf + 14U); + dev_desc->iProduct = *(uint8_t *)(buf + 15U); + dev_desc->iSerialNumber = *(uint8_t *)(buf + 16U); + dev_desc->bNumberConfigurations = *(uint8_t *)(buf + 17U); + } +} + +/*! + \brief parse the configuration descriptor + \param[in] cfg_desc: pointer to USB configuration descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval none +*/ +static void usbh_cfgdesc_parse(usb_desc_config *cfg_desc, uint8_t *buf) +{ + /* parse configuration descriptor */ + *cfg_desc = (usb_desc_config) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U), + }, + + .wTotalLength = BYTE_SWAP(buf + 2U), + .bNumInterfaces = *(uint8_t *)(buf + 4U), + .bConfigurationValue = *(uint8_t *)(buf + 5U), + .iConfiguration = *(uint8_t *)(buf + 6U), + .bmAttributes = *(uint8_t *)(buf + 7U), + .bMaxPower = *(uint8_t *)(buf + 8U) + }; +} + +/*! + \brief parse the configuration descriptor set + \param[in] udev: pointer to device property + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval none +*/ +static void usbh_cfgset_parse(usb_dev_prop *udev, uint8_t *buf) +{ + usb_desc_ep *ep = NULL; + usb_desc_itf_set *itf = NULL; + usb_desc_itf itf_value; + usb_desc_config *cfg = NULL; + + usb_desc_header *pdesc = (usb_desc_header *)buf; + + uint8_t itf_index = 0U, ep_index = 0U, alt_setting = 0U; + uint8_t pre_itf_index = 0U; + uint16_t ptr = 0U; + + /* parse configuration descriptor */ + usbh_cfgdesc_parse(&udev->cfg_desc_set.cfg_desc, buf); + cfg = &udev->cfg_desc_set.cfg_desc; + ptr = USB_CFG_DESC_LEN; + + if(cfg->bNumInterfaces > USBH_MAX_INTERFACES_NUM) { + return; + } + + while(ptr < cfg->wTotalLength) { + pdesc = usbh_nextdesc_get((uint8_t *)pdesc, &ptr); + + if(USB_DESCTYPE_ITF == pdesc->bDescriptorType) { + itf_index = *(((uint8_t *)pdesc) + 2U); + + if(pre_itf_index != itf_index) { + alt_setting = 0U; + } + + itf = &udev->cfg_desc_set.itf_desc_set[itf_index][alt_setting]; + + alt_setting++; + + if((*((uint8_t *)pdesc + 3U)) < 3U) { + usbh_itfdesc_parse(&itf_value, (uint8_t *)pdesc); + + /* parse endpoint descriptors relative to the current interface */ + if(itf_value.bNumEndpoints > USBH_MAX_EP_NUM) { + return; + } + + usbh_itfdesc_parse(&itf->itf_desc, (uint8_t *)&itf_value); + + /* store the previous interface index */ + pre_itf_index = itf_index; + + if(0U == itf_value.bNumEndpoints) { + continue; + } + + for(ep_index = 0U; ep_index < itf_value.bNumEndpoints;) { + pdesc = usbh_nextdesc_get((void *)pdesc, &ptr); + + if(USB_DESCTYPE_EP == pdesc->bDescriptorType) { + ep = &itf->ep_desc[ep_index]; + + usbh_epdesc_parse(ep, (uint8_t *)pdesc); + + ep_index++; + } + } + } + } + } +} + +/*! + \brief parse the interface descriptor + \param[in] itf_desc: pointer to USB interface descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval none +*/ +static void usbh_itfdesc_parse(usb_desc_itf *itf_desc, uint8_t *buf) +{ + *itf_desc = (usb_desc_itf) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U), + }, + + .bInterfaceNumber = *(uint8_t *)(buf + 2U), + .bAlternateSetting = *(uint8_t *)(buf + 3U), + .bNumEndpoints = *(uint8_t *)(buf + 4U), + .bInterfaceClass = *(uint8_t *)(buf + 5U), + .bInterfaceSubClass = *(uint8_t *)(buf + 6U), + .bInterfaceProtocol = *(uint8_t *)(buf + 7U), + .iInterface = *(uint8_t *)(buf + 8U) + }; +} + +/*! + \brief parse the endpoint descriptor + \param[in] ep_desc: pointer to USB endpoint descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval none +*/ +static void usbh_epdesc_parse(usb_desc_ep *ep_desc, uint8_t *buf) +{ + *ep_desc = (usb_desc_ep) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U) + }, + + .bEndpointAddress = *(uint8_t *)(buf + 2U), + .bmAttributes = *(uint8_t *)(buf + 3U), + .wMaxPacketSize = BYTE_SWAP(buf + 4U), + .bInterval = *(uint8_t *)(buf + 6U) + }; +} + +/*! + \brief parse the string descriptor + \param[in] psrc: source pointer containing the descriptor data + \param[in] pdest: destination address pointer + \param[in] len: length of the descriptor + \param[out] none + \retval none +*/ +static void usbh_strdesc_parse(uint8_t *psrc, uint8_t *pdest, uint16_t len) +{ + uint16_t str_len = 0U, index = 0U; + + /* the Unicode string descriptor is not NULL-terminated. The string length is + * computed by subtracting two from the value of the first byte of the descriptor. + */ + + /* check which is lower size, the size of string or the length of bytes read from the device */ + if(USB_DESCTYPE_STR == psrc[1]) { + /* make sure the descriptor is string type */ + + /* psrc[0] contains size of descriptor, subtract 2 to get the length of string */ + str_len = USB_MIN((uint16_t)psrc[0] - 2U, len); + + psrc += 2U; /* adjust the offset ignoring the string length and descriptor type */ + + for(index = 0U; index < str_len; index += 2U) { + /* copy only the string and ignore the Unicode id, hence add the source */ + *pdest = psrc[index]; + + pdest++; + } + + *pdest = 0U; /* mark end of string */ + } +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c new file mode 100644 index 00000000000..ff5cff63abe --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c @@ -0,0 +1,181 @@ +/*! + \file usbh_pipe.c + \brief USB host mode pipe operation driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" + +/* local function prototypes ('static') */ +static uint16_t usbh_freepipe_get(usb_core_driver *udev); + +/*! + \brief create a pipe + \param[in] udev: pointer to USB core instance + \param[in] dev: USB device + \param[in] pp_num: pipe number + \param[in] ep_type: endpoint type + \param[in] ep_mpl: endpoint max packet length + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_create(usb_core_driver *udev, \ + usb_dev_prop *dev, \ + uint8_t pp_num, \ + uint8_t ep_type, \ + uint16_t ep_mpl) +{ + usb_pipe *pp = &udev->host.pipe[pp_num]; + + pp->dev_addr = dev->addr; + pp->dev_speed = dev->speed; + pp->ep.type = ep_type; + pp->ep.mps = ep_mpl; + + if((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { + pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); + } + + usb_pipe_init(udev, pp_num); + + return HP_OK; +} + +/*! + \brief modify a pipe + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[in] dev_addr: device address + \param[in] dev_speed: device speed + \param[in] ep_mpl: endpoint max packet length + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_update(usb_core_driver *udev, \ + uint8_t pp_num, \ + uint8_t dev_addr, \ + uint32_t dev_speed, \ + uint16_t ep_mpl) +{ + usb_pipe *pp = &udev->host.pipe[pp_num]; + + if((pp->dev_addr != dev_addr) && (dev_addr)) { + pp->dev_addr = dev_addr; + } + + if((pp->dev_speed != dev_speed) && (dev_speed)) { + pp->dev_speed = dev_speed; + + if((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { + pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); + } + } + + if((pp->ep.mps != ep_mpl) && (ep_mpl)) { + pp->ep.mps = ep_mpl; + } + + usb_pipe_init(udev, pp_num); + + return HP_OK; +} + +/*! + \brief allocate a new pipe + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_allocate(usb_core_driver *udev, uint8_t ep_addr) +{ + uint16_t pp_num = usbh_freepipe_get(udev); + + if(HP_ERROR != pp_num) { + udev->host.pipe[pp_num].in_used = 1U; + udev->host.pipe[pp_num].ep.dir = EP_DIR(ep_addr); + udev->host.pipe[pp_num].ep.num = EP_ID(ep_addr); + } + + return (uint8_t)pp_num; +} + +/*! + \brief free a pipe + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_free(usb_core_driver *udev, uint8_t pp_num) +{ + if(pp_num < HP_MAX) { + udev->host.pipe[pp_num].in_used = 0U; + } + + return USBH_OK; +} + +/*! + \brief delete all USB host pipe + \param[in] udev: pointer to USB core instance + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_delete(usb_core_driver *udev) +{ + uint8_t pp_num = 0U; + + for(pp_num = 2U; pp_num < HP_MAX; pp_num++) { + udev->host.pipe[pp_num] = (usb_pipe) {0}; + } + + return USBH_OK; +} + +/*! + \brief get a free pipe number for allocation + \param[in] udev: pointer to USB core instance + \param[out] none + \retval operation status +*/ +static uint16_t usbh_freepipe_get(usb_core_driver *udev) +{ + uint8_t pp_num = 0U; + + for(pp_num = 0U; pp_num < HP_MAX; pp_num++) { + if(0U == udev->host.pipe[pp_num].in_used) { + return (uint16_t)pp_num; + } + } + + return HP_ERROR; +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c new file mode 100644 index 00000000000..2c2da9d9802 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c @@ -0,0 +1,369 @@ +/*! + \file usbh_transc.c + \brief USB host mode transactions driver + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" +#include "usbh_transc.h" + +/* local function prototypes ('static') */ +static usb_urb_state usbh_urb_wait(usbh_host *uhost, uint8_t pp_num, uint32_t wait_time); +static void usbh_setup_transc(usbh_host *uhost); +static void usbh_data_in_transc(usbh_host *uhost); +static void usbh_data_out_transc(usbh_host *uhost); +static void usbh_status_in_transc(usbh_host *uhost); +static void usbh_status_out_transc(usbh_host *uhost); +static uint32_t usbh_request_submit(usb_core_driver *udev, uint8_t pp_num); + +/*! + \brief send the SETUP packet to the USB device + \param[in] udev: pointer to USB core instance + \param[in] buf: data buffer which will be sent to USB device + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +usbh_status usbh_ctlsetup_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num) +{ + usb_pipe *pp = &udev->host.pipe[pp_num]; + + pp->DPID = PIPE_DPID_SETUP; + pp->xfer_buf = buf; + pp->xfer_len = USB_SETUP_PACKET_LEN; + + return (usbh_status)usbh_request_submit(udev, pp_num); +} + +/*! + \brief send a data packet to the USB device + \param[in] udev: pointer to USB core instance + \param[in] buf: data buffer which will be sent to USB device + \param[in] pp_num: pipe number + \param[in] len: length of the data to be sent + \param[out] none + \retval operation status +*/ +usbh_status usbh_data_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len) +{ + usb_pipe *pp = &udev->host.pipe[pp_num]; + + pp->xfer_buf = buf; + pp->xfer_len = len; + + switch(pp->ep.type) { + case USB_EPTYPE_CTRL: + if(0U == len) { + pp->data_toggle_out = 1U; + } + + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + break; + + case USB_EPTYPE_INTR: + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + + pp->data_toggle_out ^= 1U; + break; + + case USB_EPTYPE_BULK: + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + break; + + case USB_EPTYPE_ISOC: + pp->DPID = PIPE_DPID[0]; + break; + + default: + break; + } + + usbh_request_submit(udev, pp_num); + + return USBH_OK; +} + +/*! + \brief receive a data packet from the USB device + \param[in] udev: pointer to USB core instance + \param[in] buf: data buffer which will be received from USB device + \param[in] pp_num: pipe number + \param[in] len: length of the data to be received + \param[out] none + \retval operation status +*/ +usbh_status usbh_data_recev(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len) +{ + usb_pipe *pp = &udev->host.pipe[pp_num]; + + pp->xfer_buf = buf; + pp->xfer_len = len; + + switch(pp->ep.type) { + case USB_EPTYPE_CTRL: + pp->DPID = PIPE_DPID[1]; + break; + + case USB_EPTYPE_INTR: + pp->DPID = PIPE_DPID[pp->data_toggle_in]; + + /* toggle DATA PID */ + pp->data_toggle_in ^= 1U; + break; + + case USB_EPTYPE_BULK: + pp->DPID = PIPE_DPID[pp->data_toggle_in]; + break; + + case USB_EPTYPE_ISOC: + pp->DPID = PIPE_DPID[0]; + break; + + default: + break; + } + + usbh_request_submit(udev, pp_num); + + return USBH_OK; +} + +/*! + \brief USB control transfer handler + \param[in] uhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_ctl_handler(usbh_host *uhost) +{ + usbh_status status = USBH_BUSY; + + switch(uhost->control.ctl_state) { + case CTL_SETUP: + usbh_setup_transc(uhost); + break; + + case CTL_DATA_IN: + usbh_data_in_transc(uhost); + break; + + case CTL_DATA_OUT: + usbh_data_out_transc(uhost); + break; + + case CTL_STATUS_IN: + usbh_status_in_transc(uhost); + break; + + case CTL_STATUS_OUT: + usbh_status_out_transc(uhost); + break; + + case CTL_FINISH: + uhost->control.ctl_state = CTL_IDLE; + + status = USBH_OK; + break; + + case CTL_ERROR: + if(++uhost->control.error_count <= USBH_MAX_ERROR_COUNT) { + /* do the transmission again, starting from SETUP packet */ + uhost->control.ctl_state = CTL_SETUP; + } else { + status = USBH_FAIL; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief wait for USB URB(USB request block) state + \param[in] uhost: pointer to USB host + \param[in] pp_num: pipe number + \param[in] wait_time: wait time + \param[out] none + \retval USB URB state +*/ +static usb_urb_state usbh_urb_wait(usbh_host *uhost, uint8_t pp_num, uint32_t wait_time) +{ + uint32_t timeout = 0U; + usb_urb_state urb_status = URB_IDLE; + timeout = uhost->control.timer; + + while(URB_DONE != (urb_status = usbh_urbstate_get(uhost->data, pp_num))) { + if(URB_NOTREADY == urb_status) { + break; + } else if(URB_STALL == urb_status) { + uhost->control.ctl_state = CTL_SETUP; + break; + } else if(URB_ERROR == urb_status) { + uhost->control.ctl_state = CTL_ERROR; + break; + } else if((wait_time > 0U) && ((uhost->control.timer - timeout) > wait_time)) { + /* timeout for IN transfer */ + uhost->control.ctl_state = CTL_ERROR; + break; + } else { + /* no operation, just wait */ + } + } + + return urb_status; +} + +/*! + \brief USB SETUP transaction + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_setup_transc(usbh_host *uhost) +{ + /* send a SETUP packet */ + usbh_ctlsetup_send(uhost->data, \ + uhost->control.setup.data, \ + uhost->control.pipe_out_num); + + if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_out_num, 0U)) { + uint8_t dir = (uhost->control.setup.req.bmRequestType & USB_TRX_MASK); + + if(uhost->control.setup.req.wLength) { + if(USB_TRX_IN == dir) { + uhost->control.ctl_state = CTL_DATA_IN; + } else { + uhost->control.ctl_state = CTL_DATA_OUT; + } + } else { + if(USB_TRX_IN == dir) { + uhost->control.ctl_state = CTL_STATUS_OUT; + } else { + uhost->control.ctl_state = CTL_STATUS_IN; + } + } + } +} + +/*! + \brief USB data IN transaction + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_data_in_transc(usbh_host *uhost) +{ + usbh_data_recev(uhost->data, \ + uhost->control.buf, \ + uhost->control.pipe_in_num, \ + uhost->control.ctl_len); + + if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_in_num, DATA_STAGE_TIMEOUT)) { + uhost->control.ctl_state = CTL_STATUS_OUT; + } +} + +/*! + \brief USB data OUT transaction + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_data_out_transc(usbh_host *uhost) +{ + usbh_pipe_toggle_set(uhost->data, uhost->control.pipe_out_num, 1U); + + usbh_data_send(uhost->data, \ + uhost->control.buf, \ + uhost->control.pipe_out_num, \ + uhost->control.ctl_len); + + if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_out_num, DATA_STAGE_TIMEOUT)) { + uhost->control.ctl_state = CTL_STATUS_IN; + } +} + +/*! + \brief USB status IN transaction + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_status_in_transc(usbh_host *uhost) +{ + uint8_t pp_num = uhost->control.pipe_in_num; + + usbh_data_recev(uhost->data, NULL, pp_num, 0U); + + if(URB_DONE == usbh_urb_wait(uhost, pp_num, NODATA_STAGE_TIMEOUT)) { + uhost->control.ctl_state = CTL_FINISH; + } +} + +/*! + \brief USB status OUT transaction + \param[in] uhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_status_out_transc(usbh_host *uhost) +{ + uint8_t pp_num = uhost->control.pipe_out_num; + + usbh_data_send(uhost->data, NULL, pp_num, 0U); + + if(URB_DONE == usbh_urb_wait(uhost, pp_num, NODATA_STAGE_TIMEOUT)) { + uhost->control.ctl_state = CTL_FINISH; + } +} + +/*! + \brief prepare a pipe and start a transfer + \param[in] udev: pointer to USB core instance + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +static uint32_t usbh_request_submit(usb_core_driver *udev, uint8_t pp_num) +{ + udev->host.pipe[pp_num].urb_state = URB_IDLE; + udev->host.pipe[pp_num].xfer_count = 0U; + + if(1U == udev->host.pipe[pp_num].do_ping) { + (void)usb_pipe_ping(udev, (uint8_t)pp_num); + return USB_OK; + } + + return (uint32_t)usb_pipe_xfer(udev, pp_num); +} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h new file mode 100644 index 00000000000..0e502e26409 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h @@ -0,0 +1,180 @@ +/*! + \file usb_cdc.h + \brief the header file of communication device class standard + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USB_CDC_H +#define USB_CDC_H + +#include "usb_ch9_std.h" + +/* communications device class code */ +#define USB_CLASS_CDC 0x02U + +/* communications interface class control protocol codes */ +#define USB_CDC_PROTOCOL_NONE 0x00U /*!< CDC none protocol */ +#define USB_CDC_PROTOCOL_AT 0x01U /*!< CDC AT protocol */ +#define USB_CDC_PROTOCOL_VENDOR 0xFFU /*!< CDC vendor protocol */ + +/* data interface class code */ +#define USB_CLASS_DATA 0x0AU + +#define USB_DESCTYPE_CDC_ACM 0x21U /*!< CDC descriptor type */ +#define USB_DESCTYPE_CS_INTERFACE 0x24U /*!< CDC interface descriptor type */ + +#define USB_CDC_ACM_CONFIG_DESC_SIZE 0x43U /*!< CDC configuration descriptor size */ + +/* class-specific notification codes for pstn subclasses */ +#define USB_CDC_NOTIFY_SERIAL_STATE 0x20U + +/* class-specific request codes */ +#define SEND_ENCAPSULATED_COMMAND 0x00U /*!< send encapsulated command request */ +#define GET_ENCAPSULATED_RESPONSE 0x01U /*!< get encapsulated response request */ +#define SET_COMM_FEATURE 0x02U /*!< set command feature request */ +#define GET_COMM_FEATURE 0x03U /*!< get command feature request */ +#define CLEAR_COMM_FEATURE 0x04U /*!< clear command feature request */ + +#define SET_AUX_LINE_STATE 0x10U /*!< set AUX line state code */ +#define SET_HOOK_STATE 0x11U /*!< set hook state code */ +#define PULSE_SETUP 0x12U /*!< pulse setup code */ +#define SEND_PULSE 0x13U /*!< send pulse code */ +#define SET_PULSE_TIME 0x14U /*!< set pulse time code */ +#define RING_AUX_JACK 0x15U /*!< ring AUX jack code */ + +#define SET_LINE_CODING 0x20U /*!< set line coding request */ +#define GET_LINE_CODING 0x21U /*!< get line coding request */ +#define SET_CONTROL_LINE_STATE 0x22U /*!< set control line state request */ +#define SEND_BREAK 0x23U /*!< send break request */ +#define NO_CMD 0xFFU /*!< no command request */ + +#define SET_RINGER_PARMS 0x30U /*!< set ringer parameter */ +#define GET_RINGER_PARMS 0x31U /*!< get ringer parameter */ +#define SET_OPERATION_PARMS 0x32U /*!< set operation parameter */ +#define GET_OPERATION_PARMS 0x33U /*!< get ringer parameter */ +#define SET_LINE_PARMS 0x34U /*!< set line parameter */ +#define GET_LINE_PARMS 0x35U /*!< get ringer parameter */ +#define DIAL_DIGITS 0x36U /*!< dial digits */ +#define SET_UNIT_PARAMETER 0x37U /*!< set unit parameter */ +#define GET_UNIT_PARAMETER 0x38U /*!< get unit parameter */ +#define CLEAR_UNIT_PARAMETER 0x39U /*!< clear unit parameter */ +#define GET_PROFILE 0x3AU /*!< get profile */ + +#define SET_ETHERNET_MULTICAST_FILTERS 0x40U /*!< set ethernet muilcast filters */ +#define SET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x41U /*!< set ethernet power management pattern filter */ +#define GET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x42U /*!< get ethernet power management pattern filter */ +#define SET_ETHERNET_PACKET_FILTER 0x43U /*!< set ethernet power pocket filter */ +#define GET_ETHERNET_STATISTIC 0x44U /*!< get ethernet statistic */ + +#define SET_ATM_DATA_FORMAT 0x50U /*!< set ATM data format */ +#define GET_ATM_DEVICE_STATISTICS 0x51U /*!< get ATM device statistics */ +#define SET_ATM_DEFAULT_VC 0x52U /*!< set ATM default VC */ +#define GET_ATM_VC_STATISTICS 0x53U /*!< get ATM VC statistics */ + +/* wValue for set control line state */ +#define CDC_ACTIVATE_CARRIER_SIGNAL_RTS 0x0002U /*!< CDC activate carrier signal RTS */ +#define CDC_DEACTIVATE_CARRIER_SIGNAL_RTS 0x0000U /*!< CDC deactivate carrier signal RTS */ +#define CDC_ACTIVATE_SIGNAL_DTR 0x0001U /*!< CDC activate signal DTR */ +#define CDC_DEACTIVATE_SIGNAL_DTR 0x0000U /*!< CDC deactivate signal DTR */ + +/* CDC subclass code */ +enum usb_cdc_subclass { + USB_CDC_SUBCLASS_RESERVED = 0U, /*!< reserved */ + USB_CDC_SUBCLASS_DLCM, /*!< direct line control mode */ + USB_CDC_SUBCLASS_ACM, /*!< abstract control mode */ + USB_CDC_SUBCLASS_TCM, /*!< telephone control mode */ + USB_CDC_SUBCLASS_MCM, /*!< multichannel control model */ + USB_CDC_SUBCLASS_CCM, /*!< CAPI control model */ + USB_CDC_SUBCLASS_ENCM, /*!< ethernet networking control model */ + USB_CDC_SUBCLASS_ANCM /*!< ATM networking control model */ +}; + +#pragma pack(1) + +/* cdc acm line coding structure */ +typedef struct { + uint32_t dwDTERate; /*!< data terminal rate */ + uint8_t bCharFormat; /*!< stop bits */ + uint8_t bParityType; /*!< parity */ + uint8_t bDataBits; /*!< data bits */ +} acm_line; + +/* notification structure */ +typedef struct { + uint8_t bmRequestType; /*!< type of request */ + uint8_t bNotification; /*!< communication interface class notifications */ + uint16_t wValue; /*!< value of notification */ + uint16_t wIndex; /*!< index of interface */ + uint16_t wLength; /*!< length of notification data */ +} acm_notification; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: header function descriptor */ + uint16_t bcdCDC; /*!< bcdCDC: low byte of spec release number (CDC1.10) */ +} usb_desc_header_func; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: call management function descriptor */ + uint8_t bmCapabilities; /*!< bmCapabilities: D0 is reset, D1 is ignored */ + uint8_t bDataInterface; /*!< bDataInterface: 1 interface used for call management */ +} usb_desc_call_managment_func; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: abstract control management descriptor */ + uint8_t bmCapabilities; /*!< bmCapabilities: D1 */ +} usb_desc_acm_func; + +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: union function descriptor */ + uint8_t bMasterInterface; /*!< bMasterInterface: communication class interface */ + uint8_t bSlaveInterface0; /*!< bSlaveInterface0: data class interface */ +} usb_desc_union_func; + +#pragma pack() + +typedef struct { + usb_desc_config config; /*!< configure descriptor */ + usb_desc_itf cmd_itf; /*!< CDC cmd interface descriptor */ + usb_desc_header_func cdc_header; /*!< CDC header function descriptor */ + usb_desc_call_managment_func cdc_call_managment; /*!< CDC call management descriptor */ + usb_desc_acm_func cdc_acm; /*!< CDC acm descriptor */ + usb_desc_union_func cdc_union; /*!< CDC union function descriptor */ + usb_desc_ep cdc_cmd_endpoint; /*!< CDC cmd endpoint descriptor */ + usb_desc_itf cdc_data_interface; /*!< CDC data interface descriptor */ + usb_desc_ep cdc_out_endpoint; /*!< CDC OUT endpoint descriptor */ + usb_desc_ep cdc_in_endpoint; /*!< CDC IN endpoint descriptor */ +} usb_cdc_desc_config_set; + +#endif /* USB_CDC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h new file mode 100644 index 00000000000..84b12e0e110 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h @@ -0,0 +1,81 @@ +/*! + \file usb_hid.h + \brief definitions for the USB HID class + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USB_HID_H +#define USB_HID_H + +#include "usb_ch9_std.h" + +#define USB_HID_CLASS 0x03U /*!< HID class code */ + +#define USB_DESCTYPE_HID 0x21U /*!< HID descriptor type */ +#define USB_DESCTYPE_REPORT 0x22U /*!< report descriptor type */ + +/* HID subclass code */ +#define USB_HID_SUBCLASS_BOOT_ITF 0x01U + +/* HID protocol codes */ +#define USB_HID_PROTOCOL_KEYBOARD 0x01U /*!< HID keyboard protocol */ +#define USB_HID_PROTOCOL_MOUSE 0x02U /*!< HID mouse protocol */ + +#define GET_REPORT 0x01U /*!< get report request */ +#define GET_IDLE 0x02U /*!< get idle request */ +#define GET_PROTOCOL 0x03U /*!< get protocol request */ +#define SET_REPORT 0x09U /*!< set report request */ +#define SET_IDLE 0x0AU /*!< set idle request */ +#define SET_PROTOCOL 0x0BU /*!< set protocol request */ + +#pragma pack(1) + +typedef struct { + usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ + + uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ + uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ + uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ + uint8_t bDescriptorType; /*!< type of HID report */ + uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ +} usb_desc_hid; + +#pragma pack() + +typedef struct { + usb_desc_config config; /*!< configure descriptor */ + usb_desc_itf hid_itf; /*!< HID interface descriptor */ + usb_desc_hid hid_vendor; /*!< HID vendor descriptor */ + usb_desc_ep hid_epin; /*!< HID IN endpoint descriptor */ + usb_desc_ep hid_epout; /*!< HID OUT endpoint descriptor */ +}usb_hid_desc_config_set; + +#endif /* USB_HID_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h new file mode 100644 index 00000000000..9b45f64a5d1 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h @@ -0,0 +1,69 @@ +/*! + \file msc_bbb.h + \brief definitions for the USB MSC BBB(bulk/bulk/bulk) protocol + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef MSC_BBB_H +#define MSC_BBB_H + +#include "usb_ch9_std.h" + +#define BBB_CBW_SIGNATURE 0x43425355U /*!< MSC BBB CBW signature */ +#define BBB_CSW_SIGNATURE 0x53425355U /*!< MSC BBB CSW signature */ +#define BBB_CBW_LENGTH 31U /*!< MSC BBB CBW length */ +#define BBB_CSW_LENGTH 13U /*!< MSC BBB CSW length */ + +typedef struct { + uint32_t dCBWSignature; /*!< CBW signature */ + uint32_t dCBWTag; /*!< CBW tag */ + uint32_t dCBWDataTransferLength; /*!< CBW signature */ + uint8_t bmCBWFlags; /*!< CBW flags */ + uint8_t bCBWLUN; /*!< CBW LUN */ + uint8_t bCBWCBLength; /*!< CBW length */ + uint8_t CBWCB[16]; /*!< CBW CB */ +} msc_bbb_cbw; + +typedef struct { + uint32_t dCSWSignature; /*!< CSW signature */ + uint32_t dCSWTag; /*!< CSW tag */ + uint32_t dCSWDataResidue; /*!< CSW data residue */ + uint8_t bCSWStatus; /*!< CSW status */ +} msc_bbb_csw; + +/* CSW command status */ +enum msc_csw_status { + CSW_CMD_PASSED = 0U, /*!< CSW passed command status */ + CSW_CMD_FAILED, /*!< CSW failed command status */ + CSW_PHASE_ERROR /*!< CSW phase error status */ +}; + +#endif /* MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h new file mode 100644 index 00000000000..c3f638410d2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h @@ -0,0 +1,117 @@ +/*! + \file msc_scsi.h + \brief definitions for the USB MSC SCSI commands + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef MSC_SCSI_H +#define MSC_SCSI_H + +#include "usb_ch9_std.h" + +/* SCSI commands */ +#define SCSI_FORMAT_UNIT 0x04U /*!< MSC SCSI format unit */ +#define SCSI_INQUIRY 0x12U /*!< MSC SCSI inquiry */ +#define SCSI_MODE_SELECT6 0x15U /*!< MSC SCSI select6 mode */ +#define SCSI_MODE_SELECT10 0x55U /*!< MSC SCSI select10 mode */ +#define SCSI_MODE_SENSE6 0x1AU /*!< MSC SCSI sense6 mode */ +#define SCSI_READ_TOC_DATA 0x43U /*!< MSC SCSI read TOC data */ +#define SCSI_MODE_SENSE10 0x5AU /*!< MSC SCSI sense10 mode */ +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU /*!< MSC SCSI allow medium removal */ +#define SCSI_READ6 0x08U /*!< MSC SCSI read6 */ +#define SCSI_READ10 0x28U /*!< MSC SCSI read10 */ +#define SCSI_READ12 0xA8U /*!< MSC SCSI read12 */ +#define SCSI_READ16 0x88U /*!< MSC SCSI read16 */ + +#define SCSI_READ_CAPACITY10 0x25U /*!< MSC SCSI read capacity10 */ +#define SCSI_READ_CAPACITY16 0x9EU /*!< MSC SCSI read capacity16 */ + +#define SCSI_REQUEST_SENSE 0x03U /*!< MSC SCSI request sense */ +#define SCSI_START_STOP_UNIT 0x1BU /*!< MSC SCSI start stop unit */ +#define SCSI_TEST_UNIT_READY 0x00U /*!< MSC SCSI test unit ready */ +#define SCSI_WRITE6 0x0AU /*!< MSC SCSI write6 */ +#define SCSI_WRITE10 0x2AU /*!< MSC SCSI write10 */ +#define SCSI_WRITE12 0xAAU /*!< MSC SCSI write12 */ +#define SCSI_WRITE16 0x8AU /*!< MSC SCSI write16 */ + +#define SCSI_VERIFY10 0x2FU /*!< MSC SCSI verify10 */ +#define SCSI_VERIFY12 0xAFU /*!< MSC SCSI verify12 */ +#define SCSI_VERIFY16 0x8FU /*!< MSC SCSI verify16 */ + +#define SCSI_SEND_DIAGNOSTIC 0x1DU /*!< MSC SCSI send diagnostic */ +#define SCSI_READ_FORMAT_CAPACITIES 0x23U /*!< MSC SCSI read format capacities */ + +#define INVALID_CDB 0x20U /*!< invalid CDB */ +#define INVALID_FIELD_IN_COMMAND 0x24U /*!< invalid field in command */ +#define PARAMETER_LIST_LENGTH_ERROR 0x1AU /*!< parameter list length error */ +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U /*!< invalid field in parameter list */ +#define ADDRESS_OUT_OF_RANGE 0x21U /*!< address out of range */ +#define MEDIUM_NOT_PRESENT 0x3AU /*!< medium not present */ +#define MEDIUM_HAVE_CHANGED 0x28U /*!< medium have changed */ +#define WRITE_PROTECTED 0x27U /*!< write protected */ +#define UNRECOVERED_READ_ERROR 0x11U /*!< unrecovered read error */ +#define WRITE_FAULT 0x03U /*!< write fault */ + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU /*!< read format capacity data length */ +#define READ_CAPACITY10_DATA_LEN 0x08U /*!< read capacity10 data length */ +#define MODE_SENSE10_DATA_LEN 0x08U /*!< sense10 mode data length */ +#define MODE_SENSE6_DATA_LEN 0x04U /*!< sense6 mode data length */ +#define READ_TOC_CMD_LEN 0x14U /*!< read TOC command length */ +#define REQUEST_SENSE_DATA_LEN 0x12U /*!< request sense data length */ +#define STANDARD_INQUIRY_DATA_LEN 0x24U /*!< standard inquiry data length */ +#define BLKVFY 0x04U /*!< block verify */ + +enum sense_state { + NO_SENSE = 0U, /*!< MSC SCSI Sense NO_SENSE state */ + RECOVERED_ERROR, /*!< MSC SCSI Sense RECOVERED_ERROR */ + NOT_READY, /*!< MSC SCSI Sense NOT READY state*/ + MEDIUM_ERROR, /*!< MSC SCSI Sense MEDIUM ERROR state*/ + HARDWARE_ERROR, /*!< MSC SCSI Sense HARDWARE ERROR state*/ + ILLEGAL_REQUEST, /*!< MSC SCSI Sense ILLEGAL REQUEST state*/ + UNIT_ATTENTION, /*!< MSC SCSI Sense UNIT ATTENTION state*/ + DATA_PROTECT, /*!< MSC SCSI Sense DATA PROTECT state*/ + BLANK_CHECK, /*!< MSC SCSI Sense BLANK CHECK state*/ + VENDOR_SPECIFIC, /*!< MSC SCSI Sense VENDOR SPECIFIC state*/ + COPY_ABORTED, /*!< MSC SCSI Sense COPY ABORTED state*/ + ABORTED_COMMAND, /*!< MSC SCSI Sense ABORTED COMMAND state*/ + RESERVED, /*!< MSC SCSI Sense RESERVED state*/ + VOLUME_OVERFLOW, /*!< MSC SCSI Sense VOLUME OVERFLOW state*/ + MISCOMPARE /*!< MSC SCSI Sense MISCOMPARE state*/ +}; + +typedef struct { + uint8_t SenseKey; /*!< MSC SCSI SenseKey */ + uint32_t Information; /*!< MSC SCSI sense Information */ + uint8_t ASC; /*!< MSC SCSI sense ASC */ + uint8_t ASCQ; /*!< MSC SCSI sense ASCQ */ +} msc_scsi_sense; + +#endif /* MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h new file mode 100644 index 00000000000..36c04bbec8f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h @@ -0,0 +1,68 @@ +/*! + \file usb_msc.h + \brief definitions for the USB MSC class + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USB_MSC_H +#define USB_MSC_H + +#include "usb_ch9_std.h" + +/* mass storage device class code */ +#define USB_CLASS_MSC 0x08U + +/* mass storage subclass code */ +#define USB_MSC_SUBCLASS_RBC 0x01U /*!< MSC RBC subclass */ +#define USB_MSC_SUBCLASS_ATAPI 0x02U /*!< MSC ATAPI subclass */ +#define USB_MSC_SUBCLASS_UFI 0x04U /*!< MSC UFI subclass */ +#define USB_MSC_SUBCLASS_SCSI 0x06U /*!< MSC SCSI subclass */ +#define USB_MSC_SUBCLASS_LOCKABLE 0x07U /*!< MSC LOCKABLE subclass */ +#define USB_MSC_SUBCLASS_IEEE1667 0x08U /*!< MSC IEEE1667 subclass */ + +/* mass storage interface class control protocol codes */ +#define USB_MSC_PROTOCOL_CBI 0x00U /*!< MSC CBI protocol */ +#define USB_MSC_PROTOCOL_CBI_ALT 0x01U /*!< MSC CBI ALT protocol */ +#define USB_MSC_PROTOCOL_BBB 0x50U /*!< MSC BBB protocol */ + +/* mass storage request codes */ +#define USB_MSC_REQ_CODES_ADSC 0x00U /*!< MSC ADSC request */ +#define USB_MSC_REQ_CODES_GET 0xFCU /*!< MSC GET request */ +#define USB_MSC_REQ_CODES_PUT 0xFDU /*!< MSC PUT request */ +#define USB_MSC_REQ_CODES_GML 0xFEU /*!< MSC GML request */ +#define USB_MSC_REQ_CODES_BOMSR 0xFFU /*!< MSC BOMSR request */ + +#define BBB_GET_MAX_LUN 0xFEU /*!< MSC BBB get maximum LUN */ +#define BBB_RESET 0xFFU /*!< MSC BBB reset */ + +#define SCSI_CMD_LENGTH 16U /*!< MSC SCSI command length */ + +#endif /* USB_MSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h new file mode 100644 index 00000000000..766cc8e5ad2 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h @@ -0,0 +1,248 @@ +/*! + \file usb_ch9_std.h + \brief USB 2.0 standard defines + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USB_CH9_STD_H +#define USB_CH9_STD_H + +#include "usb_conf.h" + +#define USB_DEV_QUALIFIER_DESC_LEN 0x0AU /*!< USB device qualifier descriptor length */ +#define USB_DEV_DESC_LEN 0x12U /*!< USB device descriptor length */ +#define USB_CFG_DESC_LEN 0x09U /*!< USB configuration descriptor length */ +#define USB_ITF_DESC_LEN 0x09U /*!< USB interface descriptor length */ +#define USB_EP_DESC_LEN 0x07U /*!< USB endpoint descriptor length */ +#define USB_IAD_DESC_LEN 0x08U /*!< USB IAD descriptor length */ +#define USB_OTG_DESC_LEN 0x03U /*!< USB device OTG descriptor length */ + +#define USB_SETUP_PACKET_LEN 0x08U /*!< USB SETUP packet length */ + +/* bit 7 of bmRequestType: data phase transfer direction */ +#define USB_TRX_MASK 0x80U /*!< USB transfer direction mask */ +#define USB_TRX_OUT 0x00U /*!< USB transfer OUT direction */ +#define USB_TRX_IN 0x80U /*!< USB transfer IN direction */ + +/* bit 6..5 of bmRequestType: request type */ +#define USB_REQTYPE_STRD 0x00U /*!< USB standard request */ +#define USB_REQTYPE_CLASS 0x20U /*!< USB class request */ +#define USB_REQTYPE_VENDOR 0x40U /*!< USB vendor request */ +#define USB_REQTYPE_MASK 0x60U /*!< USB request mask */ + +#define USBD_BUS_POWERED 0x00U /*!< USB bus power supply */ +#define USBD_SELF_POWERED 0x01U /*!< USB self power supply */ + +#define USB_STATUS_REMOTE_WAKEUP 2U /*!< USB is in remote wakeup status */ +#define USB_STATUS_SELF_POWERED 1U /*!< USB is in self powered status */ + +/* bit 4..0 of bmRequestType: recipient type */ +enum _usb_recp_type { + USB_RECPTYPE_DEV = 0x0U, /*!< USB device request type */ + USB_RECPTYPE_ITF = 0x1U, /*!< USB interface request type */ + USB_RECPTYPE_EP = 0x2U, /*!< USB endpoint request type */ + USB_RECPTYPE_MASK = 0x3U /*!< USB request type mask */ +}; + +/* bRequest value */ +enum _usb_request { + USB_GET_STATUS = 0x0U, /*!< USB get status request */ + USB_CLEAR_FEATURE = 0x1U, /*!< USB clear feature request */ + USB_RESERVED2 = 0x2U, + USB_SET_FEATURE = 0x3U, /*!< USB set feature request */ + USB_RESERVED4 = 0x4U, + USB_SET_ADDRESS = 0x5U, /*!< USB set address request */ + USB_GET_DESCRIPTOR = 0x6U, /*!< USB get descriptor request */ + USB_SET_DESCRIPTOR = 0x7U, /*!< USB set descriptor request */ + USB_GET_CONFIGURATION = 0x8U, /*!< USB get configuration request */ + USB_SET_CONFIGURATION = 0x9U, /*!< USB set configuration request */ + USB_GET_INTERFACE = 0xAU, /*!< USB get interface request */ + USB_SET_INTERFACE = 0xBU, /*!< USB set interface request */ + USB_SYNCH_FRAME = 0xCU /*!< USB synchronize frame request */ +}; + +/* descriptor types of USB specifications */ +enum _usb_desctype { + USB_DESCTYPE_DEV = 0x1U, /*!< USB device descriptor type */ + USB_DESCTYPE_CONFIG = 0x2U, /*!< USB configuration descriptor type */ + USB_DESCTYPE_STR = 0x3U, /*!< USB string descriptor type */ + USB_DESCTYPE_ITF = 0x4U, /*!< USB interface descriptor type */ + USB_DESCTYPE_EP = 0x5U, /*!< USB endpoint descriptor type */ + USB_DESCTYPE_DEV_QUALIFIER = 0x6U, /*!< USB device qualifier descriptor type */ + USB_DESCTYPE_OTHER_SPD_CONFIG = 0x7U, /*!< USB other speed configuration descriptor type */ + USB_DESCTYPE_ITF_POWER = 0x8U, /*!< USB interface power descriptor type */ + USB_DESCTYPE_IAD = 0xBU, /*!< USB interface association descriptor type */ + USB_DESCTYPE_BOS = 0xFU /*!< USB BOS descriptor type */ +}; + +/* USB Endpoint Descriptor bmAttributes bit definitions */ +/* bits 1..0 : transfer type */ +enum _usbx_type { + USB_EP_ATTR_CTL = 0x0U, /*!< USB control transfer type */ + USB_EP_ATTR_ISO = 0x1U, /*!< USB Isochronous transfer type */ + USB_EP_ATTR_BULK = 0x2U, /*!< USB Bulk transfer type */ + USB_EP_ATTR_INT = 0x3U /*!< USB Interrupt transfer type */ +}; + +/* bits 3..2 : Sync type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_NOSYNC 0x00U /*!< No Synchronization */ +#define USB_EP_ATTR_ASYNC 0x04U /*!< Asynchronous */ +#define USB_EP_ATTR_ADAPTIVE 0x08U /*!< Adaptive */ +#define USB_EP_ATTR_SYNC 0x0CU /*!< Synchronous */ +#define USB_EP_ATTR_SYNCTYPE 0x0CU /*!< Synchronous type */ + +/* bits 5..4 : usage type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_DATA 0x00U /*!< Data endpoint */ +#define USB_EP_ATTR_FEEDBACK 0x10U /*!< Feedback endpoint */ +#define USB_EP_ATTR_IMPLICIT_FEEDBACK_DATA 0x20U /*!< Implicit feedback Data endpoint */ +#define USB_EP_ATTR_USAGETYPE 0x30U /*!< Usage type */ + +/* endpoint max packet size bits12..11 */ +#define USB_EP_MPS_ADD_0 (0x00 << 11) /*!< None(1 transaction per microframe */ +#define USB_EP_MPS_ADD_1 (0x01 << 11) /*!< 1 additional(2 transaction per microframe */ +#define USB_EP_MPS_ADD_2 (0x02 << 11) /*!< 2 additional(3 transaction per microframe */ + +#define FEATURE_SELECTOR_EP 0x00U /*!< USB endpoint feature selector */ +#define FEATURE_SELECTOR_DEV 0x01U /*!< USB device feature selector */ +#define FEATURE_SELECTOR_REMOTEWAKEUP 0x01U /*!< USB feature selector remote wakeup */ + +#define BYTE_SWAP(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (uint16_t)(((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8)) + +#define BYTE_LOW(x) ((uint8_t)((x) & 0x00FFU)) +#define BYTE_HIGH(x) ((uint8_t)(((x) & 0xFF00U) >> 8)) + +#define USB_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#define USB_DEFAULT_CONFIG 0U + +/* USB classes */ +#define USB_CLASS_HID 0x03U /*!< USB HID class */ +#define USB_CLASS_MSC 0x08U /*!< USB MSC class */ + +/* use the following values when USB host need to get descriptor */ +#define USBH_DESC(x) (((x)<< 8) & 0xFF00U) + +/* as per USB specs 9.2.6.4 :standard request with data request timeout: 5sec + standard request with no data stage timeout : 50ms */ +#define DATA_STAGE_TIMEOUT 5000U /*!< USB data stage timeout*/ +#define NODATA_STAGE_TIMEOUT 50U /*!< USB no data stage timeout*/ + +#pragma pack(1) + +/* USB standard device request structure */ +typedef struct _usb_req { + uint8_t bmRequestType; /*!< type of request */ + uint8_t bRequest; /*!< request of SETUP packet */ + uint16_t wValue; /*!< value of SETUP packet */ + uint16_t wIndex; /*!< index of SETUP packet */ + uint16_t wLength; /*!< length of SETUP packet */ +} usb_req; + +/* USB SETUP packet define */ +typedef union _usb_setup { + uint8_t data[8]; /*!< the data of USB SETUP packet */ + + usb_req req; /*!< USB standard device request */ +} usb_setup; + +/* USB descriptor defines */ + +typedef struct _usb_desc_header { + uint8_t bLength; /*!< size of the descriptor */ + uint8_t bDescriptorType; /*!< type of the descriptor */ +} usb_desc_header; + +typedef struct _usb_desc_dev { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint16_t bcdUSB; /*!< BCD of the supported USB specification */ + uint8_t bDeviceClass; /*!< USB device class */ + uint8_t bDeviceSubClass; /*!< USB device subclass */ + uint8_t bDeviceProtocol; /*!< USB device protocol */ + uint8_t bMaxPacketSize0; /*!< size of the control (address 0) endpoint's bank in bytes */ + uint16_t idVendor; /*!< vendor ID for the USB product */ + uint16_t idProduct; /*!< unique product ID for the USB product */ + uint16_t bcdDevice; /*!< product release (version) number */ + uint8_t iManufacturer; /*!< string index for the manufacturer's name */ + uint8_t iProduct; /*!< string index for the product name/details */ + uint8_t iSerialNumber; /*!< string index for the product's globally unique hexadecimal serial number */ + uint8_t bNumberConfigurations; /*!< total number of configurations supported by the device */ +} usb_desc_dev; + +typedef struct _usb_desc_config { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint16_t wTotalLength; /*!< size of the configuration descriptor header,and all sub descriptors inside the configuration */ + uint8_t bNumInterfaces; /*!< total number of interfaces in the configuration */ + uint8_t bConfigurationValue; /*!< configuration index of the current configuration */ + uint8_t iConfiguration; /*!< index of a string descriptor describing the configuration */ + uint8_t bmAttributes; /*!< configuration attributes */ + uint8_t bMaxPower; /*!< maximum power consumption of the device while in the current configuration */ +} usb_desc_config; + +typedef struct _usb_desc_itf { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bInterfaceNumber; /*!< index of the interface in the current configuration */ + uint8_t bAlternateSetting; /*!< alternate setting for the interface number */ + uint8_t bNumEndpoints; /*!< total number of endpoints in the interface */ + uint8_t bInterfaceClass; /*!< interface class ID */ + uint8_t bInterfaceSubClass; /*!< interface subclass ID */ + uint8_t bInterfaceProtocol; /*!< interface protocol ID */ + uint8_t iInterface; /*!< index of the string descriptor describing the interface */ +} usb_desc_itf; + +typedef struct _usb_desc_ep { + usb_desc_header header; /*!< descriptor header, including type and size. */ + + uint8_t bEndpointAddress; /*!< logical address of the endpoint */ + uint8_t bmAttributes; /*!< endpoint attributes */ + uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ + uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ +} usb_desc_ep; + +typedef struct _usb_desc_LANGID { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint16_t wLANGID; /*!< LANGID code */ +} usb_desc_LANGID; + +typedef struct _usb_desc_str { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint16_t unicode_string[128]; /*!< unicode string data */ +} usb_desc_str; + +#pragma pack() + +/* compute string descriptor length */ +#define USB_STRING_LEN(unicode_chars) (sizeof(usb_desc_header) + ((unicode_chars) << 1)) + +#endif /* USB_CH9_STD_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript new file mode 100644 index 00000000000..cc3f1a11d27 --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript @@ -0,0 +1,65 @@ +import rtconfig +from building import * + +# get current directory +cwd = GetCurrentDir() + +# The set of source files associated with this SConscript file. + +src = Split(''' +CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c +GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c +''') + +if GetDepend(['RT_USING_SERIAL']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c'] + +if GetDepend(['BSP_USING_ETH']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c'] + +if GetDepend(['RT_USING_ADC']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c'] + +if GetDepend(['RT_USING_DAC']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c'] + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c'] + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c'] + +if GetDepend(['RT_USING_SDIO']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c'] + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c'] + +if GetDepend(['BSP_USING_SDRAM']): + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c'] + src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c'] + +path = [ + cwd + '/CMSIS/GD/GD32F5xx/Include', + cwd + '/CMSIS', + cwd + '/GD32F5xx_standard_peripheral/Include',] + +CPPDEFINES = ['USE_STDPERIPH_DRIVER'] + +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt new file mode 100644 index 00000000000..26b8487772f --- /dev/null +++ b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt @@ -0,0 +1,1390 @@ +/*! + \file change log.txt + \brief change log for GD32F5xx firmware + + \version 2024-07-31, V1.1.0, firmware for GD32F5xx +*/ + +/* + Copyright (c) 2024, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +******************* V1.1.0 2024-06-07 ****************************************************************************************** +______________________Common______________________________________________________________________________________________ +Fix file: +gd32F5xx_it.c +fix reason: +The single bit ECC error and FPU interrupts are enabled by default, so an interrupt service function needs to be added. +V1.0.0: +none +V1.1.0: +#define SINGLE_ECC_ERROR_HANDLE(s) do{}while(1) +/*! + \brief this function handles SRAM and Flash single bit ECC non-correction exception + \param[in] none + \param[out] none + \retval none +*/ +void SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler(void) +{ + if((SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE0)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE1)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE2)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE3)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE4)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE5)) || + (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE6))) { + MULTI_ECC_ERROR_HANDLE("SRAM or FLASH single bit ECC error\r\n"); + } +} + +/*! + \brief this function handles FPU exception + \param[in] none + \param[out] none + \retval none +*/ +void FPU_IRQHandler(void) +{ + /* if FPU exception occurs, go to infinite loop */ + while(1) { + } +} + +Fix file: +gd32F5xx_it.h +fix reason: +Add the declaration of the SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler and FPU_IRQHandler function. +V1.0.0: +none +V1.1.0: +/* this function handles SRAM and Flash single bit ECC non-correction exception */ +void SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler(void); +/* this function handles FPU exception */ +void FPU_IRQHandler(void); + +Fix file: +All functions in the file that involve the use of a serial port. +fix reason: +Modify the serial port redirection function to adapt to the Embedded Builder IDE. +V1.0.0: +/* retarget the C library printf function to the USART */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} +V1.1.0: +#ifdef GD_ECLIPSE_GCC +/* retarget the C library printf function to the USART, in Eclipse GCC environment */ +int __io_putchar(int ch) +{ + usart_data_transmit(EVAL_COM0, (uint8_t) ch ); + while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} +#else +/* retarget the C library printf function to the USART */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} +#endif /* GD_ECLIPSE_GCC */ + +Fix file: +../Firmware/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h +fix reason: +Add a firmware library version acquisition function to the firmware library. +V1.0.0: +/* GD32F5xx firmware library version number V1.0 */ +#define __GD32F5XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __GD32F5XX_STDPERIPH_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ +#define __GD32F5XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __GD32F5XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __GD32F5XX_STDPERIPH_VERSION ((__GD32F5XX_STDPERIPH_VERSION_MAIN << 24)\ + |(__GD32F5XX_STDPERIPH_VERSION_SUB1 << 16)\ + |(__GD32F5XX_STDPERIPH_VERSION_SUB2 << 8)\ + |(__GD32F5XX_STDPERIPH_VERSION_RC)) +V1.1.0: +/* GD32F5xx firmware library version number V1.0 */ +#define __GD32F5xx_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __GD32F5xx_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ +#define __GD32F5xx_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __GD32F5xx_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __GD32F5xx_STDPERIPH_VERSION ((__GD32F5xx_STDPERIPH_VERSION_MAIN << 24)\ + |(__GD32F5xx_STDPERIPH_VERSION_SUB1 << 16)\ + |(__GD32F5xx_STDPERIPH_VERSION_SUB2 << 8)\ + |(__GD32F5xx_STDPERIPH_VERSION_RC)) + +Fix file: +../Firmware/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h +fix reason: +Add a firmware library version acquisition function to the firmware library. +V1.0.0: +none +V1.1.0: +/* firmware version can be aquired by uncommenting the macro */ +#define __FIRMWARE_VERSION_DEFINE +#ifdef __FIRMWARE_VERSION_DEFINE +/* get firmware version */ +extern uint32_t gd32f5xx_firmware_version_get(void); +#endif /* __FIRMWARE_VERSION_DEFINE */ + +Fix file: +../Firmware/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c +fix reason: +Add a firmware library version acquisition function to the firmware library. +V1.0.0: +none +V1.1.0: +#ifdef __FIRMWARE_VERSION_DEFINE +/*! + \brief get firmware version + \param[in] none + \param[out] none + \retval firmware version +*/ +uint32_t gd32f5xx_firmware_version_get(void) +{ + return __GD32F5XX_STDPERIPH_VERSION; +} +#endif /* __FIRMWARE_VERSION_DEFINE */ + +Fix file: +../Template/main.c +fix reason: +Display the firmware library version through USART in main function. +V1.0.0: +none +V1.1.0: +#ifdef __FIRMWARE_VERSION_DEFINE + uint32_t fw_ver = 0; +#endif + +#ifdef __FIRMWARE_VERSION_DEFINE + fw_ver = gd32f5xx_firmware_version_get(); + /* print firmware version */ + printf("\r\nGD32F5xx series firmware version: V%d.%d.%d", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8)); +#endif /* __FIRMWARE_VERSION_DEFINE */ +__________________________________________________________________________________________________________________________ + +______________________ENET________________________________________________________________________________________________ +Fix file: +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c +fix reason: +Default to disabling carrier sensing to prevent half-duplex issues. +V1.0.0: + | ENET_CARRIERSENSE_ENABLE | ENET_RECEIVEOWN_ENABLE \ +V1.1.0: + | ENET_CARRIERSENSE_DISABLE | ENET_RECEIVEOWN_ENABLE \ +__________________________________________________________________________________________________________________________ + +______________________TIMER_______________________________________________________________________________________________ +Fix file: +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c +fix reason: +Fixed the bug of interfaces timer_flag_clear/timer_interrupt_flag_clear. +void timer_flag_clear(uint32_t timer_periph, uint32_t flag) +{ + TIMER_INTF(timer_periph) &= (~(uint32_t)flag); +} + +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_INTF(timer_periph) &= (~(uint32_t)interrupt); +} + +V1.1.0: +void timer_flag_clear(uint32_t timer_periph, uint32_t flag) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)flag); +} + +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); +} +_________________________________________________________________________________________________________________________ + +______________________MISC_______________________________________________________________________________________________ +Fix file: +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c +fix reason: New function nvic_system_reset added. +V1.0.0: +none +V1.1.0: +/*! + \brief initiates a system reset request to reset the MCU + \param[in] none + \param[out] none + \retval none +*/ +void nvic_system_reset(void) +{ + NVIC_SystemReset(); +} + +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.h +fix reason: New function nvic_system_reset declaration added. +V1.0.0: +none +V1.1.0: +/* initiates a system reset request to reset the MCU */ +void nvic_system_reset(void); +_________________________________________________________________________________________________________________________ + +______________________CAU_______________________________________________________________________________________________ +Fix file: +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c +fix reason: Fixed the bug of interface cau_flag_get. +V1.0.0: +#define FLAG_MASK ((uint32_t)0x00000020U) + +FlagStatus cau_flag_get(uint32_t flag) +{ + uint32_t reg = 0U; + FlagStatus ret_flag = RESET; + + /* check if the flag is in CAU_STAT1 register */ + if(RESET != (flag & FLAG_MASK)) { + reg = CAU_STAT1; + } else { + /* the flag is in CAU_STAT0 register */ + reg = CAU_STAT0; + } + + /* check the status of the specified CAU flag */ + if(RESET != (reg & flag)) { + ret_flag = SET; + } + + return ret_flag; +} +V1.1.0: +FlagStatus cau_flag_get(uint32_t flag) +{ + uint32_t reg = 0U; + FlagStatus ret_flag = RESET; + + /* check if the flag is in CAU_STAT1 register */ + if(1U == (flag >> 31U)) { + reg = CAU_STAT1; + } else { + /* the flag is in CAU_STAT0 register */ + reg = CAU_STAT0; + } + + /* check the status of the specified CAU flag */ + if(0U != (reg & flag)) { + ret_flag = SET; + } + + return ret_flag; +} + +../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.h +fix reason: New function nvic_system_reset declaration added. +V1.0.0: +#define CAU_FLAG_INFIFO CAU_STAT1_ISTA /*!< IN FIFO flag status */ +#define CAU_FLAG_OUTFIFO CAU_STAT1_OSTA /*!< OUT FIFO flag status */ +V1.1.0: +/* cau_stat1 register value */ +#define CAU_FLAG_INFIFO (CAU_STAT1_ISTA | BIT(31)) /*!< IN FIFO flag status */ +#define CAU_FLAG_OUTFIFO (CAU_STAT1_OSTA | BIT(31)) /*!< OUT FIFO flag status */ +_________________________________________________________________________________________________________________________ + +______________________USB________________________________________________________________________________________________ +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Include\usb_iap_core.h +fix reason: +Changing IAP commands due to IAP protocol modification +V1.0.0: +/* special commands with download request */ +#define IAP_OPTION_BYTE1 0x01U +#define IAP_ERASE 0x02U +#define IAP_DNLOAD 0x03U +#define IAP_LEAVE 0x04U +#define IAP_GETBIN_ADDRESS 0x05U +#define IAP_OPTION_BYTE2 0x06U +V1.1.0: +/* special commands with download request */ +#define IAP_READ_OPTION_BYTE 0x01U /*!< read option byte request */ +#define IAP_ERASE 0x02U /*!< erase request */ +#define IAP_DOWNLOAD 0x03U /*!< download request */ +#define IAP_LEAVE 0x04U /*!< leave request */ +#define IAP_GETBIN_ADDRESS 0x05U /*!< get bin address request */ +#define IAP_WRITE_OPTION_BYTE 0x06U /*!< write option byte request */ +#define IAP_UPLOAD 0x07U /*!< upload request */ +#define IAP_CHECK_RDP 0x08U /*!< check rdp state request */ + +#define OPERATION_SUCCESS 0x02U /*!< operation success status */ +#define OPERATION_FAIL 0x5FU /*!< operation fail status */ +#define LEAVE_FINISH 0x04U /*!< leave finish status */ +#define OB_WRITE_SUCCESS 0x03U /*!< OB write success status */ +#define IS_RDP_MODE 0xBBU /*!< MCU RDP status */ +#define IS_NORMAL_MODE 0xA5U /*!< MCU normal status */ + +#define IAP_HOST_ID 0x01U /*!< IAP host ID */ +#define IAP_DEVICE_ID 0x02U /*!< IAP device ID */ + + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing IAP DATA OUT function due to IAP protocol modification +V1.0.0: +/*! + \brief handle data out stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval none +*/ +static uint8_t iap_data_out (usb_dev *udev ,uint8_t ep_num) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + if (0x01U == iap->report_buf[0]) { + switch (iap->report_buf[1]) { + case IAP_DNLOAD: + iap_req_dnload(udev); + break; + + case IAP_ERASE: + iap_req_erase(udev); + break; + + case IAP_OPTION_BYTE1: + iap_req_optionbyte(udev, 0x01U); + break; + + case IAP_LEAVE: + iap_req_leave(udev); + break; + + case IAP_GETBIN_ADDRESS: + iap_address_send(udev); + break; + + case IAP_OPTION_BYTE2: + iap_req_optionbyte(udev, 0x02U); + break; + + default: + break; + } + } + + usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); + + return USBD_OK; +} +V1.1.0: +/*! + \brief handle data OUT stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + if(IAP_HOST_ID == iap->report_buf[0]) { + switch(iap->report_buf[1]) { + case IAP_DOWNLOAD: + iap_req_download(udev); + break; + + case IAP_ERASE: + iap_req_erase(udev); + break; + + case IAP_READ_OPTION_BYTE: + iap_req_read_optionbyte(udev); + break; + + case IAP_LEAVE: + iap_req_leave(udev); + break; + + case IAP_GETBIN_ADDRESS: + iap_address_send(udev); + break; + + case IAP_WRITE_OPTION_BYTE: + iap_req_write_optionbyte(udev); + break; + + case IAP_UPLOAD: + iap_req_upload(udev); + break; + + case IAP_CHECK_RDP: + iap_check_rdp(udev); + break; + + default: + break; + } + } + + usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); + + return USBD_OK; +} + +Fix file: +\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing IAP download request function due to IAP protocol modification +V1.0.0: +/*! + \brief handle the IAP_DNLOAD request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_dnload(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + if (0U != iap->transfer_times) { + if (1U == iap->transfer_times) { + if (0U == iap->lps) { + iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); + } else { + iap_data_write(&iap->report_buf[2], iap->base_address, iap->file_length % TRANSFER_SIZE); + iap->lps = 0U; + } + + iap->dev_status[0] = 0x02U; + iap->dev_status[1] = 0x02U; + iap_report_send (udev, iap->dev_status, IAP_IN_PACKET); + } else { + iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); + + iap->base_address += TRANSFER_SIZE; + } + + iap->transfer_times--; + } +} +V1.1.0: +/*! + \brief handle the IAP_DOWNLOAD request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_download(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->dev_status[0] = IAP_DEVICE_ID; + + /* get the target address to download */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24; + + /* program the target address */ + if(FMC_READY == iap_data_write(&iap->report_buf[6], iap->base_address, TRANSFER_SIZE)) { + iap->dev_status[1] = OPERATION_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Adding IAP write option byte request function due to IAP protocol modification +V1.0.0: +none +V1.1.0: +/*! + \brief handle the IAP_WRITE_OPTION_BYTE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_write_optionbyte(usb_dev *udev) +{ + uint32_t option_byte_addr = 0U; + uint16_t option_byte_size = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get option byte address address */ + option_byte_addr = iap->report_buf[2]; + option_byte_addr |= (uint32_t)iap->report_buf[3] << 8; + option_byte_addr |= (uint32_t)iap->report_buf[4] << 16; + option_byte_addr |= (uint32_t)iap->report_buf[5] << 24; + + /* get option byte address size */ + if(OPT_BYTE_ADDR == option_byte_addr) { + option_byte_size = OPT_BYTE_SIZE; + } + + iap->dev_status[0] = IAP_DEVICE_ID; + + /* write option byte address data */ + if(FMC_READY == option_byte_write(option_byte_addr, &iap->report_buf[6], option_byte_size)) { + iap->dev_status[1] = OB_WRITE_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing IAP erase flash request function due to IAP protocol modification +V1.0.0: +/*! + \brief handle the IAP_ERASE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_erase(usb_dev *udev) +{ + uint32_t addr = 0U; + + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get base address to erase */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= iap->report_buf[3] << 8U; + iap->base_address |= iap->report_buf[4] << 16U; + iap->base_address |= iap->report_buf[5] << 24U; + + /* get file length */ + iap->file_length = iap->report_buf[7]; + iap->file_length |= iap->report_buf[8] << 8U; + iap->file_length |= iap->report_buf[9] << 16U; + iap->file_length |= iap->report_buf[10] << 24U; + + iap->lps = iap->file_length % TRANSFER_SIZE; + if (0U == iap->lps) { + iap->transfer_times = iap->file_length / TRANSFER_SIZE; + } else { + iap->transfer_times = iap->file_length / TRANSFER_SIZE + 1U; + } + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(iap->base_address)) { + return; + } + + addr = iap->base_address; + + /* unlock the flash program erase controller */ + fmc_unlock(); + + flash_erase(addr, iap->file_length, iap->report_buf); + + fmc_lock(); + + iap->dev_status[0] = 0x02U; + iap->dev_status[1] = 0x01U; + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); +} +V1.1.0: +/*! + \brief handle the IAP_ERASE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_erase(usb_dev *udev) +{ + uint32_t addr = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get base address to erase */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24; + + /* get file length */ + iap->file_length = iap->report_buf[6]; + iap->file_length |= (uint32_t)iap->report_buf[7] << 8; + iap->file_length |= (uint32_t)iap->report_buf[8] << 16; + iap->file_length |= (uint32_t)iap->report_buf[9] << 24; + + /* check if the address is in protected area */ + if(IS_PROTECTED_AREA(iap->base_address)) { + return; + } + + addr = iap->base_address; + iap->dev_status[0] = IAP_DEVICE_ID; + + if(FMC_READY == flash_erase(addr, iap->file_length)) { + iap->dev_status[1] = OPERATION_SUCCESS; + } else { + iap->dev_status[1] = OPERATION_FAIL; + } + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing IAP read option byte request function due to IAP protocol modification +V1.0.0: +/*! + \brief handle the IAP_OPTION_BYTE request + \param[in] udev: pointer to USB device instance + \param[in] option_num: number of option byte + \param[out] none + \retval none +*/ +static void iap_req_optionbyte(usb_dev *udev, uint8_t option_num) +{ + uint8_t i = 0U; + uint32_t address = 0U; + + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->option_byte[0] = 0x02U; + + if (0x01U == option_num) { + address = OPT_BYTE_ADDR1; +#ifdef OPT_BYTE_ADDR2 + } else if (0x02U == option_num) { + address = OPT_BYTE_ADDR2; +#endif + } else { + return; + } + + for (i = 1U; i < 17U; i++) { + iap->option_byte[i] = *(uint8_t *)address; + address++; + } + + iap_report_send (udev, iap->option_byte, IAP_IN_PACKET); +} +V1.1.0: +/*! + \brief handle the IAP_READ_OPTION_BYTE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_read_optionbyte(usb_dev *udev) +{ + uint8_t i = 0U; + uint32_t option_size = 0U, temp = 0U, option_address = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* read option address address */ + option_address = iap->report_buf[2] + (iap->report_buf[3] << 8) + (iap->report_buf[4] << 16) + (iap->report_buf[5] << 24); + + iap->option_byte[0] = IAP_DEVICE_ID; + + if(OPT_BYTE_ADDR == option_address) { + option_size = OPT_BYTE_SIZE; + } + + /* read option address content */ + for(i = 0U; i < (option_size / 4U); i++) { + temp = *(uint32_t *)option_address; + iap->option_byte[4 * i + 5] = temp >> 24; + iap->option_byte[4 * i + 4] = temp >> 16; + iap->option_byte[4 * i + 3] = temp >> 8; + iap->option_byte[4 * i + 2] = temp; + option_address = option_address + 4U; + } + iap->option_byte[1] = OPERATION_SUCCESS; + + iap_report_send(udev, iap->option_byte, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing leave IAP mode request function due to IAP protocol modification +V1.0.0: +/*! + \brief handle the IAP_LEAVE request + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_leave(usb_dev *udev) +{ + /* lock the internal flash */ + fmc_lock(); + + /* generate system reset to allow jumping to the user code */ + NVIC_SystemReset(); +} +V1.1.0: +/*! + \brief handle the IAP_LEAVE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_leave(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* get base address to jump */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24; + + iap->dev_status[0] = IAP_DEVICE_ID; + iap->dev_status[1] = LEAVE_FINISH; + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); + + usbd_disconnect(udev); + + /* reset register */ + register_reset(); + + /* jump to target */ + jump_to_execute(iap->base_address); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Changing IAP upload request function due to IAP protocol modification +V1.0.0: +none +V1.1.0: +/*! + \brief handle the IAP_UPLOAD request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_upload(usb_dev *udev) +{ + uint16_t packet_valid_length = 0U, i= 0U; + uint32_t bin_flash_addr = APP_LOADED_ADDR; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + iap->bin_addr[0] = IAP_DEVICE_ID; + + /* get target flash address */ + bin_flash_addr = iap->report_buf[2]; + bin_flash_addr |= (uint32_t)iap->report_buf[3] << 8; + bin_flash_addr |= (uint32_t)iap->report_buf[4] << 16; + bin_flash_addr |= (uint32_t)iap->report_buf[5] << 24; + + /* get current packet valid length */ + packet_valid_length = iap->report_buf[6]; + packet_valid_length |= iap->report_buf[7] << 8; + + /* get target flash address content */ + for(i = 0U; i < packet_valid_length; i++) { + iap->bin_addr[i + 1] = REG8(bin_flash_addr + i); + } + + iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c +fix reason: +Adding IAP check read protected request function due to IAP protocol modification +V1.0.0: +none +V1.1.0: +/*! + \brief handle the IAP_CHECK_RDP request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_check_rdp(usb_dev *udev) +{ + uint8_t mode = 0U; + usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; + + /* check whether the SPC bit of FMC module is normal state */ + if(0xA5U != REG8(OPT_BYTE_ADDR)) { + mode = IS_RDP_MODE; + } else { + mode = IS_NORMAL_MODE; + } + + iap->bin_addr[0] = IAP_DEVICE_ID; + iap->bin_addr[1] = mode; + + iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); +} + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\class\msc\Include\usbd_msc_scsi.h +fix reason: +The statement here can be removed +V1.0.0: +extern const uint8_t msc_page00_inquiry_data[]; +extern const uint8_t msc_mode_sense6_data[]; +extern const uint8_t msc_mode_sense10_data[]; +V1.1.0: +none + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\core\Source\usbd_core.c +fix reason: +GD32F5xx can not support USB high-speed core, it has only one full-speed core +V1.0.0: +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core) +V1.1.0: +void usbd_init(usb_core_driver *udev, usb_desc *desc, usb_class_core *class_core) + +Fix file: +..\Firmware\GD32F5xx_usb_library\device\core\Source\usbd_core.c +fix reason: +The endpoint size in the endpoint descriptor is the lower 11 bits +V1.0.0: +uint16_t max_len = ep_desc->wMaxPacketSize; +V1.1.0: +uint16_t max_len = ep_desc->wMaxPacketSize & EP_MAX_PACKET_SIZE_MASK; + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Include\drv_usb_core.h +fix reason: +Adding endpoint size mask +V1.0.0: +none +V1.1.0: +#define EP_MAX_PACKET_SIZE_MASK 0x07FFU /*!< endpoint maximum packet size mask */ + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Include\drv_usb_regs.h +fix reason: +Removing the core enumeration as GD32F5xx has only one full-speed core +V1.0.0: +typedef enum +{ + USB_CORE_ENUM_HS = 0, /*!< USB core type is HS */ + USB_CORE_ENUM_FS = 1 /*!< USB core type is FS */ +} usb_core_enum; +V1.1.0: +none + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_core.c +fix reason: +GD32F5xx can not support USB high-speed core, it has only one full-speed core +V1.0.0: +usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs, usb_core_enum usb_core) +V1.1.0: +usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs) + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_core.c +fix reason: +GD32F5xx have no ULPI +V1.0.0: +#ifdef USBHS_EXTERNAL_VBUS_ENABLED + /* use external VBUS driver */ + usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; +#else + /* use internal VBUS driver */ + usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; +#endif /* USBHS_EXTERNAL_VBUS_ENABLED */ +V1.1.0: +none + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_host.c +fix reason: +GD32F5xx can not support USB high-speed +V1.0.0: +if (!pp->ep.dir) { + if (PORT_SPEED_HIGH == pp->dev_speed) { + pp_inten |= HCHINTEN_NYETIE; + pp_inten |= HCHINTEN_ACKIE; + } +} +V1.1.0: +none + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_host.c +fix reason: +As GD32F5xx can not support USB high-speed, so it can not support PING protocol +V1.0.0: +/*! + \brief configure host pipe to do ping operation + \param[in] udev: pointer to USB device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_ping (usb_core_driver *udev, uint8_t pipe_num) +{ + uint32_t pp_ctl = 0U; + + udev->regs.pr[pipe_num]->HCHLEN = HCHLEN_PING | (HCHLEN_PCNT & (1U << 19U)); + + pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; + + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return USB_OK; +} +V1.1.0: +none + + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c +fix reason: +The wakeup interrupt is repeated +V1.0.0: +if (intr & GINTF_WKUPIF) { + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_WKUPIF; +} +V1.1.0: +none + + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c +fix reason: +GD32F5xx is embedded PHY by default +V1.0.0: +if (USB_EMBEDDED_PHY == udev->bp.phy_itf) { +V1.1.0: +none + + +Fix file: +..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c +fix reason: +As GD32F5xx can not support USB high-speed, so it can not support PING protocol +V1.0.0: +if (URB_PING == pp->urb_state) { + pp->err_count = 0U; + usb_pp_halt (udev, (uint8_t)pp_num, HCHINTF_TF, PIPE_XF); +} +V1.1.0: +none + + +Fix file: +..\Firmware\GD32F5xx_usb_library\host\class\hid\Include\usbh_standard_hid.h +fix reason: +The name of the structure has been changed since it is confusing +V1.0.0: +typedef struct _hid_mouse_info +{ + uint8_t x; + uint8_t y; + uint8_t buttons[3]; +} hid_mouse_info; +V1.1.0: +typedef struct _mouse_report_data { + uint8_t x; /*!< X coordinate value */ + uint8_t y; /*!< Y coordinate value */ + uint8_t buttons[3]; /*!< button buff */ +} mouse_report_data; + + +Fix file: +..\Firmware\GD32F5xx_usb_library\host\class\hid\Source\usbh_standard_hid.c +fix reason: +It is changed as the structure has been changed +V1.0.0: +hid_mouse_info mouse_info; + +uint8_t mouse_report_data[8] = {0U}; + +if(hid->len > sizeof(mouse_report_data)) { + hid->len = sizeof(mouse_report_data); +} + +hid->pdata = (uint8_t *)(void *)mouse_report_data; +V1.1.0: +mouse_report_data mouse_info; + +uint8_t hid_mouse_info[8] = {0U}; + +if(hid->len > sizeof(hid_mouse_info)) { + hid->len = sizeof(hid_mouse_info); +} + +hid->pdata = (uint8_t *)(void *)hid_mouse_info; + + +Fix file: +..\Firmware\GD32F5xx_usb_library\host\core\Source\usbh_pipe.c +fix reason: +As GD32F5xx can not support USB high-speed, so it can not support PING protocol +V1.0.0: +if ((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { + pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); +} +V1.1.0: +none + +Fix file: +..\Examples\USB\USB_Device\audio\inc\usb_conf.h +..\Examples\USB\USB_Device\cdc_acm\inc\usb_conf.h +..\Examples\USB\USB_Device\composite_dev_hid_printer\inc\usb_conf.h +..\Examples\USB\USB_Device\custom_hid\inc\usb_conf.h +..\Examples\USB\USB_Device\dev_firmware_update\inc\usb_conf.h +..\Examples\USB\USB_Device\in_application_program_hid\inc\usb_conf.h +..\Examples\USB\USB_Device\msc_cdrom\inc\usb_conf.h +..\Examples\USB\USB_Device\msc_udisk\inc\usb_conf.h +..\Examples\USB\USB_Device\standard_hid_keyboard\inc\usb_conf.h +..\Examples\USB\USB_Device\usb_printer\inc\usb_conf.h +..\Examples\USB\USB_Device\usb_host_hid_keyboard_mouse\inc\usb_conf.h +..\Examples\USB\USB_Device\usb_host_msc_udisk\inc\usb_conf.h +fix reason: +GD32F5xx can not support USB high-speed core, it has only one full-speed core +V1.0.0: +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#define __ALIGN_BEGIN +#define __ALIGN_END +V1.1.0: +none + +Fix file: +..\Examples\USB\USB_Device\audio\inc\app.c +..\Examples\USB\USB_Device\cdc_acm\inc\app.c +..\Examples\USB\USB_Device\composite_dev_hid_printer\inc\app.c +..\Examples\USB\USB_Device\custom_hid\inc\app.c +..\Examples\USB\USB_Device\dev_firmware_update\inc\app.c +..\Examples\USB\USB_Device\in_application_program_hid\inc\app.c +..\Examples\USB\USB_Device\msc_cdrom\inc\app.c +..\Examples\USB\USB_Device\msc_udisk\inc\app.c +..\Examples\USB\USB_Device\standard_hid_keyboard\inc\app.c +..\Examples\USB\USB_Device\usb_printer\inc\app.c +fix reason: +GD32F5xx can not support USB high-speed core, it has only one full-speed core +V1.0.0: +usbd_init (&usbd_printer, USB_CORE_ENUM_FS, ...); +V1.1.0: +usbd_init(&usbd_printer, ...); + + +Fix file: +..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c +fix reason: +Changing flash erase function due to IAP protocol modification +V1.0.0: +/*! + \brief erase flash + \param[in] address: erase start address + \param[in] file_length: file length + \param[in] report_buffer: report buffer + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +void flash_erase(uint32_t address, uint32_t file_length, uint8_t* report_buffer) +{ + uint16_t page_count = 0U, i = 0U; + + page_count = report_buffer[6]; + + /* clear pending flags */ + fmc_flag_clear (FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); + + for (i = 0U; i < page_count; i ++) { + /* call the standard flash erase-page function */ + fmc_page_erase(address); + + address += PAGE_SIZE; + } +} +V1.1.0: +/*! + \brief erase flash + \param[in] address: erase start address + \param[in] file_length: file length + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum flash_erase(uint32_t address, uint32_t file_length) +{ + uint16_t page_count = 0U, i = 0U; + fmc_state_enum fmc_state = FMC_READY; + + if(0U == (file_length % PAGE_SIZE)) { + page_count = (uint16_t)(file_length / PAGE_SIZE); + } else { + page_count = (uint16_t)(file_length / PAGE_SIZE + 1U); + } + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* clear pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); + + for(i = 0U; i < page_count; i ++) { + /* call the standard flash erase-page function */ + fmc_state = fmc_page_erase(address); + + address += PAGE_SIZE; + } + + /* lock the flash program erase controller */ + fmc_lock(); + + return fmc_state; +} + +Fix file: +..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c +fix reason: +Changing flash write function due to IAP protocol modification +V1.0.0: +/*! + \brief write data to sectors of memory + \param[in] data: data to be written + \param[in] addr: sector address/code + \param[in] len: length of data to be written (in bytes) + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len) +{ + uint32_t idx = 0U; + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(addr)) { + return; + } + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* clear pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); + + /* data received are word multiple */ + for (idx = 0U; idx < len; idx += 4) { + if (FMC_READY == fmc_word_program(addr, *(uint32_t *)(data + idx))) { + addr += 4U; + } else { + while(1){ + } + } + } + + fmc_lock(); +} +V1.1.0: +/*! + \brief write data to sectors of memory + \param[in] data: data to be written + \param[in] addr: sector address/code + \param[in] len: length of data to be written (in bytes) + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +fmc_state_enum iap_data_write(uint8_t *data, uint32_t addr, uint32_t len) +{ + uint32_t idx = 0U; + fmc_state_enum fmc_state = FMC_READY; + + /* check if the address is in protected area */ + if(IS_PROTECTED_AREA(addr)) { + return FMC_BUSY; + } + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* clear pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); + + /* data received are word multiple */ + for(idx = 0U; idx < len; idx += 4) { + if(FMC_READY == fmc_word_program(addr, *(uint32_t *)(data + idx))) { + addr += 4U; + } else { + while(1){ + } + } + } + + /* lock the flash program erase controller */ + fmc_lock(); + + return fmc_state; +} + +Fix file: +..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c +fix reason: +Adding related operation due to IAP protocol modifications +V1.0.0: +none +V1.1.0: +fmc_state_enum option_byte_write(uint32_t mem_add, uint8_t *data, uint16_t len) + +void jump_to_execute(uint32_t addr) + +void register_reset(void) + +static fmc_state_enum fmc_state_get(void) + +static fmc_state_enum fmc_ready_wait(uint32_t timeout) + + +Fix file: +..\Examples\USB\USB_Device\standard_hid_keyboard\src\gd32f5xx_hw.c +fix reason: +Repeated definition +V1.0.0: +#ifdef USE_USBFS + #define USBFS_CORE +#endif /* USE_USBFS */ + +#ifdef USBFS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 + + #define USBFS_LOW_PWR_MGMT_SUPPORT + #define USBFS_SOF_OUTPUT_ENABLED + +#endif /* USBFS_CORE */ +V1.1.0: +none + +Fix file: +..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\gd32f5xx_usb_hw.c +..\Examples\USB\USB_Host\usb_host_msc_udisk\src\gd32f5xx_usb_hw.c +fix reason: +There is no relevant action about USB over current and SOF output in the code +V1.0.0: +#define HOST_OVRCURR_PORT GPIOE +#define HOST_OVRCURR_LINE GPIO_PIN_1 +#define HOST_OVRCURR_PORT_SOURCE GPIO_PORT_SOURCE_GPIOE +#define HOST_OVRCURR_PIN_SOURCE GPIO_PINSOURCE1 +#define HOST_OVRCURR_PORT_RCC RCC_APB2PERIPH_GPIOE +#define HOST_OVRCURR_EXTI_LINE EXTI_LINE1 +#define HOST_OVRCURR_IRQn EXTI1_IRQn + +#define HOST_SOF_OUTPUT_RCC RCC_APB2PERIPH_GPIOA +#define HOST_SOF_PORT GPIOA +#define HOST_SOF_SIGNAL GPIO_PIN_8 +V1.1.0: +none + + +Fix file: +..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\gd32f5xx_usb_hw.c +..\Examples\USB\USB_Host\usb_host_msc_udisk\src\gd32f5xx_usb_hw.c +fix reason: +Repeated operation +V1.0.0: +/*! + \brief configure USB GPIO + \param[in] none + \param[out] none + \retval none +*/ +void usb_gpio_config (void) +{ +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + EXTI_InitPara EXTI_InitStructure; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + + EXTI_ClearIntBitState(EXTI_LINE18); + + /* USB wakeup EXTI line configuration */ + EXTI_InitStructure.EXTI_LINE = EXTI_LINE18; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LINEEnable = ENABLE; + EXTI_Init(&EXTI_InitStructure); + +#endif +} +V1.1.0: +none + + +Fix file: +..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\lcd_font.c +..\Examples\USB\USB_Host\usb_host_msc_udisk\src\lcd_font.c +fix reason: +Chinese fonts compile with errors in some IDE +V1.0.0: +const typefont_GB162 hz16[] = { + "鏄?,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00, + "绀?,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00, + "娴?,0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08, + "璇?,0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02, + 0x00, +}; + +/* song typeface bold small 2 font */ +const typefont_GB242 hz24[] = +{ + "鏄?,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0x00,0x0F,0x03,0xC0,0x0C,0x00,0x40,0x1F,0xF8,0x60,0x18,0x00,0x60,0x08,0x00,0x40,0x0E,0x01,0xC0,0x07,0xFF,0x00,0x00,0x00,0x00,0x01,0x84,0x00,0x01,0x84,0x00,0x19,0x87,0x80,0x0F,0x8C,0xE0,0x07,0x8C,0x20,0x00,0xCC,0x00,0x03,0xFF,0xE0,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "绀?,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xFF,0xE0,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x06,0x13,0x00,0x0C,0x13,0xC0,0x0C,0x18,0xF0,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "娴?,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x39,0xFC,0x30,0x1F,0xCC,0x30,0x07,0x06,0xB0,0x0F,0x06,0xF0,0x19,0x07,0xB0,0x31,0x37,0xB0,0x31,0x36,0xF0,0x1F,0x27,0xF0,0x01,0x67,0xF0,0x01,0xE5,0xF0,0x01,0xE1,0xF0,0x00,0x41,0xF0,0x0C,0xF8,0xB0,0x3C,0xD8,0x30,0x00,0x8C,0x30,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "璇?,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x60,0x0C,0x03,0x70,0x0C,0x03,0x30,0x00,0x3F,0xE0,0x00,0x3F,0x80,0x08,0x01,0x00,0x3C,0x01,0x80,0x04,0x7F,0x80,0x04,0x7D,0x80,0x0C,0x00,0x80,0x0C,0x10,0xC0,0x0C,0x10,0xC0,0x0C,0x18,0x40,0x0C,0x1C,0x60,0x0F,0x7E,0x60,0x06,0x70,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, +}; +V1.1.0: +none +__________________________________________________________________________________________________________________________ + +__________________________________________________________________________________________________________________________ + diff --git a/bsp/gd32/arm/libraries/Kconfig b/bsp/gd32/arm/libraries/Kconfig index 33910ffce07..986c4bb45da 100644 --- a/bsp/gd32/arm/libraries/Kconfig +++ b/bsp/gd32/arm/libraries/Kconfig @@ -30,3 +30,8 @@ config SOC_SERIES_GD32H7xx bool select ARCH_ARM_CORTEX_M7 select SOC_FAMILY_GD32 + +config SOC_SERIES_GD32F5 + bool + select ARCH_ARM_CORTEX_M33 + select SOC_FAMILY_GD32 \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c index f8d8695df79..092ed4aeb61 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.c @@ -257,7 +257,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) const struct pin_index *index = RT_NULL; rt_uint32_t pin_mode = 0; -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx rt_uint32_t pin_pupd = 0, pin_odpp = 0; #endif @@ -269,7 +269,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) /* GPIO Periph clock enable */ rcu_periph_clock_enable(index->clk); -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_OUTPUT; #else pin_mode = GPIO_MODE_OUT_PP; @@ -279,7 +279,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) { case PIN_MODE_OUTPUT: /* output setting */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_OUTPUT; pin_pupd = GPIO_PUPD_NONE; pin_odpp = GPIO_OTYPE_PP; @@ -289,7 +289,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_OUTPUT_OD: /* output setting: od. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_OUTPUT; pin_pupd = GPIO_PUPD_NONE; pin_odpp = GPIO_OTYPE_OD; @@ -299,7 +299,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT: /* input setting: not pull. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLUP | GPIO_PUPD_PULLDOWN; #else @@ -308,7 +308,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT_PULLUP: /* input setting: pull up. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLUP; #else @@ -317,7 +317,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; case PIN_MODE_INPUT_PULLDOWN: /* input setting: pull down. */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx pin_mode = GPIO_MODE_INPUT; pin_pupd = GPIO_PUPD_PULLDOWN; #else @@ -328,7 +328,7 @@ static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) break; } -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx gpio_mode_set(index->gpio_periph, pin_mode, pin_pupd, index->pin); if(pin_mode == GPIO_MODE_OUTPUT) { @@ -553,7 +553,7 @@ static rt_err_t gd32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ return -RT_EINVAL; } -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx rcu_periph_clock_enable(RCU_SYSCFG); #else rcu_periph_clock_enable(RCU_AF); @@ -563,7 +563,7 @@ static rt_err_t gd32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ nvic_irq_enable(irqmap->irqno, 5U, 0U); /* connect EXTI line to GPIO pin */ -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx syscfg_exti_line_config(index->port_src, index->pin_src); #else gpio_exti_source_select(index->port_src, index->pin_src); diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h index a20ac9aa006..1c4d8e1febf 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_gpio.h @@ -31,11 +31,13 @@ extern "C" { #include "gd32h7xx_gpio.h" #elif defined SOC_SERIES_GD32E50x #include "gd32e50x_gpio.h" +#elif defined SOC_SERIES_GD32F5xx +#include "gd32f5xx_gpio.h" #endif #define __GD32_PORT(port) GPIO##port -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx #define GD32_PIN(index, port, pin) {index, RCU_GPIO##port, \ GPIO##port, GPIO_PIN_##pin, \ EXTI_SOURCE_GPIO##port, \ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c index 29e5a0c8d62..ea4c73143c5 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.c @@ -157,7 +157,7 @@ static const struct gd32_uart uart_obj[] = { USART0, // uart peripheral index USART0_IRQn, // uart iqrn RCU_USART0, // uart periph clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin @@ -186,7 +186,7 @@ static const struct gd32_uart uart_obj[] = { USART1, // uart peripheral index USART1_IRQn, // uart iqrn RCU_USART1, // uart periph clock -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx RCU_GPIOA, RCU_GPIOA, // tx gpio clock, rx gpio clock GPIOA, GPIO_AF_7, GPIO_PIN_2, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_3, // rx port, rx alternate, rx pin @@ -210,7 +210,7 @@ static const struct gd32_uart uart_obj[] = { USART2, // uart peripheral index USART2_IRQn, // uart iqrn RCU_USART2, // uart periph clock -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx RCU_GPIOB, RCU_GPIOB, // tx gpio clock, rt gpio clock GPIOB, GPIO_AF_7, GPIO_PIN_10, // tx port, tx alternate, tx pin GPIOB, GPIO_AF_7, GPIO_PIN_11, // rx port, rx alternate, rx pin @@ -234,7 +234,7 @@ static const struct gd32_uart uart_obj[] = { UART3, // uart peripheral index UART3_IRQn, // uart iqrn RCU_UART3, // uart periph clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx RCU_GPIOC, RCU_GPIOC, // tx gpio clock, rt gpio clock GPIOC, GPIO_AF_8, GPIO_PIN_10, // tx port, tx alternate, tx pin GPIOC, GPIO_AF_8, GPIO_PIN_11, // rx port, rx alternate, rx pin @@ -258,7 +258,7 @@ static const struct gd32_uart uart_obj[] = { UART4, // uart peripheral index UART4_IRQn, // uart iqrn RCU_UART4, RCU_GPIOC, RCU_GPIOD, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOC, GPIO_AF_8, GPIO_PIN_12, // tx port, tx alternate, tx pin GPIOD, GPIO_AF_8, GPIO_PIN_2, // rx port, rx alternate, rx pin #elif defined SOC_SERIES_GD32E50x @@ -279,7 +279,7 @@ static const struct gd32_uart uart_obj[] = { USART5, // uart peripheral index USART5_IRQn, // uart iqrn RCU_USART5, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOC, GPIO_AF_8, GPIO_PIN_6, // tx port, tx alternate, tx pin GPIOC, GPIO_AF_8, GPIO_PIN_7, // rx port, rx alternate, rx pin #elif defined SOC_SERIES_GD32E50x @@ -300,7 +300,7 @@ static const struct gd32_uart uart_obj[] = { UART6, // uart peripheral index UART6_IRQn, // uart iqrn RCU_UART6, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOE, GPIO_AF_8, GPIO_PIN_7, // tx port, tx alternate, tx pin GPIOE, GPIO_AF_8, GPIO_PIN_8, // rx port, rx alternate, rx pin #else @@ -317,7 +317,7 @@ static const struct gd32_uart uart_obj[] = { UART7, // uart peripheral index UART7_IRQn, // uart iqrn RCU_UART7, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOE, GPIO_AF_8, GPIO_PIN_0, // tx port, tx alternate, tx pin GPIOE, GPIO_AF_8, GPIO_PIN_1, // rx port, rx alternate, rx pin #else @@ -347,7 +347,7 @@ void gd32_uart_gpio_init(struct gd32_uart *uart) rcu_periph_clock_enable(uart->rx_gpio_clk); rcu_periph_clock_enable(uart->per_clk); -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx /* connect port to USARTx_Tx */ gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin); diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h index 9481455601a..1e81fd12c61 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart.h @@ -33,14 +33,14 @@ struct gd32_uart rcu_periph_enum tx_gpio_clk; //Todo: 5bits rcu_periph_enum rx_gpio_clk; //Todo: 5bits uint32_t tx_port; //Todo: 4bits -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx uint16_t tx_af; //Todo: 4bits #elif defined SOC_SERIES_GD32E50x uint32_t tx_af; //alternate1 cfg #endif uint16_t tx_pin; //Todo: 4bits uint32_t rx_port; //Todo: 4bits -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx uint16_t rx_af; //Todo: 4bits #elif defined SOC_SERIES_GD32E50x uint32_t rx_af; //alternate1 cfg diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c index ee0dfffd574..37b8090a1f5 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c @@ -56,7 +56,7 @@ static struct gd32_uart uart_obj[] = { USART0, // uart peripheral index USART0_IRQn, // uart iqrn RCU_USART0, RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin #else @@ -78,7 +78,7 @@ static struct gd32_uart uart_obj[] = { USART1, // uart peripheral index USART1_IRQn, // uart iqrn RCU_USART1, RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOA, GPIO_AF_7, GPIO_PIN_2, // tx port, tx alternate, tx pin GPIOA, GPIO_AF_7, GPIO_PIN_3, // rx port, rx alternate, rx pin #else @@ -100,7 +100,7 @@ static struct gd32_uart uart_obj[] = { USART2, // uart peripheral index USART2_IRQn, // uart iqrn RCU_USART2, RCU_GPIOB, RCU_GPIOB, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOB, GPIO_AF_7, GPIO_PIN_10, // tx port, tx alternate, tx pin GPIOB, GPIO_AF_7, GPIO_PIN_11, // rx port, rx alternate, rx pin #else @@ -122,7 +122,7 @@ static struct gd32_uart uart_obj[] = { UART3, // uart peripheral index UART3_IRQn, // uart iqrn RCU_UART3, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOC, GPIO_AF_8, GPIO_PIN_10, // tx port, tx alternate, tx pin GPIOC, GPIO_AF_8, GPIO_PIN_11, // rx port, rx alternate, rx pin #else @@ -144,7 +144,7 @@ static struct gd32_uart uart_obj[] = { UART4, // uart peripheral index UART4_IRQn, // uart iqrn RCU_UART4, RCU_GPIOC, RCU_GPIOD, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOC, GPIO_AF_8, GPIO_PIN_12, // tx port, tx alternate, tx pin GPIOD, GPIO_AF_8, GPIO_PIN_2, // rx port, rx alternate, rx pin #else @@ -166,7 +166,7 @@ static struct gd32_uart uart_obj[] = { USART5, // uart peripheral index USART5_IRQn, // uart iqrn RCU_USART5, RCU_GPIOC, RCU_GPIOC, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOC, GPIO_AF_8, GPIO_PIN_6, // tx port, tx alternate, tx pin GPIOC, GPIO_AF_8, GPIO_PIN_7, // rx port, rx alternate, rx pin #else @@ -188,7 +188,7 @@ static struct gd32_uart uart_obj[] = { UART6, // uart peripheral index UART6_IRQn, // uart iqrn RCU_UART6, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOE, GPIO_AF_8, GPIO_PIN_7, // tx port, tx alternate, tx pin GPIOE, GPIO_AF_8, GPIO_PIN_8, // rx port, rx alternate, rx pin #else @@ -210,7 +210,7 @@ static struct gd32_uart uart_obj[] = { UART7, // uart peripheral index UART7_IRQn, // uart iqrn RCU_UART7, RCU_GPIOE, RCU_GPIOE, // periph clock, tx gpio clock, rt gpio clock -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx GPIOE, GPIO_AF_8, GPIO_PIN_0, // tx port, tx alternate, tx pin GPIOE, GPIO_AF_8, GPIO_PIN_1, // rx port, rx alternate, rx pin #else @@ -664,7 +664,7 @@ void gd32_uart_gpio_init (struct gd32_uart *uart) rcu_periph_clock_enable(uart->rx_gpio_clk); rcu_periph_clock_enable(uart->per_clk); -#if defined SOC_SERIES_GD32F4xx +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx /* connect port to USARTx_Tx */ gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin); From ea13d2780913f64b3b4b917d6ab524f9090a2124 Mon Sep 17 00:00:00 2001 From: Yaochenger <1516081466@qq.com> Date: Thu, 3 Jul 2025 11:58:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[bsp/gd32]=20=E6=B7=BB=E5=8A=A0gd32f527=20b?= =?UTF-8?q?sp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/gd32/arm/gd32527I-eval/.config | 165 +- bsp/gd32/arm/gd32527I-eval/README.md | 39 +- .../RTE/_rt-thread/RTE_Components.h | 15 - bsp/gd32/arm/gd32527I-eval/SConstruct | 22 +- bsp/gd32/arm/gd32527I-eval/board/Kconfig | 3 +- bsp/gd32/arm/gd32527I-eval/board/SConscript | 9 - .../board/linker_scripts/link.ld | 6 +- .../board/linker_scripts/link.sct | 6 +- bsp/gd32/arm/gd32527I-eval/figures/board.png | Bin 405988 -> 0 bytes .../gd32527I-eval/figures/gd32f527i_eval.png | Bin 0 -> 616941 bytes bsp/gd32/arm/gd32527I-eval/project.uvoptx | 182 +- bsp/gd32/arm/gd32527I-eval/project.uvprojx | 145 +- bsp/gd32/arm/gd32527I-eval/rtconfig.h | 45 +- bsp/gd32/arm/gd32527I-eval/template.uvoptx | 9 +- bsp/gd32/arm/gd32527I-eval/template.uvprojx | 6 +- .../CMSIS/GD/GD32F5xx/Include/gd32f5xx.h | 302 -- .../GD/GD32F5xx/Include/system_gd32f5xx.h | 57 - .../GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s | 495 --- .../GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s | 317 -- .../GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s | 750 ---- .../GD/GD32F5xx/Source/system_gd32f5xx.c | 944 ----- .../CMSIS/LICENSE.TXT | 201 - .../CMSIS/cmsis_armcc.h | 817 ---- .../CMSIS/cmsis_armclang.h | 1803 -------- .../CMSIS/cmsis_compiler.h | 355 -- .../CMSIS/cmsis_gcc.h | 1980 --------- .../CMSIS/cmsis_version.h | 39 - .../CMSIS/core_armv8mbl.h | 1878 --------- .../CMSIS/core_armv8mml.h | 2902 ------------- .../CMSIS/core_cm0.h | 888 ---- .../CMSIS/core_cm0plus.h | 1021 ----- .../CMSIS/core_cm23.h | 1878 --------- .../CMSIS/core_cm3.h | 1928 --------- .../CMSIS/core_cm33.h | 2898 ------------- .../CMSIS/core_cm4.h | 2113 ---------- .../CMSIS/core_cm7.h | 2658 ------------ .../CMSIS/core_sc000.h | 1016 ----- .../CMSIS/core_sc300.h | 1903 --------- .../CMSIS/mpu_armv7.h | 182 - .../CMSIS/tz_context.h | 69 - .../Include/gd32f5xx_adc.h | 513 --- .../Include/gd32f5xx_can.h | 916 ---- .../Include/gd32f5xx_cau.h | 317 -- .../Include/gd32f5xx_crc.h | 78 - .../Include/gd32f5xx_ctc.h | 182 - .../Include/gd32f5xx_dac.h | 277 -- .../Include/gd32f5xx_dbg.h | 165 - .../Include/gd32f5xx_dci.h | 236 -- .../Include/gd32f5xx_dma.h | 433 -- .../Include/gd32f5xx_enet.h | 1697 -------- .../Include/gd32f5xx_exmc.h | 812 ---- .../Include/gd32f5xx_exti.h | 293 -- .../Include/gd32f5xx_fmc.h | 644 --- .../Include/gd32f5xx_fwdgt.h | 118 - .../Include/gd32f5xx_gpio.h | 406 -- .../Include/gd32f5xx_hau.h | 223 - .../Include/gd32f5xx_i2c.h | 416 -- .../Include/gd32f5xx_i2c_add.h | 410 -- .../Include/gd32f5xx_ipa.h | 378 -- .../Include/gd32f5xx_iref.h | 184 - .../Include/gd32f5xx_misc.h | 93 - .../Include/gd32f5xx_pkcau.h | 290 -- .../Include/gd32f5xx_pmu.h | 203 - .../Include/gd32f5xx_rcu.h | 1261 ------ .../Include/gd32f5xx_rtc.h | 638 --- .../Include/gd32f5xx_sai.h | 473 --- .../Include/gd32f5xx_sdio.h | 431 -- .../Include/gd32f5xx_spi.h | 376 -- .../Include/gd32f5xx_syscfg.h | 358 -- .../Include/gd32f5xx_timer.h | 869 ---- .../Include/gd32f5xx_tli.h | 370 -- .../Include/gd32f5xx_trng.h | 100 - .../Include/gd32f5xx_usart.h | 489 --- .../Include/gd32f5xx_wwdgt.h | 107 - .../Source/gd32f5xx_adc.c | 1200 ------ .../Source/gd32f5xx_can.c | 1431 ------- .../Source/gd32f5xx_cau.c | 718 ---- .../Source/gd32f5xx_cau_aes.c | 915 ---- .../Source/gd32f5xx_cau_des.c | 183 - .../Source/gd32f5xx_cau_tdes.c | 198 - .../Source/gd32f5xx_crc.c | 127 - .../Source/gd32f5xx_ctc.c | 388 -- .../Source/gd32f5xx_dac.c | 679 --- .../Source/gd32f5xx_dbg.c | 209 - .../Source/gd32f5xx_dci.c | 343 -- .../Source/gd32f5xx_dma.c | 902 ---- .../Source/gd32f5xx_enet.c | 3701 ----------------- .../Source/gd32f5xx_exmc.c | 1264 ------ .../Source/gd32f5xx_exti.c | 251 -- .../Source/gd32f5xx_fmc.c | 1592 ------- .../Source/gd32f5xx_fwdgt.c | 229 - .../Source/gd32f5xx_gpio.c | 431 -- .../Source/gd32f5xx_hau.c | 402 -- .../Source/gd32f5xx_hau_sha_md5.c | 419 -- .../Source/gd32f5xx_i2c.c | 857 ---- .../Source/gd32f5xx_i2c_add.c | 978 ----- .../Source/gd32f5xx_ipa.c | 636 --- .../Source/gd32f5xx_iref.c | 124 - .../Source/gd32f5xx_misc.c | 184 - .../Source/gd32f5xx_pkcau.c | 1270 ------ .../Source/gd32f5xx_pmu.c | 394 -- .../Source/gd32f5xx_rcu.c | 1473 ------- .../Source/gd32f5xx_rtc.c | 1289 ------ .../Source/gd32f5xx_sai.c | 609 --- .../Source/gd32f5xx_sdio.c | 801 ---- .../Source/gd32f5xx_spi.c | 877 ---- .../Source/gd32f5xx_syscfg.c | 471 --- .../Source/gd32f5xx_timer.c | 2282 ---------- .../Source/gd32f5xx_tli.c | 595 --- .../Source/gd32f5xx_trng.c | 153 - .../Source/gd32f5xx_usart.c | 1010 ----- .../Source/gd32f5xx_wwdgt.c | 141 - .../device/class/audio/Include/audio_core.h | 316 -- .../class/audio/Include/audio_out_itf.h | 48 - .../device/class/audio/Source/audio_core.c | 951 ----- .../device/class/audio/Source/audio_out_itf.c | 167 - .../device/class/cdc/Include/cdc_acm_core.h | 65 - .../device/class/cdc/Source/cdc_acm_core.c | 520 --- .../device/class/dfu/Include/dfu_core.h | 173 - .../device/class/dfu/Include/dfu_mem.h | 82 - .../device/class/dfu/Source/dfu_core.c | 721 ---- .../device/class/dfu/Source/dfu_mem.c | 241 -- .../class/hid/Include/custom_hid_core.h | 66 - .../class/hid/Include/standard_hid_core.h | 67 - .../device/class/hid/Source/custom_hid_core.c | 473 --- .../class/hid/Source/standard_hid_core.c | 460 -- .../device/class/iap/Include/usb_iap_core.h | 103 - .../device/class/iap/Source/usb_iap_core.c | 667 --- .../device/class/msc/Include/usbd_msc_bbb.h | 100 - .../device/class/msc/Include/usbd_msc_core.h | 57 - .../device/class/msc/Include/usbd_msc_mem.h | 58 - .../device/class/msc/Include/usbd_msc_scsi.h | 53 - .../device/class/msc/Source/usbd_msc_bbb.c | 287 -- .../device/class/msc/Source/usbd_msc_core.c | 395 -- .../device/class/msc/Source/usbd_msc_scsi.c | 758 ---- .../class/printer/Include/printer_core.h | 78 - .../class/printer/Source/printer_core.c | 302 -- .../device/core/Include/usbd_core.h | 102 - .../device/core/Include/usbd_enum.h | 98 - .../device/core/Include/usbd_transc.h | 56 - .../device/core/Source/usbd_core.c | 320 -- .../device/core/Source/usbd_enum.c | 816 ---- .../device/core/Source/usbd_transc.c | 264 -- .../driver/Include/drv_usb_core.h | 347 -- .../driver/Include/drv_usb_dev.h | 197 - .../driver/Include/drv_usb_host.h | 115 - .../driver/Include/drv_usb_hw.h | 62 - .../driver/Include/drv_usb_regs.h | 656 --- .../driver/Include/drv_usbd_int.h | 50 - .../driver/Include/drv_usbh_int.h | 53 - .../driver/Source/drv_usb_core.c | 371 -- .../driver/Source/drv_usb_dev.c | 660 --- .../driver/Source/drv_usb_host.c | 472 --- .../driver/Source/drv_usbd_int.c | 576 --- .../driver/Source/drv_usbh_int.c | 639 --- .../host/class/hid/Include/usbh_hid_core.h | 116 - .../class/hid/Include/usbh_standard_hid.h | 96 - .../host/class/hid/Source/usbh_hid_core.c | 582 --- .../host/class/hid/Source/usbh_standard_hid.c | 271 -- .../host/class/msc/Include/usbh_msc_bbb.h | 148 - .../host/class/msc/Include/usbh_msc_core.h | 122 - .../host/class/msc/Include/usbh_msc_scsi.h | 97 - .../host/class/msc/Source/usbh_msc_bbb.c | 360 -- .../host/class/msc/Source/usbh_msc_core.c | 551 --- .../host/class/msc/Source/usbh_msc_fatfs.c | 232 -- .../host/class/msc/Source/usbh_msc_scsi.c | 396 -- .../host/core/Include/usbh_core.h | 262 -- .../host/core/Include/usbh_enum.h | 70 - .../host/core/Include/usbh_pipe.h | 102 - .../host/core/Include/usbh_transc.h | 50 - .../host/core/Source/usbh_core.c | 655 --- .../host/core/Source/usbh_enum.c | 693 --- .../host/core/Source/usbh_pipe.c | 181 - .../host/core/Source/usbh_transc.c | 369 -- .../ustd/class/cdc/usb_cdc.h | 180 - .../ustd/class/hid/usb_hid.h | 81 - .../ustd/class/msc/msc_bbb.h | 69 - .../ustd/class/msc/msc_scsi.h | 117 - .../ustd/class/msc/usb_msc.h | 68 - .../ustd/common/usb_ch9_std.h | 248 -- .../GD32F5xx_Firmware_Library/SConscript | 65 - .../GD32F5xx_Firmware_Library/change log.txt | 1390 ------- bsp/gd32/arm/libraries/Kconfig | 2 +- 183 files changed, 408 insertions(+), 94755 deletions(-) delete mode 100644 bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h delete mode 100644 bsp/gd32/arm/gd32527I-eval/figures/board.png create mode 100644 bsp/gd32/arm/gd32527I-eval/figures/gd32f527i_eval.png delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript delete mode 100644 bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt diff --git a/bsp/gd32/arm/gd32527I-eval/.config b/bsp/gd32/arm/gd32527I-eval/.config index 5e366ae773b..db9edb54a9e 100644 --- a/bsp/gd32/arm/gd32527I-eval/.config +++ b/bsp/gd32/arm/gd32527I-eval/.config @@ -111,6 +111,7 @@ CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -139,11 +140,7 @@ CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TINY_FFS is not set # end of kservice options -CONFIG_RT_USING_DEBUG=y -CONFIG_RT_DEBUGING_ASSERT=y -CONFIG_RT_DEBUGING_COLOR=y -CONFIG_RT_DEBUGING_CONTEXT=y -# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_DEBUG is not set # CONFIG_RT_USING_CI_ACTION is not set # @@ -182,11 +179,18 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" -CONFIG_RT_VER_NUM=0x50200 +CONFIG_RT_VER_NUM=0x50201 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_SECURE=y +CONFIG_ARCH_ARM_CORTEX_M33=y + # # RT-Thread Components # @@ -499,6 +503,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# CONFIG_PKG_USING_FREEMQTT is not set # end of IoT - internet of things # @@ -526,6 +533,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set # end of JSON: JavaScript Object Notation, a lightweight data-interchange format # @@ -630,6 +638,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set # end of tools packages # @@ -641,7 +651,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set -# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set # end of enhanced kernel services # CONFIG_PKG_USING_AUNITY is not set @@ -659,7 +668,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_CMSIS_5 is not set # CONFIG_PKG_USING_CMSIS_CORE is not set -# CONFIG_PKG_USING_CMSIS_DSP is not set # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set @@ -711,7 +719,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARM_2D is not set # CONFIG_PKG_USING_MCUBOOT is not set # CONFIG_PKG_USING_TINYUSB is not set -# CONFIG_PKG_USING_CHERRYUSB is not set # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set @@ -719,10 +726,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FLASH_BLOB is not set # CONFIG_PKG_USING_MLIBC is not set # CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set # CONFIG_PKG_USING_SFDB is not set # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set # end of system packages # @@ -736,10 +747,44 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # STM32 HAL & SDK Drivers # +# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set # CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set # end of STM32 HAL & SDK Drivers # @@ -771,6 +816,83 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set + +# +# WCH HAL & SDK Drivers +# +# CONFIG_PKG_USING_CH32V20x_SDK is not set +# CONFIG_PKG_USING_CH32V307_SDK is not set +# end of WCH HAL & SDK Drivers + +# +# AT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set +# end of AT32 HAL & SDK Drivers + +# +# HC32 DDL Drivers +# +# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set +# end of HC32 DDL Drivers + +# +# NXP HAL & SDK Drivers +# +# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set +# end of NXP HAL & SDK Drivers + +# +# NUVOTON Drivers +# +# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set +# end of NUVOTON Drivers + +# +# GD32 Drivers +# +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-cmsis" +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_VER="latest" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-series" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_VER="latest" +# end of GD32 Drivers # end of HAL & SDK Drivers # @@ -808,14 +930,17 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BMI088 is not set # CONFIG_PKG_USING_HMC5883 is not set # CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_MAX31855 is not set # CONFIG_PKG_USING_TMP1075 is not set # CONFIG_PKG_USING_SR04 is not set # CONFIG_PKG_USING_CCS811 is not set # CONFIG_PKG_USING_PMSXX is not set # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90382 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -841,6 +966,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# CONFIG_PKG_USING_P3T1755 is not set +# CONFIG_PKG_USING_QMI8658 is not set +# CONFIG_PKG_USING_ICM20948 is not set # end of sensors drivers # @@ -929,6 +1057,13 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SYSTEM_RUN_LED is not set # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SERVO is not set +# CONFIG_PKG_USING_SEAN_WS2812B is not set +# CONFIG_PKG_USING_IC74HC165 is not set +# CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers @@ -945,6 +1080,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set # end of AI packages # @@ -956,6 +1092,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set # end of Signal Processing and Control Algorithm Packages # @@ -990,6 +1127,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_DONUT is not set # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set # end of entertainment: terminal games and other interesting software packages # CONFIG_PKG_USING_LIBCSV is not set @@ -1015,6 +1153,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set # CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set # CONFIG_PKG_USING_DESIGN_PATTERN is not set @@ -1025,6 +1164,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_DRMP is not set # end of miscellaneous packages # @@ -1038,6 +1178,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set # CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set # CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set # CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set # CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set # CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set @@ -1263,11 +1404,13 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Arduino libraries # end of RT-Thread online packages +CONFIG_SOC_FAMILY_GD32=y +CONFIG_SOC_SERIES_GD32F5xx=y + # # Hardware Drivers Config # -CONFIG_SOC_SERIES_GD32F5xx=y -CONFIG_SOC_GD32527I=y +CONFIG_SOC_GD32527=y # # Onboard Peripheral Drivers diff --git a/bsp/gd32/arm/gd32527I-eval/README.md b/bsp/gd32/arm/gd32527I-eval/README.md index eda047696ab..b64f32bfcd7 100644 --- a/bsp/gd32/arm/gd32527I-eval/README.md +++ b/bsp/gd32/arm/gd32527I-eval/README.md @@ -1,6 +1,10 @@ -# GDF527I-Eval开发板BSP说明 +# GDF527I-EVAL开发板BSP说明 -## 外设支持 + + +![GD32F527I-EVAL](figures/gd32f527i_eval.png) + +## 一 外设支持 本 BSP 目前对外设的支持情况如下: @@ -11,7 +15,7 @@ | **扩展模块** | **支持情况** | **备注** | | 暂无 | 暂不支持 | 暂不支持 | -## 使用说明 +## 二 使用说明 使用说明分为如下两个章节: @@ -23,35 +27,37 @@ 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 -### 快速上手 +### 三 快速上手 本 BSP 为开发者提供 MDK5工程,支持 GCC 开发环境,也可使用RT-Thread Studio开发。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 -#### 硬件连接 +### 3.1 硬件连接 使用调试器连接开发板到 PC,使用USB2TTL连接USART0,并给开发板供电。 -#### 编译下载 +### 3.2 编译下载 -双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 +双击 **project.uvprojx** 文件,打开 MDK5 工程,编译并下载程序到开发板。 -> 工程默认配置使用 CMSIS-DAP 仿真器下载程序,在通过 CMSIS-DAP 连接开发板的基础上,点击下载按钮即可下载程序到开发板 +> 工程默认配置使用 CMSIS-DAP 仿真器下载程序,在通过 CMSIS-DAP 连接开发板的基础上,点击下载按钮即可下载程序到开发板; +> +> EVAL板载DAP-Link,可直接使用板子DAP-Link下载. -#### 运行结果 +### 3.3 运行结果 下载程序成功之后,系统会自动运行,LED 闪烁。 连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: -```bash +```apl \ | / - RT - Thread Operating System - / | \ 5.0.0 build Mar 3 2023 00:43:44 - 2006 - 2022 Copyright by RT-Thread team + / | \ 5.2.1 build Jul 3 2025 11:53:15 + 2006 - 2024 Copyright by RT-Thread team msh /> ``` -### 进阶使用 +### 3.4 进阶使用 此 BSP 默认只开启了 GPIO 和 串口1的功能,如果需使用高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: @@ -63,12 +69,13 @@ msh /> 4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 -## 注意事项 +## 3.5 注意事项 -暂无 +若MDK编译无法运行请更行MDK至较新的版本,在MDK538版本测试通过。 -## 联系人信息 +## 四 联系人信息 维护人: - [yuanzihao](https://github.com/zihao-yuan/), 邮箱: +- [Guozhanxin](https://github.com/Guozhanxin) diff --git a/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h b/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h deleted file mode 100644 index 5361d8c17c9..00000000000 --- a/bsp/gd32/arm/gd32527I-eval/RTE/_rt-thread/RTE_Components.h +++ /dev/null @@ -1,15 +0,0 @@ - -/* - * Auto generated Run-Time-Environment Configuration File - * *** Do not modify ! *** - * - * Project: 'project' - * Target: 'rt-thread' - */ - -#ifndef RTE_COMPONENTS_H -#define RTE_COMPONENTS_H - - - -#endif /* RTE_COMPONENTS_H */ diff --git a/bsp/gd32/arm/gd32527I-eval/SConstruct b/bsp/gd32/arm/gd32527I-eval/SConstruct index 3917db9a61e..bb1d4085dc6 100644 --- a/bsp/gd32/arm/gd32527I-eval/SConstruct +++ b/bsp/gd32/arm/gd32527I-eval/SConstruct @@ -14,6 +14,25 @@ except: print('Cannot found RT-Thread root directory, please check RTT_ROOT') print(RTT_ROOT) exit(-1) + +def bsp_pkg_check(): + import subprocess + + check_paths = [ + os.path.join("packages", "gd32-arm-cmsis-latest"), + os.path.join("packages", "gd32-arm-series-latest") + ] + + need_update = not all(os.path.exists(p) for p in check_paths) + + if need_update: + print("\n===============================================================================") + print("Dependency packages missing, please running 'pkgs --update'...") + print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...") + print("===============================================================================") + exit(1) + +RegisterPreBuildingAction(bsp_pkg_check) TARGET = 'rtthread.' + rtconfig.TARGET_EXT @@ -31,6 +50,7 @@ if rtconfig.PLATFORM in ['iccarm']: env.Replace(ARFLAGS = ['']) env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') +Export('env') Export('RTT_ROOT') Export('rtconfig') @@ -51,7 +71,7 @@ gd32_library = 'GD32F5xx_Firmware_Library' rtconfig.BSP_LIBRARY_TYPE = gd32_library # include libraries -objs.extend(SConscript(os.path.join(libraries_path_prefix, gd32_library, 'SConscript'))) +# objs.extend(SConscript(os.path.join(libraries_path_prefix, gd32_library, 'SConscript'))) # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'))) diff --git a/bsp/gd32/arm/gd32527I-eval/board/Kconfig b/bsp/gd32/arm/gd32527I-eval/board/Kconfig index 9fb623a9cc0..aa799711f6d 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32527I-eval/board/Kconfig @@ -2,9 +2,10 @@ menu "Hardware Drivers Config" config SOC_SERIES_GD32F5xx bool + select ARCH_ARM_CORTEX_SECURE default y -config SOC_GD32527I +config SOC_GD32527 bool select SOC_SERIES_GD32F5xx select RT_USING_COMPONENTS_INIT diff --git a/bsp/gd32/arm/gd32527I-eval/board/SConscript b/bsp/gd32/arm/gd32527I-eval/board/SConscript index 34d88c084a6..ae6d4a07167 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/SConscript +++ b/bsp/gd32/arm/gd32527I-eval/board/SConscript @@ -13,15 +13,6 @@ board.c path = [cwd] -startup_path_prefix = SDK_LIB - -if rtconfig.PLATFORM in ['gcc']: - src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/GCC/startup_gd32f4xx.s'] -elif rtconfig.PLATFORM in ['armcc', 'armclang']: - src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/ARM/startup_gd32f4xx.s'] -elif rtconfig.PLATFORM in ['iccarm']: - src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/IAR/startup_gd32f4xx.s'] - CPPDEFINES = ['GD32F527'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) diff --git a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld index 5bec095bfb6..6fbeea4e92d 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld +++ b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.ld @@ -1,13 +1,13 @@ /* - * linker script for GD32F4xx with GNU ld + * linker script for GD32F5xx with GNU ld * BruceOu 2021-12-14 */ /* Program Entry, set to mark it as "used" and avoid gc */ MEMORY { - CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ - DATA (rw) : ORIGIN = 0x20000000, LENGTH = 448k /* 448KB sram */ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 2048k /* 1024KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 512k /* 448KB sram */ } ENTRY(Reset_Handler) _system_stack_size = 0x200; diff --git a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct index 56a5b1213b3..51f82cf2028 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct +++ b/bsp/gd32/arm/gd32527I-eval/board/linker_scripts/link.sct @@ -2,13 +2,13 @@ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* -LR_IROM1 0x08000000 0x00100000 { ; load region size_region - ER_IROM1 0x08000000 0x00100000 { ; load address = execution address +LR_IROM1 0x08000000 0x00200000 { ; load region size_region + ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } - RW_IRAM1 0x20000000 0x00070000 { ; RW data + RW_IRAM1 0x20000000 0x00080000 { ; RW data .ANY (+RW +ZI) } } diff --git a/bsp/gd32/arm/gd32527I-eval/figures/board.png b/bsp/gd32/arm/gd32527I-eval/figures/board.png deleted file mode 100644 index 45f85c7db68498d87e51b6dd31b1dc04921f6172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405988 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�_b7Vf^2jZO>6qRO?DSngO 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≫W@uP09MuH5y;$VyjhS&Su4F>iFz4NBm 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%0AAT2WiSPM_aY3mibXIV}+%b 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
P79!Xa}a%eZ&nu)^kQTx*^7DF@mH*{_B zu(=*QG?Ym_BP`K?v3ewHptBF|Z|glAtg{vA0HK>#oPm~?L^vL;7(Xi1;HqtRu-FWjv_z8mwd zIp(7kkBKoF(jSpGeaV(tnMKD0+@>)VFMTvgDGPOpsuO|^*ZZ( zFpwE8J5m#4PlVhY+5Q@<=a$bKFe-&fzOLERBB2pSdco=aInwZH-WF_ip`7cLaj9Pk zSBw4dcyL=8Pa$L4#H_P_Z}9l)C-@j@xJ{bSTq&=v%Ic0R2*(%Fjb4P^)F9#kis96U zcQ(P>Yrl(VYvbDo&1PSxCxcFZX&o;M>G?qdodV{;q)xFBUU

8zB{&%+D<3>I!fF%OT}W~u#f2tq#A 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

CnwJDWOdE1hJVIp52`5$fN+G|tQ<8d! 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%0A^sYg?1~gx0Wsrm@Y}tXa+eFhM#@AT=W$149Fp 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

K)RY+Tl!&3bzW8U>y}ihf$0b;YOq~eFP>+TzBn8 zbaltD>*b^9=xoN3qlYOUJJHderTnUb%Uxv_FwB}Y4}16Q!1GUUAuvCT%JN!lyyg~E zR!+uak3UOrb_(vY2nG8H0YilC7i6(~IC<(Wp4S zaL9nqP_zcCS1-r!eexrC-+SJQTi$ey876CPI%8yRbxpll=^L$_M5R%VieMvgcaZmG z(1}v&iK(sDsVv3tJc)Mga6nnE0}XUcV~LC4zEr)Q@&cn4tl0Kq zy{mU6)sINng;}#35Dj=(A2EX09Im_WM!fRMA+v5k!}r?SNB~XrC)&N3bB^s4|2RPv zuNYW5JfP>wkNCm?oX&Gyi^Ix^Ppy~nXZgXtFC$NQNJ9FK!Z9uZ1aBBiG;57i^`z-4 zep5O+vNIZqpuM9VI+xoV>>%LIJlXu)xu=dS7|%I9uO^R0!A!~c%zUr#Ud6TfB?!%C zNfS|AzTpxAt1g1yFcvLZ#kQ}qbE~w#D@B?e*GHK{2nY_vKXgNpC$l4gE@0&nT3klOSQJP3J*T? zAf`=eq_NjaUZ^0*ybdj`gEV}Ol713czH&DD`r6RfIY@(M7OubUdeheGm!WRf z0)(f`L?}X8#k^_0u|_-&9yo@Mu3mGleJB*AENEw0hfrTXl{`LzA??pzL|7@xb#?NI zH(EP8%*k-!P?+VV@kBaxm)cQ+ezvi6hxQk~@uq7LEf2y)V$f8TUuJ5gxM^G$WCQ2Y z9_-sQj2Ab71p|6|%4jWUPDz-;%a2kIGfDiGoYoh|HFM_(2As4l*c30>a*T!3H=Q)p3&eC; zzj=C9vXqNf^=fXK+oQ#UR9RGC?Deep`2@cSjL-K}>dw97#b}ZOl%TVWVM_#Zq)@deiQjcA9Kn-TNfU6< zvIP+zeUQIHDDy;#tIAPE&{1%Wr#(A0+%K=+PH(B4!f8&ZO($#eAiZR-w%1g1KD9lO`G)Zts<*Ph z@-4L-%c~@Lp%d?G^|Th~%D53|6MstAF>WExTAZZo#hhX|&XIj`lJ6IHq+gb^y|WVo zL!@EmW%r(4G?0!OKw*k6-Y`5__=b`+qa1urUa~U5DQ7`mP$p>_Nh}^C@beRR>fiyt zsoUn}7JUBCKaX#I<2y8FrsCxBHZv!D`J)WHQ3EK@xcu97$!YGLwdX$-}vSa@Sp$jO&mUSiU!O{WAyg+B+%O2 z%eE^;COv{<$4;TUy9d*!Pa{BU!P%xJ)`3oR^uZU1Ai*%(aT4Bf&)e|ugAY=S5&DxiF2C$jGfhC4Nc^IsKMx!} zjLu{X1FY+*wO*`Uv6wPIy_!MOqwJxzm$G+s63hx8*UFhao0EE^j6W!%K8<5SP$;I8d> ze$xQD+JS|0qgc9Z4J&;*1*95_jp8D6l@a;7se1Cv90@}k-J0G7qGz+;7&B~F<`xK_ z6|aJqQh1fBA@r>RZ;1gku~>>sXUA(rVt02hPM%aZy%Z9K9F>Tp#7z~7X-w?@b#hjS z6ubmj(Qnn4;~W7~_;r4Lny_PGEReAR>c7IB%fbPQ1DCgW;Kc-lV0qFT@jJ1J{V{R#k3&60DmYlB6GshWaNqJ@da zh3ANy;poW?A=K9R5%PzT*51Zhrkzg|!cr!w7gfEfPVcBT>CVwerh-)yjiygw%Jf>y zUpxbqHQF7a6D!uv#DWElRAy}ik^!@FedU@3ICZ*-<=jTFcNhNruRev3fBbi_YRx64 z$0?J{V6=1yzF-cYqj>$@-}@Nuxb+Sy<72E_KN==gpvWcqPk`V z^IgiiV}475tm9hNH-SBsWT}o@%o9-gL&hN2qA@jIIO@fvm#xN)8!yH5X*J~e1QmP> z7A=~CB}?YxiYqs;esY*GeF_1?Ni;X@$IO`#+<4O(Q?^JsFm-wj?tc577+{<2*tr!0 z16_v8GT9WeDYfG;f{_pvvF76od`gCk7A-w$4xYAXVg)j68Vlymz~z^(MrC<`ptr;H zU@cj?!Yp#i63`i1BT)&&h;EB%dORnL>du_p2AsP z8{-8FP9397>1p`Y%|OnABsm#n=jMU(PvHb4tdS=g5>ViK#?z6gexIK@%+L096Euxd zhuMQ1)T1apIFVD&z@~-E4WW(8>P#xR3X7y_H_xF?5>M?EFTpCUx zyzs&f0!=>y`x!^=s5nf+7;Ki$j5gNy^bx)rWjm`bHDoPNt)5545hxd^7O0Yu%7@TF z6+3q9!Sl~;F&odfxAtM6KY=YTy^Q0>&f?U`vsk%u9i~j0hV5H-6y{PaR{Hyx6v7KmP7-{uygmugBs=OYxVV`)54(^KGoxN?f|( z3LHLi1e-U%NZ`BM)Z5y%m!gZn?D-eB5U>s)tvQlzKMfw8^d@T1N_`qG4C^Y>qCSE* z8i1y4RenM&9RsSlpc%gNxWmLhJ+xnGu(}0o$uNwoV?A?}9odW$Ek%+>S3HqGG#DUg zbU|m}zvaz$m~y*4IFGwAAQC7&lS zWl9wmESg2y^P!`C08OVmQC-=QB`Oe|C_s59=B3O@!B3eVCSdmP zwT|{Ir2!(tvYfKu9rwJI@?TRUH80rGsG-w0;3fp2`MyVRc;Cy|xjli3Xen;kI2|)) z&P2E(YUYpS)dL|bu#6cmWd?KV;Ab()a-?Gl(NYq2NshFu6HGl`~f9dk~-6vtOtFRUBAFRlxDC(ecOi^Ezs_FV;Yf;#c^+ey#H zHE+$mcx57|I7TrPT^(l(J@cCh7$qWa-q?3^O5c9R-rM-<>9hb;3zTF4Hq_Tq0BYDy zC#Wd7JTkd7a(OCgD%DW9nxM0q24V|ddTA@B&zQt#J}Nvvwr$-*A*=;I1T3bl1Sl^o zl#_40ml7n1IS-KPz4J`>x+<)$O3QiHk20SZ@Bhe0ar>Qb#p-oeVg90p6x659sUOxk z-%>oK;l%gwC-caDiFmK*m%$vUu3l}cM#_MlI7Zqnm8?AnVg^^Jzxn$Cel#)`&+hquZ z!e%9W2?4cM=_cZxxcaI~FnLNf`ubYX)2(x@Pq2-026SpWs3)F!lzG)E++Kp#VW!)M zOuh%1kpY}(I*h*lE`p{o>+Bd#5?t#fDuKmJDuwF$MuaLW2qd*nvle=g7j;O0slzhE zo5E$KB~nH?D$hPlnOuoQ3ujWHjiRmn6hU#X=_TH=bB~cvUZ0N!LSZjYL+=;T#`(^X zX>tmyd*`<^KU6;jGS450ut$t)C{es3XX6(edA8@&{?>atgs&Y7v{u2S!>9tE0^4?H z7aL!{?S}3&1PMY-EAhGFDZHj3XrpoEOY?cPy4>v|kYktvJC5u0ia9fXj?M;oHaC-}edz9qkuDNAaOkAzvC|1-0%FXB{xKf&Egj8rm_@7d z=47O7MgDH>*1U2z2# zFPx1Z-+RBRis1AZcJ0~+zrULG7ooHW89?X{2pD#mX+Hb*9^|(|m^FJgR;*r%#~yzH zLH}fQw)f(NmtJHVM-Yn*qNAhJfZCT|-i>FTeF0vA#vCz;t}>c6t;9nxs!nM2-V2=R zWHSO8go0W)?Iz8$tu$SSbnP+mXwZhL%+3bo6?KRW=@{BP+Z8Nhld|fm>aEWc+}e?; zNJSazYzBOuAPycngWhfe&Wz?I51ajK1K}`@%n>9AfQM;l$yM;#JK2EP9s8@a_gIJHsy7AhuVmFy*M9FQsXEa z;0OzG8m`g-cuSISjV9n?Lyx4$2qP&1&_VhE%Jm^;I>wlB8VOomD}j^d?>ysY*bq50 zl%e5zt#~&?E}|#%YG_B`X>hm$huouz(b=LWo%m^NBw! z6TV*0PhQk9)P#Tf_e(h?A>m4|@{Fy9ytq>sg>}LkUwC((<3lrdmfrRZSbr`Ky_~HJ zTbK5^6{=3J!1>``n|IuW-n>n z!uQTIN8ycEx5eK1mQ|S6D{axZT_9l>M<@()b1psk;`E1yrBEFOYtvOc$7?$p@lNq` zIVY@D)_Sh|>$y!+bEmXTh~A486;BH`&aGVL?=*#;(h(o#vIL}BRATa{Aw~_=0+CP< zeh+~PQInZpDUfGWs_x~~E9#}!bLW}fE1&XuE@iIosw}!HoZ3Xask*9;l#cT(f%5WF zR8<7<;~#wkpZ~Mp$G5)rujpz$!u%?}yjH*KI}WJT)yAcyv!6CSs#GezAcm-H4jnv! z+Um*ZXzjslbvfJ( ze<(`@mcw6s?sxI^uYMVS`}coJ05}SNSoPg)7Eer`Iu(l+FTqt;U5#ner(?;|dARkK zTM&u5Fq|1gn#xN?K#7la;1XC!6TE5UNqapKq-IMI2-KJ!o>VGfPKMEmOfm>ilELYw zBM6ndFn9iB+;GzsSi4~{-g?iCxb3cMv2f`$TyyPO+;#WOxa!(VsOSl1eq=E@0Vz1oLX zRV}_@LU#4IK;0Pcj^_mA)XP`Q7y71TlsYZ+PTqn|(S_w-%Lfi0TfpYLr!ZH|c7K*zKWVM*z+S zbG|vAS6!O4^jmo~=@rtqFV2-uRi|)zqkF^KtQW0f*M6}zwKOOj8;rq}BQVqy0mqv~ zNdnr6>v)r<>dU63vK!#bFGvq-cN>*UX^~*y^J=>-wW*GV^$_%SLMJ4axl3ti173gfmXm@&N>dUuDxbUrW^s5&lhIh5JwPG=p;AIW!6?>E=?sQ zJ%{+-PhQey>(Kt9Wg2ddnEBbGIy$(-N1#@UXw`Hi(kg2u!D%JG!S^FR_!(A5?~;;9 zhjvRNIn~*Q4ePLH_f8sb8q$_wGm0=lT%Lx4WTp1sj6^H2WbS-iv1BEtO__!PKGP|a z+J!(yOPqk#uQ*IQLgSOoLr3$rx1B(PD~SoxWimlsQ0iv6X{dTg zyR7RRY0gJpRPU-rsx>Ek*0d>@-7pi;U^(il8Zfz`k@Oj0xDdbVMy!8;b>44Q&g+08 zO>?S>1X0emFk5uFwbhsCPmA&-MBkX3FlLSxcnKRuyMefAB@L%zv=U;-r~8o^>LF5Y zLu#-EnOG;XL;V=ybx?DjV(lcfHu`o9#5)ilEW;kWA;MVCWa`I{T$)sTwn-rWFOmjNT7m7ZwTcxWzsUc&O6ncE*q-^beivmcB z&-Vmmw77JW=$QlL@5uh=_aQ}=i~Oqr3! z@?~?-(RQ55k8#YrQ0H4t9Os*b=cE0+oJFZy&#TeZk;bNH_v5=?e-K~%r=KC#8^O%U zmlIsiV*NE@-`-{lU_asmBiOm)5S7OQeD44LF~0imU&7?ZS*91WtTaIRR))U*9M*5R z9v}PdPvS5B;`10B7{*Y1lnS$sirR}UFCM}VzW*?e9B!uIrxNve(Mbi9RaP{TG&;mG z(3tncQR+!xltz9!KZp#KvgnT)GVP(0aokd_RKQxysUA1&LJ}>nK$wPsrd#Yku-DA# zJ9VbntPXB!>BNy^XQ=pch?F<-J35M4yO@NiaH7lr6*z(vyFto*fd&F&140S*ioAZC zp?GFT#){?@G8FTaHFG|7j=APt4)pa?p~VR7n0KZwWhti=JZWi1U{T)TNryij9#B}(t(3jM>zJ`O1`v(TG1aVI&oRE%yEK8ZR%EABDbof5 zby~<23Wv=0Kq1z9Fc4%LL{T2q{Jt=s>41lFlt&^aonM7B`7H3GxgRYd$WmL`Ih-1D zwevV5#vA#dDiV*HD`~~>Ez4ez2^Y#e)s>+)Ii_#CX+_c>L7srPpGKJ$#oc=AwU{-# z5m#KbmPXDx(*IJt`+aXFn4FGaNZ?Do{0ZE4$MyK|N8gD*{Xf6Y`|D6yrBN4cBQ#)) zyAOT%9(?N4zk@&d>?bi}b}hkFhJZ7TWV(mAq7CU>KZZvJ**01XC*w@*1|(@fYHLT0 zqUwZ30cf+JO!IXKoOEP(L_^FhzZOAR8nCpY0|f-8NhNG=4_w+wfEdVC>Zbvr0|#_c zoD8jq8Pd<^tzpm5tREU2q+|6^E?&5dyp+Phqq`9#Xx1|Ue9foyGJGnbBhN<&LL=s6 zx+)q9UV=W+t_~^Ce!p6{rxPP(6qzZAtn+MIXTm4>9c`(ko=2TPnW1q&$(GJwBqPJe zW6Mj>XnVND1Ink@%y%s{>6bAtZZmab>Xb$-owFFr<}WhGHETAB_WRXg1jNl48jK@0 zFu*j*5Tdc*_pl@*Ir41Q$QZ->rlX)hA8)`-2tqa4x34EbZf522!`j$c$3G3Tu<1k` zsi7{U;>}185r`(ckVy?dhx4ZiR%Hokvb~Ov(i!rZj80ogVkk9etQZL|v)F-om)8nJ zhv=QvgJOLCFwYE+8N&bdI`i2H{BNvd=A61Tc`Xtqzq}i3r(*Xj{lqxVltZ2$8dE?P zxXF*@Y5e?6Kh-U6}<(=SfTNqao+ z+12l_&%PT$oP8NPM46~Y~vWg4?nOKEvJ*bZ^m;^oxx9jv<*M` z;S+e_nM2t0+$%^Y{RsLe;q0j-_UvrKs^zz!zH%v^eqtXwnpv*lS|kPojC+tmdj{V5 zu8$+^pMhtd+7EB(Bz~rzK=%j%=+k)Qp)I)Yr%z(fuA{j3-beA^&mT55Qx+s}cQdbL zTD&vJ>i~Zz2$rdg`AW*O%;lx=KZw5Gn3?+*iPqxe$u=|m77Ep(rgj=Z^AWUl3}ElR zqj>7s?YQ?RPvgbSM+uP2aO(6Bp4)VY?^>zs8d#N8RI~(0qvce-Vd4||e1y-m$+=dt zQ_&aN&g`zhtL^m$bkdDB{njyq>13L6pMXIOwdgCI|{yg-V)H@1_*L0J8kW zoX_W__fh%lYVRE{C2i?(jK<}h-wrQpg}uGE&n+KWdLE-`>x*T8yvirCjQbYFIW77^@E5$eF#BVlsQ5w8e$qX-( zH+AfypWxHZ;5@p^LYU_Qt^zx;6cGJW7 zw=e%a=FXdhbsH9wzLV(gJ%f!mZa`nG34il78-N;=VsbM>Z1E2`MOBQz36P*GWJ7HV2!Uvwi7s+|Ky zamo5MW*T8@`!NDZ89jMaS4BxPl#`S(3A5iSza63+(Hv6JaGw06Lwhuj*i7?KyRe!? zhdSIq3%<2A8k+`w_14RXU>u#atnz9%5{37AG>w3CYv`YW`8`dU)D$XhZ>hzFqH%4p zB_9lUQD0Mukk1VtzZGEG+Iv_dT8h`-KWKIoFbhwame)hxV0ko3rk+;GeWj=TzEL+J z_YWn8(Q-C{fqpUfHkL12PI{(eo=LFL zOW0~2pfMCpRq!1JqKt1TG6^=bZIb3#8X)O_K0zy`rQZ(tbe`*(fTaUEivg&Bq{2IZ z)(NZM^rK05yukeVv$1*e^Z2)a`E$&lGZi!E&87g46~e1Ml&0e7x4gc~w9A-gSrYkF zE7S2IF_gie+2fQz3@#ixd=Q(Se-5v_vJG9Gt(1d(h?duy-ohb9f8hQX@xJ%{A>RA` z&*1)_ZbmHTr@WNH@Y09}zWt2{@aaGLNBq&J{sqrGvxhpNh6cMAyLTQ!%b8|YT^M_J z9VYmE4B!3Mx6yR+1oOrGYObD!&OAh%tWVQhD4NWtP&U#}W$s2I){g4B>6kNbDUKg+ zWqwLAWBN)emZ`{Q!)&`6f*@e=!YeRk(lX>S7vs<%hv=S-`a$T@Uc%xAjSGbw2UvUrsf-OK5>HpMqI zOfR~%^lN!r&f$?_=e$!KCry1%J+^kpzt9eRZbkvrJIpl96a}V7RxnOG00;zX_+7lB zaGJBJX)G3~zCl;0i}SoGhxN+0Knnw!A#)j-y4Pt=+G5QXPvQ97WVYZH-zaM5r=DA9 z>r8c_wsgFHGckfu)ngptCrzyZ@&w7-0>#7 z^WAU9Ti^axtiN;}0q{m#dCg_0sjFZw$I2a-@b5rp^lFWu9vqK_$WF zteMks>eLZ4uUh2{Gb6KR&LZCc@jwp0C&*LkxlI`GCw|K1NE6wVd9GtJ-2{2+sT8ms z)vgnop2#{bEm3$6ag__11ZgReW&3I*nRtrLty8R0aZOEOei+`+Ln-N!yg4eKB`ufG zAaVPdhMRoA=F= z7RX1g)Cx}e5n2#=3IGZ-?HejVW)v5}rPr&jU|FUb21&4?bn1aDYb#`QwG+FQHO(R| zFpK=J**OAhTwe(Do8}Dh$rt@D+!fuwG3TUh?#sQ%M zu8ObTQ^ps_<9ACaM9q{SDk{^frD>@K_-av;!U)K!kODO7>7Y^@$s$H2q-a{X-hQSF zr;cvHP^_Qt!wjbl`rS;|YmVsKzHK)SAKuJ%DWw9_;tp00m5RxaR+N{zsT4b@=&0CO zkLh>}`5}In;a%QxDvT)a{VWRoFo7YJRbF-A@gX_XkB-(3D$07awIy)oY#ePZIeh0^ zPvYC(d=NkU{y@YVnPIl=E{{QT!H;h(ir_O& zV4grCRh5+nlxy26^%$#n zI5s$lSUg_%{u^_K=lGwI3A!&h{nYvPdamJkZL6dy12HW!VL%Pjn^T`y4!Z>v>rV+V zybK8eDU%?t#racungeVLdx7V3wPj~lA6|TZ8)@!)c;JCYaQ}S|W79L64ZT14_$KuC zC26N?tSiWo}jj1WP>6RNXd+t=T0~@gu+`c@9N8{)lXd`aX z8Sex1+P^lB%P(7kPk!QE_{fI{WN*I$_uO*}-uAYeao1fN@upj@#5LEg!=;xk!zCM* z!xtE(;dvGm3j~pk6YnucE6EX@k9ng1ii!AVY78-IOHc7mAtn+EDo`p^2XeRtK)zC^)FIrb(ur; z=Pe2$Tt(|ONNYDzj&P*ToJ;KS2jMAeMCnKaGgo7_ZPBV(?c5&-M2YsptXz5mRx`&_ zii+ODRuzrQ0x(^=Lj44)B79klI$fi>w$>1Mb8|DA&bClME1Y^@WaY_O0Al38FTv0k zb4qn0|4Tb2;^f;h`Iw^rMNXnZ&IxPcnY*!faz;oMoV_<6wGYO1#jz)LO3F#wxmw|F zZq54(-D@dVu`5o)nj`vetbWc<@BF;TnS1?Yz9w=CBQK%s+{<0~+tlv_`FFzUy>qqq zPIxCBo0h$Qbvf+Sxi^H0-K#i6zX`6JZx81k6?{9&gkfGx_3+Td`=tOv(irpuiS_F3nvUYdHy2 z^+bwybrrZ%Pl|w~1ex+AK&fzgr+5l00O_=!?)6?kQekwjX9Q!+V^vKxF1ch4rcIw` z=H6|4=|yC-+Fpq1XyE~slHE9;-z1PiDdV$DE|>NS)W*>i)+4g++fh|lg=l36iTD|K zLM5oI^dLi!in25!-Fhm)9=x#Wd0ew`HU98VKa9(+xC+g!z3A&{VqIlW=F!5N z7;bvgRrtt9-eET7K70BYF279yPMzvt8vyO? z37kEnZSLCG#HWuk){k+ht6sZZxO1%#}kfALEtv zMnz_NRg4pz(etOk%P4`lj_k~42eEkZY^++j5Ean?`g__9AYHj)Ee;(%WMsHHB(x?# zU`{$=j4sD_QkE9@*>5@v`=m>p-b%%{L+zG%#(2o`vYwCe*ciyt)eff?BGB1e8e6;} zTw@G=kM}zDPx;l*w)jP-B584wG1~YIXNXfnmFo4=qA6|5Bpyprk!$XvnI z=B{uzf#bIdB{F3*_spN>-bSNg%%3|41A{Tt)HRrm%(Y5h2S~8W8HT`|vdJt6R!n1z z4KrIZEM!<}go9U;2Zd4D#`3D~sLjn>Qd3dNZ3%|rLpXTwDCt**Q4X){J4(=m29jP<`En^xEa$4F0a4lR#%msDgxleShivwmMx!;6)Wds?b_v(BWtmK!vQj0JVe<+Nz7XJB13u!lJyrYt)*-&V;zoQ z_twKm^p0Rk<5UELIfBwS!@E!sYQP{xh!)dz^~F#-$%9$*8sQ0sarj6J&Yoqu?g}I` zDS}Wf4414|&noF!bU^;qqA9J2*C7^WUtEITqz(@n^|0&__`_aeH_csj;nGVlBi4&h z{!osp7=~8fn41uUe)mgXHb>V@np}bzv!fVwrP+941VS|k(dzaEBPjDm$b=N&qm>j+ zERg0Lkl;ngw2yeDfS{G{;&U%StA=5uYc!`VY+erFYSu*Z3Kxa%WF&9mVPY0iD&M{ z-W9vCo;UN+!u@z|yx0>vE8MNKdAIjPkI%W+Qm$fGoW?mN!Dl9wLRvP>SAR^yQ|H`8 zguR?ohGO99csX0Hv3AjOg_S$kBf?ziy?!e{3R;MMp0mS$ww)#L9p|L2i~W}QY1~-b zo$qY83q2Kv-W4fT=X-q0e-7Z*ZzrF$kO|^6cTC3=dZ=XUYR5pRtaa@XDn+F^Wf=-4 zfzVL2idJ+82M-X0zO)(h=1rlXDkD#qVB6MR6vSG2Uij`gz$g$X5UR@2GY5pqshp}4 zUFG#n0aH2M3)G7D^-Mt20jWvU);ChQTty|2!7B$2V&%$J1YXVP?`vWCB!e6fs%>Q~ zm?|k@UZ`Bn2{LNW(Lsz7+(atM@u82t7nfhX4%27X;Z3()i&bmq5}10i=8{ENzIs09 z%$bDNwk876PQ3HIH_#Z5VZp+A@CO2B|Ii#2K`z^Y>uz3+-~OF#n~7$Byno zUA+&JsQ}Xy@|RtC8Op25F@MoaTzTy^l&L|~O>RU@Z6j;Ig;b8fCd>L$Rcf^^6*NZD zaF+}sSQSDho}li?nmKtbO&#d$=tFP!02LEUN#GL-)Ke*GSdy|75e&1fUGAV6rX^&f z{_wH9RSciCz>3OngaF^`lkBGQq4F+s<(bzZ0x&`U0#O@K!Uy~*MQn!kJn9h>*y_jZ znUkmdS zyq*u69!-{$_xxvQ-2r|D)-Yk!i|T+`U7dS*Z9cECnoB30q?OsW$5r4@i?6g-q-anb zCvLvik&1rP8}ISD%`<)5ryV1hU*%If2MCngG8Zy(?kZ<$v~YiMr+nDqcHXlrS`5?J zP>Z>9<`8t8W&63%KafCAU&??`t>hl2aigt;^bKp6iWe-PGzSrsP>(wmWEz-W)9UE- z+<3|l{jv4qVAhj7_S`98S-f!HPvBr2L8}sAM3`2uC7iq z)UCOhjAcd~Ol^u6$S+>M%S>6&x|*S(K7@k9lsWZ?R(O$$mtgOXQ;78m#M1b2CDGbC zL?E7Eox~9iMa^k(ZC!n6nCilu1r0_f9Xfmp&1Yid>vDw4h1qljYnXKDG2arf9@WCF zOw#a^Ml*!BvcuY)NQUVsya6AgRYB6fozJ~){RRZXcJEZ>-|9q_B=#DtN;p1}XAoReO$pe)XtfQ-D#DgmViEuJT3eyf}XX?kJV^jzW1 zyrd%UI0H_MXFUCWgI>J>#uxHyyz`6!&V?&@=eImFRPa*x^3HD~4jJD9sPVpGPGymo z*fUmqv8U3}*J#L;lJ>M>&#c-jg#ATMbyD0e#qDF2mXsR5L;4b*>E5YNTS|RbJvEM( zr6|w0<9K@np$sssEY>s>we4`hOF2o|N?}>0MSXkjyG+6ObM^5mui;TUm)dbG4I{G* z;yLo{D1D(t7+&dufkO_FoOHk-H!IV)nqEC4i&OBon7ln?AN3d0*A#DLqg^_c>r-sUP z6_^zOD50>{wnf@gxW{Y&ou%v$4Jf91Yr(p;y{CG@Z)?+aTK>QQpLFrQ6=m9Zc{o8O zujVQYd6&3hMQ*M6Tf>i-ur>8 zuylDPuD@X^{_v0Ai+kR69m7%fB~QWSOCVTFx(Tu_GR-K>YeldJ$-y*oX`SPpHVa10 z{)SY9>ebfjdC@}uKo9RnF)-MRR3?VxkQNOMAfHYk9UDYe!^1rUt;t~m(HxTTIEK?{ zBw_<*ibIybBALvP!YQ*!H$h*N3O-B)S^)5*NwKh@H_~z5tO6dvlqr*`P3msz(cSOmCW*V=6$({7ar2s7qj3;0Y~ab>!JO87PXCz~Q&dPdc+z z7y*GZZ`1Ox;-~o)%EmR#iHuzLfRqV;Q{eyg80i-=jq}TA z0Z%TM+2%zQogZVk|`P`QjcPOSo2!Tk?0>n3k?7l%a3_$Lt)>$)n~oWJb@0U-ajMC2 z-J-=VEMFEtZA}m@&HW^ZIO4q?q+)(%f}k=NBvPhTO<|N7r9doYrBZyz+Rl-&S*QGM zfq3gi;_{DQ4}}~VCa_ltWc&LU zJIh2?X`S!Jej8Fd=L+8$$6c6?rBUnj*uHYgYfEO@+=O$&I_W!L*E%PyVt{_3w_t0m zE|rdLCwisFda?Pl=^CX*o;7NZ!csM_Fan^8p-~NeRzq@9LL~&M+81wx`4X>Mu&R~9 zUM=24GH-`u z`;FvKAD(~yX|pxXZMWTmgRi`TGpBb`hDZ^#F|AgHQ*W8#_E@jsX5~fMC`)4`!}JJv zboPBu7vwKQ2d#=kJZnU3Mp7AXnl`{aqElz{|{{aw%*^+NhnC)cB{uF@Wh zJUWPcX$)T&ZaI)8c~K7fv{ZX7#)1Wiq6&B7#su_1wBf?XHGicJOH)IP;Lq34$K z)n>de(7tHb4#(@;GM4n->Iw&>DyXgwFY12molQqhc@Y2-C{-`IyaQyl%Yy;MCXP*8 z;mzK&)IH)ejS^^alG&Okr$r&dri_EJA@f_KeKx;Z7a`h65!4e5DO@E4!^1Kj_!uVdz{$>`}NkCvt2@@m90i(ARZ&%g9A-geLJ z1pFGM$P&a28335g_Y+5GekKj8^pH6|w~9uNIXHnl(AV38fqnvDg3){Kxrgs6@zhg~ zqr5zfkA3XJSi5d1OOYZ?%lKtpDk>i%ks^TAUZ1oX5My1OZtF&8pFk(g zavCF@eZA-#q7lwEGpE;)Cb~MBF}XI1-+KR@_{<-E5P9aUqqP|s0%C0gr%ngcxkt=J z8_39a`BJxVnsfo_Mf1X024OU__>?kUJ0F?O9=+C|A;LH2CLE6MK7KD!11w})5=RcC zks0z((5^sD%_3Ih6aq(`EgUu#r|#+!60+F-cdDmnEa$--6xRa8_Pp?(nSgnSF}GLaXP`R)Cb4_|R6wFH<4^6>g$@ z75}!v&fJ;jj(6V4ncqcme)Z0N=e0N|Z|2HqY6tx@u8_=YP3^*RnqKXq$ZF+_IVb*w zPU%hb&T-B+<%;jEdwt(MKP{`k95>#*HMndVdZv5%v28z`^mQGJ?}QuAkA<^w4bSko z1f>&3=_?ERrofTn2t@kHclz!W0;>A@IzE;XmC}-@qSayzrCZ`5$f`y-T#W+E80}7$BuE_G;s60n1MMKKeAR{|Mgx z_IvR5x4r}GH>}4kx806wuD=17UU4O^*?1$?t-pjyWi_TW)>D~H$Gq9Isf2x)KX)PK z&Rv8xYc9pjH{FR1>#wH#nuM7%=HbfAuQ%mwYd=FVMTtHdJXdW#PYo4V3eP^h8GCmf zM0IsN1%C*!e)YEcO^-!m-ELXZO8;#~NNy**Tp>cL_{q6d1@`z$3Vr#%5p&z6*$_6Q~Tpq$j+kfujZ3v396?0&ApRMt8L zNgKZlP!zmQSSW_j+#Q>UVKGCmjXTGu_(}0Q=kwyPI^*&xhm9LR-`0uedG(cb(0yA^f}n zbK3nyohfdQ587~C`4I3{uH0TN_~4ECCGR-<+sHe8d>qG58|Rc+S6e1+AfHBMd5FBw zV5VhEnmiNrjWeiA8?bBF5z-ATNrSwmysB{p5!+FxX>y7H_)cHnenf;`FIQ1hHMX=N-3V{rW{Xb@CA2 z_x`sbOCzs5>O;e%T0H*vLje`ZDW2q2nFCBLe7RY147Z4}d{xv_l3470*L8qxQw(b5{nBTsInftVtWtD;d5GG&yrdO*A& zUeu_8_?{q|G%Eu{Q)n8eOfvMQPR6B6R$%S|o$#blE6ZorzkW9%2rV7lfn8g-WAEM+ zGYSgua?D$>42=!b5TF$#g`wU|EmTm(NY4bOc`_msE!6-iJu_!|H?@+M&ty%Sv<=hf zj+y7b!ec(S$XZNLRaIl|o0@eNY5|0@vFvc86)GY&iUh-ea(Y&L{Y`Nb<*WF&>QLoT zh3L8Cop*BPcTt>Qy|dq$$f=&k`@GFp;fGuynTw}3zAK(qVWt=8rqI6QIj4>s=hT&) z-WB(NjOQIU-n~Ot6S)i9$8j3gyRc{1absz}x_!qKq=1=yry%yd4WoM}-gr*mweOuU zV`Wf}s7c3+BB*ChU`4~7dH5(0U1niYDW*-GhPs+sla_c`?JJXf?rJ zCHC(-imlsrV#(4u6sYRRE5)8Y2M9vdYa#%u-b~H^RDJ0C0-0lVV?n4Dgd_O@%$+wI zZ++Xlu$Zz&E2=d-emOx+|<)!^iNGd!IwB z$BPWp@DdcBKC=&PRAMddU3mVvZ6^M;*KB0_R^juX|2lemOVQbp#I7AjaOj9u(eKBe z-G^}eWD5=-IBJH;QAQwddZS6pTI7;SvI$vVT3t^tp@ji5`!(_;elb@W4x}aH*`BIx zMmMrE5Dc4RPTlk#^~w~k@}`$u0^EtqfBLQGlIV8Wna|9BrG}m)*F`h2fgXm)@jF>e zpH_=dP#|X%hY#(?v13OV$Atrj4zr!21iiMmQHo7YTNha;+AgF|r|X5@_I%p+;xjo5 zCYjlSvj&{5>e$e8+j}aosH?(i<-7%(7JTZecux8zKE0B4rc*f!qKq%x3o`0nWie|V z2tYNJKs~0Zv^`}^TQzARh&J$Ng)$u5jQUL9vEFg|Aj?HABiHfwtGz^l^$wpiN}*n| znG_AkIxJi?9|Lg>;YKkyn8n~w7CU#m!uHTT%Mude`$eA-MgQ1A7*-=H2QX{;ECV3p@gWSv z266XW-a-&phoeUh;?hgkp}wISG0F%nzL__7DcW1R$)Bf*akM}%Wx%eEusw68iEX5v z974Ec{Z(v#Ke5mO%AbDT)A$g=DF7EOR#R{AvL%bm^ppJuHzAWG2xUu-jASrp_H<+P z_ICFm=nwK4X^EiJt+Du0O`%aQDC?H(bhfJvJzbh+(~6TP4$}Y~BGA`fuYROr0m`E@ z25gFyn%Xi1qoat1%gA>$a(GV+3Kk!;=awO*AoCk@ zW1M?|J8?8d!c`>#OO}*i=Dbo=)b_v^Zem8xFhnyOqK5@Y(GnPihn49m9fqgGdUsjD zlZ)MCRv)bu?ImX{ELvSIojXe8DuAjAuok2cxNTSoSF;jPj3zH0q@y^X!eD_ZRUIb$ zU-#>DWA*-0^(~UI{$e&sXtQ|@eKxrzr8P24#vQFtMT`5{Q2`K#* zgjGc4(^}s4>I|>IeT z+>3wvm%qn9|G&S(7ysY?#kaok75w8r{0+YRuV28i!~1Yx|291I^Lz1~Z+#hG_@}?b z7r*c~_}Ts6W&9`bY5$AIQR6ap?J(DPq2MB02 zic`h<%_2`A=%T{c=_(}z*T+sZ;fFu`DSm$c!x-pe8AiPblvTh}=0{ESEGm*F{P=r6 z!GjM!$g0!A51-vZBwUH!o<4pjO5mKvj-9XI?5R^Ye)Jf2Z{2|uL9kmV?nEmQ@P**g zP&k!?ZLc7!GlWuYFU7hwy;E8YMPJ5n9*^Jjz+Ob?dvZbmIN$~hTN7@v?IN)nhP z5RWCyTt7Rv*fcZSR>0G_w{5NWc7C#)h=gG%x63Ol5sF4wKDJq11Ex%wf>F|=_J*D{ zdp7HNp4l#_xw*x}3j_iNhzX$S-l13fjj?-q3lPV8G5LmJGz>1V$Epx0JO>g5NCnCq zgU-^kexHA}qX8P7)6luRdXZ9W-xPtq>B(2xq-E8qyj{2>9p+=)GNh7Oq*FRCpR~{G zaJEo?c>%%^vwB$fO-70=#h+u6e%bMl4rxElu5b#VgMu(1ZjYf2G zQ^@QqD!H<1)heu5xsr96G;?qLAsLN2mB?+Ti7Z{Z$QU`o0UF9)vUmyZ{qc|3FvBz~ zC*hiFuEkxq--X%JXX6`R`wl89Y6x&Uk*Ba2M zQ_AcDEw-erSKj#vFtwH?uMr3FW6tuc@Jgu(OZlStv<#zj-ZM0mB{#LWO+2Kw6d0|m z9i;)S(U~&RPS)%$kRqR^Sx1_SEHNMS2Z*UG4UMp@npUBXKuL#inC~@-bfk=Na^|Sv zeS41^`P{>}fq>?*x=4o^V>pSwEE#DEf+0ZtFix^v-;=zPL89~{ktpixCXv7Ni>|=0 zZ`2i1d9_QX;v~dTtXy4+>9Yc4DsA@KMQf&+4ReZutC?XsSt&i_WKD7%L_R%a=2qpi z33JWyn&VZISGCb=JT9+$3PLhsDy?2tTKAH2sz+WWSj_%@>g}XpA)Ar$`I7}UmbWse zD<9e>u>b$B`>%GaZ`S*T_qvWfe`BsV4YjM|)ZVuDZemybZATzGPVXE+eKGI2iS94v zoN!KB7yfo!@pCyxNfzf{PQUHkGuwmfC}hW75d5Of0gVmSc_>B{kZOu&2sqi*>D)zECf343DJH)xCq)UQC@?Pr)BUa<~Ite+hs&F7*IJ0DU?Qea#PRRElTFR%Q_xX_$IJLIgk*8&;Q#lQf; zI+d%yU{kZ|`WRx8_lX2foH&79yLO|Lim$FtJ?x{@A36zY#2n?B)Dh7a5Vm8`IbJks zop{EoE%SXLJLAUZw+o%&33{hj*Y=KDkZXph3%#Q1DJ5C6d}HaJyPE&md<>_s8k*NT zb(&~%dYy9~iAD)nDhUW848!(ezSU!@#Xw^qejLYF;!7u=ul5Cg<-Oyacd93yr(RxO zfl?YB-925{w`U)L*elexTKp3-KtikNHNR6mvs&Sw&Z_5A04HJIX$Uq;{Vbo+LM(aS z4<%z5N+)PE^`X136MgYM(s(;w+`NhJ5_oCzHazmsllb(wS;C?KezZ5Oa z9eCk|ZLHG>=FeG%XP$b|9MOs!f5(8vEnBu0jEG^jZ6yso@*c@hk~3>)Q==87tVi{1s%wAXU;XA9@$gap`Dj>cAT7c6O0cc{p{SYftx>{gdGZX}+dEl-S_LQpp}95!C{mOTGuz5=1lffG?Z4Yil&|97R*;xG^W5>y zJ2~^aD9*3mU5uR0&y#*n=nBcaR^oKhJeR)y>3S}miN7_LAM2!;&ZSfM{aV}@) zv-Bo#7k*pOtg=-6SEnbZdnbRz@pbPA0ijMbg}DpUr%ppvRTbaonJ1GHLr`dvmxUR%jZ0-^Jq1w(mB0~f z-@XgWmd&M*)eacI{(Tyb7x2_DycDo_RbBv8-%}oxSG`ky)ib2w`y4Laa5=iV+HvOe zadXt&2)}vo&?yRkpp!tdtGkQkEH##XQaw?WP2m9Z&5U+*#L(F_U{3$=6J({S7sR~P$tw11DO#`_Z)21&l z^TqP{xS1ciaM5&Z*sua8j~_>GM?XIO>5t&EfAL9t?sI=mz)?Ykyp8F^Sr;kHm^}r5 z^LL-cJKlB+W=@|+Fm?!6T(J@*o;;p=?je-ddMN*52voWejS`Uco~AJ$GkYWp%L@c% zHUD!&bt$k#`Y0>sh4m_B!S*!c?*cV4-bAk&;uA1(tH(}YigDD4d_PLBd7KJoXvH+H z<4J!6Q99nwT-8J3@ffdtojpv;s5>elGc|z3Bl=>B{2N8Us~(kM3=-t8Shfi3)-ERv zh0)X1#%l#utzL_lci1hO)C;DeKrIRqU0S+l9?m(@g!Q6*3pOqA63Df*UMPdU&M@K` zC!7JvhW2fE%S)E-WsHgD?Qg|b(Zze#TL5bHjOyPRopa)=-0B)q9Q7h;ii6TuJRR7e zy4Faahaf>cj_P5QQKzAKff@B~DQycxP>E3U7^2YCb62MO(6&=?ZR_DU*(e z6~In*oq-mK|3O}SD><5az|r_VNF#ge(KzZ_0CH{*`mZp8K1UW%Xp>@mum zBY5+jZ^wJz_fdTN+dsjs-G>>@htv?;kpNe7t9@+$64nWY2-_n^xj7j+QRv9=oovcH zc#D}cC$mi`#|Stzt!XGmgNt&}>-LlP2`fkKx$=^g>OntprWsdWQj0(MLuUIVHV@l^ZCC210X|AunaA{5UdrTIG{!@0t6I{% za2pNx(*u<8C8({fGoujdnU#?#*}`fvbR}9>orzZjnpHL}RGc<_2A^vu6~B?w+L@q) zA2(EZ9{;{RHz5c;zT=B18zK0k&Y-c1ni>hpIx=3EmFK10b5kUh5cv~uQc-A6wNVx* z&x+RSO&!Ih=UO!>Az4QBEF#vCV(PXI1cL^V%ZhQCjiZU+$q?F<-pyy#RRW!{yCG8aqDI;G>3RYYuK6n{s)xaYumR(x*^8oJ`Tl(TW|Z(W^u#rMU|d8VuNQoLiX zC~4zt7@MA$_k35}uIFE!^c{EMbETz6V}RB==e@!^_l}oSoI+L5DI71XJB2@&2c@TZ zo|?Bt4%QYp{6U`7;+8UKufyrnrlF#;k^sI2nKm5NzHC01TpM!$HJg1!6p5+Dk2YR;eXCLyO@G=Zrx5L!Yo8w%<4HJ_Plt{%9?hB}-* zeVV|rje=UM?p=7(P1oV>yKko~IEmO05DjZMv=j*fP?gBbd`BV`c>CM$#_SnWuyfBr zG`IFpk&fEo=0whHm125>LLt2Ko;y)nU4gdFUdGQM67?aT7(^-=!`0VbhYx+|L%89l zji{-ef=kw~#?qw=S-z!s^PAs<=`$KBz{{~~$8JYBo$0ZpOcpJf zlc7cwrl4r#`Df{k;RMd;N6pZ&yn4;m3o1I%R$Q99CQ!!o^jXrK=uO+UXtVPY)@3r$ zg9YgATZuZ!JvH;wjOhzUcry$M|yS*tt5+0iyPM7O*Oaemn0R z#c93n?Qex~-pQ%+#QCkVnOdVDqfsf3KIJFkqoAN$Q5ntVG>_r<^El(q%f_P6e}ZPL`q4TgU^d;3Td zUIRSir2jnxQQApC2NG!7MUH&0g@*Fd-8yp8v^%{zle8hbISXI!RWFQ_N@_Fpyy@W{ ziVu*hwE;SHI_W|y(FGurl#ew(xC&# zjKP=7dl@fj7TJY@KBkkv6Hh#DIlfik|LX z9C+mbLFryT-;JK$UY1FnRwd-&2E6e6Gl&iL;=1duAgHUS!8wRkD;DFDbt^G>ay_O^ zslyG|ZNQSnGodrzue|ayvq}Bbsk8C?^E>d<`yL~BFDLjLK~4Qs3?&H)DMQucsKrNW zn{19o=d?)(1-v+RVm|>W8-{hP`Jm-Ay43S*cG-v}OnJ2KWt8BTaMtjFrcNY>@;K4d zj5)I^aoHtHQ68-#=p7)d6aVD080a3wu01CRm3#!CaT+#B(k~?|ZTV1;|1mGoN)HXl zEEX=U!K|6}Ca->P1(q(_fQ1X!VAD&_lQu^vm+BCv>{aKWXjk-SWQ72=kr$*f{!Wv2 z#qZiRL;JL95u-W|ue|aa1j3c%d&(W7bIvKA*X<^Z**_>0tkt4K*?zE+OQ~dhG`v~) z%!HX!!>drSj(5_;YY7Nds0yID4(X&lVMXCI%p-*;#ZJ+{!cvB^z!{=;F}f;31=7mS za5!qxSI?&slTc7xb8uxYA1^5$(psGs|W>Z9QGZ6~Z@SbFtB$UB=&JMR_NQ6^FddZynOdWCc5!xX#X zbnMj*SI8@#+}JyP%hIFGzZ8Rd5!BP6=VMCEiR+~Aq-T^Cug*8DbK1*(U*2*0mZL}= zXP;SR=%jHWJ?Wd8e=WW;^9a>5Ng!vu+CqHEboo^kgNjFjiRmy613LI;6f4s;{9h=a zT{S(5!NHiBVj}@&dprd=)w>y|GSqLacGolIPd%S`DlI?Oti1xa-gXb(e$Tsc<>ec( zZ|@x`9G|4nFe!cVgX|%aItAY~h#rITwX;I1s^x%dW%J zDYLM8*<##v>qZ^^LAgX>&pMFslHtapMha zznnR5{lg!AmjT>be3Z|$(0EtAh71k(yg>|S;vztih;_P(K8zfq*GLhK0S&k5m3p&H zZ>idtKtM9qEIv|L(Gcs#(j)<)hUkfsOLQL^n)E zw4ix?{$LadPn-yFXEIRdn~Rkvm>LFMLy39sTJ4LrcFmQQchZ=F4ZD38f=;tVAHX3Mrmn|pxH9Wqqg8PewWD^ zfT=xQeSW(Ue;^nkc!{!|wQ;%2=y&DI9M3uwV|?lCJi)Jy%aoC14H+w+1k6>>T3D0C zvSmwg#pRb6n$U1Gv&FpF&CnYfYjM||cVP0AMzcA*Hda>}>a_Cuyk^_6P&jBv-|O|D zrm6-(pAP|F5S8WCq#11`nMX%Q2j(wah#%eiO?==(AHYBV^B1sv+cvi52(G$x9qF>3 zX}Qg`9j~_p^XAT^pG_Q+!ax1X-{QWX-EVY^XiYl>bhft>D0|>0ur6h}nI-1iLy#Ef zb(rZy;c*3-Pw}col4RIxKXkTdfu3cE>9jOq9m!AaOrR!CrW2?j|FxcJ!H<6UQ#|_c zQ`ouV0JOKW+k7KSu&H_8Y$vwIf~C`N?G4MYcI{$R)mEU4`LAoJ#)_3Q&8qrDT8o-$ zaki-m+h5*|9lQ3?xFx73X3HkCY&*(eeoy%k3CTdwGtstmjIfKg*pv(i)5w<$GV6HA z4+jn(#wZO2?f=Re5GlT4C;2k2JGvh@c?7fw$aKR5qilT5OHj9b2|qqcD{HhgKu<+c zW+%y;eqm;)q)ZL!hld1FrmYOjgj|Yv3PTO6OL^!(d`F3Bh{Db{Dk$6ngNU)ry=04V zmhpa5-MKlduhB_)8zErID`$a+zVzQ=IV%tij4)n(?1iYa8)!j?5F#})w$<8%A5(Ep>Jvm zBZw#nB~%?lLG>yjDX?dU{N*+EhRWQfEo!u?R*R1$w8ZqKENdF=?T66Xau~aIZN*f)9CK*VLRB>)uKhwyqpxgJ>xt^;AYni7$8L;sC4BV zdUyDJBHsG%bjp(TR*%VB86?_rdMyhT`6{R9)(aFGSw%iqJvqI#x_4xk>cASBHa+u< zfKW0m8Z9TVimoI9+6`~bB%$(DJOD|iE%dS{O z5F?`|je%GPMoN>|c+-{m-QRy7{`Ma}jT>*ilKIIZJ*?I9U0Aqi2Hx`4H{tjG=%e`a z&wUzm=S?Ah6ZDj5Z^{HR*?xjzmVY#XY)+#EIr7#3u}VK`>+4MZw6dEN4IlYC78@dM zmSORth2~^4ZPc%x+*Epyb)=Q(aU_O%`8!Trk|aH+3DjJO_$tjDTTvQoT1`mf%+^1t z(D0&qFm1bN%eNjgMC}jJAW0<5Xs^zSPm#X;fuLzS`5bvn`!1WqRhX_;{fk5z8z*4{ zjne9hI`T{xp5L?;TQ=`ty4@1KW-&Ll1oNqFlSa(h`G5O={}!M9+-EU)@?@6Phd1AS z7ykIupTwJPy@f!265G~oMy9^-#c$)wU;YMZk%p$GVX*zJC!i*tlOZL8+|sO-3;Ko( z1}$uihIQzN%IQXRbsY`p8lg2qd%vt3Lp&F_K9>8`QQ+7is*bn|Rh5$|AZyqt4Jfae zf{LnXv}~uLymC4smAqC>BH`5{LSI!~kDB_)B#0@r?i&z^R`FRaGhb^~uc;eY7K`RZ zc&Jb;05xrF1>89SW1f%#bS?IdE585lb0)uqtmyuY=E}q^#5ew2Jy;g31%9=q2!?RTATNg-Pxt}wPtV*u32ySdjt^Gpv^2zz^e<=W>4 zmyYN7Ty<7PAtf&XWP8R4TKH}Cm>7_w?ni+bGv8D5yi>?$)C;QLdMD3zDbW@$XL024 z3wZ9ipWw+S@5Rw$`^_GFMgbBg_4N7Xlm`k(q+pCWapcs1#=medBlUE zA<=z?5yJwhgRwlGd*)?azTqbP*`NMBO7bB*@Uy3=FKP6+ z>hauTd+?8+|0bS!WG{AaZ9#Y22#y}=!e9OQzu}wTxSt?(fOS^|SD+SN%3XoKY^Gm` zz|@^_A_Fy;$+~_xjmN9No7zT?q~YjEA*L5p}U+zQ9YCDA+#CbdxHIx7Mi9B=ric+>oZ>OwK>1`$<(o(&WdaORxg^?2MBZu zd}`Hxf{NREZR(yf;MCa~XpH79zyCU%E#3J37rXId$zSO7OpT;A)z$K^3_II9&k!uT zQ+|iv$2?;cu6j2t0A^NYYo50cHPuz-2wwFT#)lFHRH%p2PPNc91f4KNgNfH+O`oIJ zJGHqMTzS+hD*9nQ2L}bx@=RCr3rEMdZh4G0` zegKzWxdvBXw+{Eb^L7HHJV8_%4U;0|!5LV!W;XuyOaF+!{F}eTrB^Ivm^Y!i){lX~ zW~^L2n|W=;XFmNgbao%dAO6wDFlSyPlIdP7UpX6hy!m>}p4*5u>lWcX?|mDwNeGLU z5MVA|Xv(PF7&M(oN2IF9Ri^<30*$!w#*Mh`_S-RY)>LTWbv)J&H^H~3Y=nlaR-C(8 zHqtlcn2aTzfD{S^C>mA28dZ~Vz>48-)paRxi|AO*rmc#an%m7T0_xa^rD80v2R*%g zW`9uau__s>9#O5J*HlB*uNEtreOhVMN6SNKoID9@RCiM`MYda}lpq%*2jg>2x;PT6tVHsth zb}bO_)Iv4!o_Nq4rAsGzQkgXJr3F-4Y^VBEr-Md50zSX_&01mkHO;ahkKUjYb&cy5 zFLj}=0qAT8nopG?Iar0nU>ybbG-hNL8+ay#{$!MSt5D*Opwt^isV9UI4+V@j08cOq zUnt7T4MOLO2KZY<>(_Q8>NVBAe5Pkqiq;Ah%WRh5jc21dLk;Ji8RuO8`&_YLkTds% zpT*BF=A1aX7K0}J9xn|?*f{UU^S`NXOlXepZ6F)2aC_dn^TN^TUV^|;O1hW3unzQG z-ihycJ#%_sv_L|?O)mkx1)%zdjpsO}ZR1++ytCle+#09n6Sakt7suK3>@!^*Z+|<_ z&VT3l;i|@}}O|O~xId+vRJU8~X=T?|8^OlX5$KGfKaqr1 zA^Rc`j8KqkxJzf8o4MwWqhe6DCsWzh*VR&46{ZDHY4|AMog!&isk*AtY$#nGjbfAv zp+DA(?w&RZ^g-s!kG|esD#8?V7B;|Y^GjRt;-;5y^zb2UdSSC!Xpzp0P^my=4F| zJ^v!XY!tb4HNN)c@8duI?R(h%;x@eW%yW3*$;Xfy8lqyU$LO%j9H*HfI8*P5C&2n+ znc!xrq!3ko8Y?dm@SqYg09ExW&-Vs^svWF+aY@DyNQ|m?i*094w^Gk2X0CJeDRdPz%cLCt0(1V z0gwz4yJ*$!O=$T>UbLz>>Je2uIpyD>Ylo))E1lDuIgvN@`%C%p9ogN2r$UdHMrt%< zt$NXO%j-@Xt1b$1j`gRWEwz#AG?}y`1)6j14{9Ew%K#Yxdkv#%Ck1;Xsl3*45cq5L zb~a5MMq`IG!H=5nYH?LLL5^9tRHhvjw4NhC9S&^UvI{-k{TOB*cJ0}1<`Ie>G>>p# zpdbE#4{O%0A_+@@#n!V6E~ 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

4OV$7L2i_bM< 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 literal 0 HcmV?d00001 diff --git a/bsp/gd32/arm/gd32527I-eval/project.uvoptx b/bsp/gd32/arm/gd32527I-eval/project.uvoptx index 18af63782b3..afc212f0a2f 100644 --- a/bsp/gd32/arm/gd32527I-eval/project.uvoptx +++ b/bsp/gd32/arm/gd32527I-eval/project.uvoptx @@ -120,7 +120,7 @@ 0 CMSIS_AGDI_V8M - -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BE12477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F5xx_7M.FLM -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM) + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BE12477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC80000 -FN1 -FF0GD32F5xx_7M.FLM -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM) 0 @@ -476,18 +476,6 @@ 4 23 - 2 - 0 - 0 - 0 - ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s - startup_gd32f4xx.s - 0 - 0 - - - 4 - 24 1 0 0 @@ -499,7 +487,7 @@ 4 - 25 + 24 1 0 0 @@ -519,31 +507,31 @@ 0 5 - 26 + 25 1 0 0 0 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c - dfs_fs.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + dfs_posix.c 0 0 5 - 27 + 26 1 0 0 0 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c - dfs_file.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + dfs_fs.c 0 0 5 - 28 + 27 1 0 0 @@ -555,13 +543,13 @@ 5 - 29 + 28 1 0 0 0 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c - dfs_posix.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + dfs_file.c 0 0 @@ -575,61 +563,61 @@ 0 6 - 30 + 29 1 0 0 0 - ..\..\..\..\components\finsh\msh_file.c - msh_file.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 6 - 31 + 30 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 6 - 32 + 31 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 6 - 33 + 32 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 6 - 34 + 33 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\msh_file.c + msh_file.c 0 0 @@ -643,7 +631,7 @@ 0 7 - 35 + 34 1 0 0 @@ -655,7 +643,7 @@ 7 - 36 + 35 1 0 0 @@ -667,7 +655,7 @@ 7 - 37 + 36 1 0 0 @@ -679,7 +667,7 @@ 7 - 38 + 37 1 0 0 @@ -691,7 +679,7 @@ 7 - 39 + 38 1 0 0 @@ -703,7 +691,7 @@ 7 - 40 + 39 1 0 0 @@ -715,7 +703,7 @@ 7 - 41 + 40 1 0 0 @@ -727,7 +715,7 @@ 7 - 42 + 41 1 0 0 @@ -739,7 +727,7 @@ 7 - 43 + 42 1 0 0 @@ -751,7 +739,7 @@ 7 - 44 + 43 1 0 0 @@ -763,7 +751,7 @@ 7 - 45 + 44 1 0 0 @@ -775,7 +763,7 @@ 7 - 46 + 45 1 0 0 @@ -787,7 +775,7 @@ 7 - 47 + 46 1 0 0 @@ -799,7 +787,7 @@ 7 - 48 + 47 1 0 0 @@ -811,7 +799,7 @@ 7 - 49 + 48 1 0 0 @@ -831,61 +819,61 @@ 0 8 - 50 + 49 1 0 0 0 - ..\..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c 0 0 8 - 51 + 50 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsscanf.c - rt_vsscanf.c + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c 0 0 8 - 52 + 51 1 0 0 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c + ..\..\..\..\src\klibc\kstdio.c + kstdio.c 0 0 8 - 53 + 52 1 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c 0 0 8 - 54 + 53 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - rt_vsnprintf_tiny.c + ..\..\..\..\src\klibc\kstring.c + kstring.c 0 0 @@ -897,6 +885,18 @@ 0 0 0 + + 9 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + 9 55 @@ -980,12 +980,12 @@ 10 61 - 1 + 2 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c - gd32f5xx_rcu.c + packages\gd32-arm-cmsis-latest\GD32F5xx\GD\GD32F5xx\Source\ARM\startup_gd32f5xx.s + startup_gd32f5xx.s 0 0 @@ -996,8 +996,8 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c - gd32f5xx_syscfg.c + packages\gd32-arm-cmsis-latest\GD32F5xx\GD\GD32F5xx\Source\system_gd32f5xx.c + system_gd32f5xx.c 0 0 @@ -1008,7 +1008,7 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c gd32f5xx_dma.c 0 0 @@ -1020,8 +1020,8 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c - gd32f5xx_usart.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c + gd32f5xx_exti.c 0 0 @@ -1032,8 +1032,8 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c - gd32f5xx_misc.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c + gd32f5xx_gpio.c 0 0 @@ -1044,8 +1044,8 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c - gd32f5xx_gpio.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c + gd32f5xx_misc.c 0 0 @@ -1056,8 +1056,8 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Source\system_gd32f5xx.c - system_gd32f5xx.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c + gd32f5xx_rcu.c 0 0 @@ -1068,8 +1068,20 @@ 0 0 0 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c - gd32f5xx_exti.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c + gd32f5xx_syscfg.c + 0 + 0 + + + 10 + 69 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c + gd32f5xx_usart.c 0 0 diff --git a/bsp/gd32/arm/gd32527I-eval/project.uvprojx b/bsp/gd32/arm/gd32527I-eval/project.uvprojx index 6fd79c653de..8923e68478c 100644 --- a/bsp/gd32/arm/gd32527I-eval/project.uvprojx +++ b/bsp/gd32/arm/gd32527I-eval/project.uvprojx @@ -16,7 +16,7 @@ GD32F527IS GigaDevice - GigaDevice.GD32F5xx_DFP.1.1.0 + GigaDevice.GD32F5xx_DFP.1.2.1 https://gd32mcu.com/data/documents/pack/ IRAM(0x20000000,0x080000) IROM(0x08000000,0x780000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE @@ -338,9 +338,9 @@ 0 - RT_USING_ARMLIBC, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F527 + __STDC_LIMIT_MACROS, GD32F527, RT_USING_ARMLIBC, __RTTHREAD__, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - ..\libraries\gd32_drivers;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\libc\posix\ipc;..\libraries\GD32F5xx_Firmware_Library\CMSIS;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\include;..\..\..\..\libcpu\arm\cortex-m33;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\common;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\libc\compilers\common\include;..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Include;board;applications;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Include + ..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\phy;applications;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\drivers\include;.;..\..\..\..\components\finsh;..\..\..\..\components\libc\posix\ipc;..\libraries\gd32_drivers;..\..\..\..\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;board;..\..\..\..\libcpu\arm\common;..\..\..\..\libcpu\arm\cortex-m33;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\extension;packages\gd32-arm-cmsis-latest\GD32F5xx;..\..\..\..\components\libc\posix\io\epoll;packages\gd32-arm-cmsis-latest\GD32F5xx\GD\GD32F5xx\Include @@ -362,7 +362,7 @@ - 1 + 0 0 0 0 @@ -371,7 +371,7 @@ 0x08000000 0x20000000 - .\gd32_rom.ld + .\board\linker_scripts\link.sct @@ -1121,11 +1121,6 @@ 1 board\board.c - - startup_gd32f4xx.s - 2 - ..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s - drv_gpio.c 1 @@ -1142,9 +1137,9 @@ Filesystem - dfs_fs.c + dfs_posix.c 1 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c 2 @@ -1198,9 +1193,9 @@ - dfs_file.c + dfs_fs.c 1 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_fs.c 2 @@ -1310,9 +1305,9 @@ - dfs_posix.c + dfs_file.c 1 - ..\..\..\..\components\dfs\dfs_v1\src\dfs_posix.c + ..\..\..\..\components\dfs\dfs_v1\src\dfs_file.c 2 @@ -1370,16 +1365,6 @@ Finsh - - msh_file.c - 1 - ..\..\..\..\components\finsh\msh_file.c - - - shell.c - 1 - ..\..\..\..\components\finsh\shell.c - msh.c 1 @@ -1395,6 +1380,16 @@ 1 ..\..\..\..\components\finsh\msh_parse.c + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + msh_file.c + 1 + ..\..\..\..\components\finsh\msh_file.c + @@ -2246,35 +2241,40 @@ klibc - kstdio.c + kerrno.c 1 - ..\..\..\..\src\klibc\kstdio.c + ..\..\..\..\src\klibc\kerrno.c - rt_vsscanf.c + rt_vsnprintf_tiny.c 1 - ..\..\..\..\src\klibc\rt_vsscanf.c + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - kerrno.c + kstdio.c 1 - ..\..\..\..\src\klibc\kerrno.c + ..\..\..\..\src\klibc\kstdio.c - kstring.c + rt_vsscanf.c 1 - ..\..\..\..\src\klibc\kstring.c + ..\..\..\..\src\klibc\rt_vsscanf.c - rt_vsnprintf_tiny.c + kstring.c 1 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + ..\..\..\..\src\klibc\kstring.c libcpu + + atomic_arm.c + 1 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + div0.c 1 @@ -2289,44 +2289,6 @@ context_rvds.S 2 ..\..\..\..\libcpu\arm\cortex-m33\context_rvds.S - - - 2 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 3 - - - - - - - - - cpuport.c @@ -2349,44 +2311,49 @@ Libraries - gd32f5xx_rcu.c - 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c + startup_gd32f5xx.s + 2 + packages\gd32-arm-cmsis-latest\GD32F5xx\GD\GD32F5xx\Source\ARM\startup_gd32f5xx.s - gd32f5xx_syscfg.c + system_gd32f5xx.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c + packages\gd32-arm-cmsis-latest\GD32F5xx\GD\GD32F5xx\Source\system_gd32f5xx.c gd32f5xx_dma.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_dma.c - gd32f5xx_usart.c + gd32f5xx_exti.c + 1 + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c + + + gd32f5xx_gpio.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c gd32f5xx_misc.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_misc.c - gd32f5xx_gpio.c + gd32f5xx_rcu.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_gpio.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_rcu.c - system_gd32f5xx.c + gd32f5xx_syscfg.c 1 - ..\libraries\GD32F5xx_Firmware_Library\CMSIS\GD\GD32F5xx\Source\system_gd32f5xx.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_syscfg.c - gd32f5xx_exti.c + gd32f5xx_usart.c 1 - ..\libraries\GD32F5xx_Firmware_Library\GD32F5xx_standard_peripheral\Source\gd32f5xx_exti.c + packages\gd32-arm-series-latest\GD32F5xx\GD32F5xx_standard_peripheral\Source\gd32f5xx_usart.c diff --git a/bsp/gd32/arm/gd32527I-eval/rtconfig.h b/bsp/gd32/arm/gd32527I-eval/rtconfig.h index c4e0b207b67..461d7cd88ff 100644 --- a/bsp/gd32/arm/gd32527I-eval/rtconfig.h +++ b/bsp/gd32/arm/gd32527I-eval/rtconfig.h @@ -80,10 +80,6 @@ /* kservice options */ /* end of kservice options */ -#define RT_USING_DEBUG -#define RT_DEBUGING_ASSERT -#define RT_DEBUGING_COLOR -#define RT_DEBUGING_CONTEXT /* Inter-Thread communication */ @@ -105,9 +101,15 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x50200 +#define RT_VER_NUM 0x50201 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_SECURE +#define ARCH_ARM_CORTEX_M33 /* RT-Thread Components */ @@ -295,6 +297,34 @@ /* Kendryte SDK */ /* end of Kendryte SDK */ + +/* WCH HAL & SDK Drivers */ + +/* end of WCH HAL & SDK Drivers */ + +/* AT32 HAL & SDK Drivers */ + +/* end of AT32 HAL & SDK Drivers */ + +/* HC32 DDL Drivers */ + +/* end of HC32 DDL Drivers */ + +/* NXP HAL & SDK Drivers */ + +/* end of NXP HAL & SDK Drivers */ + +/* NUVOTON Drivers */ + +/* end of NUVOTON Drivers */ + +/* GD32 Drivers */ + +#define PKG_USING_GD32_ARM_CMSIS_DRIVER +#define PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION +#define PKG_USING_GD32_ARM_SERIES_DRIVER +#define PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION +/* end of GD32 Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ @@ -374,11 +404,12 @@ /* end of Arduino libraries */ /* end of RT-Thread online packages */ +#define SOC_FAMILY_GD32 +#define SOC_SERIES_GD32F5xx /* Hardware Drivers Config */ -#define SOC_SERIES_GD32F5xx -#define SOC_GD32527I +#define SOC_GD32527 /* Onboard Peripheral Drivers */ diff --git a/bsp/gd32/arm/gd32527I-eval/template.uvoptx b/bsp/gd32/arm/gd32527I-eval/template.uvoptx index 7cc88950b15..963a27944d4 100644 --- a/bsp/gd32/arm/gd32527I-eval/template.uvoptx +++ b/bsp/gd32/arm/gd32527I-eval/template.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 13 + 14 @@ -114,9 +114,14 @@ - BIN\UL2V8M.DLL + BIN\CMSIS_AGDI_V8M.DLL + + 0 + CMSIS_AGDI_V8M + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BE12477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC80000 -FN1 -FF0GD32F5xx_7M.FLM -FS08000000 -FL0780000 -FP0($$Device:GD32F527IS$Flash\GD32F5xx_7M.FLM) + 0 UL2V8M diff --git a/bsp/gd32/arm/gd32527I-eval/template.uvprojx b/bsp/gd32/arm/gd32527I-eval/template.uvprojx index 555f6ab3cef..ec4580f48b1 100644 --- a/bsp/gd32/arm/gd32527I-eval/template.uvprojx +++ b/bsp/gd32/arm/gd32527I-eval/template.uvprojx @@ -15,7 +15,7 @@ GD32F527IS GigaDevice - GigaDevice.GD32F5xx_DFP.1.1.0 + GigaDevice.GD32F5xx_DFP.1.2.1 https://gd32mcu.com/data/documents/pack/ IRAM(0x20000000,0x080000) IROM(0x08000000,0x780000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE @@ -361,7 +361,7 @@ - 1 + 0 0 0 0 @@ -370,7 +370,7 @@ 0x08000000 0x20000000 - .\gd32_rom.ld + .\board\linker_scripts\link.sct diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h deleted file mode 100644 index 169241476a5..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h +++ /dev/null @@ -1,302 +0,0 @@ -/*! - \file gd32f5xx.h - \brief general definitions for GD32F5xx - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * Copyright (c) 2024, GigaDevice Semiconductor Inc. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ - -#ifndef GD32F5XX_H -#define GD32F5XX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* define GD32F5xx */ -#if !defined (GD32F527) -/* #define GD32F527 */ -#endif /* define GD32F5xx */ - -#if !defined (GD32F527) -#error "Please select the target GD32F5xx device in gd32f5xx.h file" -#endif /* undefine GD32F5xx tip */ - -/* define value of high speed crystal oscillator (HXTAL) in Hz */ -#if !defined (HXTAL_VALUE) -#define HXTAL_VALUE ((uint32_t)25000000) -#endif /* high speed crystal oscillator value */ - -/* define startup timeout value of high speed crystal oscillator (HXTAL) */ -#if !defined (HXTAL_STARTUP_TIMEOUT) -#define HXTAL_STARTUP_TIMEOUT ((uint16_t)0xFFFF) -#endif /* high speed crystal oscillator startup timeout */ - -/* define value of internal 16MHz RC oscillator (IRC16M) in Hz */ -#if !defined (IRC16M_VALUE) -#define IRC16M_VALUE ((uint32_t)16000000) -#endif /* internal 16MHz RC oscillator value */ - -/* define startup timeout value of internal 16MHz RC oscillator (IRC16M) */ -#if !defined (IRC16M_STARTUP_TIMEOUT) -#define IRC16M_STARTUP_TIMEOUT ((uint16_t)0x0500) -#endif /* internal 16MHz RC oscillator startup timeout */ - -/* define value of internal 32KHz RC oscillator(IRC32K) in Hz */ -#if !defined (IRC32K_VALUE) -#define IRC32K_VALUE ((uint32_t)32000) -#endif /* internal 32KHz RC oscillator value */ - -/* define value of low speed crystal oscillator (LXTAL)in Hz */ -#if !defined (LXTAL_VALUE) -#define LXTAL_VALUE ((uint32_t)32768) -#endif /* low speed crystal oscillator value */ - -/* I2S external clock in selection */ -//#define I2S_EXTERNAL_CLOCK_IN (uint32_t)12288000U - -/* GD32F5xx firmware library version number */ -#define __GD32F5XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __GD32F5XX_STDPERIPH_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ -#define __GD32F5XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __GD32F5XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __GD32F5XX_STDPERIPH_VERSION ((__GD32F5XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__GD32F5XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__GD32F5XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__GD32F5XX_STDPERIPH_VERSION_RC)) - -/* configuration of the cortex-M33 processor and core peripherals */ -#define __CM33_REV 0x0001 /*!< core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< GD32F5xx provide MPU */ -#define __NVIC_PRIO_BITS 4 /*!< GD32F5xx uses 4 bits for the priority levels */ -#define __Vendor_SysTickConfig 0 /*!< set to 1 if different sysTick config is used */ -#define __FPU_PRESENT 1 /*!< FPU present */ -#define __DSP_PRESENT 1 /*!< DSP present */ -/* define interrupt number */ -typedef enum IRQn { - /* cortex-M33 processor exceptions numbers */ - NonMaskableInt_IRQn = -14, /*!< 2 non maskable interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 cortex-M33 memory management interrupt */ - BusFault_IRQn = -11, /*!< 5 cortex-M33 bus fault interrupt */ - UsageFault_IRQn = -10, /*!< 6 cortex-M33 usage fault interrupt */ - SVCall_IRQn = -5, /*!< 11 cortex-M33 SV call interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 cortex-M33 debug monitor interrupt */ - PendSV_IRQn = -2, /*!< 14 cortex-M33 pend SV interrupt */ - SysTick_IRQn = -1, /*!< 15 cortex-M33 system tick interrupt */ - /* interruput numbers */ - WWDGT_IRQn = 0, /*!< window watchdog timer interrupt */ - LVD_IRQn = 1, /*!< LVD through EXTI line detect interrupt */ - TAMPER_STAMP_IRQn = 2, /*!< tamper and timestamp through EXTI line detect */ - RTC_WKUP_IRQn = 3, /*!< RTC wakeup through EXTI line interrupt */ - FMC_IRQn = 4, /*!< FMC interrupt */ - RCU_CTC_IRQn = 5, /*!< RCU and CTC interrupt */ - EXTI0_IRQn = 6, /*!< EXTI line 0 interrupts */ - EXTI1_IRQn = 7, /*!< EXTI line 1 interrupts */ - EXTI2_IRQn = 8, /*!< EXTI line 2 interrupts */ - EXTI3_IRQn = 9, /*!< EXTI line 3 interrupts */ - EXTI4_IRQn = 10, /*!< EXTI line 4 interrupts */ - DMA0_Channel0_IRQn = 11, /*!< DMA0 channel0 Interrupt */ - DMA0_Channel1_IRQn = 12, /*!< DMA0 channel1 Interrupt */ - DMA0_Channel2_IRQn = 13, /*!< DMA0 channel2 interrupt */ - DMA0_Channel3_IRQn = 14, /*!< DMA0 channel3 interrupt */ - DMA0_Channel4_IRQn = 15, /*!< DMA0 channel4 interrupt */ - DMA0_Channel5_IRQn = 16, /*!< DMA0 channel5 interrupt */ - DMA0_Channel6_IRQn = 17, /*!< DMA0 channel6 interrupt */ - ADC_IRQn = 18, /*!< ADC interrupt */ - CAN0_TX_IRQn = 19, /*!< CAN0 TX interrupt */ - CAN0_RX0_IRQn = 20, /*!< CAN0 RX0 interrupt */ - CAN0_RX1_IRQn = 21, /*!< CAN0 RX1 interrupt */ - CAN0_EWMC_IRQn = 22, /*!< CAN0 EWMC interrupt */ - EXTI5_9_IRQn = 23, /*!< EXTI[9:5] interrupts */ - TIMER0_BRK_TIMER8_IRQn = 24, /*!< TIMER0 break and TIMER8 interrupts */ - TIMER0_UP_TIMER9_IRQn = 25, /*!< TIMER0 update and TIMER9 interrupts */ - TIMER0_TRG_CMT_TIMER10_IRQn = 26, /*!< TIMER0 trigger and commutation and TIMER10 interrupts */ - TIMER0_Channel_IRQn = 27, /*!< TIMER0 channel capture compare interrupt */ - TIMER1_IRQn = 28, /*!< TIMER1 interrupt */ - TIMER2_IRQn = 29, /*!< TIMER2 interrupt */ - TIMER3_IRQn = 30, /*!< TIMER3 interrupts */ - I2C0_EV_IRQn = 31, /*!< I2C0 event interrupt */ - I2C0_ER_IRQn = 32, /*!< I2C0 error interrupt */ - I2C1_EV_IRQn = 33, /*!< I2C1 event interrupt */ - I2C1_ER_IRQn = 34, /*!< I2C1 error interrupt */ - SPI0_IRQn = 35, /*!< SPI0 interrupt */ - SPI1_IRQn = 36, /*!< SPI1 interrupt */ - USART0_IRQn = 37, /*!< USART0 interrupt */ - USART1_IRQn = 38, /*!< USART1 interrupt */ - USART2_IRQn = 39, /*!< USART2 interrupt */ - EXTI10_15_IRQn = 40, /*!< EXTI[15:10] interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC alarm interrupt */ - USBFS_WKUP_IRQn = 42, /*!< USBFS wakeup interrupt */ - TIMER7_BRK_TIMER11_IRQn = 43, /*!< TIMER7 break and TIMER11 interrupts */ - TIMER7_UP_TIMER12_IRQn = 44, /*!< TIMER7 update and TIMER12 interrupts */ - TIMER7_TRG_CMT_TIMER13_IRQn = 45, /*!< TIMER7 trigger and commutation and TIMER13 interrupts */ - TIMER7_Channel_IRQn = 46, /*!< TIMER7 channel capture compare interrupt */ - DMA0_Channel7_IRQn = 47, /*!< DMA0 channel7 interrupt */ - EXMC_IRQn = 48, /*!< EXMC interrupt */ - SDIO_IRQn = 49, /*!< SDIO interrupt */ - TIMER4_IRQn = 50, /*!< TIMER4 interrupt */ - SPI2_IRQn = 51, /*!< SPI2 interrupt */ - UART3_IRQn = 52, /*!< UART3 interrupt */ - UART4_IRQn = 53, /*!< UART4 interrupt */ - TIMER5_DAC_IRQn = 54, /*!< TIMER5 and DAC0 DAC1 underrun error interrupts */ - TIMER6_IRQn = 55, /*!< TIMER6 interrupt */ - DMA1_Channel0_IRQn = 56, /*!< DMA1 channel0 interrupt */ - DMA1_Channel1_IRQn = 57, /*!< DMA1 channel1 interrupt */ - DMA1_Channel2_IRQn = 58, /*!< DMA1 channel2 interrupt */ - DMA1_Channel3_IRQn = 59, /*!< DMA1 channel3 interrupt */ - DMA1_Channel4_IRQn = 60, /*!< DMA1 channel4 interrupt */ - ENET_IRQn = 61, /*!< ENET interrupt */ - ENET_WKUP_IRQn = 62, /*!< ENET wakeup through EXTI line interrupt */ - CAN1_TX_IRQn = 63, /*!< CAN1 TX interrupt */ - CAN1_RX0_IRQn = 64, /*!< CAN1 RX0 interrupt */ - CAN1_RX1_IRQn = 65, /*!< CAN1 RX1 interrupt */ - CAN1_EWMC_IRQn = 66, /*!< CAN1 EWMC interrupt */ - USBFS_IRQn = 67, /*!< USBFS interrupt */ - DMA1_Channel5_IRQn = 68, /*!< DMA1 channel5 interrupt */ - DMA1_Channel6_IRQn = 69, /*!< DMA1 channel6 interrupt */ - DMA1_Channel7_IRQn = 70, /*!< DMA1 channel7 interrupt */ - USART5_IRQn = 71, /*!< USART5 interrupt */ - I2C2_EV_IRQn = 72, /*!< I2C2 event interrupt */ - I2C2_ER_IRQn = 73, /*!< I2C2 error interrupt */ - USBHS_EP1_Out_IRQn = 74, /*!< USBHS endpoint 1 out interrupt */ - USBHS_EP1_In_IRQn = 75, /*!< USBHS endpoint 1 in interrupt */ - USBHS_WKUP_IRQn = 76, /*!< USBHS wakeup through EXTI line interrupt */ - USBHS_IRQn = 77, /*!< USBHS interrupt */ - DCI_IRQn = 78, /*!< DCI interrupt */ - TRNG_IRQn = 80, /*!< TRNG interrupt */ - FPU_IRQn = 81, /*!< FPU interrupt */ - UART6_IRQn = 82, /*!< UART6 interrupt */ - UART7_IRQn = 83, /*!< UART7 interrupt */ - SPI3_IRQn = 84, /*!< SPI3 interrupt */ - SPI4_IRQn = 85, /*!< SPI4 interrupt */ - SPI5_IRQn = 86, /*!< SPI5 interrupt */ - SAI_IRQn = 87, /*!< SAI interrupt */ - TLI_IRQn = 88, /*!< TLI interrupt */ - TLI_ER_IRQn = 89, /*!< TLI error interrupt */ - IPA_IRQn = 90, /*!< IPA interrupt */ - PKCAU_IRQn = 91, /*!< PKCAU interrupt */ - I2C3_EV_IRQn = 92, /*!< I2C3 Event interrupt */ - I2C3_ER_IRQn = 93, /*!< I2C3 Error interrupt */ - I2C4_EV_IRQn = 94, /*!< I2C4 Event interrupt */ - I2C4_ER_IRQn = 95, /*!< I2C4 Error interrupt */ - I2C5_EV_IRQn = 96, /*!< I2C5 Event interrupt */ - I2C5_ER_IRQn = 97, /*!< I2C5 Error interrupt */ - I2C3_WKUP_IRQn = 98, /*!< I2C3 Wakeup through EXTI Line interrupt */ - I2C4_WKUP_IRQn = 99, /*!< I2C4 Wakeup through EXTI Line interrupt */ - I2C5_WKUP_IRQn = 100, /*!< I2C5 Wakeup through EXTI Line interrupt */ - SYSCFG_SRAM_ECC_ER_IRQn = 101, /*!< SYSCFG SRAM ECC Error interrupt */ - HAU_IRQn = 102, /*!< HAU interrupt */ - CAU_IRQn = 103 /*!< CAU interrupt */ -} IRQn_Type; - -/* includes */ -#include "core_cm33.h" -#include "system_gd32f5xx.h" -#include - -/* enum definitions */ -typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; -typedef enum {RESET = 0, SET = !RESET} FlagStatus; -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; - -/* bit operations */ -#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr)) -#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr)) -#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr)) -#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x))) -#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) -#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) - -/* main flash and SRAM memory map */ -#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ -#define TCMSRAM_BASE ((uint32_t)0x10000000U) /*!< TCMSRAM(64KB) base address */ -#define OPTION_BASE ((uint32_t)0x1FFFC000U) /*!< Option bytes base address */ -#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ - -/* peripheral memory map */ -#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ -#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ -#define AHB1_BUS_BASE ((uint32_t)0x40020000U) /*!< ahb1 base address */ -#define AHB2_BUS_BASE ((uint32_t)0x50000000U) /*!< ahb2 base address */ - -/* EXMC memory map */ -#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ - -/* advanced peripheral bus 1 memory map */ -#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ -#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ -#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ -#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ -#define I2S_ADD_BASE (APB1_BUS_BASE + 0x00003400U) /*!< I2S1_add base address */ -#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ -#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ -#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ -#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ -#define CTC_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< CTC base address */ -#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ -#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ -#define IREF_BASE (APB1_BUS_BASE + 0x0000C400U) /*!< IREF base address */ - -/* advanced peripheral bus 2 memory map */ -#define ADC_BASE (APB2_BUS_BASE + 0x00002000U) /*!< ADC base address */ -#define SDIO_BASE (APB2_BUS_BASE + 0x00002C00U) /*!< SDIO base address */ -#define SYSCFG_BASE (APB2_BUS_BASE + 0x00003800U) /*!< SYSCFG base address */ -#define EXTI_BASE (APB2_BUS_BASE + 0x00003C00U) /*!< EXTI base address */ -#define SAI_BASE (APB2_BUS_BASE + 0x00005800U) /*!< SAI base address */ -#define TLI_BASE (APB2_BUS_BASE + 0x00006800U) /*!< TLI base address */ - -/* advanced high performance bus 1 memory map */ -#define GPIO_BASE (AHB1_BUS_BASE + 0x00000000U) /*!< GPIO base address */ -#define CRC_BASE (AHB1_BUS_BASE + 0x00003000U) /*!< CRC base address */ -#define RCU_BASE (AHB1_BUS_BASE + 0x00003800U) /*!< RCU base address */ -#define FMC_BASE (AHB1_BUS_BASE + 0x00003C00U) /*!< FMC base address */ -#define BKPSRAM_BASE (AHB1_BUS_BASE + 0x00004000U) /*!< BKPSRAM base address */ -#define DMA_BASE (AHB1_BUS_BASE + 0x00006000U) /*!< DMA base address */ -#define ENET_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< ENET base address */ -#define IPA_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< IPA base address */ -#define USBHS_BASE (AHB1_BUS_BASE + 0x00020000U) /*!< USBHS base address */ - -/* advanced high performance bus 2 memory map */ -#define USBFS_BASE (AHB2_BUS_BASE + 0x00000000U) /*!< USBFS base address */ -#define DCI_BASE (AHB2_BUS_BASE + 0x00050000U) /*!< DCI base address */ -#define CAU_BASE (AHB2_BUS_BASE + 0x00060000U) /*!< CAU base address */ -#define HAU_BASE (AHB2_BUS_BASE + 0x00060400U) /*!< HAU base address */ -#define TRNG_BASE (AHB2_BUS_BASE + 0x00060800U) /*!< TRNG base address */ -#define PKCAU_BASE (AHB2_BUS_BASE + 0x00061000U) /*!< PKCAU base address */ - -/* option byte and debug memory map */ -#define OB_BASE ((uint32_t)0x1FFEC000U) /*!< OB base address */ -#define DBG_BASE ((uint32_t)0xE0044000U) /*!< DBG base address */ - -/* define marco USE_STDPERIPH_DRIVER */ -#if !defined USE_STDPERIPH_DRIVER -#define USE_STDPERIPH_DRIVER -#endif -#ifdef USE_STDPERIPH_DRIVER -#include "gd32f5xx_libopt.h" -#endif /* USE_STDPERIPH_DRIVER */ - -#ifdef __cplusplus -} -#endif -#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h deleted file mode 100644 index 1260a698fb3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h +++ /dev/null @@ -1,57 +0,0 @@ -/*! - \file system_gd32f5xx.h - \brief CMSIS Cortex-M33 Device Peripheral Access Layer Header File for - GD32F5xx Device Series -*/ - -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * Copyright (c) 2024, GigaDevice Semiconductor Inc. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ - -#ifndef SYSTEM_GD32F5XX_H -#define SYSTEM_GD32F5XX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* firmware version can be aquired by uncommenting the macro */ -#define __FIRMWARE_VERSION_DEFINE - -/* system clock frequency (core clock) */ -extern uint32_t SystemCoreClock; - -/* function declarations */ -/* initialize the system and update the SystemCoreClock variable */ -extern void SystemInit (void); -/* update the SystemCoreClock with current core clock retrieved from cpu registers */ -extern void SystemCoreClockUpdate (void); -#ifdef __FIRMWARE_VERSION_DEFINE -/* get firmware version */ -extern uint32_t gd32f5xx_firmware_version_get(void); -#endif /* __FIRMWARE_VERSION_DEFINE */ - -#ifdef __cplusplus -} -#endif - -#endif /* SYSTEM_GD32F5XX_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s deleted file mode 100644 index cb0938415d6..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/ARM/startup_gd32f5xx.s +++ /dev/null @@ -1,495 +0,0 @@ -;/*! -; \file startup_gd32f5xx.s -; \brief start up file -; -; \version 2024-07-31, V1.1.0, firmware for GD32F5xx -;*/ -; -;/* -; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. -; * Copyright (c) 2024, GigaDevice Semiconductor Inc. -; * -; * SPDX-License-Identifier: Apache-2.0 -; * -; * Licensed under the Apache License, Version 2.0 (the License); you may -; * not use this file except in compliance with the License. -; * You may obtain a copy of the License at -; * -; * www.apache.org/licenses/LICENSE-2.0 -; * -; * Unless required by applicable law or agreed to in writing, software -; * distributed under the License is distributed on an AS IS BASIS, WITHOUT -; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; * See the License for the specific language governing permissions and -; * limitations under the License. -; */ -; -;/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ - -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000400 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - -; /* reset Vector Mapped to at Address 0 */ - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - -; /* external interrupts handler */ - DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer - DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect - DCD TAMPER_STAMP_IRQHandler ; 18:Tamper and TimeStamp through EXTI Line detect - DCD RTC_WKUP_IRQHandler ; 19:RTC Wakeup through EXTI Line - DCD FMC_IRQHandler ; 20:FMC - DCD RCU_CTC_IRQHandler ; 21:RCU and CTC - DCD EXTI0_IRQHandler ; 22:EXTI Line 0 - DCD EXTI1_IRQHandler ; 23:EXTI Line 1 - DCD EXTI2_IRQHandler ; 24:EXTI Line 2 - DCD EXTI3_IRQHandler ; 25:EXTI Line 3 - DCD EXTI4_IRQHandler ; 26:EXTI Line 4 - DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 - DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 - DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 - DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 - DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 - DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 - DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 - DCD ADC_IRQHandler ; 34:ADC - DCD CAN0_TX_IRQHandler ; 35:CAN0 TX - DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 - DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 - DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC - DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 - DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 - DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 - DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commutation and TIMER10 - DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Capture Compare - DCD TIMER1_IRQHandler ; 44:TIMER1 - DCD TIMER2_IRQHandler ; 45:TIMER2 - DCD TIMER3_IRQHandler ; 46:TIMER3 - DCD I2C0_EV_IRQHandler ; 47:I2C0 Event - DCD I2C0_ER_IRQHandler ; 48:I2C0 Error - DCD I2C1_EV_IRQHandler ; 49:I2C1 Event - DCD I2C1_ER_IRQHandler ; 50:I2C1 Error - DCD SPI0_IRQHandler ; 51:SPI0 - DCD SPI1_IRQHandler ; 52:SPI1 - DCD USART0_IRQHandler ; 53:USART0 - DCD USART1_IRQHandler ; 54:USART1 - DCD USART2_IRQHandler ; 55:USART2 - DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 - DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm - DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup - DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 - DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 - DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commutation and TIMER13 - DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare - DCD DMA0_Channel7_IRQHandler ; 63:DMA0 Channel7 - DCD EXMC_IRQHandler ; 64:EXMC - DCD SDIO_IRQHandler ; 65:SDIO - DCD TIMER4_IRQHandler ; 66:TIMER4 - DCD SPI2_IRQHandler ; 67:SPI2 - DCD UART3_IRQHandler ; 68:UART3 - DCD UART4_IRQHandler ; 69:UART4 - DCD TIMER5_DAC_IRQHandler ; 70:TIMER5 and DAC0 DAC1 Underrun error - DCD TIMER6_IRQHandler ; 71:TIMER6 - DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 - DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 - DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 - DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 - DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 - DCD ENET_IRQHandler ; 77:Ethernet - DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line - DCD CAN1_TX_IRQHandler ; 79:CAN1 TX - DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 - DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC - DCD USBFS_IRQHandler ; 83:USBFS - DCD DMA1_Channel5_IRQHandler ; 84:DMA1 Channel5 - DCD DMA1_Channel6_IRQHandler ; 85:DMA1 Channel6 - DCD DMA1_Channel7_IRQHandler ; 86:DMA1 Channel7 - DCD USART5_IRQHandler ; 87:USART5 - DCD I2C2_EV_IRQHandler ; 88:I2C2 Event - DCD I2C2_ER_IRQHandler ; 89:I2C2 Error - DCD USBHS_EP1_Out_IRQHandler ; 90:USBHS Endpoint 1 Out - DCD USBHS_EP1_In_IRQHandler ; 91:USBHS Endpoint 1 in - DCD USBHS_WKUP_IRQHandler ; 92:USBHS Wakeup through EXTI Line - DCD USBHS_IRQHandler ; 93:USBHS - DCD DCI_IRQHandler ; 94:DCI - DCD 0 ; 95:Reserved - DCD TRNG_IRQHandler ; 96:TRNG - DCD FPU_IRQHandler ; 97:FPU - DCD UART6_IRQHandler ; 98:UART6 - DCD UART7_IRQHandler ; 99:UART7 - DCD SPI3_IRQHandler ; 100:SPI3 - DCD SPI4_IRQHandler ; 101:SPI4 - DCD SPI5_IRQHandler ; 102:SPI5 - DCD SAI_IRQHandler ; 103:SAI - DCD TLI_IRQHandler ; 104:TLI - DCD TLI_ER_IRQHandler ; 105:TLI Error - DCD IPA_IRQHandler ; 106:IPA - DCD PKCAU_IRQHandler ; 107:PKCAU - DCD I2C3_EV_IRQHandler ; 108:I2C3 Event - DCD I2C3_ER_IRQHandler ; 109:I2C3 Error - DCD I2C4_EV_IRQHandler ; 110:I2C4 Event - DCD I2C4_ER_IRQHandler ; 111:I2C4 Error - DCD I2C5_EV_IRQHandler ; 112:I2C5 Event - DCD I2C5_ER_IRQHandler ; 113:I2C5 Error - DCD I2C3_WKUP_IRQHandler ; 114:I2C3 Wakeup through EXTI Line - DCD I2C4_WKUP_IRQHandler ; 115:I2C4 Wakeup through EXTI Line - DCD I2C5_WKUP_IRQHandler ; 116:I2C5 Wakeup through EXTI Line - DCD SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler ; 117:SYSCFG SRAM and Flash single bit ECC Error - DCD HAU_IRQHandler ; 118:HAU - DCD CAU_IRQHandler ; 119:CAU - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -;/* reset Handler */ -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT SystemInit - IMPORT __main - IMPORT |Image$$RW_IRAM1$$RW$$Base| - - LDR R0, =|Image$$RW_IRAM1$$RW$$Base| - ADD R1, R0, #0x8000 - LDR R2, =0x0 -MEM_INIT STRD R2, R2, [ R0 ] , #8 - CMP R0, R1 - BNE MEM_INIT - - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -;/* dummy Exception Handlers */ -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler\ - PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler\ - PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC -; /* external interrupts handler */ - EXPORT WWDGT_IRQHandler [WEAK] - EXPORT LVD_IRQHandler [WEAK] - EXPORT TAMPER_STAMP_IRQHandler [WEAK] - EXPORT RTC_WKUP_IRQHandler [WEAK] - EXPORT FMC_IRQHandler [WEAK] - EXPORT RCU_CTC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA0_Channel0_IRQHandler [WEAK] - EXPORT DMA0_Channel1_IRQHandler [WEAK] - EXPORT DMA0_Channel2_IRQHandler [WEAK] - EXPORT DMA0_Channel3_IRQHandler [WEAK] - EXPORT DMA0_Channel4_IRQHandler [WEAK] - EXPORT DMA0_Channel5_IRQHandler [WEAK] - EXPORT DMA0_Channel6_IRQHandler [WEAK] - EXPORT ADC_IRQHandler [WEAK] - EXPORT CAN0_TX_IRQHandler [WEAK] - EXPORT CAN0_RX0_IRQHandler [WEAK] - EXPORT CAN0_RX1_IRQHandler [WEAK] - EXPORT CAN0_EWMC_IRQHandler [WEAK] - EXPORT EXTI5_9_IRQHandler [WEAK] - EXPORT TIMER0_BRK_TIMER8_IRQHandler [WEAK] - EXPORT TIMER0_UP_TIMER9_IRQHandler [WEAK] - EXPORT TIMER0_TRG_CMT_TIMER10_IRQHandler [WEAK] - EXPORT TIMER0_Channel_IRQHandler [WEAK] - EXPORT TIMER1_IRQHandler [WEAK] - EXPORT TIMER2_IRQHandler [WEAK] - EXPORT TIMER3_IRQHandler [WEAK] - EXPORT I2C0_EV_IRQHandler [WEAK] - EXPORT I2C0_ER_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT SPI0_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT USART0_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT EXTI10_15_IRQHandler [WEAK] - EXPORT RTC_Alarm_IRQHandler [WEAK] - EXPORT USBFS_WKUP_IRQHandler [WEAK] - EXPORT TIMER7_BRK_TIMER11_IRQHandler [WEAK] - EXPORT TIMER7_UP_TIMER12_IRQHandler [WEAK] - EXPORT TIMER7_TRG_CMT_TIMER13_IRQHandler [WEAK] - EXPORT TIMER7_Channel_IRQHandler [WEAK] - EXPORT DMA0_Channel7_IRQHandler [WEAK] - EXPORT EXMC_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TIMER4_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT UART3_IRQHandler [WEAK] - EXPORT UART4_IRQHandler [WEAK] - EXPORT TIMER5_DAC_IRQHandler [WEAK] - EXPORT TIMER6_IRQHandler [WEAK] - EXPORT DMA1_Channel0_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT ENET_IRQHandler [WEAK] - EXPORT ENET_WKUP_IRQHandler [WEAK] - EXPORT CAN1_TX_IRQHandler [WEAK] - EXPORT CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_EWMC_IRQHandler [WEAK] - EXPORT USBFS_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT USART5_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT USBHS_EP1_Out_IRQHandler [WEAK] - EXPORT USBHS_EP1_In_IRQHandler [WEAK] - EXPORT USBHS_WKUP_IRQHandler [WEAK] - EXPORT USBHS_IRQHandler [WEAK] - EXPORT DCI_IRQHandler [WEAK] - EXPORT TRNG_IRQHandler [WEAK] - EXPORT FPU_IRQHandler [WEAK] - EXPORT UART6_IRQHandler [WEAK] - EXPORT UART7_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT SPI4_IRQHandler [WEAK] - EXPORT SPI5_IRQHandler [WEAK] - EXPORT SAI_IRQHandler [WEAK] - EXPORT TLI_IRQHandler [WEAK] - EXPORT TLI_ER_IRQHandler [WEAK] - EXPORT IPA_IRQHandler [WEAK] - EXPORT PKCAU_IRQHandler [WEAK] - EXPORT I2C3_EV_IRQHandler [WEAK] - EXPORT I2C3_ER_IRQHandler [WEAK] - EXPORT I2C4_EV_IRQHandler [WEAK] - EXPORT I2C4_ER_IRQHandler [WEAK] - EXPORT I2C5_EV_IRQHandler [WEAK] - EXPORT I2C5_ER_IRQHandler [WEAK] - EXPORT I2C3_WKUP_IRQHandler [WEAK] - EXPORT I2C4_WKUP_IRQHandler [WEAK] - EXPORT I2C5_WKUP_IRQHandler [WEAK] - EXPORT SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler [WEAK] - EXPORT HAU_IRQHandler [WEAK] - EXPORT CAU_IRQHandler [WEAK] - -;/* external interrupts handler */ -WWDGT_IRQHandler -LVD_IRQHandler -TAMPER_STAMP_IRQHandler -RTC_WKUP_IRQHandler -FMC_IRQHandler -RCU_CTC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA0_Channel0_IRQHandler -DMA0_Channel1_IRQHandler -DMA0_Channel2_IRQHandler -DMA0_Channel3_IRQHandler -DMA0_Channel4_IRQHandler -DMA0_Channel5_IRQHandler -DMA0_Channel6_IRQHandler -ADC_IRQHandler -CAN0_TX_IRQHandler -CAN0_RX0_IRQHandler -CAN0_RX1_IRQHandler -CAN0_EWMC_IRQHandler -EXTI5_9_IRQHandler -TIMER0_BRK_TIMER8_IRQHandler -TIMER0_UP_TIMER9_IRQHandler -TIMER0_TRG_CMT_TIMER10_IRQHandler -TIMER0_Channel_IRQHandler -TIMER1_IRQHandler -TIMER2_IRQHandler -TIMER3_IRQHandler -I2C0_EV_IRQHandler -I2C0_ER_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -SPI0_IRQHandler -SPI1_IRQHandler -USART0_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -EXTI10_15_IRQHandler -RTC_Alarm_IRQHandler -USBFS_WKUP_IRQHandler -TIMER7_BRK_TIMER11_IRQHandler -TIMER7_UP_TIMER12_IRQHandler -TIMER7_TRG_CMT_TIMER13_IRQHandler -TIMER7_Channel_IRQHandler -DMA0_Channel7_IRQHandler -EXMC_IRQHandler -SDIO_IRQHandler -TIMER4_IRQHandler -SPI2_IRQHandler -UART3_IRQHandler -UART4_IRQHandler -TIMER5_DAC_IRQHandler -TIMER6_IRQHandler -DMA1_Channel0_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -ENET_IRQHandler -ENET_WKUP_IRQHandler -CAN1_TX_IRQHandler -CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_EWMC_IRQHandler -USBFS_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -USART5_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -USBHS_EP1_Out_IRQHandler -USBHS_EP1_In_IRQHandler -USBHS_WKUP_IRQHandler -USBHS_IRQHandler -DCI_IRQHandler -TRNG_IRQHandler -FPU_IRQHandler -UART6_IRQHandler -UART7_IRQHandler -SPI3_IRQHandler -SPI4_IRQHandler -SPI5_IRQHandler -SAI_IRQHandler -TLI_IRQHandler -TLI_ER_IRQHandler -IPA_IRQHandler -PKCAU_IRQHandler -I2C3_EV_IRQHandler -I2C3_ER_IRQHandler -I2C4_EV_IRQHandler -I2C4_ER_IRQHandler -I2C5_EV_IRQHandler -I2C5_ER_IRQHandler -I2C3_WKUP_IRQHandler -I2C4_WKUP_IRQHandler -I2C5_WKUP_IRQHandler -SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler -HAU_IRQHandler -CAU_IRQHandler - - B . - ENDP - - ALIGN - -; user Initial Stack & Heap - - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap PROC - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - ENDP - - ALIGN - - ENDIF - - END diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s deleted file mode 100644 index 2858036acf8..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/GCC/startup_gd32f5xx.s +++ /dev/null @@ -1,317 +0,0 @@ -;/* -; * Copyright (c) 2006-2021, RT-Thread Development Team -; * -; * SPDX-License-Identifier: Apache-2.0 -; * -; * Change Logs: -; * Date Author Notes -; * 2018-05-22 tanek first implementation -; */ - -.syntax unified -.cpu cortex-m4 -.fpu softvfp -.thumb - -.global g_pfnVectors -.global Default_Handler - - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - -g_pfnVectors: - .word _estack // Top of Stack - .word Reset_Handler // Reset Handler - .word NMI_Handler // NMI Handler - .word HardFault_Handler // Hard Fault Handler - .word MemManage_Handler // MPU Fault Handler - .word BusFault_Handler // Bus Fault Handler - .word UsageFault_Handler // Usage Fault Handler - .word 0 // Reserved - .word 0 // Reserved - .word 0 // Reserved - .word 0 // Reserved - .word SVC_Handler // SVCall Handler - .word DebugMon_Handler // Debug Monitor Handler - .word 0 // Reserved - .word PendSV_Handler // PendSV Handler - .word SysTick_Handler // SysTick Handler - - // external interrupts handler - .word WWDGT_IRQHandler // 16:Window Watchdog Timer - .word LVD_IRQHandler // 17:LVD through EXTI Line detect - .word TAMPER_STAMP_IRQHandler // 18:Tamper and TimeStamp through EXTI Line detect - .word RTC_WKUP_IRQHandler // 19:RTC Wakeup through EXTI Line - .word FMC_IRQHandler // 20:FMC - .word RCU_CTC_IRQHandler // 21:RCU and CTC - .word EXTI0_IRQHandler // 22:EXTI Line 0 - .word EXTI1_IRQHandler // 23:EXTI Line 1 - .word EXTI2_IRQHandler // 24:EXTI Line 2 - .word EXTI3_IRQHandler // 25:EXTI Line 3 - .word EXTI4_IRQHandler // 26:EXTI Line 4 - .word DMA0_Channel0_IRQHandler // 27:DMA0 Channel0 - .word DMA0_Channel1_IRQHandler // 28:DMA0 Channel1 - .word DMA0_Channel2_IRQHandler // 29:DMA0 Channel2 - .word DMA0_Channel3_IRQHandler // 30:DMA0 Channel3 - .word DMA0_Channel4_IRQHandler // 31:DMA0 Channel4 - .word DMA0_Channel5_IRQHandler // 32:DMA0 Channel5 - .word DMA0_Channel6_IRQHandler // 33:DMA0 Channel6 - .word ADC_IRQHandler // 34:ADC - .word CAN0_TX_IRQHandler // 35:CAN0 TX - .word CAN0_RX0_IRQHandler // 36:CAN0 RX0 - .word CAN0_RX1_IRQHandler // 37:CAN0 RX1 - .word CAN0_EWMC_IRQHandler // 38:CAN0 EWMC - .word EXTI5_9_IRQHandler // 39:EXTI5 to EXTI9 - .word TIMER0_BRK_TIMER8_IRQHandler // 40:TIMER0 Break and TIMER8 - .word TIMER0_UP_TIMER9_IRQHandler // 41:TIMER0 Update and TIMER9 - .word TIMER0_TRG_CMT_TIMER10_IRQHandler // 42:TIMER0 Trigger and Commutation and TIMER10 - .word TIMER0_CC_IRQHandler // 43:TIMER0 Capture Compare - .word TIMER1_IRQHandler // 44:TIMER1 - .word TIMER2_IRQHandler // 45:TIMER2 - .word TIMER3_IRQHandler // 46:TIMER3 - .word I2C0_EV_IRQHandler // 47:I2C0 Event - .word I2C0_ER_IRQHandler // 48:I2C0 Error - .word I2C1_EV_IRQHandler // 49:I2C1 Event - .word I2C1_ER_IRQHandler // 50:I2C1 Error - .word SPI0_IRQHandler // 51:SPI0 - .word SPI1_IRQHandler // 52:SPI1 - .word USART0_IRQHandler // 53:USART0 - .word USART1_IRQHandler // 54:USART1 - .word USART2_IRQHandler // 55:USART2 - .word EXTI10_15_IRQHandler // 56:EXTI10 to EXTI15 - .word RTC_Alarm_IRQHandler // 57:RTC Alarm - .word USBFS_WKUP_IRQHandler // 58:USBFS Wakeup - .word TIMER7_BRK_TIMER11_IRQHandler // 59:TIMER7 Break and TIMER11 - .word TIMER7_UP_TIMER12_IRQHandler // 60:TIMER7 Update and TIMER12 - .word TIMER7_TRG_CMT_TIMER13_IRQHandler // 61:TIMER7 Trigger and Commutation and TIMER13 - .word TIMER7_CC_IRQHandler // 62:TIMER7 Capture Compare - .word DMA0_Channel7_IRQHandler // 63:DMA0 Channel7 - .word EXMC_IRQHandler // 64:EXMC - .word SDIO_IRQHandler // 65:SDIO - .word TIMER4_IRQHandler // 66:TIMER4 - .word SPI2_IRQHandler // 67:SPI2 - .word UART3_IRQHandler // 68:UART3 - .word UART4_IRQHandler // 69:UART4 - .word TIMER5_DAC_IRQHandler // 70:TIMER5 and DAC0 DAC1 Underrun error - .word TIMER6_IRQHandler // 71:TIMER6 - .word DMA1_Channel0_IRQHandler // 72:DMA1 Channel0 - .word DMA1_Channel1_IRQHandler // 73:DMA1 Channel1 - .word DMA1_Channel2_IRQHandler // 74:DMA1 Channel2 - .word DMA1_Channel3_IRQHandler // 75:DMA1 Channel3 - .word DMA1_Channel4_IRQHandler // 76:DMA1 Channel4 - .word ENET_IRQHandler // 77:Ethernet - .word ENET_WKUP_IRQHandler // 78:Ethernet Wakeup through EXTI Line - .word CAN1_TX_IRQHandler // 79:CAN1 TX - .word CAN1_RX0_IRQHandler // 80:CAN1 RX0 - .word CAN1_RX1_IRQHandler // 81:CAN1 RX1 - .word CAN1_EWMC_IRQHandler // 82:CAN1 EWMC - .word USBFS_IRQHandler // 83:USBFS - .word DMA1_Channel5_IRQHandler // 84:DMA1 Channel5 - .word DMA1_Channel6_IRQHandler // 85:DMA1 Channel6 - .word DMA1_Channel7_IRQHandler // 86:DMA1 Channel7 - .word USART5_IRQHandler // 87:USART5 - .word I2C2_EV_IRQHandler // 88:I2C2 Event - .word I2C2_ER_IRQHandler // 89:I2C2 Error - .word USBHS_EP1_Out_IRQHandler // 90:USBHS Endpoint 1 Out - .word USBHS_EP1_In_IRQHandler // 91:USBHS Endpoint 1 in - .word USBHS_WKUP_IRQHandler // 92:USBHS Wakeup through EXTI Line - .word USBHS_IRQHandler // 93:USBHS - .word DCI_IRQHandler // 94:DCI - .word 0 // 95:Reserved - .word TRNG_IRQHandler // 96:TRNG - .word FPU_IRQHandler // 97:FPU - .word UART6_IRQHandler // 98:UART6 - .word UART7_IRQHandler // 99:UART7 - .word SPI3_IRQHandler // 100:SPI3 - .word SPI4_IRQHandler // 101:SPI4 - .word SPI5_IRQHandler // 102:SPI5 - .word 0 // 103:Reserved - .word TLI_IRQHandler // 104:TLI - .word TLI_ER_IRQHandler // 105:TLI Error - .word IPA_IRQHandler // 106:IPA - - .size g_pfnVectors, .-g_pfnVectors - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r1, =_sidata - ldr r2, =_sdata - ldr r3, =_edata - - subs r3, r2 - ble fill_bss_start - -loop_copy_data: - subs r3, #4 - ldr r0, [r1,r3] - str r0, [r2,r3] - bgt loop_copy_data - -fill_bss_start: - ldr r1, =__bss_start - ldr r2, =__bss_end - movs r0, 0 - subs r2, r1 - ble startup_enter - -loop_fill_bss: - subs r2, #4 - str r0, [r1, r2] - bgt loop_fill_bss - -startup_enter: - bl SystemInit - bl entry - - /* Exception Handlers */ - .weak NMI_Handler - .type NMI_Handler, %function -NMI_Handler: - b . - .size NMI_Handler, . - NMI_Handler - - .weak MemManage_Handler - .type MemManage_Handler, %function -MemManage_Handler: - b . - .size MemManage_Handler, . - MemManage_Handler - - .weak BusFault_Handler - .type BusFault_Handler, %function -BusFault_Handler: - b . - .size BusFault_Handler, . - BusFault_Handler - - .weak UsageFault_Handler - .type UsageFault_Handler, %function -UsageFault_Handler: - b . - .size UsageFault_Handler, . - UsageFault_Handler - - .weak SVC_Handler - .type SVC_Handler, %function -SVC_Handler: - b . - .size SVC_Handler, . - SVC_Handler - - .weak DebugMon_Handler - .type DebugMon_Handler, %function -DebugMon_Handler: - b . - .size DebugMon_Handler, . - DebugMon_Handler - - .weak PendSV_Handler - .type PendSV_Handler, %function -PendSV_Handler: - b . - .size PendSV_Handler, . - PendSV_Handler - - .weak SysTick_Handler - .type SysTick_Handler, %function -SysTick_Handler: - b . - .size SysTick_Handler, . - SysTick_Handler - - /* IQR Handler */ - .section .text.Default_Handler,"ax",%progbits - .type Default_Handler, %function -Default_Handler: - b . - .size Default_Handler, . - Default_Handler - - .macro IRQ handler - .weak \handler - .set \handler, Default_Handler - .endm - - IRQ WWDGT_IRQHandler - IRQ LVD_IRQHandler - IRQ TAMPER_STAMP_IRQHandler - IRQ RTC_WKUP_IRQHandler - IRQ FMC_IRQHandler - IRQ RCU_CTC_IRQHandler - IRQ EXTI0_IRQHandler - IRQ EXTI1_IRQHandler - IRQ EXTI2_IRQHandler - IRQ EXTI3_IRQHandler - IRQ EXTI4_IRQHandler - IRQ DMA0_Channel0_IRQHandler - IRQ DMA0_Channel1_IRQHandler - IRQ DMA0_Channel2_IRQHandler - IRQ DMA0_Channel3_IRQHandler - IRQ DMA0_Channel4_IRQHandler - IRQ DMA0_Channel5_IRQHandler - IRQ DMA0_Channel6_IRQHandler - IRQ ADC_IRQHandler - IRQ CAN0_TX_IRQHandler - IRQ CAN0_RX0_IRQHandler - IRQ CAN0_RX1_IRQHandler - IRQ CAN0_EWMC_IRQHandler - IRQ EXTI5_9_IRQHandler - IRQ TIMER0_BRK_TIMER8_IRQHandler - IRQ TIMER0_UP_TIMER9_IRQHandler - IRQ TIMER0_TRG_CMT_TIMER10_IRQHandler - IRQ TIMER0_CC_IRQHandler - IRQ TIMER1_IRQHandler - IRQ TIMER2_IRQHandler - IRQ TIMER3_IRQHandler - IRQ I2C0_EV_IRQHandler - IRQ I2C0_ER_IRQHandler - IRQ I2C1_EV_IRQHandler - IRQ I2C1_ER_IRQHandler - IRQ SPI0_IRQHandler - IRQ SPI1_IRQHandler - IRQ USART0_IRQHandler - IRQ USART1_IRQHandler - IRQ USART2_IRQHandler - IRQ EXTI10_15_IRQHandler - IRQ RTC_Alarm_IRQHandler - IRQ USBFS_WKUP_IRQHandler - IRQ TIMER7_BRK_TIMER11_IRQHandler - IRQ TIMER7_UP_TIMER12_IRQHandler - IRQ TIMER7_TRG_CMT_TIMER13_IRQHandler - IRQ TIMER7_CC_IRQHandler - IRQ DMA0_Channel7_IRQHandler - IRQ EXMC_IRQHandler - IRQ SDIO_IRQHandler - IRQ TIMER4_IRQHandler - IRQ SPI2_IRQHandler - IRQ UART3_IRQHandler - IRQ UART4_IRQHandler - IRQ TIMER5_DAC_IRQHandler - IRQ TIMER6_IRQHandler - IRQ DMA1_Channel0_IRQHandler - IRQ DMA1_Channel1_IRQHandler - IRQ DMA1_Channel2_IRQHandler - IRQ DMA1_Channel3_IRQHandler - IRQ DMA1_Channel4_IRQHandler - IRQ ENET_IRQHandler - IRQ ENET_WKUP_IRQHandler - IRQ CAN1_TX_IRQHandler - IRQ CAN1_RX0_IRQHandler - IRQ CAN1_RX1_IRQHandler - IRQ CAN1_EWMC_IRQHandler - IRQ USBFS_IRQHandler - IRQ DMA1_Channel5_IRQHandler - IRQ DMA1_Channel6_IRQHandler - IRQ DMA1_Channel7_IRQHandler - IRQ USART5_IRQHandler - IRQ I2C2_EV_IRQHandler - IRQ I2C2_ER_IRQHandler - IRQ USBHS_EP1_Out_IRQHandler - IRQ USBHS_EP1_In_IRQHandler - IRQ USBHS_WKUP_IRQHandler - IRQ USBHS_IRQHandler - IRQ DCI_IRQHandler - IRQ TRNG_IRQHandler - IRQ FPU_IRQHandler - IRQ UART6_IRQHandler - IRQ UART7_IRQHandler - IRQ SPI3_IRQHandler - IRQ SPI4_IRQHandler - IRQ SPI5_IRQHandler - IRQ TLI_IRQHandler - IRQ TLI_ER_IRQHandler - IRQ IPA_IRQHandler diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s deleted file mode 100644 index edad76bf50a..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/IAR/startup_gd32f5xx.s +++ /dev/null @@ -1,750 +0,0 @@ -;/*! -; \file startup_gd32f5xx.s -; \brief start up file -; -; \version 2024-07-31, V1.1.0, firmware for GD32F5xx -;*/ -; -;/* -; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. -; * Copyright (c) 2024, GigaDevice Semiconductor Inc. -; * -; * SPDX-License-Identifier: Apache-2.0 -; * -; * Licensed under the Apache License, Version 2.0 (the License); you may -; * not use this file except in compliance with the License. -; * You may obtain a copy of the License at -; * -; * www.apache.org/licenses/LICENSE-2.0 -; * -; * Unless required by applicable law or agreed to in writing, software -; * distributed under the License is distributed on an AS IS BASIS, WITHOUT -; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; * See the License for the specific language governing permissions and -; * limitations under the License. -; */ -; -;/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) ; top of stack - DCD Reset_Handler ; Vector Number 1,Reset Handler - - DCD NMI_Handler ; Vector Number 2,NMI Handler - DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler - DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler - DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler - DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; Vector Number 11,SVCall Handler - DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; Vector Number 14,PendSV Handler - DCD SysTick_Handler ; Vector Number 15,SysTick Handler - - ; External Interrupts - DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer - DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect - DCD TAMPER_STAMP_IRQHandler ; 18:Tamper and TimeStamp through EXTI Line detect - DCD RTC_WKUP_IRQHandler ; 19:RTC Wakeup through EXTI Line - DCD FMC_IRQHandler ; 20:FMC - DCD RCU_CTC_IRQHandler ; 21:RCU and CTC - DCD EXTI0_IRQHandler ; 22:EXTI Line 0 - DCD EXTI1_IRQHandler ; 23:EXTI Line 1 - DCD EXTI2_IRQHandler ; 24:EXTI Line 2 - DCD EXTI3_IRQHandler ; 25:EXTI Line 3 - DCD EXTI4_IRQHandler ; 26:EXTI Line 4 - DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 - DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 - DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 - DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 - DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 - DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 - DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 - DCD ADC_IRQHandler ; 34:ADC - DCD CAN0_TX_IRQHandler ; 35:CAN0 TX - DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 - DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 - DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC - DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 - DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 - DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 - DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commucation and TIMER10 - DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare - DCD TIMER1_IRQHandler ; 44:TIMER1 - DCD TIMER2_IRQHandler ; 45:TIMER2 - DCD TIMER3_IRQHandler ; 46:TIMER3 - DCD I2C0_EV_IRQHandler ; 47:I2C0 Event - DCD I2C0_ER_IRQHandler ; 48:I2C0 Error - DCD I2C1_EV_IRQHandler ; 49:I2C1 Event - DCD I2C1_ER_IRQHandler ; 50:I2C1 Error - DCD SPI0_IRQHandler ; 51:SPI0 - DCD SPI1_IRQHandler ; 52:SPI1 - DCD USART0_IRQHandler ; 53:USART0 - DCD USART1_IRQHandler ; 54:USART1 - DCD USART2_IRQHandler ; 55:USART2 - DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 - DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm - DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup - DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 - DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 - DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commucation and TIMER13 - DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare - DCD DMA0_Channel7_IRQHandler ; 63:DMA0 Channel7 - DCD EXMC_IRQHandler ; 64:EXMC - DCD SDIO_IRQHandler ; 65:SDIO - DCD TIMER4_IRQHandler ; 66:TIMER4 - DCD SPI2_IRQHandler ; 67:SPI2 - DCD UART3_IRQHandler ; 68:UART3 - DCD UART4_IRQHandler ; 69:UART4 - DCD TIMER5_DAC_IRQHandler ; 70:TIMER5 and DAC0 DAC1 Underrun error - DCD TIMER6_IRQHandler ; 71:TIMER6 - DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 - DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 - DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 - DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 - DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 - DCD ENET_IRQHandler ; 77:Ethernet - DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line - DCD CAN1_TX_IRQHandler ; 79:CAN1 TX - DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 - DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC - DCD USBFS_IRQHandler ; 83:USBFS - DCD DMA1_Channel5_IRQHandler ; 84:DMA1 Channel5 - DCD DMA1_Channel6_IRQHandler ; 85:DMA1 Channel6 - DCD DMA1_Channel7_IRQHandler ; 86:DMA1 Channel7 - DCD USART5_IRQHandler ; 87:USART5 - DCD I2C2_EV_IRQHandler ; 88:I2C2 Event - DCD I2C2_ER_IRQHandler ; 89:I2C2 Error - DCD USBHS_EP1_Out_IRQHandler ; 90:USBHS Endpoint 1 Out - DCD USBHS_EP1_In_IRQHandler ; 91:USBHS Endpoint 1 in - DCD USBHS_WKUP_IRQHandler ; 92:USBHS Wakeup through EXTI Line - DCD USBHS_IRQHandler ; 93:USBHS - DCD DCI_IRQHandler ; 94:DCI - DCD 0 ; 95:Reserved - DCD TRNG_IRQHandler ; 96:TRNG - DCD FPU_IRQHandler ; 97:FPU - DCD UART6_IRQHandler ; 98:UART6 - DCD UART7_IRQHandler ; 99:UART7 - DCD SPI3_IRQHandler ; 100:SPI3 - DCD SPI4_IRQHandler ; 101:SPI4 - DCD SPI5_IRQHandler ; 102:SPI5 - DCD SAI_IRQHandler ; 103:SAI - DCD TLI_IRQHandler ; 104:TLI - DCD TLI_ER_IRQHandler ; 105:TLI Error - DCD IPA_IRQHandler ; 106:IPA - DCD PKCAU_IRQHandler ; 107:PKCAU - DCD I2C3_EV_IRQHandler ; 108:I2C3 Event - DCD I2C3_ER_IRQHandler ; 109:I2C3 Error - DCD I2C4_EV_IRQHandler ; 110:I2C4 Event - DCD I2C4_ER_IRQHandler ; 111:I2C4 Error - DCD I2C5_EV_IRQHandler ; 112:I2C5 Event - DCD I2C5_ER_IRQHandler ; 113:I2C5 Error - DCD I2C3_WKUP_IRQHandler ; 114:I2C3 Wakeup through EXTI Line - DCD I2C4_WKUP_IRQHandler ; 115:I2C4 Wakeup through EXTI Line - DCD I2C5_WKUP_IRQHandler ; 116:I2C5 Wakeup through EXTI Line - DCD SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler ; 117:SYSCFG SRAM ECC Error - DCD HAU_IRQHandler ; 118:HAU - DCD CAU_IRQHandler ; 119:CAU - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:NOROOT:REORDER(2) -Reset_Handler - LDR r2, =0x8000 - LDR r1, =0x20000000 - MOV r0, #0x00 - -SRAM_INIT - STM r1!, {r0} - SUBS r2, r2, #4 - CMP r2, #0x00 - BNE SRAM_INIT - - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDGT_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDGT_IRQHandler - B WWDGT_IRQHandler - - PUBWEAK LVD_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -LVD_IRQHandler - B LVD_IRQHandler - - PUBWEAK TAMPER_STAMP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TAMPER_STAMP_IRQHandler - B TAMPER_STAMP_IRQHandler - - PUBWEAK RTC_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_WKUP_IRQHandler - B RTC_WKUP_IRQHandler - - PUBWEAK FMC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FMC_IRQHandler - B FMC_IRQHandler - - PUBWEAK RCU_CTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCU_CTC_IRQHandler - B RCU_CTC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA0_Channel0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel0_IRQHandler - B DMA0_Channel0_IRQHandler - - PUBWEAK DMA0_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel1_IRQHandler - B DMA0_Channel1_IRQHandler - - PUBWEAK DMA0_Channel2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel2_IRQHandler - B DMA0_Channel2_IRQHandler - - PUBWEAK DMA0_Channel3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel3_IRQHandler - B DMA0_Channel3_IRQHandler - - PUBWEAK DMA0_Channel4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel4_IRQHandler - B DMA0_Channel4_IRQHandler - - PUBWEAK DMA0_Channel5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel5_IRQHandler - B DMA0_Channel5_IRQHandler - - PUBWEAK DMA0_Channel6_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel6_IRQHandler - B DMA0_Channel6_IRQHandler - - PUBWEAK ADC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC_IRQHandler - B ADC_IRQHandler - - PUBWEAK CAN0_TX_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN0_TX_IRQHandler - B CAN0_TX_IRQHandler - - PUBWEAK CAN0_RX0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN0_RX0_IRQHandler - B CAN0_RX0_IRQHandler - - PUBWEAK CAN0_RX1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN0_RX1_IRQHandler - B CAN0_RX1_IRQHandler - - PUBWEAK CAN0_EWMC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN0_EWMC_IRQHandler - B CAN0_EWMC_IRQHandler - - PUBWEAK EXTI5_9_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI5_9_IRQHandler - B EXTI5_9_IRQHandler - - PUBWEAK TIMER0_BRK_TIMER8_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER0_BRK_TIMER8_IRQHandler - B TIMER0_BRK_TIMER8_IRQHandler - - PUBWEAK TIMER0_UP_TIMER9_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER0_UP_TIMER9_IRQHandler - B TIMER0_UP_TIMER9_IRQHandler - - PUBWEAK TIMER0_TRG_CMT_TIMER10_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER0_TRG_CMT_TIMER10_IRQHandler - B TIMER0_TRG_CMT_TIMER10_IRQHandler - - PUBWEAK TIMER0_Channel_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER0_Channel_IRQHandler - B TIMER0_Channel_IRQHandler - - PUBWEAK TIMER1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER1_IRQHandler - B TIMER1_IRQHandler - - PUBWEAK TIMER2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER2_IRQHandler - B TIMER2_IRQHandler - - PUBWEAK TIMER3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER3_IRQHandler - B TIMER3_IRQHandler - - PUBWEAK I2C0_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C0_EV_IRQHandler - B I2C0_EV_IRQHandler - - PUBWEAK I2C0_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C0_ER_IRQHandler - B I2C0_ER_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK SPI0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI0_IRQHandler - B SPI0_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK USART0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART0_IRQHandler - B USART0_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK EXTI10_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI10_15_IRQHandler - B EXTI10_15_IRQHandler - - PUBWEAK RTC_Alarm_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_Alarm_IRQHandler - B RTC_Alarm_IRQHandler - - PUBWEAK USBFS_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBFS_WKUP_IRQHandler - B USBFS_WKUP_IRQHandler - - PUBWEAK TIMER7_BRK_TIMER11_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER7_BRK_TIMER11_IRQHandler - B TIMER7_BRK_TIMER11_IRQHandler - - PUBWEAK TIMER7_UP_TIMER12_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER7_UP_TIMER12_IRQHandler - B TIMER7_UP_TIMER12_IRQHandler - - PUBWEAK TIMER7_TRG_CMT_TIMER13_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER7_TRG_CMT_TIMER13_IRQHandler - B TIMER7_TRG_CMT_TIMER13_IRQHandler - - PUBWEAK TIMER7_Channel_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER7_Channel_IRQHandler - B TIMER7_Channel_IRQHandler - - PUBWEAK DMA0_Channel7_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA0_Channel7_IRQHandler - B DMA0_Channel7_IRQHandler - - PUBWEAK EXMC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXMC_IRQHandler - B EXMC_IRQHandler - - PUBWEAK SDIO_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SDIO_IRQHandler - B SDIO_IRQHandler - - PUBWEAK TIMER4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER4_IRQHandler - B TIMER4_IRQHandler - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - PUBWEAK UART3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -UART3_IRQHandler - B UART3_IRQHandler - - PUBWEAK UART4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -UART4_IRQHandler - B UART4_IRQHandler - - PUBWEAK TIMER5_DAC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER5_DAC_IRQHandler - B TIMER5_DAC_IRQHandler - - PUBWEAK TIMER6_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIMER6_IRQHandler - B TIMER6_IRQHandler - - PUBWEAK DMA1_Channel0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel0_IRQHandler - B DMA1_Channel0_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK ENET_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ENET_IRQHandler - B ENET_IRQHandler - - PUBWEAK ENET_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ENET_WKUP_IRQHandler - B ENET_WKUP_IRQHandler - - PUBWEAK CAN1_TX_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN1_TX_IRQHandler - B CAN1_TX_IRQHandler - - PUBWEAK CAN1_RX0_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN1_RX0_IRQHandler - B CAN1_RX0_IRQHandler - - PUBWEAK CAN1_RX1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN1_RX1_IRQHandler - B CAN1_RX1_IRQHandler - - PUBWEAK CAN1_EWMC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAN1_EWMC_IRQHandler - B CAN1_EWMC_IRQHandler - - PUBWEAK USBFS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBFS_IRQHandler - B USBFS_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK USART5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART5_IRQHandler - B USART5_IRQHandler - - PUBWEAK I2C2_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_EV_IRQHandler - B I2C2_EV_IRQHandler - - PUBWEAK I2C2_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_ER_IRQHandler - B I2C2_ER_IRQHandler - - PUBWEAK USBHS_EP1_Out_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBHS_EP1_Out_IRQHandler - B USBHS_EP1_Out_IRQHandler - - PUBWEAK USBHS_EP1_In_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBHS_EP1_In_IRQHandler - B USBHS_EP1_In_IRQHandler - - PUBWEAK USBHS_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBHS_WKUP_IRQHandler - B USBHS_WKUP_IRQHandler - - PUBWEAK USBHS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USBHS_IRQHandler - B USBHS_IRQHandler - - PUBWEAK DCI_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DCI_IRQHandler - B DCI_IRQHandler - - PUBWEAK TRNG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TRNG_IRQHandler - B TRNG_IRQHandler - - PUBWEAK FPU_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FPU_IRQHandler - B FPU_IRQHandler - - PUBWEAK UART6_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -UART6_IRQHandler - B UART6_IRQHandler - - PUBWEAK UART7_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -UART7_IRQHandler - B UART7_IRQHandler - - PUBWEAK SPI3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI3_IRQHandler - B SPI3_IRQHandler - - PUBWEAK SPI4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI4_IRQHandler - B SPI4_IRQHandler - - PUBWEAK SPI5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI5_IRQHandler - B SPI5_IRQHandler - - PUBWEAK SAI_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SAI_IRQHandler - B SAI_IRQHandler - - PUBWEAK TLI_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TLI_IRQHandler - B TLI_IRQHandler - - PUBWEAK TLI_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TLI_ER_IRQHandler - B TLI_ER_IRQHandler - - PUBWEAK IPA_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -IPA_IRQHandler - B IPA_IRQHandler - - PUBWEAK PKCAU_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PKCAU_IRQHandler - B PKCAU_IRQHandler - - PUBWEAK I2C3_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C3_EV_IRQHandler - B I2C3_EV_IRQHandler - - PUBWEAK I2C3_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C3_ER_IRQHandler - B I2C3_ER_IRQHandler - - PUBWEAK I2C4_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C4_EV_IRQHandler - B I2C4_EV_IRQHandler - - PUBWEAK I2C4_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C4_ER_IRQHandler - B I2C4_ER_IRQHandler - - PUBWEAK I2C5_EV_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C5_EV_IRQHandler - B I2C5_EV_IRQHandler - - PUBWEAK I2C5_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C5_ER_IRQHandler - B I2C5_ER_IRQHandler - - PUBWEAK I2C3_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C3_WKUP_IRQHandler - B I2C3_WKUP_IRQHandler - - PUBWEAK I2C4_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C4_WKUP_IRQHandler - B I2C4_WKUP_IRQHandler - - PUBWEAK I2C5_WKUP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C5_WKUP_IRQHandler - B I2C5_WKUP_IRQHandler - - PUBWEAK SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler - B SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler - - PUBWEAK HAU_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -HAU_IRQHandler - B HAU_IRQHandler - - PUBWEAK CAU_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CAU_IRQHandler - B CAU_IRQHandler - - END \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c deleted file mode 100644 index 29790b223c8..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c +++ /dev/null @@ -1,944 +0,0 @@ -/*! - \file system_gd32f5xx.c - \brief CMSIS Cortex-M33 Device Peripheral Access Layer Source File for - GD32F5xx Device Series -*/ - -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * Copyright (c) 2024, GigaDevice Semiconductor Inc. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ - -#include "gd32f5xx.h" - -/* system frequency define */ -#define __IRC16M (IRC16M_VALUE) /* internal 16 MHz RC oscillator frequency */ -#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ -#define __SYS_OSC_CLK (__IRC16M) /* main oscillator frequency */ - -#define VECT_TAB_OFFSET (uint32_t)0x00 /* vector table base offset */ - -/* select a system clock by uncommenting the following line */ -//#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M) -//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL) -//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000) -//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000) -//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000) -//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000) -//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000) -//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000) -//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000) -//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000) -#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000) - -#define RCU_MODIFY(__delay) do{ \ - volatile uint32_t i; \ - if(0U != __delay){ \ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV2; \ - for(i=0U; i<__delay; i++){ \ - } \ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV4; \ - for(i=0U; i<__delay; i++){ \ - } \ - } \ - }while(0) - -#define SEL_IRC16M 0x00U -#define SEL_HXTAL 0x01U -#define SEL_PLLP 0x02U - -/* set the system clock frequency and declare the system clock configuration function */ -#ifdef __SYSTEM_CLOCK_IRC16M -uint32_t SystemCoreClock = __SYSTEM_CLOCK_IRC16M; -static void system_clock_16m_irc16m(void); -#elif defined (__SYSTEM_CLOCK_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; -static void system_clock_hxtal(void); -#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_IRC16M; -static void system_clock_120m_irc16m(void); -#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_8M_HXTAL; -static void system_clock_120m_8m_hxtal(void); -#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_25M_HXTAL; -static void system_clock_120m_25m_hxtal(void); -#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_IRC16M; -static void system_clock_168m_irc16m(void); -#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_8M_HXTAL; -static void system_clock_168m_8m_hxtal(void); -#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_25M_HXTAL; -static void system_clock_168m_25m_hxtal(void); -#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_IRC16M; -static void system_clock_200m_irc16m(void); -#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_8M_HXTAL; -static void system_clock_200m_8m_hxtal(void); -#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) -uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_25M_HXTAL; -static void system_clock_200m_25m_hxtal(void); - -#endif /* __SYSTEM_CLOCK_IRC16M */ - -/* configure the system clock */ -static void system_clock_config(void); - -/*! - \brief setup the microcontroller system, initialize the system - \param[in] none - \param[out] none - \retval none -*/ -void SystemInit (void) -{ - /* FPU settings */ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1U) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ -#endif - /* Reset the RCU clock configuration to the default reset state */ - /* Set IRC16MEN bit */ - RCU_CTL |= RCU_CTL_IRC16MEN; - while(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ - } - RCU_MODIFY(0x50U); - - RCU_CFG0 &= ~RCU_CFG0_SCS; - - /* Reset HXTALEN, CKMEN and PLLEN bits */ - RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); - - /* Reset HSEBYP bit */ - RCU_CTL &= ~(RCU_CTL_HXTALBPS); - - /* Reset CFG0 register */ - RCU_CFG0 = 0x00000000U; - - /* wait until IRC16M is selected as system clock */ - while(RCU_SCSS_IRC16M != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } - - /* Reset PLLCFGR register */ - RCU_PLL = 0x24003010U; - - /* Disable all interrupts */ - RCU_INT = 0x00000000U; - - /* Configure the System clock source, PLL Multiplier and Divider factors, - AHB/APBx prescalers and Flash settings */ - system_clock_config(); - -#ifdef VECT_TAB_SRAM - nvic_vector_table_set(NVIC_VECTTAB_RAM, VECT_TAB_OFFSET); -#else - nvic_vector_table_set(NVIC_VECTTAB_FLASH, VECT_TAB_OFFSET); -#endif -} -/*! - \brief configure the system clock - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_config(void) -{ -#ifdef __SYSTEM_CLOCK_IRC16M - system_clock_16m_irc16m(); -#elif defined (__SYSTEM_CLOCK_HXTAL) - system_clock_hxtal(); -#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) - system_clock_120m_irc16m(); -#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) - system_clock_120m_8m_hxtal(); -#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) - system_clock_120m_25m_hxtal(); -#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) - system_clock_168m_irc16m(); -#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) - system_clock_168m_8m_hxtal(); -#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) - system_clock_168m_25m_hxtal(); -#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) - system_clock_200m_irc16m(); -#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) - system_clock_200m_8m_hxtal(); -#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) - system_clock_200m_25m_hxtal(); -#endif /* __SYSTEM_CLOCK_IRC16M */ -} - -#ifdef __SYSTEM_CLOCK_IRC16M -/*! - \brief configure the system clock to 16M by IRC16M - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_16m_irc16m(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable IRC16M */ - RCU_CTL |= RCU_CTL_IRC16MEN; - - /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); - }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ - while(1){ - } - } - - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; - /* APB1 = AHB */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; - - /* select IRC16M as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_IRC16M; - - /* wait until IRC16M is selected as system clock */ - while(RCU_SCSS_IRC16M != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_HXTAL) -/*! - \brief configure the system clock to HXTAL - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; - /* APB1 = AHB */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; - - /* select HXTAL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; - - /* wait until HXTAL is selected as system clock */ - while(RCU_SCSS_HXTAL != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M) -/*! - \brief configure the system clock to 120M by PLL which selects IRC16M as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_120m_irc16m(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable IRC16M */ - RCU_CTL |= RCU_CTL_IRC16MEN; - - /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); - }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* IRC16M is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 16, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ - RCU_PLL = (16U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_IRC16M) | (5U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 120 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL) -/*! - \brief configure the system clock to 120M by PLL which selects HXTAL(8M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_120m_8m_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 8, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ - RCU_PLL = (8U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (5U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 120 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL) -/*! - \brief configure the system clock to 120M by PLL which selects HXTAL(25M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_120m_25m_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 25, PLL_N = 240, PLL_P = 2, PLL_Q = 5 */ - RCU_PLL = (25U | (240U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (5U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 120 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M) -/*! - \brief configure the system clock to 168M by PLL which selects IRC16M as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_168m_irc16m(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable IRC16M */ - RCU_CTL |= RCU_CTL_IRC16MEN; - - /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); - }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* IRC16M is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 16, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ - RCU_PLL = (16U | (336U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_IRC16M) | (7U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 168 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL) -/*! - \brief configure the system clock to 168M by PLL which selects HXTAL(8M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_168m_8m_hxtal(void) -{ - uint32_t timeout = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - while((0U == (RCU_CTL & RCU_CTL_HXTALSTB)) && (HXTAL_STARTUP_TIMEOUT != timeout++)){ - } - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 8, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ - RCU_PLL = (8U | (336 << 6U) | (((2 >> 1U) -1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (7 << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 168 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL) -/*! - \brief configure the system clock to 168M by PLL which selects HXTAL(25M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_168m_25m_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 25, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */ - RCU_PLL = (25U | (336U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (7U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 168 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M) -/*! - \brief configure the system clock to 200M by PLL which selects IRC16M as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_200m_irc16m(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable IRC16M */ - RCU_CTL |= RCU_CTL_IRC16MEN; - - /* wait until IRC16M is stable or the startup time is longer than IRC16M_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_IRC16MSTB); - }while((0U == stab_flag) && (IRC16M_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_IRC16MSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* IRC16M is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 16, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ - RCU_PLL = (16U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_IRC16M) | (9U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 200 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL) -/*! - \brief configure the system clock to 200M by PLL which selects HXTAL(8M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_200m_8m_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ - RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (9U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 200 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} - -#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL) -/*! - \brief configure the system clock to 200M by PLL which selects HXTAL(25M) as its clock source - \param[in] none - \param[out] none - \retval none -*/ -static void system_clock_200m_25m_hxtal(void) -{ - uint32_t timeout = 0U; - uint32_t stab_flag = 0U; - - /* enable HXTAL */ - RCU_CTL |= RCU_CTL_HXTALEN; - - /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ - do{ - timeout++; - stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); - }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); - - /* if fail */ - if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ - while(1){ - } - } - - RCU_APB1EN |= RCU_APB1EN_PMUEN; - PMU_CTL |= PMU_CTL_LDOVS; - - /* HXTAL is stable */ - /* AHB = SYSCLK */ - RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; - /* APB2 = AHB/2 */ - RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; - /* APB1 = AHB/4 */ - RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; - - /* Configure the main PLL, PSC = 25, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ - RCU_PLL = (25U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | - (RCU_PLLSRC_HXTAL) | (9U << 24U)); - - /* enable PLL */ - RCU_CTL |= RCU_CTL_PLLEN; - - /* wait until PLL is stable */ - while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ - } - - /* Enable the high-drive to extend the clock frequency to 200 Mhz */ - PMU_CTL |= PMU_CTL_HDEN; - while(0U == (PMU_CS & PMU_CS_HDRF)){ - } - - /* select the high-drive mode */ - PMU_CTL |= PMU_CTL_HDS; - while(0U == (PMU_CS & PMU_CS_HDSRF)){ - } - - /* select PLL as system clock */ - RCU_CFG0 &= ~RCU_CFG0_SCS; - RCU_CFG0 |= RCU_CKSYSSRC_PLLP; - - /* wait until PLL is selected as system clock */ - while( RCU_SCSS_PLLP != (RCU_CFG0 & RCU_CFG0_SCSS)){ - } -} -#endif /* __SYSTEM_CLOCK_IRC16M */ -/*! - \brief update the SystemCoreClock with current core clock retrieved from cpu registers - \param[in] none - \param[out] none - \retval none -*/ -void SystemCoreClockUpdate(void) -{ - uint32_t sws; - uint32_t pllpsc, plln, pllsel, pllp, ck_src, idx, clk_exp; - - /* exponent of AHB, APB1 and APB2 clock divider */ - const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - - sws = GET_BITS(RCU_CFG0, 2, 3); - switch(sws){ - /* IRC16M is selected as CK_SYS */ - case SEL_IRC16M: - SystemCoreClock = IRC16M_VALUE; - break; - /* HXTAL is selected as CK_SYS */ - case SEL_HXTAL: - SystemCoreClock = HXTAL_VALUE; - break; - /* PLLP is selected as CK_SYS */ - case SEL_PLLP: - /* get the value of PLLPSC[5:0] */ - pllpsc = GET_BITS(RCU_PLL, 0U, 5U); - plln = GET_BITS(RCU_PLL, 6U, 14U); - pllp = (GET_BITS(RCU_PLL, 16U, 17U) + 1U) * 2U; - /* PLL clock source selection, HXTAL or IRC8M/2 */ - pllsel = (RCU_PLL & RCU_PLL_PLLSEL); - if (RCU_PLLSRC_HXTAL == pllsel) { - ck_src = HXTAL_VALUE; - } else { - ck_src = IRC16M_VALUE; - } - SystemCoreClock = ((ck_src / pllpsc) * plln) / pllp; - break; - /* IRC16M is selected as CK_SYS */ - default: - SystemCoreClock = IRC16M_VALUE; - break; - } - /* calculate AHB clock frequency */ - idx = GET_BITS(RCU_CFG0, 4, 7); - clk_exp = ahb_exp[idx]; - SystemCoreClock = SystemCoreClock >> clk_exp; -} - -#ifdef __FIRMWARE_VERSION_DEFINE -/*! - \brief get firmware version - \param[in] none - \param[out] none - \retval firmware version -*/ -uint32_t gd32f5xx_firmware_version_get(void) -{ - return __GD32F5XX_STDPERIPH_VERSION; -} -#endif /* __FIRMWARE_VERSION_DEFINE */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT deleted file mode 100644 index 8dada3edaf5..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/LICENSE.TXT +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h deleted file mode 100644 index ecf24b14313..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armcc.h +++ /dev/null @@ -1,817 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (ARM compiler V5) header file - * @version V5.0.2 - * @date 13. February 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* CMSIS compiler control architecture macros */ -#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ - (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 -#endif - - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ - - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed)) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION __packed union -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#else - (void)fpscr; -#endif -} - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB()do -{\ - __schedule_barrier();\ - __isb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB()do -{\ - __schedule_barrier();\ - __dsb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB()do -{\ - __schedule_barrier();\ - __dmb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return(result); -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h deleted file mode 100644 index 543ea2c4825..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_armclang.h +++ /dev/null @@ -1,1803 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang.h - * @brief CMSIS compiler ARMCLANG (ARM compiler V6) header file - * @version V5.0.3 - * @date 27. March 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#ifndef __ARM_COMPAT_H -#include /* Compatibility header for ARM Compiler 5 intrinsics */ -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed))T_UINT32 - { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); see arm_compat.h */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); see arm_compat.h */ - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_SP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return(result); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Get Process Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - - return(result); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Get Main Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Set Main Stack Pointer Limit (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -/* #define __get_FPSCR __builtin_arm_get_fpscr */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -/* #define __set_FPSCR __builtin_arm_set_fpscr */ -__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "memory"); -#else - (void)fpscr; -#endif -} - -#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF); - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF); - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF); - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __builtin_bswap32 - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16 __builtin_bswap16 /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */ -#if 0 -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} -#endif - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ - /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ - int32_t result; - - __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ - /* ToDo ARMCLANG: check if __builtin_arm_rbit is supported */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return(result); -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __builtin_clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#if 0 -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) -#endif - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h deleted file mode 100644 index ac54d891ee3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_compiler.h +++ /dev/null @@ -1,355 +0,0 @@ -/**************************************************************************//** - * @file cmsis_compiler.h - * @brief CMSIS compiler generic header file - * @version V5.0.2 - * @date 13. February 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_COMPILER_H -#define __CMSIS_COMPILER_H - -#include - -/* - * ARM Compiler 4/5 - */ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - - -/* - * ARM Compiler 6 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #include "cmsis_armclang.h" - - -/* - * GNU Compiler - */ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - - -/* - * IAR Compiler - */ -#elif defined ( __ICCARM__ ) - - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - - #include - - /* CMSIS compiler control architecture macros */ - #if (__CORE__ == __ARM6M__) || (__CORE__ == __ARM6SM__) - #ifndef __ARM_ARCH_6M__ - #define __ARM_ARCH_6M__ 1 - #endif - #elif (__CORE__ == __ARM7M__) - #ifndef __ARM_ARCH_7M__ - #define __ARM_ARCH_7M__ 1 - #endif - #elif (__CORE__ == __ARM7EM__) - #ifndef __ARM_ARCH_7EM__ - #define __ARM_ARCH_7EM__ 1 - #endif - #endif - - #ifndef __NO_RETURN - #define __NO_RETURN __noreturn - #endif - #ifndef __USED - #define __USED __root - #endif - #ifndef __WEAK - #define __WEAK __weak - #endif - #ifndef __PACKED - #define __PACKED __packed - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION __packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - __packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. - #define __ALIGNED(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - - /* Workaround for missing __CLZ intrinsic in*/ - /* various versions of the IAR compilers.*/ - /* __IAR_FEATURE_CLZ__ should be defined by*/ - /* the compiler that supports __CLZ internally.*/ - #if (defined (__ARM_ARCH_6M__)) && (__ARM_ARCH_6M__ == 1) && (!defined (__IAR_FEATURE_CLZ__)) - __STATIC_INLINE uint32_t __CLZ(uint32_t data) - { - if (data == 0u) - { return 32u; } - - uint32_t count = 0; - uint32_t mask = 0x80000000; - - while ((data & mask) == 0) - { - count += 1u; - mask = mask >> 1u; - } - - return (count); - } - #endif - - -/* - * TI ARM Compiler - */ -#elif defined ( __TI_ARM__ ) - #include - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __attribute__((packed)) - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed)) - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed)) - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __attribute__((packed))T_UINT32 - { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - - -/* - * TASKING Compiler - */ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __packed__ - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __packed__ - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __packed__ - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __packed__ T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __align(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - - -/* - * COSMIC Compiler - */ -#elif defined ( __CSMC__ ) - #include - - #ifndef __ASM - #define __ASM _asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __NO_RETURN - /* NO RETURN is automatically detected hence no warning here*/ - #define __NO_RETURN - #endif - #ifndef __USED - #warning No compiler specific solution for __USED. __USED is ignored. - #define __USED - #endif - #ifndef __WEAK - #define __WEAK __weak - #endif - #ifndef __PACKED - #define __PACKED @packed - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT @packed struct - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION @packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - @packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. - #define __ALIGNED(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - - -#else - #error Unknown compiler. -#endif - - -#endif /* __CMSIS_COMPILER_H */ - diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h deleted file mode 100644 index f6dd0e8f4b0..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_gcc.h +++ /dev/null @@ -1,1980 +0,0 @@ -/**************************************************************************//** - * @file cmsis_gcc.h - * @brief CMSIS compiler GCC header file - * @version V5.0.2 - * @date 13. February 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_GCC_H -#define __CMSIS_GCC_H - -/* ignore some GCC warnings */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -/* Fallback for __has_builtin */ -#ifndef __has_builtin - #define __has_builtin(x) (0) -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - struct __attribute__((packed))T_UINT32 - { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_SP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return(result); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Get Process Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - - return(result); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Get Main Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -} - - -#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ - (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Set Main Stack Pointer Limit (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_get_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - return __builtin_arm_get_fpscr(); -#else - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#endif -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_set_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - __builtin_arm_set_fpscr(fpscr); -#else - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); -#endif -#else - (void)fpscr; -#endif -} - -#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -/*__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)*/ -/*{*/ -/* __ASM volatile ("nop");*/ -/*}*/ -#define __NOP() __ASM volatile ("nop") /* This implementation generates debug information */ - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -/*__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)*/ -/*{*/ -/* __ASM volatile ("wfi");*/ -/*}*/ -#define __WFI() __ASM volatile ("wfi") /* This implementation generates debug information */ - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -/*__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)*/ -/*{*/ -/* __ASM volatile ("wfe");*/ -/*}*/ -#define __WFE() __ASM volatile ("wfe") /* This implementation generates debug information */ - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -/*__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)*/ -/*{*/ -/* __ASM volatile ("sev");*/ -/*}*/ -#define __SEV() __ASM volatile ("sev") /* This implementation generates debug information */ - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -__attribute__((always_inline)) __STATIC_INLINE void __ISB(void) -{ - __ASM volatile ("isb 0xF":::"memory"); -} - - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__((always_inline)) __STATIC_INLINE void __DSB(void) -{ - __ASM volatile ("dsb 0xF":::"memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__((always_inline)) __STATIC_INLINE void __DMB(void) -{ - __ASM volatile ("dmb 0xF":::"memory"); -} - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (short)__builtin_bswap16(value); -#else - int32_t result; - - __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return(result); -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __builtin_clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAEXB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAEXH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDAEX(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); - return(result); -} - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (__ARM_FEATURE_DSP == 1) /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */ - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#if 0 -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) -#endif - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#pragma GCC diagnostic pop - -#endif /* __CMSIS_GCC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h deleted file mode 100644 index d458a6c8599..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/cmsis_version.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************//** - * @file cmsis_version.h - * @brief CMSIS Core(M) Version definitions - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CMSIS_VERSION_H -#define __CMSIS_VERSION_H - -/* CMSIS Version definitions */ -#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ -#define __CM_CMSIS_VERSION_SUB ( 0U) /*!< [15:0] CMSIS Core(M) sub version */ -#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ - __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ -#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h deleted file mode 100644 index ccb1e3a3d30..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mbl.h +++ /dev/null @@ -1,1878 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mbl.h - * @brief CMSIS ARMv8MBL Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_ARMV8MBL_H_GENERIC -#define __CORE_ARMV8MBL_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MBL - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MBL_H_DEPENDANT -#define __CORE_ARMV8MBL_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MBL_REV - #define __ARMv8MBL_REV 0x0000U - #warning "__ARMv8MBL_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MBL */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED4[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for ARMv8-M Baseline */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for ARMv8-M Baseline */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h deleted file mode 100644 index 80f41527120..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_armv8mml.h +++ /dev/null @@ -1,2902 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mml.h - * @brief CMSIS ARMv8MML Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_ARMV8MML_H_GENERIC -#define __CORE_ARMV8MML_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS ARMv8MML definitions */ -#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (81U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MML_H_DEPENDANT -#define __CORE_ARMV8MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MML_REV - #define __ARMv8MML_REV 0x0000U - #warning "__ARMv8MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED3[92U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED4[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h deleted file mode 100644 index 27fdbcfe6d3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0.h +++ /dev/null @@ -1,888 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M0 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000U - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - Address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)0x0U; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)0x0U; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h deleted file mode 100644 index 4fbaa918541..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm0plus.h +++ /dev/null @@ -1,1021 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex-M0+ - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0+ definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ - __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000U - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0+ header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0+ */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0+ */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; - -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h deleted file mode 100644 index b97fa9dd3f0..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm23.h +++ /dev/null @@ -1,1878 +0,0 @@ -/**************************************************************************//** - * @file core_cm23.h - * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM23_H_GENERIC -#define __CORE_CM23_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M23 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ - __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (23U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM23_H_DEPENDANT -#define __CORE_CM23_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM23_REV - #define __CM23_REV 0x0000U - #warning "__CM23_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M23 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED4[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h deleted file mode 100644 index 2f4295f120e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm3.h +++ /dev/null @@ -1,1928 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M3 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (3U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1U]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h deleted file mode 100644 index dee3d65b69c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm33.h +++ /dev/null @@ -1,2898 +0,0 @@ -/**************************************************************************//** - * @file core_cm33.h - * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM33_H_GENERIC -#define __CORE_CM33_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M33 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM33 definitions */ -#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ - __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (33U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM33_H_DEPENDANT -#define __CORE_CM33_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM33_REV - #define __CM33_REV 0x0000U - #warning "__CM33_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M33 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED3[92U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED4[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h deleted file mode 100644 index 28df20ad310..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm4.h +++ /dev/null @@ -1,2113 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M4 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (4U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000U - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h deleted file mode 100644 index dd3700c92c2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_cm7.h +++ /dev/null @@ -1,2658 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM7_H_GENERIC -#define __CORE_CM7_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M7 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (7U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_INLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_INLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_INLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_INLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_INLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - register uint32_t ccsidr; - register uint32_t sets; - register uint32_t ways; - - SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_INLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_INLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_INLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t)addr; - int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) - { - SCB->DCIMVAC = op_addr; - op_addr += (uint32_t)linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t) addr; - int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) - { - SCB->DCCMVAC = op_addr; - op_addr += (uint32_t)linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t) addr; - int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) - { - SCB->DCCIMVAC = op_addr; - op_addr += (uint32_t)linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/*@} end of CMSIS_Core_CacheFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h deleted file mode 100644 index bd26eaa0db9..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc000.h +++ /dev/null @@ -1,1016 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (000U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000U - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the SC000 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h deleted file mode 100644 index 780372a350c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/core_sc300.h +++ /dev/null @@ -1,1903 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V5.0.2 - * @date 19. April 2017 - ******************************************************************************/ -/* - * Copyright (c) 2009-2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC3000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (300U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000U - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - uint32_t RESERVED1[1U]; -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h deleted file mode 100644 index 168b501345b..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/mpu_armv7.h +++ /dev/null @@ -1,182 +0,0 @@ -/****************************************************************************** - * @file mpu_armv7.h - * @brief CMSIS MPU API for ARMv7 MPU - * @version V5.0.2 - * @date 09. June 2017 - ******************************************************************************/ -/* - * Copyright (c) 2017 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ARM_MPU_ARMV7_H -#define ARM_MPU_ARMV7_H - -#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) -#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) -#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) -#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) -#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) -#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) -#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) -#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) -#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) -#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) -#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) -#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) -#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) -#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) -#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) -#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) -#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) -#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) -#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) -#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) -#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) -#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) -#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) -#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) -#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) -#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) -#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) -#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) - -#define ARM_MPU_AP_NONE 0u -#define ARM_MPU_AP_PRIV 1u -#define ARM_MPU_AP_URO 2u -#define ARM_MPU_AP_FULL 3u -#define ARM_MPU_AP_PRO 5u -#define ARM_MPU_AP_RO 6u - -/** MPU Region Base Address Register Value -* -* \param Region The region to be configured, number 0 to 15. -* \param BaseAddress The base address for the region. -*/ -#define ARM_MPU_RBAR(Region, BaseAddress) ((BaseAddress & MPU_RBAR_ADDR_Msk) | (Region & MPU_RBAR_REGION_Msk) | (1UL << MPU_RBAR_VALID_Pos)) - -/** -* MPU Region Attribut and Size Register Value -* -* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. -* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. -* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. -* \param IsShareable Region is shareable between multiple bus masters. -* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. -* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. -* \param SubRegionDisable Sub-region disable field. -* \param Size Region size of the region to be configured, for example 4K, 8K. -*/ -#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ - ((DisableExec << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ - ((AccessPermission << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ - ((TypeExtField << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ - ((IsShareable << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ - ((IsCacheable << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ - ((IsBufferable << MPU_RASR_B_Pos) & MPU_RASR_B_Msk) | \ - ((SubRegionDisable << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ - ((Size << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ - ((1UL << MPU_RASR_ENABLE_Pos) & MPU_RASR_ENABLE_Msk) - - -/** -* Struct for a single MPU Region -*/ -typedef struct _ARM_MPU_Region_t { - uint32_t RBAR; /*!< The region base address register value (RBAR)*/ - uint32_t RASR; /*!< The region attribute and size register value (RASR) \ref MPU_RASR*/ -} ARM_MPU_Region_t; - -/** Enable the MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) -{ - __DSB(); - __ISB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable() -{ - __DSB(); - __ISB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; -} - -/** Clear and disable the given MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) -{ - MPU->RNR = rnr; - MPU->RASR = 0u; -} - -/** Configure an MPU region. -* \param rbar Value for RBAR register. -* \param rsar Value for RSAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) -{ - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Configure the given MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rsar Value for RSAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) -{ - MPU->RNR = rnr; - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Memcopy with strictly ordered memory access, e.g. for register targets. -* \param dst Destination data is copied to. -* \param src Source data is copied from. -* \param len Amount of data words to be copied. -*/ -__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) -{ - uint32_t i; - for (i = 0u; i < len; ++i) - { - dst[i] = src[i]; - } -} - -/** Load the given number of MPU regions from a table. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) -{ - orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*sizeof(ARM_MPU_Region_t)/4u); -} - -#endif diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h deleted file mode 100644 index 5181610d065..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/CMSIS/tz_context.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2015-2016 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ---------------------------------------------------------------------------- - * - * $Date: 21. September 2016 - * $Revision: V1.0 - * - * Project: TrustZone for ARMv8-M - * Title: Context Management for ARMv8-M TrustZone - * - * Version 1.0 - * Initial Release - *---------------------------------------------------------------------------*/ - -#ifndef TZ_CONTEXT_H -#define TZ_CONTEXT_H - -#include - -#ifndef TZ_MODULEID_T -#define TZ_MODULEID_T -/*/ \details Data type that identifies secure software modules called by a process.*/ -typedef uint32_t TZ_ModuleId_t; -#endif - -/*/ \details TZ Memory ID identifies an allocated memory slot.*/ -typedef uint32_t TZ_MemoryId_t; - -/*/ Initialize secure context memory system*/ -/*/ \return execution status (1: success, 0: error)*/ -uint32_t TZ_InitContextSystem_S (void); - -/*/ Allocate context memory for calling secure software modules in TrustZone*/ -/*/ \param[in] module identifies software modules called from non-secure mode*/ -/*/ \return value != 0 id TrustZone memory slot identifier*/ -/*/ \return value 0 no memory available or internal error*/ -TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); - -/*/ Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S*/ -/*/ \param[in] id TrustZone memory slot identifier*/ -/*/ \return execution status (1: success, 0: error)*/ -uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); - -/*/ Load secure context (called on RTOS thread context switch)*/ -/*/ \param[in] id TrustZone memory slot identifier*/ -/*/ \return execution status (1: success, 0: error)*/ -uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); - -/*/ Store secure context (called on RTOS thread context switch)*/ -/*/ \param[in] id TrustZone memory slot identifier*/ -/*/ \return execution status (1: success, 0: error)*/ -uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); - -#endif /* TZ_CONTEXT_H*/ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h deleted file mode 100644 index 97d4e393aea..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_adc.h +++ /dev/null @@ -1,513 +0,0 @@ -/*! - \file gd32f5xx_adc.h - \brief definitions for the ADC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_ADC_H -#define GD32F5XX_ADC_H - -#include "gd32f5xx.h" - -/* ADC definitions */ -#define ADC0 ADC_BASE -#define ADC1 (ADC_BASE + 0x100U) -#define ADC2 (ADC_BASE + 0x200U) - -/* registers definitions */ -#define ADC_STAT(adcx) REG32((adcx) + 0x00U) /*!< ADC status register */ -#define ADC_CTL0(adcx) REG32((adcx) + 0x04U) /*!< ADC control register 0 */ -#define ADC_CTL1(adcx) REG32((adcx) + 0x08U) /*!< ADC control register 1 */ -#define ADC_SAMPT0(adcx) REG32((adcx) + 0x0CU) /*!< ADC sampling time register 0 */ -#define ADC_SAMPT1(adcx) REG32((adcx) + 0x10U) /*!< ADC sampling time register 1 */ -#define ADC_IOFF0(adcx) REG32((adcx) + 0x14U) /*!< ADC inserted channel data offset register 0 */ -#define ADC_IOFF1(adcx) REG32((adcx) + 0x18U) /*!< ADC inserted channel data offset register 1 */ -#define ADC_IOFF2(adcx) REG32((adcx) + 0x1CU) /*!< ADC inserted channel data offset register 2 */ -#define ADC_IOFF3(adcx) REG32((adcx) + 0x20U) /*!< ADC inserted channel data offset register 3 */ -#define ADC_WDHT(adcx) REG32((adcx) + 0x24U) /*!< ADC watchdog high threshold register */ -#define ADC_WDLT(adcx) REG32((adcx) + 0x28U) /*!< ADC watchdog low threshold register */ -#define ADC_RSQ0(adcx) REG32((adcx) + 0x2CU) /*!< ADC routine sequence register 0 */ -#define ADC_RSQ1(adcx) REG32((adcx) + 0x30U) /*!< ADC routine sequence register 1 */ -#define ADC_RSQ2(adcx) REG32((adcx) + 0x34U) /*!< ADC routine sequence register 2 */ -#define ADC_ISQ(adcx) REG32((adcx) + 0x38U) /*!< ADC inserted sequence register */ -#define ADC_IDATA0(adcx) REG32((adcx) + 0x3CU) /*!< ADC inserted data register 0 */ -#define ADC_IDATA1(adcx) REG32((adcx) + 0x40U) /*!< ADC inserted data register 1 */ -#define ADC_IDATA2(adcx) REG32((adcx) + 0x44U) /*!< ADC inserted data register 2 */ -#define ADC_IDATA3(adcx) REG32((adcx) + 0x48U) /*!< ADC inserted data register 3 */ -#define ADC_RDATA(adcx) REG32((adcx) + 0x4CU) /*!< ADC routine data register */ -#define ADC_OVSAMPCTL(adcx) REG32((adcx) + 0x80U) /*!< ADC oversampling control register */ -#define ADC_SSTAT REG32((ADC_BASE) + 0x300U) /*!< ADC summary status register */ -#define ADC_SYNCCTL REG32((ADC_BASE) + 0x304U) /*!< ADC synchronization control register */ -#define ADC_SYNCDATA REG32((ADC_BASE) + 0x308U) /*!< ADC synchronization routine data register */ - -/* bits definitions */ -/* ADC_STAT */ -#define ADC_STAT_WDE BIT(0) /*!< analog watchdog event flag */ -#define ADC_STAT_EOC BIT(1) /*!< end of conversion */ -#define ADC_STAT_EOIC BIT(2) /*!< inserted channel end of conversion */ -#define ADC_STAT_STIC BIT(3) /*!< inserted channel start flag */ -#define ADC_STAT_STRC BIT(4) /*!< routine channel start flag */ -#define ADC_STAT_ROVF BIT(5) /*!< routine data register overflow */ - -/* ADC_CTL0 */ -#define ADC_CTL0_WDCHSEL BITS(0,4) /*!< analog watchdog channel select bits */ -#define ADC_CTL0_EOCIE BIT(5) /*!< interrupt enable for EOC */ -#define ADC_CTL0_WDEIE BIT(6) /*!< analog watchdog interrupt enable */ -#define ADC_CTL0_EOICIE BIT(7) /*!< interrupt enable for inserted channels */ -#define ADC_CTL0_SM BIT(8) /*!< scan mode */ -#define ADC_CTL0_WDSC BIT(9) /*!< when in scan mode, analog watchdog is effective on a single channel */ -#define ADC_CTL0_ICA BIT(10) /*!< automatic inserted sequence conversion */ -#define ADC_CTL0_DISRC BIT(11) /*!< discontinuous mode on routine channels */ -#define ADC_CTL0_DISIC BIT(12) /*!< discontinuous mode on inserted channels */ -#define ADC_CTL0_DISNUM BITS(13,15) /*!< discontinuous mode channel count */ -#define ADC_CTL0_IWDEN BIT(22) /*!< analog watchdog enable on inserted channels */ -#define ADC_CTL0_RWDEN BIT(23) /*!< analog watchdog enable on routine channels */ -#define ADC_CTL0_DRES BITS(24,25) /*!< ADC data resolution */ -#define ADC_CTL0_ROVFIE BIT(26) /*!< interrupt enable for ROVF */ - -/* ADC_CTL1 */ -#define ADC_CTL1_ADCON BIT(0) /*!< ADC converter on */ -#define ADC_CTL1_CTN BIT(1) /*!< continuous conversion */ -#define ADC_CTL1_CLB BIT(2) /*!< ADC calibration */ -#define ADC_CTL1_RSTCLB BIT(3) /*!< reset calibration */ -#define ADC_CTL1_DMA BIT(8) /*!< direct memory access mode */ -#define ADC_CTL1_DDM BIT(9) /*!< DMA disable mode */ -#define ADC_CTL1_EOCM BIT(10) /*!< end of conversion mode */ -#define ADC_CTL1_DAL BIT(11) /*!< data alignment */ -#define ADC_CTL1_ETSIC BITS(16,19) /*!< external event select for inserted sequence */ -#define ADC_CTL1_ETMIC BITS(20,21) /*!< external trigger conversion mode for inserted channels */ -#define ADC_CTL1_SWICST BIT(22) /*!< start conversion of inserted channels */ -#define ADC_CTL1_ETSRC BITS(24,27) /*!< external event select for routine sequence */ -#define ADC_CTL1_ETMRC BITS(28,29) /*!< external trigger conversion mode for routine channels */ -#define ADC_CTL1_SWRCST BIT(30) /*!< start conversion of routine channels */ - -/* ADC_SAMPTx x=0..1 */ -#define ADC_SAMPTX_SPTN BITS(0,2) /*!< channel x sample time selection */ - -/* ADC_IOFFx x=0..3 */ -#define ADC_IOFFX_IOFF BITS(0,11) /*!< data offset for inserted channel x */ - -/* ADC_WDHT */ -#define ADC_WDHT_WDHT BITS(0,11) /*!< analog watchdog high threshold */ - -/* ADC_WDLT */ -#define ADC_WDLT_WDLT BITS(0,11) /*!< analog watchdog low threshold */ - -/* ADC_RSQx */ -#define ADC_RSQX_RSQN BITS(0,4) /*!< x conversion in routine sequence */ -#define ADC_RSQ0_RL BITS(20,23) /*!< routine channel sequence length */ - -/* ADC_ISQ */ -#define ADC_ISQ_ISQN BITS(0,4) /*!< x conversion in inserted sequence */ -#define ADC_ISQ_IL BITS(20,21) /*!< inserted sequence length */ - -/* ADC_IDATAx x=0..3*/ -#define ADC_IDATAX_IDATAN BITS(0,15) /*!< inserted data x */ - -/* ADC_RDATA */ -#define ADC_RDATA_RDATA BITS(0,15) /*!< routine data */ - -/* ADC_OVSAMPCTL */ -#define ADC_OVSAMPCTL_OVSEN BIT(0) /*!< oversampling enable */ -#define ADC_OVSAMPCTL_OVSR BITS(2,4) /*!< oversampling ratio */ -#define ADC_OVSAMPCTL_OVSS BITS(5,8) /*!< oversampling shift */ -#define ADC_OVSAMPCTL_TOVS BIT(9) /*!< triggered oversampling */ - -/* ADC_SSTAT */ -#define ADC_SSTAT_WDE0 BIT(0) /*!< the mirror image of the WDE bit of ADC0 */ -#define ADC_SSTAT_EOC0 BIT(1) /*!< the mirror image of the EOC bit of ADC0 */ -#define ADC_SSTAT_EOIC0 BIT(2) /*!< the mirror image of the EOIC bit of ADC0 */ -#define ADC_SSTAT_STIC0 BIT(3) /*!< the mirror image of the STIC bit of ADC0 */ -#define ADC_SSTAT_STRC0 BIT(4) /*!< the mirror image of the STRC bit of ADC0 */ -#define ADC_SSTAT_ROVF0 BIT(5) /*!< the mirror image of the ROVF bit of ADC0 */ -#define ADC_SSTAT_WDE1 BIT(8) /*!< the mirror image of the WDE bit of ADC1 */ -#define ADC_SSTAT_EOC1 BIT(9) /*!< the mirror image of the EOC bit of ADC1 */ -#define ADC_SSTAT_EOIC1 BIT(10) /*!< the mirror image of the EOIC bit of ADC1 */ -#define ADC_SSTAT_STIC1 BIT(11) /*!< the mirror image of the STIC bit of ADC1 */ -#define ADC_SSTAT_STRC1 BIT(12) /*!< the mirror image of the STRC bit of ADC1 */ -#define ADC_SSTAT_ROVF1 BIT(13) /*!< the mirror image of the ROVF bit of ADC1 */ -#define ADC_SSTAT_WDE2 BIT(16) /*!< the mirror image of the WDE bit of ADC2 */ -#define ADC_SSTAT_EOC2 BIT(17) /*!< the mirror image of the EOC bit of ADC2 */ -#define ADC_SSTAT_EOIC2 BIT(18) /*!< the mirror image of the EOIC bit of ADC2 */ -#define ADC_SSTAT_STIC2 BIT(19) /*!< the mirror image of the STIC bit of ADC2 */ -#define ADC_SSTAT_STRC2 BIT(20) /*!< the mirror image of the STRC bit of ADC2 */ -#define ADC_SSTAT_ROVF2 BIT(21) /*!< the mirror image of the ROVF bit of ADC2 */ - -/* ADC_SYNCCTL */ -#define ADC_SYNCCTL_SYNCM BITS(0,4) /*!< ADC synchronization mode */ -#define ADC_SYNCCTL_SYNCDLY BITS(8,11) /*!< ADC synchronization delay */ -#define ADC_SYNCCTL_SYNCDDM BIT(13) /*!< ADC synchronization DMA disable mode */ -#define ADC_SYNCCTL_SYNCDMA BITS(14,15) /*!< ADC synchronization DMA mode selection */ -#define ADC_SYNCCTL_ADCCK BITS(16,18) /*!< ADC clock */ -#define ADC_SYNCCTL_VBATEN BIT(22) /*!< channel 18 (1/4 voltate of external battery) enable of ADC0 */ -#define ADC_SYNCCTL_TSVREN BIT(23) /*!< channel 16 (temperature sensor) and 17 (internal reference voltage) enable of ADC0 */ - -/* ADC_SYNCDATA */ -#define ADC_SYNCDATA_SYNCDATA0 BITS(0,15) /*!< routine data1 in ADC synchronization mode */ -#define ADC_SYNCDATA_SYNCDATA1 BITS(16,31) /*!< routine data2 in ADC synchronization mode */ - -/* constants definitions */ -/* ADC status flag */ -#define ADC_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event flag */ -#define ADC_FLAG_EOC ADC_STAT_EOC /*!< end of conversion */ -#define ADC_FLAG_EOIC ADC_STAT_EOIC /*!< inserted channel end of conversion */ -#define ADC_FLAG_STIC ADC_STAT_STIC /*!< inserted channel start flag */ -#define ADC_FLAG_STRC ADC_STAT_STRC /*!< routine channel start flag */ -#define ADC_FLAG_ROVF ADC_STAT_ROVF /*!< routine data register overflow */ - -/* adc_ctl0 register value */ -#define CTL0_DISNUM(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to ADC_CTL0_DISNUM bit field */ - -/* ADC special function definitions */ -#define ADC_SCAN_MODE ADC_CTL0_SM /*!< scan mode */ -#define ADC_INSERTED_CHANNEL_AUTO ADC_CTL0_ICA /*!< inserted sequence convert automatically */ -#define ADC_CONTINUOUS_MODE ADC_CTL1_CTN /*!< continuous mode */ - -/* temperature sensor channel, internal reference voltage channel, VBAT channel */ -#define ADC_VBAT_CHANNEL_SWITCH ADC_SYNCCTL_VBATEN /*!< VBAT channel */ -#define ADC_TEMP_VREF_CHANNEL_SWITCH ADC_SYNCCTL_TSVREN /*!< Vref and Vtemp channel */ - -/* ADC synchronization mode */ -#define SYNCCTL_SYNCM(regval) (BITS(0,4) & ((uint32_t)(regval))) /*!< write value to ADC_CTL0_SYNCM bit field */ -#define ADC_SYNC_MODE_INDEPENDENT SYNCCTL_SYNCM(0) /*!< ADC synchronization mode disabled.All the ADCs work independently */ -#define ADC_DAUL_ROUTINE_PARALLEL_INSERTED_PARALLEL SYNCCTL_SYNCM(1) /*!< ADC0 and ADC1 work in combined routine parallel & inserted parallel mode. ADC2 works independently */ -#define ADC_DAUL_ROUTINE_PARALLEL_INSERTED_ROTATION SYNCCTL_SYNCM(2) /*!< ADC0 and ADC1 work in combined routine parallel & trigger rotation mode. ADC2 works independently */ -#define ADC_DAUL_INSERTED_PARALLEL SYNCCTL_SYNCM(5) /*!< ADC0 and ADC1 work in inserted parallel mode. ADC2 works independently */ -#define ADC_DAUL_ROUTINE_PARALLEL SYNCCTL_SYNCM(6) /*!< ADC0 and ADC1 work in routine parallel mode. ADC2 works independently */ -#define ADC_DAUL_ROUTINE_FOLLOW_UP SYNCCTL_SYNCM(7) /*!< ADC0 and ADC1 work in follow-up mode. ADC2 works independently */ -#define ADC_DAUL_INSERTED_TRRIGGER_ROTATION SYNCCTL_SYNCM(9) /*!< ADC0 and ADC1 work in trigger rotation mode. ADC2 works independently */ -#define ADC_ALL_ROUTINE_PARALLEL_INSERTED_PARALLEL SYNCCTL_SYNCM(17) /*!< all ADCs work in combined routine parallel & inserted parallel mode */ -#define ADC_ALL_ROUTINE_PARALLEL_INSERTED_ROTATION SYNCCTL_SYNCM(18) /*!< all ADCs work in combined routine parallel & trigger rotation mode */ -#define ADC_ALL_INSERTED_PARALLEL SYNCCTL_SYNCM(21) /*!< all ADCs work in inserted parallel mode */ -#define ADC_ALL_ROUTINE_PARALLEL SYNCCTL_SYNCM(22) /*!< all ADCs work in routine parallel mode */ -#define ADC_ALL_ROUTINE_FOLLOW_UP SYNCCTL_SYNCM(23) /*!< all ADCs work in follow-up mode */ -#define ADC_ALL_INSERTED_TRRIGGER_ROTATION SYNCCTL_SYNCM(25) /*!< all ADCs work in trigger rotation mode */ - -/* ADC data alignment */ -#define ADC_DATAALIGN_RIGHT ((uint32_t)0x00000000U) /*!< LSB alignment */ -#define ADC_DATAALIGN_LEFT ADC_CTL1_DAL /*!< MSB alignment */ - -/* external trigger mode for routine and inserted channel */ -#define EXTERNAL_TRIGGER_DISABLE ((uint32_t)0x00000000U) /*!< external trigger disable */ -#define EXTERNAL_TRIGGER_RISING ((uint32_t)0x00000001U) /*!< rising edge of external trigger */ -#define EXTERNAL_TRIGGER_FALLING ((uint32_t)0x00000002U) /*!< falling edge of external trigger */ -#define EXTERNAL_TRIGGER_RISING_FALLING ((uint32_t)0x00000003U) /*!< rising and falling edge of external trigger */ - -/* ADC external trigger select for routine channel */ -#define CTL1_ETSRC(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) -#define ADC_EXTTRIG_ROUTINE_T0_CH0 CTL1_ETSRC(0) /*!< timer 0 CC0 event select */ -#define ADC_EXTTRIG_ROUTINE_T0_CH1 CTL1_ETSRC(1) /*!< timer 0 CC1 event select */ -#define ADC_EXTTRIG_ROUTINE_T0_CH2 CTL1_ETSRC(2) /*!< timer 0 CC2 event select */ -#define ADC_EXTTRIG_ROUTINE_T1_CH1 CTL1_ETSRC(3) /*!< timer 1 CC1 event select */ -#define ADC_EXTTRIG_ROUTINE_T1_CH2 CTL1_ETSRC(4) /*!< timer 1 CC2 event select */ -#define ADC_EXTTRIG_ROUTINE_T1_CH3 CTL1_ETSRC(5) /*!< timer 1 CC3 event select */ -#define ADC_EXTTRIG_ROUTINE_T1_TRGO CTL1_ETSRC(6) /*!< timer 1 TRGO event select */ -#define ADC_EXTTRIG_ROUTINE_T2_CH0 CTL1_ETSRC(7) /*!< timer 2 CC0 event select */ -#define ADC_EXTTRIG_ROUTINE_T2_TRGO CTL1_ETSRC(8) /*!< timer 2 TRGO event select */ -#define ADC_EXTTRIG_ROUTINE_T3_CH3 CTL1_ETSRC(9) /*!< timer 3 CC3 event select */ -#define ADC_EXTTRIG_ROUTINE_T4_CH0 CTL1_ETSRC(10) /*!< timer 4 CC0 event select */ -#define ADC_EXTTRIG_ROUTINE_T4_CH1 CTL1_ETSRC(11) /*!< timer 4 CC1 event select */ -#define ADC_EXTTRIG_ROUTINE_T4_CH2 CTL1_ETSRC(12) /*!< timer 4 CC2 event select */ -#define ADC_EXTTRIG_ROUTINE_T7_CH0 CTL1_ETSRC(13) /*!< timer 7 CC0 event select */ -#define ADC_EXTTRIG_ROUTINE_T7_TRGO CTL1_ETSRC(14) /*!< timer 7 TRGO event select */ -#define ADC_EXTTRIG_ROUTINE_EXTI_11 CTL1_ETSRC(15) /*!< extiline 11 select */ - -/* ADC external trigger select for inserted channel */ -#define CTL1_ETSIC(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) -#define ADC_EXTTRIG_INSERTED_T0_CH3 CTL1_ETSIC(0) /*!< timer0 capture compare 3 */ -#define ADC_EXTTRIG_INSERTED_T0_TRGO CTL1_ETSIC(1) /*!< timer0 TRGO event */ -#define ADC_EXTTRIG_INSERTED_T1_CH0 CTL1_ETSIC(2) /*!< timer1 capture compare 0 */ -#define ADC_EXTTRIG_INSERTED_T1_TRGO CTL1_ETSIC(3) /*!< timer1 TRGO event */ -#define ADC_EXTTRIG_INSERTED_T2_CH1 CTL1_ETSIC(4) /*!< timer2 capture compare 1 */ -#define ADC_EXTTRIG_INSERTED_T2_CH3 CTL1_ETSIC(5) /*!< timer2 capture compare 3 */ -#define ADC_EXTTRIG_INSERTED_T3_CH0 CTL1_ETSIC(6) /*!< timer3 capture compare 0 */ -#define ADC_EXTTRIG_INSERTED_T3_CH1 CTL1_ETSIC(7) /*!< timer3 capture compare 1 */ -#define ADC_EXTTRIG_INSERTED_T3_CH2 CTL1_ETSIC(8) /*!< timer3 capture compare 2 */ -#define ADC_EXTTRIG_INSERTED_T3_TRGO CTL1_ETSIC(9) /*!< timer3 capture compare TRGO */ -#define ADC_EXTTRIG_INSERTED_T4_CH3 CTL1_ETSIC(10) /*!< timer4 capture compare 3 */ -#define ADC_EXTTRIG_INSERTED_T4_TRGO CTL1_ETSIC(11) /*!< timer4 capture compare TRGO */ -#define ADC_EXTTRIG_INSERTED_T7_CH1 CTL1_ETSIC(12) /*!< timer7 capture compare 1 */ -#define ADC_EXTTRIG_INSERTED_T7_CH2 CTL1_ETSIC(13) /*!< timer7 capture compare 2 */ -#define ADC_EXTTRIG_INSERTED_T7_CH3 CTL1_ETSIC(14) /*!< timer7 capture compare 3 */ -#define ADC_EXTTRIG_INSERTED_EXTI_15 CTL1_ETSIC(15) /*!< external interrupt line 15 */ - -/* ADC channel sample time */ -#define SAMPTX_SPT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_SAMPTX_SPT bit field */ -#define ADC_SAMPLETIME_3 SAMPTX_SPT(0) /*!< 3 sampling cycles */ -#define ADC_SAMPLETIME_15 SAMPTX_SPT(1) /*!< 15 sampling cycles */ -#define ADC_SAMPLETIME_28 SAMPTX_SPT(2) /*!< 28 sampling cycles */ -#define ADC_SAMPLETIME_56 SAMPTX_SPT(3) /*!< 56 sampling cycles */ -#define ADC_SAMPLETIME_84 SAMPTX_SPT(4) /*!< 84 sampling cycles */ -#define ADC_SAMPLETIME_112 SAMPTX_SPT(5) /*!< 112 sampling cycles */ -#define ADC_SAMPLETIME_144 SAMPTX_SPT(6) /*!< 144 sampling cycles */ -#define ADC_SAMPLETIME_480 SAMPTX_SPT(7) /*!< 480 sampling cycles */ - -/* adc_ioffx register value */ -#define IOFFX_IOFF(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_IOFFX_IOFF bit field */ - -/* adc_wdht register value */ -#define WDHT_WDHT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDHT_WDHT bit field */ - -/* adc_wdlt register value */ -#define WDLT_WDLT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDLT_WDLT bit field */ - -/* adc_rsqx register value */ -#define RSQ0_RL(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_RSQ0_RL bit field */ - -/* adc_isq register value */ -#define ISQ_IL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_ISQ_IL bit field */ - -/* adc_ovsampctl register value */ -/* ADC resolution */ -#define CTL0_DRES(regval) (BITS(24,25) & ((uint32_t)(regval) << 24)) /*!< write value to ADC_CTL0_DRES bit field */ -#define ADC_RESOLUTION_12B CTL0_DRES(0) /*!< 12-bit ADC resolution */ -#define ADC_RESOLUTION_10B CTL0_DRES(1) /*!< 10-bit ADC resolution */ -#define ADC_RESOLUTION_8B CTL0_DRES(2) /*!< 8-bit ADC resolution */ -#define ADC_RESOLUTION_6B CTL0_DRES(3) /*!< 6-bit ADC resolution */ - -/* oversampling shift */ -#define OVSAMPCTL_OVSS(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) /*!< write value to ADC_OVSAMPCTL_OVSS bit field */ -#define ADC_OVERSAMPLING_SHIFT_NONE OVSAMPCTL_OVSS(0) /*!< no oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_1B OVSAMPCTL_OVSS(1) /*!< 1-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_2B OVSAMPCTL_OVSS(2) /*!< 2-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_3B OVSAMPCTL_OVSS(3) /*!< 3-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_4B OVSAMPCTL_OVSS(4) /*!< 4-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_5B OVSAMPCTL_OVSS(5) /*!< 5-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_6B OVSAMPCTL_OVSS(6) /*!< 6-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_7B OVSAMPCTL_OVSS(7) /*!< 7-bit oversampling shift */ -#define ADC_OVERSAMPLING_SHIFT_8B OVSAMPCTL_OVSS(8) /*!< 8-bit oversampling shift */ - -/* oversampling ratio */ -#define OVSAMPCTL_OVSR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ADC_OVSAMPCTL_OVSR bit field */ -#define ADC_OVERSAMPLING_RATIO_MUL2 OVSAMPCTL_OVSR(0) /*!< oversampling ratio multiple 2 */ -#define ADC_OVERSAMPLING_RATIO_MUL4 OVSAMPCTL_OVSR(1) /*!< oversampling ratio multiple 4 */ -#define ADC_OVERSAMPLING_RATIO_MUL8 OVSAMPCTL_OVSR(2) /*!< oversampling ratio multiple 8 */ -#define ADC_OVERSAMPLING_RATIO_MUL16 OVSAMPCTL_OVSR(3) /*!< oversampling ratio multiple 16 */ -#define ADC_OVERSAMPLING_RATIO_MUL32 OVSAMPCTL_OVSR(4) /*!< oversampling ratio multiple 32 */ -#define ADC_OVERSAMPLING_RATIO_MUL64 OVSAMPCTL_OVSR(5) /*!< oversampling ratio multiple 64 */ -#define ADC_OVERSAMPLING_RATIO_MUL128 OVSAMPCTL_OVSR(6) /*!< oversampling ratio multiple 128 */ -#define ADC_OVERSAMPLING_RATIO_MUL256 OVSAMPCTL_OVSR(7) /*!< oversampling ratio multiple 256 */ - -/* triggered oversampling */ -#define ADC_OVERSAMPLING_ALL_CONVERT ((uint32_t)0x00000000U) /*!< all oversampled conversions for a channel are done consecutively after a trigger */ -#define ADC_OVERSAMPLING_ONE_CONVERT ADC_OVSAMPCTL_TOVS /*!< each oversampled conversion for a channel needs a trigger */ - -/* ADC channel sequence definitions */ -#define ADC_ROUTINE_CHANNEL ((uint8_t)0x01U) /*!< adc routine sequence */ -#define ADC_INSERTED_CHANNEL ((uint8_t)0x02U) /*!< adc inserted sequence */ -#define ADC_ROUTINE_INSERTED_CHANNEL ((uint8_t)0x03U) /*!< both routine and inserted sequence */ -#define ADC_CHANNEL_DISCON_DISABLE ((uint8_t)0x04U) /*!< disable discontinuous mode of routine & inserted sequence */ - -/* ADC inserted channel definitions */ -#define ADC_INSERTED_CHANNEL_0 ((uint8_t)0x00U) /*!< adc inserted channel 0 */ -#define ADC_INSERTED_CHANNEL_1 ((uint8_t)0x01U) /*!< adc inserted channel 1 */ -#define ADC_INSERTED_CHANNEL_2 ((uint8_t)0x02U) /*!< adc inserted channel 2 */ -#define ADC_INSERTED_CHANNEL_3 ((uint8_t)0x03U) /*!< adc inserted channel 3 */ - -/* ADC channel definitions */ -#define ADC_CHANNEL_0 ((uint8_t)0x00U) /*!< ADC channel 0 */ -#define ADC_CHANNEL_1 ((uint8_t)0x01U) /*!< ADC channel 1 */ -#define ADC_CHANNEL_2 ((uint8_t)0x02U) /*!< ADC channel 2 */ -#define ADC_CHANNEL_3 ((uint8_t)0x03U) /*!< ADC channel 3 */ -#define ADC_CHANNEL_4 ((uint8_t)0x04U) /*!< ADC channel 4 */ -#define ADC_CHANNEL_5 ((uint8_t)0x05U) /*!< ADC channel 5 */ -#define ADC_CHANNEL_6 ((uint8_t)0x06U) /*!< ADC channel 6 */ -#define ADC_CHANNEL_7 ((uint8_t)0x07U) /*!< ADC channel 7 */ -#define ADC_CHANNEL_8 ((uint8_t)0x08U) /*!< ADC channel 8 */ -#define ADC_CHANNEL_9 ((uint8_t)0x09U) /*!< ADC channel 9 */ -#define ADC_CHANNEL_10 ((uint8_t)0x0AU) /*!< ADC channel 10 */ -#define ADC_CHANNEL_11 ((uint8_t)0x0BU) /*!< ADC channel 11 */ -#define ADC_CHANNEL_12 ((uint8_t)0x0CU) /*!< ADC channel 12 */ -#define ADC_CHANNEL_13 ((uint8_t)0x0DU) /*!< ADC channel 13 */ -#define ADC_CHANNEL_14 ((uint8_t)0x0EU) /*!< ADC channel 14 */ -#define ADC_CHANNEL_15 ((uint8_t)0x0FU) /*!< ADC channel 15 */ -#define ADC_CHANNEL_16 ((uint8_t)0x10U) /*!< ADC channel 16 */ -#define ADC_CHANNEL_17 ((uint8_t)0x11U) /*!< ADC channel 17 */ -#define ADC_CHANNEL_18 ((uint8_t)0x12U) /*!< ADC channel 18 */ - -/* ADC interrupt flag */ -#define ADC_INT_WDE ADC_CTL0_WDEIE /*!< analog watchdog event interrupt */ -#define ADC_INT_EOC ADC_CTL0_EOCIE /*!< end of sequence conversion interrupt */ -#define ADC_INT_EOIC ADC_CTL0_EOICIE /*!< end of inserted sequence conversion interrupt */ -#define ADC_INT_ROVF ADC_CTL0_ROVFIE /*!< routine data register overflow */ - -/* ADC interrupt flag */ -#define ADC_INT_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt */ -#define ADC_INT_FLAG_EOC ADC_STAT_EOC /*!< end of sequence conversion interrupt */ -#define ADC_INT_FLAG_EOIC ADC_STAT_EOIC /*!< end of inserted sequence conversion interrupt */ -#define ADC_INT_FLAG_ROVF ADC_STAT_ROVF /*!< routine data register overflow */ - -/* configure the ADC clock for all the ADCs */ -#define SYNCCTL_ADCCK(regval) (BITS(16,18) & ((uint32_t)(regval) << 16)) -#define ADC_ADCCK_PCLK2_DIV2 SYNCCTL_ADCCK(0) /*!< PCLK2 div2 */ -#define ADC_ADCCK_PCLK2_DIV4 SYNCCTL_ADCCK(1) /*!< PCLK2 div4 */ -#define ADC_ADCCK_PCLK2_DIV6 SYNCCTL_ADCCK(2) /*!< PCLK2 div6 */ -#define ADC_ADCCK_PCLK2_DIV8 SYNCCTL_ADCCK(3) /*!< PCLK2 div8 */ -#define ADC_ADCCK_HCLK_DIV5 SYNCCTL_ADCCK(4) /*!< HCLK div5 */ -#define ADC_ADCCK_HCLK_DIV6 SYNCCTL_ADCCK(5) /*!< HCLK div6 */ -#define ADC_ADCCK_HCLK_DIV10 SYNCCTL_ADCCK(6) /*!< HCLK div10 */ -#define ADC_ADCCK_HCLK_DIV20 SYNCCTL_ADCCK(7) /*!< HCLK div20 */ - -/* ADC synchronization delay */ -#define ADC_SYNC_DELAY_5CYCLE ((uint32_t)0x00000000U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 5 ADC clock cycles. */ -#define ADC_SYNC_DELAY_6CYCLE ((uint32_t)0x00000100U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 6 ADC clock cycles. */ -#define ADC_SYNC_DELAY_7CYCLE ((uint32_t)0x00000200U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 7 ADC clock cycles. */ -#define ADC_SYNC_DELAY_8CYCLE ((uint32_t)0x00000300U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 8 ADC clock cycles. */ -#define ADC_SYNC_DELAY_9CYCLE ((uint32_t)0x00000400U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 9 ADC clock cycles. */ -#define ADC_SYNC_DELAY_10CYCLE ((uint32_t)0x00000500U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 10 ADC clock cycles. */ -#define ADC_SYNC_DELAY_11CYCLE ((uint32_t)0x00000600U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 11 ADC clock cycles. */ -#define ADC_SYNC_DELAY_12CYCLE ((uint32_t)0x00000700U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 12 ADC clock cycles. */ -#define ADC_SYNC_DELAY_13CYCLE ((uint32_t)0x00000800U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 13 ADC clock cycles. */ -#define ADC_SYNC_DELAY_14CYCLE ((uint32_t)0x00000900U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 14 ADC clock cycles. */ -#define ADC_SYNC_DELAY_15CYCLE ((uint32_t)0x00000A00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 15 ADC clock cycles. */ -#define ADC_SYNC_DELAY_16CYCLE ((uint32_t)0x00000B00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 16 ADC clock cycles. */ -#define ADC_SYNC_DELAY_17CYCLE ((uint32_t)0x00000C00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 17 ADC clock cycles. */ -#define ADC_SYNC_DELAY_18CYCLE ((uint32_t)0x00000D00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 18 ADC clock cycles. */ -#define ADC_SYNC_DELAY_19CYCLE ((uint32_t)0x00000E00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 19 ADC clock cycles. */ -#define ADC_SYNC_DELAY_20CYCLE ((uint32_t)0x00000F00U) /*!< the delay between 2 sampling phases in ADC synchronization modes to 20 ADC clock cycles. */ - -/* ADC synchronization DMA mode selection */ -#define ADC_SYNC_DMA_DISABLE ((uint32_t)0x00000000U) /*!< ADC synchronization DMA disabled */ -#define ADC_SYNC_DMA_MODE0 ((uint32_t)0x00004000U) /*!< ADC synchronization DMA mode 0 */ -#define ADC_SYNC_DMA_MODE1 ((uint32_t)0x00008000U) /*!< ADC synchronization DMA mode 1 */ - -/* end of conversion mode */ -#define ADC_EOC_SET_SEQUENCE ((uint8_t)0x00U) /*!< only at the end of a sequence of routine conversions, the EOC bit is set */ -#define ADC_EOC_SET_CONVERSION ((uint8_t)0x01U) /*!< at the end of each routine conversion, the EOC bit is set */ - -/* function declarations */ -/* initialization config */ -/* reset ADC */ -void adc_deinit(void); -/* configure the ADC clock for all the ADCs */ -void adc_clock_config(uint32_t prescaler); -/* enable or disable ADC special function */ -void adc_special_function_config(uint32_t adc_periph , uint32_t function , ControlStatus newvalue); -/* configure ADC data alignment */ -void adc_data_alignment_config(uint32_t adc_periph , uint32_t data_alignment); -/* enable ADC interface */ -void adc_enable(uint32_t adc_periph); -/* disable ADC interface */ -void adc_disable(uint32_t adc_periph); -/* ADC calibration and reset calibration */ -void adc_calibration_enable(uint32_t adc_periph); -/* configure temperature sensor and internal reference voltage channel or VBAT channel function */ -void adc_channel_16_to_18(uint32_t function, ControlStatus newvalue); -/* configure ADC resolution */ -void adc_resolution_config(uint32_t adc_periph, uint32_t resolution); -/* configure ADC oversample mode */ -void adc_oversample_mode_config(uint32_t adc_periph, uint32_t mode, uint16_t shift, uint8_t ratio); -/* enable ADC oversample mode */ -void adc_oversample_mode_enable(uint32_t adc_periph); -/* disable ADC oversample mode */ -void adc_oversample_mode_disable(uint32_t adc_periph); - -/* DMA config */ -/* enable DMA request */ -void adc_dma_mode_enable(uint32_t adc_periph); -/* disable DMA request */ -void adc_dma_mode_disable(uint32_t adc_periph); -/* when DMA=1, the DMA engine issues a request at end of each routine conversion */ -void adc_dma_request_after_last_enable(uint32_t adc_periph); -/* the DMA engine is disabled after the end of transfer signal from DMA controller is detected */ -void adc_dma_request_after_last_disable(uint32_t adc_periph); - -/* routine sequence and inserted sequence config */ -/* configure ADC discontinuous mode */ -void adc_discontinuous_mode_config(uint32_t adc_periph , uint8_t adc_sequence , uint8_t length); -/* configure the length of routine sequence or inserted sequence */ -void adc_channel_length_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t length); -/* configure ADC routine channel */ -void adc_routine_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); -/* configure ADC inserted channel */ -void adc_inserted_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); -/* configure ADC inserted channel offset */ -void adc_inserted_channel_offset_config(uint32_t adc_periph , uint8_t inserted_channel , uint16_t offset); -/* configure ADC external trigger source */ -void adc_external_trigger_source_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t external_trigger_source); -/* enable ADC external trigger */ -void adc_external_trigger_config(uint32_t adc_periph , uint8_t adc_sequence , uint32_t trigger_mode); -/* enable ADC software trigger */ -void adc_software_trigger_enable(uint32_t adc_periph , uint8_t adc_sequence); -/* configure end of conversion mode */ -void adc_end_of_conversion_config(uint32_t adc_periph , uint8_t end_selection); - -/* get channel data */ -/* read ADC routine data register */ -uint16_t adc_routine_data_read(uint32_t adc_periph); -/* read ADC inserted data register */ -uint16_t adc_inserted_data_read(uint32_t adc_periph , uint8_t inserted_channel); - -/* watchdog config */ -/* disable ADC analog watchdog single channel */ -void adc_watchdog_single_channel_disable(uint32_t adc_periph ); -/* enable ADC analog watchdog single channel */ -void adc_watchdog_single_channel_enable(uint32_t adc_periph , uint8_t adc_channel); -/* configure ADC analog watchdog sequence */ -void adc_watchdog_sequence_channel_enable(uint32_t adc_periph , uint8_t adc_sequence); -/* disable ADC analog watchdog */ -void adc_watchdog_disable(uint32_t adc_periph , uint8_t adc_sequence); -/* configure ADC analog watchdog threshold */ -void adc_watchdog_threshold_config(uint32_t adc_periph , uint16_t low_threshold , uint16_t high_threshold); - -/* ADC synchronization */ -/* configure the ADC sync mode */ -void adc_sync_mode_config(uint32_t sync_mode); -/* configure the delay between 2 sampling phases in ADC sync modes */ -void adc_sync_delay_config(uint32_t sample_delay); -/* configure ADC sync DMA mode selection */ -void adc_sync_dma_config(uint32_t dma_mode ); -/* configure ADC sync DMA engine is disabled after the end of transfer signal from DMA controller is detected */ -void adc_sync_dma_request_after_last_enable(void); -/* configure ADC sync DMA engine issues requests according to the SYNCDMA bits */ -void adc_sync_dma_request_after_last_disable(void); -/* read ADC sync routine data register */ -uint32_t adc_sync_routine_data_read(void); - -/* interrupt & flag functions */ -/* get the bit state of ADCx software start conversion */ -FlagStatus adc_routine_software_startconv_flag_get(uint32_t adc_periph); -/* get the bit state of ADCx software inserted channel start conversion */ -FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph); -/* get the ADC flag bits */ -FlagStatus adc_flag_get(uint32_t adc_periph , uint32_t adc_flag); -/* clear the ADC flag bits */ -void adc_flag_clear(uint32_t adc_periph , uint32_t adc_flag); -/* enable ADC interrupt */ -void adc_interrupt_enable(uint32_t adc_periph , uint32_t adc_interrupt); -/* disable ADC interrupt */ -void adc_interrupt_disable(uint32_t adc_periph , uint32_t adc_interrupt); -/* get the ADC interrupt bits */ -FlagStatus adc_interrupt_flag_get(uint32_t adc_periph , uint32_t adc_interrupt); -/* clear the ADC flag */ -void adc_interrupt_flag_clear(uint32_t adc_periph , uint32_t adc_interrupt); - -#endif /* GD32F5XX_ADC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h deleted file mode 100644 index d5b18a3dc0c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_can.h +++ /dev/null @@ -1,916 +0,0 @@ -/*! - \file gd32f5xx_can.h - \brief definitions for the CAN - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#ifndef GD32F5XX_CAN_H -#define GD32F5XX_CAN_H - -#include "gd32f5xx.h" - -/* CAN definitions */ -#define CAN0 CAN_BASE /*!< CAN0 base address */ -#define CAN1 (CAN0 + 0x00000400U) /*!< CAN1 base address */ - -/* registers definitions */ -#define CAN_CTL(canx) REG32((canx) + 0x00000000U) /*!< CAN control register */ -#define CAN_STAT(canx) REG32((canx) + 0x00000004U) /*!< CAN status register */ -#define CAN_TSTAT(canx) REG32((canx) + 0x00000008U) /*!< CAN transmit status register*/ -#define CAN_RFIFO0(canx) REG32((canx) + 0x0000000CU) /*!< CAN receive FIFO0 register */ -#define CAN_RFIFO1(canx) REG32((canx) + 0x00000010U) /*!< CAN receive FIFO1 register */ -#define CAN_INTEN(canx) REG32((canx) + 0x00000014U) /*!< CAN interrupt enable register */ -#define CAN_ERR(canx) REG32((canx) + 0x00000018U) /*!< CAN error register */ -#define CAN_BT(canx) REG32((canx) + 0x0000001CU) /*!< CAN bit timing register */ -#define CAN_FDCTL(canx) REG32((canx) + 0x00000020U) /*!< CAN FD control register */ -#define CAN_FDSTAT(canx) REG32((canx) + 0x00000024U) /*!< CAN FD status register */ -#define CAN_FDTDC(canx) REG32((canx) + 0x00000028U) /*!< CAN FD transmitter delay compensation register */ -#define CAN_DBT(canx) REG32((canx) + 0x0000002CU) /*!< CAN date bit timing register */ -#define CAN_TMI0(canx) REG32((canx) + 0x00000180U) /*!< CAN transmit mailbox0 identifier register */ -#define CAN_TMP0(canx) REG32((canx) + 0x00000184U) /*!< CAN transmit mailbox0 property register */ -#define CAN_TMDATA00(canx) REG32((canx) + 0x00000188U) /*!< CAN transmit mailbox0 data0 register */ -#define CAN_TMDATA10(canx) REG32((canx) + 0x0000018CU) /*!< CAN transmit mailbox0 data1 register */ -#define CAN_TMI1(canx) REG32((canx) + 0x00000190U) /*!< CAN transmit mailbox1 identifier register */ -#define CAN_TMP1(canx) REG32((canx) + 0x00000194U) /*!< CAN transmit mailbox1 property register */ -#define CAN_TMDATA01(canx) REG32((canx) + 0x00000198U) /*!< CAN transmit mailbox1 data0 register */ -#define CAN_TMDATA11(canx) REG32((canx) + 0x0000019CU) /*!< CAN transmit mailbox1 data1 register */ -#define CAN_TMI2(canx) REG32((canx) + 0x000001A0U) /*!< CAN transmit mailbox2 identifier register */ -#define CAN_TMP2(canx) REG32((canx) + 0x000001A4U) /*!< CAN transmit mailbox2 property register */ -#define CAN_TMDATA02(canx) REG32((canx) + 0x000001A8U) /*!< CAN transmit mailbox2 data0 register */ -#define CAN_TMDATA12(canx) REG32((canx) + 0x000001ACU) /*!< CAN transmit mailbox2 data1 register */ -#define CAN_RFIFOMI0(canx) REG32((canx) + 0x000001B0U) /*!< CAN receive FIFO0 mailbox identifier register */ -#define CAN_RFIFOMP0(canx) REG32((canx) + 0x000001B4U) /*!< CAN receive FIFO0 mailbox property register */ -#define CAN_RFIFOMDATA00(canx) REG32((canx) + 0x000001B8U) /*!< CAN receive FIFO0 mailbox data0 register */ -#define CAN_RFIFOMDATA10(canx) REG32((canx) + 0x000001BCU) /*!< CAN receive FIFO0 mailbox data1 register */ -#define CAN_RFIFOMI1(canx) REG32((canx) + 0x000001C0U) /*!< CAN receive FIFO1 mailbox identifier register */ -#define CAN_RFIFOMP1(canx) REG32((canx) + 0x000001C4U) /*!< CAN receive FIFO1 mailbox property register */ -#define CAN_RFIFOMDATA01(canx) REG32((canx) + 0x000001C8U) /*!< CAN receive FIFO1 mailbox data0 register */ -#define CAN_RFIFOMDATA11(canx) REG32((canx) + 0x000001CCU) /*!< CAN receive FIFO1 mailbox data1 register */ -#define CAN_FCTL(canx) REG32((canx) + 0x00000200U) /*!< CAN filter control register */ -#define CAN_FMCFG(canx) REG32((canx) + 0x00000204U) /*!< CAN filter mode register */ -#define CAN_FSCFG(canx) REG32((canx) + 0x0000020CU) /*!< CAN filter scale register */ -#define CAN_FAFIFO(canx) REG32((canx) + 0x00000214U) /*!< CAN filter associated FIFO register */ -#define CAN_FW(canx) REG32((canx) + 0x0000021CU) /*!< CAN filter working register */ -#define CAN_F0DATA0(canx) REG32((canx) + 0x00000240U) /*!< CAN filter 0 data 0 register */ -#define CAN_F1DATA0(canx) REG32((canx) + 0x00000248U) /*!< CAN filter 1 data 0 register */ -#define CAN_F2DATA0(canx) REG32((canx) + 0x00000250U) /*!< CAN filter 2 data 0 register */ -#define CAN_F3DATA0(canx) REG32((canx) + 0x00000258U) /*!< CAN filter 3 data 0 register */ -#define CAN_F4DATA0(canx) REG32((canx) + 0x00000260U) /*!< CAN filter 4 data 0 register */ -#define CAN_F5DATA0(canx) REG32((canx) + 0x00000268U) /*!< CAN filter 5 data 0 register */ -#define CAN_F6DATA0(canx) REG32((canx) + 0x00000270U) /*!< CAN filter 6 data 0 register */ -#define CAN_F7DATA0(canx) REG32((canx) + 0x00000278U) /*!< CAN filter 7 data 0 register */ -#define CAN_F8DATA0(canx) REG32((canx) + 0x00000280U) /*!< CAN filter 8 data 0 register */ -#define CAN_F9DATA0(canx) REG32((canx) + 0x00000288U) /*!< CAN filter 9 data 0 register */ -#define CAN_F10DATA0(canx) REG32((canx) + 0x00000290U) /*!< CAN filter 10 data 0 register */ -#define CAN_F11DATA0(canx) REG32((canx) + 0x00000298U) /*!< CAN filter 11 data 0 register */ -#define CAN_F12DATA0(canx) REG32((canx) + 0x000002A0U) /*!< CAN filter 12 data 0 register */ -#define CAN_F13DATA0(canx) REG32((canx) + 0x000002A8U) /*!< CAN filter 13 data 0 register */ -#define CAN_F14DATA0(canx) REG32((canx) + 0x000002B0U) /*!< CAN filter 14 data 0 register */ -#define CAN_F15DATA0(canx) REG32((canx) + 0x000002B8U) /*!< CAN filter 15 data 0 register */ -#define CAN_F16DATA0(canx) REG32((canx) + 0x000002C0U) /*!< CAN filter 16 data 0 register */ -#define CAN_F17DATA0(canx) REG32((canx) + 0x000002C8U) /*!< CAN filter 17 data 0 register */ -#define CAN_F18DATA0(canx) REG32((canx) + 0x000002D0U) /*!< CAN filter 18 data 0 register */ -#define CAN_F19DATA0(canx) REG32((canx) + 0x000002D8U) /*!< CAN filter 19 data 0 register */ -#define CAN_F20DATA0(canx) REG32((canx) + 0x000002E0U) /*!< CAN filter 20 data 0 register */ -#define CAN_F21DATA0(canx) REG32((canx) + 0x000002E8U) /*!< CAN filter 21 data 0 register */ -#define CAN_F22DATA0(canx) REG32((canx) + 0x000002F0U) /*!< CAN filter 22 data 0 register */ -#define CAN_F23DATA0(canx) REG32((canx) + 0x000003F8U) /*!< CAN filter 23 data 0 register */ -#define CAN_F24DATA0(canx) REG32((canx) + 0x00000300U) /*!< CAN filter 24 data 0 register */ -#define CAN_F25DATA0(canx) REG32((canx) + 0x00000308U) /*!< CAN filter 25 data 0 register */ -#define CAN_F26DATA0(canx) REG32((canx) + 0x00000310U) /*!< CAN filter 26 data 0 register */ -#define CAN_F27DATA0(canx) REG32((canx) + 0x00000318U) /*!< CAN filter 27 data 0 register */ -#define CAN_F0DATA1(canx) REG32((canx) + 0x00000244U) /*!< CAN filter 0 data 1 register */ -#define CAN_F1DATA1(canx) REG32((canx) + 0x0000024CU) /*!< CAN filter 1 data 1 register */ -#define CAN_F2DATA1(canx) REG32((canx) + 0x00000254U) /*!< CAN filter 2 data 1 register */ -#define CAN_F3DATA1(canx) REG32((canx) + 0x0000025CU) /*!< CAN filter 3 data 1 register */ -#define CAN_F4DATA1(canx) REG32((canx) + 0x00000264U) /*!< CAN filter 4 data 1 register */ -#define CAN_F5DATA1(canx) REG32((canx) + 0x0000026CU) /*!< CAN filter 5 data 1 register */ -#define CAN_F6DATA1(canx) REG32((canx) + 0x00000274U) /*!< CAN filter 6 data 1 register */ -#define CAN_F7DATA1(canx) REG32((canx) + 0x0000027CU) /*!< CAN filter 7 data 1 register */ -#define CAN_F8DATA1(canx) REG32((canx) + 0x00000284U) /*!< CAN filter 8 data 1 register */ -#define CAN_F9DATA1(canx) REG32((canx) + 0x0000028CU) /*!< CAN filter 9 data 1 register */ -#define CAN_F10DATA1(canx) REG32((canx) + 0x00000294U) /*!< CAN filter 10 data 1 register */ -#define CAN_F11DATA1(canx) REG32((canx) + 0x0000029CU) /*!< CAN filter 11 data 1 register */ -#define CAN_F12DATA1(canx) REG32((canx) + 0x000002A4U) /*!< CAN filter 12 data 1 register */ -#define CAN_F13DATA1(canx) REG32((canx) + 0x000002ACU) /*!< CAN filter 13 data 1 register */ -#define CAN_F14DATA1(canx) REG32((canx) + 0x000002B4U) /*!< CAN filter 14 data 1 register */ -#define CAN_F15DATA1(canx) REG32((canx) + 0x000002BCU) /*!< CAN filter 15 data 1 register */ -#define CAN_F16DATA1(canx) REG32((canx) + 0x000002C4U) /*!< CAN filter 16 data 1 register */ -#define CAN_F17DATA1(canx) REG32((canx) + 0x0000024CU) /*!< CAN filter 17 data 1 register */ -#define CAN_F18DATA1(canx) REG32((canx) + 0x000002D4U) /*!< CAN filter 18 data 1 register */ -#define CAN_F19DATA1(canx) REG32((canx) + 0x000002DCU) /*!< CAN filter 19 data 1 register */ -#define CAN_F20DATA1(canx) REG32((canx) + 0x000002E4U) /*!< CAN filter 20 data 1 register */ -#define CAN_F21DATA1(canx) REG32((canx) + 0x000002ECU) /*!< CAN filter 21 data 1 register */ -#define CAN_F22DATA1(canx) REG32((canx) + 0x000002F4U) /*!< CAN filter 22 data 1 register */ -#define CAN_F23DATA1(canx) REG32((canx) + 0x000002FCU) /*!< CAN filter 23 data 1 register */ -#define CAN_F24DATA1(canx) REG32((canx) + 0x00000304U) /*!< CAN filter 24 data 1 register */ -#define CAN_F25DATA1(canx) REG32((canx) + 0x0000030CU) /*!< CAN filter 25 data 1 register */ -#define CAN_F26DATA1(canx) REG32((canx) + 0x00000314U) /*!< CAN filter 26 data 1 register */ -#define CAN_F27DATA1(canx) REG32((canx) + 0x0000031CU) /*!< CAN filter 27 data 1 register */ - -/* CAN transmit mailbox bank */ -#define CAN_TMI(canx, bank) REG32((canx) + 0x180U + ((bank) * 0x10U)) /*!< CAN transmit mailbox identifier register */ -#define CAN_TMP(canx, bank) REG32((canx) + 0x184U + ((bank) * 0x10U)) /*!< CAN transmit mailbox property register */ -#define CAN_TMDATA0(canx, bank) REG32((canx) + 0x188U + ((bank) * 0x10U)) /*!< CAN transmit mailbox data0 register */ -#define CAN_TMDATA1(canx, bank) REG32((canx) + 0x18CU + ((bank) * 0x10U)) /*!< CAN transmit mailbox data1 register */ - -/* CAN filter bank */ -#define CAN_FDATA0(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x0U) /*!< CAN filter data 0 register */ -#define CAN_FDATA1(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x4U) /*!< CAN filter data 1 register */ - -/* CAN receive FIFO mailbox bank */ -#define CAN_RFIFOMI(canx, bank) REG32((canx) + 0x1B0U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox identifier register */ -#define CAN_RFIFOMP(canx, bank) REG32((canx) + 0x1B4U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox property register */ -#define CAN_RFIFOMDATA0(canx, bank) REG32((canx) + 0x1B8U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data0 register */ -#define CAN_RFIFOMDATA1(canx, bank) REG32((canx) + 0x1BCU + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data1 register */ - -/* bits definitions */ -/* CAN_CTL */ -#define CAN_CTL_IWMOD BIT(0) /*!< initial working mode */ -#define CAN_CTL_SLPWMOD BIT(1) /*!< sleep working mode */ -#define CAN_CTL_TFO BIT(2) /*!< transmit FIFO order */ -#define CAN_CTL_RFOD BIT(3) /*!< receive FIFO overwrite disable */ -#define CAN_CTL_ARD BIT(4) /*!< automatic retransmission disable */ -#define CAN_CTL_AWU BIT(5) /*!< automatic wakeup */ -#define CAN_CTL_ABOR BIT(6) /*!< automatic bus-off recovery */ -#define CAN_CTL_TTC BIT(7) /*!< time triggered communication */ -#define CAN_CTL_SWRST BIT(15) /*!< CAN software reset */ -#define CAN_CTL_DFZ BIT(16) /*!< CAN debug freeze */ - -/* CAN_STAT */ -#define CAN_STAT_IWS BIT(0) /*!< initial working state */ -#define CAN_STAT_SLPWS BIT(1) /*!< sleep working state */ -#define CAN_STAT_ERRIF BIT(2) /*!< error interrupt flag*/ -#define CAN_STAT_WUIF BIT(3) /*!< status change interrupt flag of wakeup from sleep working mode */ -#define CAN_STAT_SLPIF BIT(4) /*!< status change interrupt flag of sleep working mode entering */ -#define CAN_STAT_TS BIT(8) /*!< transmitting state */ -#define CAN_STAT_RS BIT(9) /*!< receiving state */ -#define CAN_STAT_LASTRX BIT(10) /*!< last sample value of rx pin */ -#define CAN_STAT_RXL BIT(11) /*!< CAN rx signal */ - -/* CAN_TSTAT */ -#define CAN_TSTAT_MTF0 BIT(0) /*!< mailbox0 transmit finished */ -#define CAN_TSTAT_MTFNERR0 BIT(1) /*!< mailbox0 transmit finished and no error */ -#define CAN_TSTAT_MAL0 BIT(2) /*!< mailbox0 arbitration lost */ -#define CAN_TSTAT_MTE0 BIT(3) /*!< mailbox0 transmit error */ -#define CAN_TSTAT_MST0 BIT(7) /*!< mailbox0 stop transmitting */ -#define CAN_TSTAT_MTF1 BIT(8) /*!< mailbox1 transmit finished */ -#define CAN_TSTAT_MTFNERR1 BIT(9) /*!< mailbox1 transmit finished and no error */ -#define CAN_TSTAT_MAL1 BIT(10) /*!< mailbox1 arbitration lost */ -#define CAN_TSTAT_MTE1 BIT(11) /*!< mailbox1 transmit error */ -#define CAN_TSTAT_MST1 BIT(15) /*!< mailbox1 stop transmitting */ -#define CAN_TSTAT_MTF2 BIT(16) /*!< mailbox2 transmit finished */ -#define CAN_TSTAT_MTFNERR2 BIT(17) /*!< mailbox2 transmit finished and no error */ -#define CAN_TSTAT_MAL2 BIT(18) /*!< mailbox2 arbitration lost */ -#define CAN_TSTAT_MTE2 BIT(19) /*!< mailbox2 transmit error */ -#define CAN_TSTAT_MST2 BIT(23) /*!< mailbox2 stop transmitting */ -#define CAN_TSTAT_NUM BITS(24,25) /*!< mailbox number */ -#define CAN_TSTAT_TME0 BIT(26) /*!< transmit mailbox0 empty */ -#define CAN_TSTAT_TME1 BIT(27) /*!< transmit mailbox1 empty */ -#define CAN_TSTAT_TME2 BIT(28) /*!< transmit mailbox2 empty */ -#define CAN_TSTAT_TMLS0 BIT(29) /*!< last sending priority flag for mailbox0 */ -#define CAN_TSTAT_TMLS1 BIT(30) /*!< last sending priority flag for mailbox1 */ -#define CAN_TSTAT_TMLS2 BIT(31) /*!< last sending priority flag for mailbox2 */ - -/* CAN_RFIFO0 */ -#define CAN_RFIFO0_RFL0 BITS(0,1) /*!< receive FIFO0 length */ -#define CAN_RFIFO0_RFF0 BIT(3) /*!< receive FIFO0 full */ -#define CAN_RFIFO0_RFO0 BIT(4) /*!< receive FIFO0 overfull */ -#define CAN_RFIFO0_RFD0 BIT(5) /*!< receive FIFO0 dequeue */ - -/* CAN_RFIFO1 */ -#define CAN_RFIFO1_RFL1 BITS(0,1) /*!< receive FIFO1 length */ -#define CAN_RFIFO1_RFF1 BIT(3) /*!< receive FIFO1 full */ -#define CAN_RFIFO1_RFO1 BIT(4) /*!< receive FIFO1 overfull */ -#define CAN_RFIFO1_RFD1 BIT(5) /*!< receive FIFO1 dequeue */ - -/* CAN_INTEN */ -#define CAN_INTEN_TMEIE BIT(0) /*!< transmit mailbox empty interrupt enable */ -#define CAN_INTEN_RFNEIE0 BIT(1) /*!< receive FIFO0 not empty interrupt enable */ -#define CAN_INTEN_RFFIE0 BIT(2) /*!< receive FIFO0 full interrupt enable */ -#define CAN_INTEN_RFOIE0 BIT(3) /*!< receive FIFO0 overfull interrupt enable */ -#define CAN_INTEN_RFNEIE1 BIT(4) /*!< receive FIFO1 not empty interrupt enable */ -#define CAN_INTEN_RFFIE1 BIT(5) /*!< receive FIFO1 full interrupt enable */ -#define CAN_INTEN_RFOIE1 BIT(6) /*!< receive FIFO1 overfull interrupt enable */ -#define CAN_INTEN_WERRIE BIT(8) /*!< warning error interrupt enable */ -#define CAN_INTEN_PERRIE BIT(9) /*!< passive error interrupt enable */ -#define CAN_INTEN_BOIE BIT(10) /*!< bus-off interrupt enable */ -#define CAN_INTEN_ERRNIE BIT(11) /*!< error number interrupt enable */ -#define CAN_INTEN_ERRIE BIT(15) /*!< error interrupt enable */ -#define CAN_INTEN_WIE BIT(16) /*!< wakeup interrupt enable */ -#define CAN_INTEN_SLPWIE BIT(17) /*!< sleep working interrupt enable */ - -/* CAN_ERR */ -#define CAN_ERR_WERR BIT(0) /*!< warning error */ -#define CAN_ERR_PERR BIT(1) /*!< passive error */ -#define CAN_ERR_BOERR BIT(2) /*!< bus-off error */ -#define CAN_ERR_ERRN BITS(4,6) /*!< error number */ -#define CAN_ERR_TECNT BITS(16,23) /*!< transmit error count */ -#define CAN_ERR_RECNT BITS(24,31) /*!< receive error count */ - -/* CAN_BT */ -#define CAN_BT_BAUDPSC BITS(0,9) /*!< baudrate prescaler */ -#define CAN_BT_BS1_6_4 BITS(10,12) /*!< bit segment 1 [6:4] */ -#define CAN_BT_BS2_4_3 BITS(13,14) /*!< bit segment 2 [4:3] */ -#define CAN_BT_BS1_3_0 BITS(16,19) /*!< bit segment 1 [3:0] */ -#define CAN_BT_BS2_2_0 BITS(20,22) /*!< bit segment 2 [2:0]*/ -#define CAN_BT_SJW BITS(24,28) /*!< resynchronization jump width */ -#define CAN_BT_LCMOD BIT(30) /*!< loopback communication mode */ -#define CAN_BT_SCMOD BIT(31) /*!< silent communication mode */ - -/* CAN_FDCTL */ -#define CAN_FDCTL_FDEN BIT(0) /*!< FD operation enable */ -#define CAN_FDCTL_PRED BIT(2) /*!< protocol exception event detection disable */ -#define CAN_FDCTL_NISO BIT(3) /*!< ISO/Bosch */ -#define CAN_FDCTL_TDCEN BIT(4) /*!< transmitter delay compensation enable */ -#define CAN_FDCTL_TDCMOD BIT(5) /*!< transmitter delay compensation mode */ -#define CAN_FDCTL_ESIMOD BIT(6) /*!< error state indicator mode */ - -/* CAN_FDSTAT */ -#define CAN_FDSTAT_TDCV BITS(0,6) /*!< transmitter delay compensation value */ -#define CAN_FDSTAT_PRE BIT(16) /*!< protocol exception event */ - -/* CAN_FDTDC */ -#define CAN_FDTDC_TDCF BITS(0,6) /*!< transmitter delay compensation filter */ -#define CAN_FDTDC_TDCO BITS(8,14) /*!< transmitter delay compensation offset */ - -/* CAN_DBT */ -#define CAN_DBT_DBAUDPSC BITS(0,9) /*!< baud rate prescaler */ -#define CAN_DBT_DBS1 BITS(16,19) /*!< bit segment 1 */ -#define CAN_DBT_DBS2 BITS(20,22) /*!< bit segment 2 */ -#define CAN_DBT_DSJW BITS(24,26) /*!< resynchronization jump width */ - -/* CAN_TMIx */ -#define CAN_TMI_TEN BIT(0) /*!< transmit enable */ -#define CAN_TMI_FT BIT(1) /*!< frame type */ -#define CAN_TMI_FF BIT(2) /*!< frame format */ -#define CAN_TMI_EFID BITS(3,31) /*!< the frame identifier */ -#define CAN_TMI_SFID BITS(21,31) /*!< the frame identifier */ - -/* CAN_TMPx */ -#define CAN_TMP_DLENC BITS(0,3) /*!< data length code */ -#define CAN_TMP_ESI BIT(4) /*!< error status indicator */ -#define CAN_TMP_BRS BIT(5) /*!< bit rate of data switch */ -#define CAN_TMP_FDF BIT(7) /*!< CAN FD frame flag */ -#define CAN_TMP_TSEN BIT(8) /*!< time stamp enable */ -#define CAN_TMP_TS BITS(16,31) /*!< time stamp */ - -/* CAN_TMDATA0x */ -#define CAN_TMDATA0_DB0 BITS(0,7) /*!< transmit data byte 0 */ -#define CAN_TMDATA0_DB1 BITS(8,15) /*!< transmit data byte 1 */ -#define CAN_TMDATA0_DB2 BITS(16,23) /*!< transmit data byte 2 */ -#define CAN_TMDATA0_DB3 BITS(24,31) /*!< transmit data byte 3 */ - -/* CAN_TMDATA1x */ -#define CAN_TMDATA1_DB4 BITS(0,7) /*!< transmit data byte 4 */ -#define CAN_TMDATA1_DB5 BITS(8,15) /*!< transmit data byte 5 */ -#define CAN_TMDATA1_DB6 BITS(16,23) /*!< transmit data byte 6 */ -#define CAN_TMDATA1_DB7 BITS(24,31) /*!< transmit data byte 7 */ - -/* CAN_RFIFOMIx */ -#define CAN_RFIFOMI_FT BIT(1) /*!< frame type */ -#define CAN_RFIFOMI_FF BIT(2) /*!< frame format */ -#define CAN_RFIFOMI_EFID BITS(3,31) /*!< the frame identifier */ -#define CAN_RFIFOMI_SFID BITS(21,31) /*!< the frame identifier */ - -/* CAN_RFIFOMPx */ -#define CAN_RFIFOMP_DLENC BITS(0,3) /*!< receive data length code */ -#define CAN_RFIFOMP_ESI BIT(4) /*!< error status indicator */ -#define CAN_RFIFOMP_BRS BIT(5) /*!< bit rate of data switch */ -#define CAN_RFIFOMP_FDF BIT(7) /*!< CAN FD frame flag */ -#define CAN_RFIFOMP_FI BITS(8,15) /*!< filter index */ -#define CAN_RFIFOMP_TS BITS(16,31) /*!< time stamp */ - -/* CAN_RFIFOMDATA0x */ -#define CAN_RFIFOMDATA0_DB0 BITS(0,7) /*!< receive data byte 0 */ -#define CAN_RFIFOMDATA0_DB1 BITS(8,15) /*!< receive data byte 1 */ -#define CAN_RFIFOMDATA0_DB2 BITS(16,23) /*!< receive data byte 2 */ -#define CAN_RFIFOMDATA0_DB3 BITS(24,31) /*!< receive data byte 3 */ - -/* CAN_RFIFOMDATA1x */ -#define CAN_RFIFOMDATA1_DB4 BITS(0,7) /*!< receive data byte 4 */ -#define CAN_RFIFOMDATA1_DB5 BITS(8,15) /*!< receive data byte 5 */ -#define CAN_RFIFOMDATA1_DB6 BITS(16,23) /*!< receive data byte 6 */ -#define CAN_RFIFOMDATA1_DB7 BITS(24,31) /*!< receive data byte 7 */ - -/* CAN_FCTL */ -#define CAN_FCTL_FLD BIT(0) /*!< filter lock disable */ -#define CAN_FCTL_HBC1F BITS(8,13) /*!< header bank of CAN1 filter */ - -/* CAN_FMCFG */ -#define CAN_FMCFG_FMOD(regval) BIT(regval) /*!< filter mode, list or mask */ - -/* CAN_FSCFG */ -#define CAN_FSCFG_FS(regval) BIT(regval) /*!< filter scale, 32 bits or 16 bits */ - -/* CAN_FAFIFO */ -#define CAN_FAFIFOR_FAF(regval) BIT(regval) /*!< filter associated with FIFO */ - -/* CAN_FW */ -#define CAN_FW_FW(regval) BIT(regval) /*!< filter working */ - -/* CAN_FxDATAy */ -#define CAN_FDATA_FD(regval) BIT(regval) /*!< filter data */ - -/* constants definitions */ -/* define the CAN bit position and its register index offset */ -#define CAN_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define CAN_REG_VAL(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 6))) -#define CAN_BIT_POS(val) ((uint32_t)(val) & 0x1FU) - -#define CAN_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) -#define CAN_REG_VALS(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 12))) -#define CAN_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) -#define CAN_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) - -/* register offset */ -#define STAT_REG_OFFSET ((uint8_t)0x04U) /*!< STAT register offset */ -#define TSTAT_REG_OFFSET ((uint8_t)0x08U) /*!< TSTAT register offset */ -#define RFIFO0_REG_OFFSET ((uint8_t)0x0CU) /*!< RFIFO0 register offset */ -#define RFIFO1_REG_OFFSET ((uint8_t)0x10U) /*!< RFIFO1 register offset */ -#define ERR_REG_OFFSET ((uint8_t)0x18U) /*!< ERR register offset */ - -/* CAN flags */ -typedef enum { - /* flags in STAT register */ - CAN_FLAG_RXL = CAN_REGIDX_BIT(STAT_REG_OFFSET, 11U), /*!< RX level */ - CAN_FLAG_LASTRX = CAN_REGIDX_BIT(STAT_REG_OFFSET, 10U), /*!< last sample value of RX pin */ - CAN_FLAG_RS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 9U), /*!< receiving state */ - CAN_FLAG_TS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 8U), /*!< transmitting state */ - CAN_FLAG_SLPIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 4U), /*!< status change flag of entering sleep working mode */ - CAN_FLAG_WUIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 3U), /*!< status change flag of wakeup from sleep working mode */ - CAN_FLAG_ERRIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 2U), /*!< error flag */ - CAN_FLAG_SLPWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 1U), /*!< sleep working state */ - CAN_FLAG_IWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 0U), /*!< initial working state */ - /* flags in TSTAT register */ - CAN_FLAG_TMLS2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 31U), /*!< transmit mailbox 2 last sending in TX FIFO */ - CAN_FLAG_TMLS1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 30U), /*!< transmit mailbox 1 last sending in TX FIFO */ - CAN_FLAG_TMLS0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 29U), /*!< transmit mailbox 0 last sending in TX FIFO */ - CAN_FLAG_TME2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 28U), /*!< transmit mailbox 2 empty */ - CAN_FLAG_TME1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 27U), /*!< transmit mailbox 1 empty */ - CAN_FLAG_TME0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 26U), /*!< transmit mailbox 0 empty */ - CAN_FLAG_MTE2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 19U), /*!< mailbox 2 transmit error */ - CAN_FLAG_MTE1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 11U), /*!< mailbox 1 transmit error */ - CAN_FLAG_MTE0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 3U), /*!< mailbox 0 transmit error */ - CAN_FLAG_MAL2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 18U), /*!< mailbox 2 arbitration lost */ - CAN_FLAG_MAL1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 10U), /*!< mailbox 1 arbitration lost */ - CAN_FLAG_MAL0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 2U), /*!< mailbox 0 arbitration lost */ - CAN_FLAG_MTFNERR2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 17U), /*!< mailbox 2 transmit finished with no error */ - CAN_FLAG_MTFNERR1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 9U), /*!< mailbox 1 transmit finished with no error */ - CAN_FLAG_MTFNERR0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 1U), /*!< mailbox 0 transmit finished with no error */ - CAN_FLAG_MTF2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 16U), /*!< mailbox 2 transmit finished */ - CAN_FLAG_MTF1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 8U), /*!< mailbox 1 transmit finished */ - CAN_FLAG_MTF0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 0U), /*!< mailbox 0 transmit finished */ - /* flags in RFIFO0 register */ - CAN_FLAG_RFO0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 4U), /*!< receive FIFO0 overfull */ - CAN_FLAG_RFF0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 3U), /*!< receive FIFO0 full */ - /* flags in RFIFO1 register */ - CAN_FLAG_RFO1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 4U), /*!< receive FIFO1 overfull */ - CAN_FLAG_RFF1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 3U), /*!< receive FIFO1 full */ - /* flags in ERR register */ - CAN_FLAG_BOERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 2U), /*!< bus-off error */ - CAN_FLAG_PERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 1U), /*!< passive error */ - CAN_FLAG_WERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 0U), /*!< warning error */ -} can_flag_enum; - -/* CAN interrupt flags */ -typedef enum { - /* interrupt flags in STAT register */ - CAN_INT_FLAG_SLPIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 4U, 17U), /*!< status change interrupt flag of sleep working mode entering */ - CAN_INT_FLAG_WUIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 3U, 16), /*!< status change interrupt flag of wakeup from sleep working mode */ - CAN_INT_FLAG_ERRIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 2U, 15), /*!< error interrupt flag */ - /* interrupt flags in TSTAT register */ - CAN_INT_FLAG_MTF2 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 16U, 0U), /*!< mailbox 2 transmit finished interrupt flag */ - CAN_INT_FLAG_MTF1 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 8U, 0U), /*!< mailbox 1 transmit finished interrupt flag */ - CAN_INT_FLAG_MTF0 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 0U, 0U), /*!< mailbox 0 transmit finished interrupt flag */ - /* interrupt flags in RFIFO0 register */ - CAN_INT_FLAG_RFO0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 4U, 3U), /*!< receive FIFO0 overfull interrupt flag */ - CAN_INT_FLAG_RFF0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 3U, 2U), /*!< receive FIFO0 full interrupt flag */ - CAN_INT_FLAG_RFL0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 2U, 1U), /*!< receive FIFO0 not empty interrupt flag */ - /* interrupt flags in RFIFO0 register */ - CAN_INT_FLAG_RFO1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 4U, 6U), /*!< receive FIFO1 overfull interrupt flag */ - CAN_INT_FLAG_RFF1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 3U, 5U), /*!< receive FIFO1 full interrupt flag */ - CAN_INT_FLAG_RFL1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 2U, 4U), /*!< receive FIFO1 not empty interrupt flag */ - /* interrupt flags in ERR register */ - CAN_INT_FLAG_ERRN = CAN_REGIDX_BITS(ERR_REG_OFFSET, 3U, 11U), /*!< error number interrupt flag */ - CAN_INT_FLAG_BOERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 2U, 10U), /*!< bus-off error interrupt flag */ - CAN_INT_FLAG_PERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 1U, 9U), /*!< passive error interrupt flag */ - CAN_INT_FLAG_WERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 0U, 8U), /*!< warning error interrupt flag */ -} can_interrupt_flag_enum; - -/* CAN FD transmitter delay compensation parameters struct */ -typedef struct { - uint32_t tdc_mode; /*!< transmitter delay compensation mode */ - uint8_t tdc_filter; /*!< transmitter delay compensation filter */ - uint8_t tdc_offset; /*!< transmitter delay compensation offset */ -} can_fd_tdc_struct; - -/* CAN initialize FD frame parameters struct */ -typedef struct { - ControlStatus fd_frame; /*!< FD operation function */ - ControlStatus excp_event_detect; /*!< protocol exception event detection function*/ - ControlStatus delay_compensation; /*!< transmitter delay compensation mode */ - can_fd_tdc_struct - *p_delay_compensation; /*!< pointer to the struct of the transmitter delay compensation */ - uint32_t iso_bosch; /*!< ISO/Bosch mode choice */ - uint32_t esi_mode; /*!< error state indicator mode */ - uint8_t data_resync_jump_width; /*!< CAN resynchronization jump width */ - uint8_t data_time_segment_1; /*!< time segment 1 */ - uint8_t data_time_segment_2; /*!< time segment 2 */ - uint16_t data_prescaler; /*!< baudrate prescaler */ -} can_fdframe_struct; - -/* CAN initialize parameters structure */ -typedef struct { - uint8_t working_mode; /*!< CAN working mode */ - uint8_t resync_jump_width; /*!< CAN resynchronization jump width */ - uint8_t time_segment_1; /*!< time segment 1 */ - uint8_t time_segment_2; /*!< time segment 2 */ - ControlStatus time_triggered; /*!< time triggered communication mode */ - ControlStatus auto_bus_off_recovery; /*!< automatic bus-off recovery */ - ControlStatus auto_wake_up; /*!< automatic wake-up mode */ - ControlStatus auto_retrans; /*!< automatic retransmission mode */ - ControlStatus rec_fifo_overwrite; /*!< receive FIFO overwrite mode */ - ControlStatus trans_fifo_order; /*!< transmit FIFO order */ - uint16_t prescaler; /*!< baudrate prescaler */ -} can_parameter_struct; - -/* CAN transmit message structure */ -typedef struct { - uint32_t tx_sfid; /*!< standard format frame identifier */ - uint32_t tx_efid; /*!< extended format frame identifier */ - uint8_t tx_ff; /*!< format of frame, standard or extended format */ - uint8_t tx_ft; /*!< type of frame, data or remote */ - uint8_t tx_dlen; /*!< data length */ - uint8_t tx_data[64]; /*!< transmit data */ - uint8_t fd_flag; /*!< CAN FD frame flag */ - uint8_t fd_brs; /*!< bit rate of data switch */ - uint8_t fd_esi; /*!< error status indicator */ -} can_trasnmit_message_struct; - -/* CAN receive message structure */ -typedef struct { - uint32_t rx_sfid; /*!< standard format frame identifier */ - uint32_t rx_efid; /*!< extended format frame identifier */ - uint8_t rx_ff; /*!< format of frame, standard or extended format */ - uint8_t rx_ft; /*!< type of frame, data or remote */ - uint8_t rx_dlen; /*!< data length */ - uint8_t rx_data[64]; /*!< receive data */ - uint8_t rx_fi; /*!< filtering index */ - uint8_t fd_flag; /*!< CAN FD frame flag */ - uint8_t fd_brs; /*!< bit rate of data switch */ - uint8_t fd_esi; /*!< error status indicator */ - -} can_receive_message_struct; - -/* CAN filter parameters structure */ -typedef struct { - uint16_t filter_list_high; /*!< filter list number high bits */ - uint16_t filter_list_low; /*!< filter list number low bits */ - uint16_t filter_mask_high; /*!< filter mask number high bits */ - uint16_t filter_mask_low; /*!< filter mask number low bits */ - uint16_t filter_fifo_number; /*!< receive FIFO associated with the filter */ - uint16_t filter_number; /*!< filter number */ - uint16_t filter_mode; /*!< filter mode, list or mask */ - uint16_t filter_bits; /*!< filter scale */ - ControlStatus filter_enable; /*!< filter work or not */ -} can_filter_parameter_struct; - -/* CAN errors */ -typedef enum { - CAN_ERROR_NONE = 0, /*!< no error */ - CAN_ERROR_FILL, /*!< fill error */ - CAN_ERROR_FORMATE, /*!< format error */ - CAN_ERROR_ACK, /*!< ACK error */ - CAN_ERROR_BITRECESSIVE, /*!< bit recessive error */ - CAN_ERROR_BITDOMINANTER, /*!< bit dominant error */ - CAN_ERROR_CRC, /*!< CRC error */ - CAN_ERROR_SOFTWARECFG, /*!< software configure */ -} can_error_enum; - -/* transmit states */ -typedef enum { - CAN_TRANSMIT_FAILED = 0U, /*!< CAN transmitted failure */ - CAN_TRANSMIT_OK = 1U, /*!< CAN transmitted success */ - CAN_TRANSMIT_PENDING = 2U, /*!< CAN transmitted pending */ - CAN_TRANSMIT_NOMAILBOX = 4U, /*!< no empty mailbox to be used for CAN */ -} can_transmit_state_enum; - -/* format and fifo states */ -typedef enum { - CAN_STANDARD_FIFO0 = 0U, /*!< standard frame and used FIFO0 */ - CAN_STANDARD_FIFO1, /*!< standard frame and used FIFO1 */ - CAN_EXTENDED_FIFO0, /*!< extended frame and used FIFO0 */ - CAN_EXTENDED_FIFO1, /*!< extended frame and used FIFO1 */ -} can_format_fifo_enum; - -typedef enum { - CAN_INIT_STRUCT = 0U, /* CAN initiliaze parameters struct */ - CAN_FILTER_STRUCT, /* CAN filter parameters struct */ - CAN_FD_FRAME_STRUCT, /* CAN initiliaze FD frame parameters struct */ - CAN_TX_MESSAGE_STRUCT, /* CAN transmit message struct */ - CAN_RX_MESSAGE_STRUCT, /* CAN receive message struct */ -} can_struct_type_enum; - -/* CAN baudrate prescaler */ -#define BT_BAUDPSC(regval) (BITS(0,9) & ((uint32_t)(regval) << 0)) - -/* CAN bit segment 1*/ -#define BT_BS1(regval) ((BITS(16,19) & ((uint32_t)(regval) << 16)) | (BITS(10,12) & ((uint32_t)(regval) << 6))) -#define BT_DBS1(regval) ((BITS(16,19) & ((uint32_t)(regval) << 16))) - -/* CAN bit segment 2*/ -#define BT_BS2(regval) ((BITS(20,22) & ((uint32_t)(regval) << 20)) | (BITS(13,14) & ((uint32_t)(regval) << 10))) -#define BT_DBS2(regval) ((BITS(20,22)) & ((uint32_t)(regval) << 20)) - -/* CAN resynchronization jump width*/ -#define BT_SJW(regval) (BITS(24,28) & ((uint32_t)(regval) << 24)) -#define BT_DSJW(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) - -#define FDTDC_TDCF(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) -#define FDTDC_TDCO(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) - -/* CAN communication mode*/ -#define BT_MODE(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) - -/* CAN FDATA high 16 bits */ -#define FDATA_MASK_HIGH(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) - -/* CAN FDATA low 16 bits */ -#define FDATA_MASK_LOW(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) - -/* CAN1 filter start bank_number */ -#define FCTL_HBC1F(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) - -/* CAN transmit mailbox extended identifier */ -#define TMI_EFID(regval) (BITS(3,31) & ((uint32_t)(regval) << 3)) - -/* CAN transmit mailbox standard identifier */ -#define TMI_SFID(regval) (BITS(21,31) & ((uint32_t)(regval) << 21)) - -/* transmit data byte 0 */ -#define TMDATA0_DB0(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) - -/* transmit data byte 1 */ -#define TMDATA0_DB1(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) - -/* transmit data byte 2 */ -#define TMDATA0_DB2(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) - -/* transmit data byte 3 */ -#define TMDATA0_DB3(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) - -/* transmit data byte 4 */ -#define TMDATA1_DB4(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) - -/* transmit data byte 5 */ -#define TMDATA1_DB5(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) - -/* transmit data byte 6 */ -#define TMDATA1_DB6(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) - -/* transmit data byte 7 */ -#define TMDATA1_DB7(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) - -/* receive mailbox extended identifier */ -#define GET_RFIFOMI_EFID(regval) GET_BITS((uint32_t)(regval), 3U, 31U) - -/* receive mailbox standard identifier */ -#define GET_RFIFOMI_SFID(regval) GET_BITS((uint32_t)(regval), 21U, 31U) - -/* receive data length */ -#define GET_RFIFOMP_DLENC(regval) GET_BITS((uint32_t)(regval), 0U, 3U) - -/* the index of the filter by which the frame is passed */ -#define GET_RFIFOMP_FI(regval) GET_BITS((uint32_t)(regval), 8U, 15U) - -/* receive data byte 0 */ -#define GET_RFIFOMDATA0_DB0(regval) GET_BITS((uint32_t)(regval), 0U, 7U) - -/* receive data byte 1 */ -#define GET_RFIFOMDATA0_DB1(regval) GET_BITS((uint32_t)(regval), 8U, 15U) - -/* receive data byte 2 */ -#define GET_RFIFOMDATA0_DB2(regval) GET_BITS((uint32_t)(regval), 16U, 23U) - -/* receive data byte 3 */ -#define GET_RFIFOMDATA0_DB3(regval) GET_BITS((uint32_t)(regval), 24U, 31U) - -/* receive data byte 4 */ -#define GET_RFIFOMDATA1_DB4(regval) GET_BITS((uint32_t)(regval), 0U, 7U) - -/* receive data byte 5 */ -#define GET_RFIFOMDATA1_DB5(regval) GET_BITS((uint32_t)(regval), 8U, 15U) - -/* receive data byte 6 */ -#define GET_RFIFOMDATA1_DB6(regval) GET_BITS((uint32_t)(regval), 16U, 23U) - -/* receive data byte 7 */ -#define GET_RFIFOMDATA1_DB7(regval) GET_BITS((uint32_t)(regval), 24U, 31U) - -/* error number */ -#define GET_ERR_ERRN(regval) GET_BITS((uint32_t)(regval), 4U, 6U) - -/* transmit error count */ -#define GET_ERR_TECNT(regval) GET_BITS((uint32_t)(regval), 16U, 23U) - -/* receive error count */ -#define GET_ERR_RECNT(regval) GET_BITS((uint32_t)(regval), 24U, 31U) - -/* CAN errors */ -#define ERR_ERRN(regval) (BITS(4,6) & ((uint32_t)(regval) << 4)) -#define CAN_ERRN_0 ERR_ERRN(0U) /*!< no error */ -#define CAN_ERRN_1 ERR_ERRN(1U) /*!< fill error */ -#define CAN_ERRN_2 ERR_ERRN(2U) /*!< format error */ -#define CAN_ERRN_3 ERR_ERRN(3U) /*!< ACK error */ -#define CAN_ERRN_4 ERR_ERRN(4U) /*!< bit recessive error */ -#define CAN_ERRN_5 ERR_ERRN(5U) /*!< bit dominant error */ -#define CAN_ERRN_6 ERR_ERRN(6U) /*!< CRC error */ -#define CAN_ERRN_7 ERR_ERRN(7U) /*!< software error */ - -#define CAN_STATE_PENDING ((uint32_t)0x00000000U) /*!< CAN pending */ - -/* CAN communication mode */ -#define CAN_NORMAL_MODE ((uint8_t)0x00U) /*!< normal communication mode */ -#define CAN_LOOPBACK_MODE ((uint8_t)0x01U) /*!< loopback communication mode */ -#define CAN_SILENT_MODE ((uint8_t)0x02U) /*!< silent communication mode */ -#define CAN_SILENT_LOOPBACK_MODE ((uint8_t)0x03U) /*!< loopback and silent communication mode */ - -/* CAN resynchronisation jump width */ -#define CAN_BT_SJW_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ -#define CAN_BT_SJW_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ -#define CAN_BT_SJW_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ -#define CAN_BT_SJW_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ -#define CAN_BT_SJW_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ -#define CAN_BT_SJW_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ -#define CAN_BT_SJW_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ -#define CAN_BT_SJW_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ -#define CAN_BT_SJW_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ -#define CAN_BT_SJW_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ -#define CAN_BT_SJW_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ -#define CAN_BT_SJW_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ -#define CAN_BT_SJW_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ -#define CAN_BT_SJW_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ -#define CAN_BT_SJW_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ -#define CAN_BT_SJW_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ -#define CAN_BT_SJW_17TQ ((uint8_t)0x10U) /*!< 17 time quanta */ -#define CAN_BT_SJW_18TQ ((uint8_t)0x11U) /*!< 18 time quanta */ -#define CAN_BT_SJW_19TQ ((uint8_t)0x12U) /*!< 19 time quanta */ -#define CAN_BT_SJW_20TQ ((uint8_t)0x13U) /*!< 20 time quanta */ -#define CAN_BT_SJW_21TQ ((uint8_t)0x14U) /*!< 21 time quanta */ -#define CAN_BT_SJW_22TQ ((uint8_t)0x15U) /*!< 22 time quanta */ -#define CAN_BT_SJW_23TQ ((uint8_t)0x16U) /*!< 23 time quanta */ -#define CAN_BT_SJW_24TQ ((uint8_t)0x17U) /*!< 24 time quanta */ -#define CAN_BT_SJW_25TQ ((uint8_t)0x18U) /*!< 25 time quanta */ -#define CAN_BT_SJW_26TQ ((uint8_t)0x19U) /*!< 26 time quanta */ -#define CAN_BT_SJW_27TQ ((uint8_t)0x1AU) /*!< 27 time quanta */ -#define CAN_BT_SJW_28TQ ((uint8_t)0x1BU) /*!< 28 time quanta */ -#define CAN_BT_SJW_29TQ ((uint8_t)0x1CU) /*!< 29 time quanta */ -#define CAN_BT_SJW_30TQ ((uint8_t)0x1DU) /*!< 30 time quanta */ -#define CAN_BT_SJW_31TQ ((uint8_t)0x1EU) /*!< 31 time quanta */ -#define CAN_BT_SJW_32TQ ((uint8_t)0x1FU) /*!< 32 time quanta */ - -/* CAN time segment 1 */ -#define CAN_BT_BS1_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ -#define CAN_BT_BS1_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ -#define CAN_BT_BS1_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ -#define CAN_BT_BS1_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ -#define CAN_BT_BS1_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ -#define CAN_BT_BS1_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ -#define CAN_BT_BS1_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ -#define CAN_BT_BS1_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ -#define CAN_BT_BS1_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ -#define CAN_BT_BS1_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ -#define CAN_BT_BS1_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ -#define CAN_BT_BS1_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ -#define CAN_BT_BS1_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ -#define CAN_BT_BS1_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ -#define CAN_BT_BS1_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ -#define CAN_BT_BS1_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ - -/* CAN time segment 2 */ -#define CAN_BT_BS2_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ -#define CAN_BT_BS2_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ -#define CAN_BT_BS2_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ -#define CAN_BT_BS2_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ -#define CAN_BT_BS2_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ -#define CAN_BT_BS2_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ -#define CAN_BT_BS2_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ -#define CAN_BT_BS2_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ -#define CAN_BT_BS2_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ -#define CAN_BT_BS2_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ -#define CAN_BT_BS2_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ -#define CAN_BT_BS2_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ -#define CAN_BT_BS2_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ -#define CAN_BT_BS2_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ -#define CAN_BT_BS2_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ -#define CAN_BT_BS2_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ -#define CAN_BT_BS2_17TQ ((uint8_t)0x10U) /*!< 17 time quanta */ -#define CAN_BT_BS2_18TQ ((uint8_t)0x11U) /*!< 18 time quanta */ -#define CAN_BT_BS2_19TQ ((uint8_t)0x12U) /*!< 19 time quanta */ -#define CAN_BT_BS2_20TQ ((uint8_t)0x13U) /*!< 20 time quanta */ -#define CAN_BT_BS2_21TQ ((uint8_t)0x14U) /*!< 21 time quanta */ -#define CAN_BT_BS2_22TQ ((uint8_t)0x15U) /*!< 22 time quanta */ -#define CAN_BT_BS2_23TQ ((uint8_t)0x16U) /*!< 23 time quanta */ -#define CAN_BT_BS2_24TQ ((uint8_t)0x17U) /*!< 24 time quanta */ -#define CAN_BT_BS2_25TQ ((uint8_t)0x18U) /*!< 25 time quanta */ -#define CAN_BT_BS2_26TQ ((uint8_t)0x19U) /*!< 26 time quanta */ -#define CAN_BT_BS2_27TQ ((uint8_t)0x1AU) /*!< 27 time quanta */ -#define CAN_BT_BS2_28TQ ((uint8_t)0x1BU) /*!< 28 time quanta */ -#define CAN_BT_BS2_29TQ ((uint8_t)0x1CU) /*!< 29 time quanta */ -#define CAN_BT_BS2_30TQ ((uint8_t)0x1DU) /*!< 30 time quanta */ -#define CAN_BT_BS2_31TQ ((uint8_t)0x1EU) /*!< 31 time quanta */ -#define CAN_BT_BS2_32TQ ((uint8_t)0x1FU) /*!< 32 time quanta */ - -/* CAN resynchronisation jump width */ -#define CAN_DBT_SWJ_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ -#define CAN_DBT_SWJ_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ -#define CAN_DBT_SWJ_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ -#define CAN_DBT_SWJ_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ -#define CAN_DBT_SWJ_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ -#define CAN_DBT_SWJ_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ -#define CAN_DBT_SWJ_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ -#define CAN_DBT_SWJ_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ - -/* CAN mailbox number */ -#define CAN_MAILBOX0 ((uint8_t)0x00U) /*!< mailbox0 */ -#define CAN_MAILBOX1 ((uint8_t)0x01U) /*!< mailbox1 */ -#define CAN_MAILBOX2 ((uint8_t)0x02U) /*!< mailbox2 */ -#define CAN_NOMAILBOX ((uint8_t)0x03U) /*!< no mailbox empty */ - -/* CAN frame format */ -#define CAN_FF_STANDARD ((uint32_t)0x00000000U) /*!< standard frame */ -#define CAN_FF_EXTENDED ((uint32_t)0x00000004U) /*!< extended frame */ - -/* CAN receive FIFO */ -#define CAN_FIFO0 ((uint8_t)0x00U) /*!< receive FIFO0 */ -#define CAN_FIFO1 ((uint8_t)0x01U) /*!< receive FIFO1 */ - -/* frame number of receive FIFO */ -#define CAN_RFIF_RFL_MASK ((uint32_t)0x00000003U) /*!< mask for frame number in receive FIFOx */ - -#define CAN_SFID_MASK ((uint32_t)0x000007FFU) /*!< mask of standard identifier */ -#define CAN_EFID_MASK ((uint32_t)0x1FFFFFFFU) /*!< mask of extended identifier */ - -/* CAN working mode */ -#define CAN_MODE_INITIALIZE ((uint8_t)0x01U) /*!< CAN initialize mode */ -#define CAN_MODE_NORMAL ((uint8_t)0x02U) /*!< CAN normal mode */ -#define CAN_MODE_SLEEP ((uint8_t)0x04U) /*!< CAN sleep mode */ - -/* filter bits */ -#define CAN_FILTERBITS_16BIT ((uint8_t)0x00U) /*!< CAN filter 16 bits */ -#define CAN_FILTERBITS_32BIT ((uint8_t)0x01U) /*!< CAN filter 32 bits */ - -/* filter mode */ -#define CAN_FILTERMODE_MASK ((uint8_t)0x00U) /*!< mask mode */ -#define CAN_FILTERMODE_LIST ((uint8_t)0x01U) /*!< list mode */ - -/* filter 16 bits mask */ -#define CAN_FILTER_MASK_16BITS ((uint32_t)0x0000FFFFU) /*!< can filter 16 bits mask */ - -/* frame type */ -#define CAN_FT_DATA ((uint32_t)0x00000000U) /*!< data frame */ -#define CAN_FT_REMOTE ((uint32_t)0x00000002U) /*!< remote frame */ - -#define CAN_ESIMOD_HARDWARE ((uint32_t)0x00000000U) /*!< displays the node error state by hardware */ -#define CAN_ESIMOD_SOFTWARE CAN_FDCTL_ESIMOD /*!< displays the node error state by software */ - -#define CAN_TDCMOD_CALC_AND_OFFSET ((uint32_t)0x00000000U) /*!< measurement and offset */ -#define CAN_TDCMOD_OFFSET CAN_FDCTL_TDCMOD /*!< only offset */ - -#define CAN_FDMOD_ISO ((uint32_t)0x00000000U) /*!< ISO mode */ -#define CAN_FDMOD_BOSCH CAN_FDCTL_NISO /*!< BOSCH mode */ - -/* CAN FD frame flag */ -#define CAN_FDF_CLASSIC (0U) /*!< classical frames */ -#define CAN_FDF_FDFRAME (1U) /*!< FD frames */ - -/* bit rate of data switch */ -#define CAN_BRS_DISABLE (0U) /*!< bit rate not switch */ -#define CAN_BRS_ENABLE (1U) /*!< the bit rate shall be switched */ - -/* error status indicator */ -#define CAN_ESI_DOMINANT (0U) /*!< transmit the dominant bit in ESI phase */ -#define CAN_ESI_RECESSIVE (1U) /*!< transmit the recessive bit in ESI phase */ - -/* CAN timeout */ -#define CAN_TIMEOUT ((uint32_t)0x0000FFFFU) /*!< timeout value */ - -/* interrupt enable bits */ -#define CAN_INT_TME CAN_INTEN_TMEIE /*!< transmit mailbox empty interrupt enable */ -#define CAN_INT_RFNE0 CAN_INTEN_RFNEIE0 /*!< receive FIFO0 not empty interrupt enable */ -#define CAN_INT_RFF0 CAN_INTEN_RFFIE0 /*!< receive FIFO0 full interrupt enable */ -#define CAN_INT_RFO0 CAN_INTEN_RFOIE0 /*!< receive FIFO0 overfull interrupt enable */ -#define CAN_INT_RFNE1 CAN_INTEN_RFNEIE1 /*!< receive FIFO1 not empty interrupt enable */ -#define CAN_INT_RFF1 CAN_INTEN_RFFIE1 /*!< receive FIFO1 full interrupt enable */ -#define CAN_INT_RFO1 CAN_INTEN_RFOIE1 /*!< receive FIFO1 overfull interrupt enable */ -#define CAN_INT_WERR CAN_INTEN_WERRIE /*!< warning error interrupt enable */ -#define CAN_INT_PERR CAN_INTEN_PERRIE /*!< passive error interrupt enable */ -#define CAN_INT_BO CAN_INTEN_BOIE /*!< bus-off interrupt enable */ -#define CAN_INT_ERRN CAN_INTEN_ERRNIE /*!< error number interrupt enable */ -#define CAN_INT_ERR CAN_INTEN_ERRIE /*!< error interrupt enable */ -#define CAN_INT_WAKEUP CAN_INTEN_WIE /*!< wakeup interrupt enable */ -#define CAN_INT_SLPW CAN_INTEN_SLPWIE /*!< sleep working interrupt enable */ - -/* function declarations */ -/* initialization functions */ -/* deinitialize CAN */ -void can_deinit(uint32_t can_periph); -/* initialize CAN structure */ -void can_struct_para_init(can_struct_type_enum type, void *p_struct); -/* initialize CAN */ -ErrStatus can_init(uint32_t can_periph, can_parameter_struct *can_parameter_init); -/* initialize CAN FD function */ -ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init); -/* CAN filter init */ -void can_filter_init(can_filter_parameter_struct *can_filter_parameter_init); -/* CAN filter mask mode initialization */ -void can_filter_mask_mode_init(uint32_t id, uint32_t mask, can_format_fifo_enum format_fifo, uint16_t filter_number); -/* CAN communication mode configure */ -ErrStatus can_monitor_mode_set(uint32_t can_periph, uint8_t mode); -/* CAN FD frame function enable */ -void can_fd_function_enable(uint32_t can_periph); -/* CAN FD frame function disable */ -void can_fd_function_disable(uint32_t can_periph); - -/* set can1 filter start bank number */ -void can1_filter_start_bank(uint8_t start_bank); -/* enable functions */ -/* CAN debug freeze enable */ -void can_debug_freeze_enable(uint32_t can_periph); -/* CAN debug freeze disable */ -void can_debug_freeze_disable(uint32_t can_periph); -/* CAN time trigger mode enable */ -void can_time_trigger_mode_enable(uint32_t can_periph); -/* CAN time trigger mode disable */ -void can_time_trigger_mode_disable(uint32_t can_periph); - -/* transmit functions */ -/* transmit CAN message */ -uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct *transmit_message); -/* get CAN transmit state */ -can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number); -/* stop CAN transmission */ -void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number); -/* CAN receive message */ -void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct *receive_message); -/* CAN release FIFO */ -void can_fifo_release(uint32_t can_periph, uint8_t fifo_number); -/* CAN receive message length */ -uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number); -/* CAN working mode */ -ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode); -/* CAN wakeup from sleep mode */ -ErrStatus can_wakeup(uint32_t can_periph); - -/* CAN get error type */ -can_error_enum can_error_get(uint32_t can_periph); -/* get CAN receive error number */ -uint8_t can_receive_error_number_get(uint32_t can_periph); -/* get CAN transmit error number */ -uint8_t can_transmit_error_number_get(uint32_t can_periph); - -/* interrupt & flag functions */ -/* CAN get flag state */ -FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag); -/* CAN clear flag state */ -void can_flag_clear(uint32_t can_periph, can_flag_enum flag); -/* CAN interrupt enable */ -void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt); -/* CAN interrupt disable */ -void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt); -/* CAN get interrupt flag state */ -FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag); -/* CAN clear interrupt flag state */ -void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag); - -#endif /* GD32F5XX_CAN_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h deleted file mode 100644 index 86614f25158..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_cau.h +++ /dev/null @@ -1,317 +0,0 @@ -/*! - \file gd32f5xx_cau.h - \brief definitions for the CAU - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_CAU_H -#define GD32F5XX_CAU_H - -#include "gd32f5xx.h" - - -/* CAU definitions */ -#define CAU CAU_BASE /*!< CAU base address */ - -/* registers definitions */ -#define CAU_CTL REG32(CAU + 0x00000000U) /*!< control register */ -#define CAU_STAT0 REG32(CAU + 0x00000004U) /*!< status register 0 */ -#define CAU_DI REG32(CAU + 0x00000008U) /*!< data input register */ -#define CAU_DO REG32(CAU + 0x0000000CU) /*!< data output register */ -#define CAU_DMAEN REG32(CAU + 0x00000010U) /*!< DMA enable register */ -#define CAU_INTEN REG32(CAU + 0x00000014U) /*!< interrupt enable register */ -#define CAU_STAT1 REG32(CAU + 0x00000018U) /*!< status register 1 */ -#define CAU_INTF REG32(CAU + 0x0000001CU) /*!< interrupt flag register */ -#define CAU_KEY0H REG32(CAU + 0x00000020U) /*!< key 0 high register */ -#define CAU_KEY0L REG32(CAU + 0x00000024U) /*!< key 0 low register */ -#define CAU_KEY1H REG32(CAU + 0x00000028U) /*!< key 1 high register */ -#define CAU_KEY1L REG32(CAU + 0x0000002CU) /*!< key 1 low register */ -#define CAU_KEY2H REG32(CAU + 0x00000030U) /*!< key 2 high register */ -#define CAU_KEY2L REG32(CAU + 0x00000034U) /*!< key 2 low register */ -#define CAU_KEY3H REG32(CAU + 0x00000038U) /*!< key 3 high register */ -#define CAU_KEY3L REG32(CAU + 0x0000003CU) /*!< key 3 low register */ -#define CAU_IV0H REG32(CAU + 0x00000040U) /*!< initial vector 0 high register */ -#define CAU_IV0L REG32(CAU + 0x00000044U) /*!< initial vector 0 low register */ -#define CAU_IV1H REG32(CAU + 0x00000048U) /*!< initial vector 1 high register */ -#define CAU_IV1L REG32(CAU + 0x0000004CU) /*!< initial vector 1 low register */ -#define CAU_GCMCCMCTXSx(x) REG32(CAU + 0x00000050U + (uint32_t)(4U * (x))) /*!< GCM or CCM mode context switch register, x = 0...7 */ -#define CAU_GCMCTXSx(x) REG32(CAU + 0x00000070U + (uint32_t)(4U * (x))) /*!< GCM mode context switch register, x = 0...7 */ - -/* bits definitions */ -/* CAU_CTL */ -#define CAU_CTL_CAUDIR BIT(2) /*!< algorithm direction */ -#define CAU_CTL_ALGM (BITS(3,5) | BIT(19)) /*!< cryptographic algorithm mode */ -#define CAU_CTL_DATAM BITS(6,7) /*!< data swapping selection */ -#define CAU_CTL_KEYM BITS(8,9) /*!< key length selection when aes mode */ -#define CAU_CTL_FFLUSH BIT(14) /*!< FIFO flush */ -#define CAU_CTL_CAUEN BIT(15) /*!< cryptographic module enable */ -#define CAU_CTL_GCM_CCMPH BITS(16,17) /*!< GCM CCM phase */ -#define CAU_CTL_NBPILB BITS(20,23) /*!< number of bytes padding in last block */ - -/* CAU_STAT0 */ -#define CAU_STAT0_IEM BIT(0) /*!< IN FIFO empty flag */ -#define CAU_STAT0_INF BIT(1) /*!< IN FIFO not full flag */ -#define CAU_STAT0_ONE BIT(2) /*!< OUT FIFO not empty flag */ -#define CAU_STAT0_OFU BIT(3) /*!< OUT FIFO full flag */ -#define CAU_STAT0_BUSY BIT(4) /*!< busy flag */ - -/* CAU_DI */ -#define CAU_DI_DI BITS(0,31) /*!< data input */ - -/* CAU_DO */ -#define CAU_DO_DO BITS(0,31) /*!< data output */ - -/* CAU_DMAEN */ -#define CAU_DMAEN_DMAIEN BIT(0) /*!< IN FIFO DMA enable */ -#define CAU_DMAEN_DMAOEN BIT(1) /*!< OUT FIFO DMA enable */ - -/* CAU_INTEN */ -#define CAU_INTEN_IINTEN BIT(0) /*!< IN FIFO interrupt enable */ -#define CAU_INTEN_OINTEN BIT(1) /*!< OUT FIFO interrupt enable */ - -/* CAU_STAT1 */ -#define CAU_STAT1_ISTA BIT(0) /*!< flag set when there is less than 4 words in IN FIFO */ -#define CAU_STAT1_OSTA BIT(1) /*!< flag set when there is one or more word in OUT FIFO */ - -/* CAU_INTF */ -#define CAU_INTF_IINTF BIT(0) /*!< IN FIFO interrupt flag */ -#define CAU_INTF_OINTF BIT(1) /*!< OUT FIFO interrupt flag */ - -/* CAU_KEYxH x=0..3 */ -#define CAU_KEYXH_KEYXH BITS(0,31) /*!< the key for des, tdes, aes */ - -/* CAU_KEYxL x=0..3 */ -#define CAU_KEYXL_KEYXL BITS(0,31) /*!< the key for des, tdes, aes */ - -/* CAU_IVxH x=0..1 */ -#define CAU_IVXH_IVXH BITS(0,31) /*!< the initialization vector for des, tdes, aes */ - -/* CAU_IVxL x=0..1 */ -#define CAU_IVXL_IVXL BITS(0,31) /*!< the initialization vector for des, tdes, aes */ - -/* constants definitions */ -/* structure for keys initialization of the cau */ -typedef struct { - uint32_t key_0_high; /*!< key 0 high */ - uint32_t key_0_low; /*!< key 0 low */ - uint32_t key_1_high; /*!< key 1 high */ - uint32_t key_1_low; /*!< key 1 low */ - uint32_t key_2_high; /*!< key 2 high */ - uint32_t key_2_low; /*!< key 2 low */ - uint32_t key_3_high; /*!< key 3 high */ - uint32_t key_3_low; /*!< key 3 low */ -} cau_key_parameter_struct; - -/* structure for vectors initialization of the cau */ -typedef struct { - uint32_t iv_0_high; /*!< init vector 0 high */ - uint32_t iv_0_low; /*!< init vector 0 low */ - uint32_t iv_1_high; /*!< init vector 1 high */ - uint32_t iv_1_low; /*!< init vector 1 low */ -} cau_iv_parameter_struct; - -/* structure for cau context swapping */ -typedef struct { - uint32_t ctl_config; /*!< current configuration */ - uint32_t iv_0_high; /*!< init vector 0 high */ - uint32_t iv_0_low; /*!< init vector 0 low */ - uint32_t iv_1_high; /*!< init vector 1 high */ - uint32_t iv_1_low; /*!< init vector 1 low */ - uint32_t key_0_high; /*!< key 0 high */ - uint32_t key_0_low; /*!< key 0 low */ - uint32_t key_1_high; /*!< key 1 high */ - uint32_t key_1_low; /*!< key 1 low */ - uint32_t key_2_high; /*!< key 2 high */ - uint32_t key_2_low; /*!< key 2 low */ - uint32_t key_3_high; /*!< key 3 high */ - uint32_t key_3_low; /*!< key 3 low */ - uint32_t gcmccmctxs[8]; /*!< GCM or CCM mode context switch */ - uint32_t gcmctxs[8]; /*!< GCM mode context switch */ -} cau_context_parameter_struct; - -/* structure for encrypt and decrypt parameters */ -typedef struct { - uint32_t alg_dir; /*!< algorithm direction */ - uint8_t *key; /*!< key */ - uint32_t key_size; /*!< key size in bytes */ - uint8_t *iv; /*!< initialization vector */ - uint32_t iv_size; /*!< iv size in bytes */ - uint8_t *input; /*!< input data */ - uint32_t in_length; /*!< input data length in bytes */ - uint8_t *aad; /*!< additional authentication data */ - uint32_t aad_size; /*!< aad size */ -} cau_parameter_struct; - -/* cau_ctl register value */ -#define CAU_ENCRYPT ((uint32_t)0x00000000U) /*!< encrypt */ -#define CAU_DECRYPT CAU_CTL_CAUDIR /*!< decrypt */ - -#define CTL_ALGM(regval) ((BITS(3,5) & ((uint32_t)(regval) << 3U)) | \ - (BIT(19) & ((uint32_t)(regval) << 16U))) /*!< write value to CAU_CTL_ALGM bit field */ -#define CAU_MODE_TDES_ECB CTL_ALGM(0) /*!< TDES-ECB (3DES Electronic codebook) */ -#define CAU_MODE_TDES_CBC CTL_ALGM(1) /*!< TDES-CBC (3DES Cipher block chaining) */ -#define CAU_MODE_DES_ECB CTL_ALGM(2) /*!< DES-ECB (simple DES Electronic codebook) */ -#define CAU_MODE_DES_CBC CTL_ALGM(3) /*!< DES-CBC (simple DES Cipher block chaining) */ -#define CAU_MODE_AES_ECB CTL_ALGM(4) /*!< AES-ECB (AES Electronic codebook) */ -#define CAU_MODE_AES_CBC CTL_ALGM(5) /*!< AES-CBC (AES Cipher block chaining) */ -#define CAU_MODE_AES_CTR CTL_ALGM(6) /*!< AES-CTR (AES counter mode) */ -#define CAU_MODE_AES_KEY CTL_ALGM(7) /*!< AES decryption key preparation mode */ -#define CAU_MODE_AES_GCM CTL_ALGM(8) /*!< AES-GCM (AES Galois/counter mode) */ -#define CAU_MODE_AES_CCM CTL_ALGM(9) /*!< AES-CCM (AES combined cipher machine mode) */ -#define CAU_MODE_AES_CFB CTL_ALGM(10) /*!< AES-CFB (cipher feedback mode) */ -#define CAU_MODE_AES_OFB CTL_ALGM(11) /*!< AES-OFB (output feedback mode) */ - -#define CTL_DATAM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6U)) /*!< write value to CAU_CTL_DATAM bit field */ -#define CAU_SWAPPING_32BIT CTL_DATAM(0) /*!< no swapping */ -#define CAU_SWAPPING_16BIT CTL_DATAM(1) /*!< half-word swapping */ -#define CAU_SWAPPING_8BIT CTL_DATAM(2) /*!< bytes swapping */ -#define CAU_SWAPPING_1BIT CTL_DATAM(3) /*!< bit swapping */ - -#define CTL_KEYM(regval) (BITS(8,9) & ((uint32_t)(regval) << 8U)) /*!< write value to CAU_CTL_KEYM bit field */ -#define CAU_KEYSIZE_128BIT CTL_KEYM(0) /*!< 128 bit key length */ -#define CAU_KEYSIZE_192BIT CTL_KEYM(1) /*!< 192 bit key length */ -#define CAU_KEYSIZE_256BIT CTL_KEYM(2) /*!< 256 bit key length */ - -#define CTL_GCM_CCMPH(regval) (BITS(16,17) & ((uint32_t)(regval) << 16U)) /*!< write value to CAU_CTL_GCM_CCMPH bit field */ -#define CAU_PREPARE_PHASE CTL_GCM_CCMPH(0) /*!< prepare phase */ -#define CAU_AAD_PHASE CTL_GCM_CCMPH(1) /*!< AAD phase */ -#define CAU_ENCRYPT_DECRYPT_PHASE CTL_GCM_CCMPH(2) /*!< encryption/decryption phase */ -#define CAU_TAG_PHASE CTL_GCM_CCMPH(3) /*!< tag phase */ - -#define CAU_PADDING_BYTES(regval) (BITS(20, 23) & ((uint32_t)(regval) << 20U)) - -/* cau_stat0 register value */ -#define CAU_FLAG_INFIFO_EMPTY CAU_STAT0_IEM /*!< IN FIFO empty */ -#define CAU_FLAG_INFIFO_NO_FULL CAU_STAT0_INF /*!< IN FIFO is not full */ -#define CAU_FLAG_OUTFIFO_NO_EMPTY CAU_STAT0_ONE /*!< OUT FIFO not empty */ -#define CAU_FLAG_OUTFIFO_FULL CAU_STAT0_OFU /*!< OUT FIFO is full */ -#define CAU_FLAG_BUSY CAU_STAT0_BUSY /*!< the CAU core is busy */ - -/* cau_dmaen register value */ -#define CAU_DMA_INFIFO CAU_DMAEN_DMAIEN /*!< DMA input enable */ -#define CAU_DMA_OUTFIFO CAU_DMAEN_DMAOEN /*!< DMA output enable */ - -/* cau_inten register value */ -#define CAU_INT_INFIFO CAU_INTEN_IINTEN /*!< IN FIFO Interrupt */ -#define CAU_INT_OUTFIFO CAU_INTEN_OINTEN /*!< OUT FIFO Interrupt */ - -/* cau_stat1 register value */ -#define CAU_FLAG_INFIFO (CAU_STAT1_ISTA | BIT(31)) /*!< IN FIFO flag status */ -#define CAU_FLAG_OUTFIFO (CAU_STAT1_OSTA | BIT(31)) /*!< OUT FIFO flag status */ - -/* cau_intf register value */ -#define CAU_INT_FLAG_INFIFO CAU_INTF_IINTF /*!< IN FIFO interrupt status */ -#define CAU_INT_FLAG_OUTFIFO CAU_INTF_OINTF /*!< OUT FIFO interrupt status */ - -/* function declarations */ -/* initialization functions */ -/* reset the CAU peripheral */ -void cau_deinit(void); -/* initialize the CAU encrypt and decrypt parameter struct with the default values */ -void cau_struct_para_init(cau_parameter_struct *cau_parameter); -/* initialize the key parameter struct with the default values */ -void cau_key_struct_para_init(cau_key_parameter_struct *key_initpara); -/* initialize the vectors parameter struct with the default values */ -void cau_iv_struct_para_init(cau_iv_parameter_struct *iv_initpara); -/* initialize the context parameter struct with the default values */ -void cau_context_struct_para_init(cau_context_parameter_struct *cau_context); - -/* configuration functions */ -/* enable the CAU peripheral */ -void cau_enable(void); -/* disable the CAU peripheral */ -void cau_disable(void); -/* enable the CAU DMA interface */ -void cau_dma_enable(uint32_t dma_req); -/* disable the CAU DMA interface */ -void cau_dma_disable(uint32_t dma_req); -/* initialize the CAU peripheral */ -void cau_init(uint32_t alg_dir, uint32_t algo_mode, uint32_t swapping); -/* configure key size if use AES algorithm */ -void cau_aes_keysize_config(uint32_t key_size); -/* initialize the key parameters */ -void cau_key_init(cau_key_parameter_struct *key_initpara); -/* initialize the vectors parameters */ -void cau_iv_init(cau_iv_parameter_struct *iv_initpara); -/* configure phase */ -void cau_phase_config(uint32_t phase); -/* flush the IN and OUT FIFOs */ -void cau_fifo_flush(void); -/* return whether CAU peripheral is enabled or disabled */ -ControlStatus cau_enable_state_get(void); - -/* read and write functions */ -/* write data to the IN FIFO */ -void cau_data_write(uint32_t data); -/* return the last data entered into the output FIFO */ -uint32_t cau_data_read(void); - -/* context switch functions */ -/* save context before context switching */ -void cau_context_save(cau_context_parameter_struct *cau_context, cau_key_parameter_struct *key_initpara); -/* restore context after context switching */ -void cau_context_restore(cau_context_parameter_struct *cau_context); - -/* encrypt and decrypt functions */ -/* encrypt and decrypt using AES in ECB mode */ -ErrStatus cau_aes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using AES in CBC mode */ -ErrStatus cau_aes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using AES in CTR mode */ -ErrStatus cau_aes_ctr(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using AES in CFB mode */ -ErrStatus cau_aes_cfb(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using AES in OFB mode */ -ErrStatus cau_aes_ofb(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using AES in GCM mode */ -ErrStatus cau_aes_gcm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t *tag); -/* encrypt and decrypt using AES in CCM mode */ -ErrStatus cau_aes_ccm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t tag[], uint32_t tag_size, uint8_t aad_buf[]); -/* encrypt and decrypt using TDES in ECB mode */ -ErrStatus cau_tdes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using TDES in CBC mode */ -ErrStatus cau_tdes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using DES in ECB mode */ -ErrStatus cau_des_ecb(cau_parameter_struct *cau_parameter, uint8_t *output); -/* encrypt and decrypt using DES in CBC mode */ -ErrStatus cau_des_cbc(cau_parameter_struct *cau_parameter, uint8_t *output); - -/* interrupt & flag functions */ -/* get the CAU flag status */ -FlagStatus cau_flag_get(uint32_t flag); -/* enable the CAU interrupts */ -void cau_interrupt_enable(uint32_t interrupt); -/* disable the CAU interrupts */ -void cau_interrupt_disable(uint32_t interrupt); -/* get the interrupt flag */ -FlagStatus cau_interrupt_flag_get(uint32_t interrupt); - -#endif /* GD32F5XX_CAU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h deleted file mode 100644 index 45a42cc350f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_crc.h +++ /dev/null @@ -1,78 +0,0 @@ -/*! - \file gd32f5xx_crc.h - \brief definitions for the CRC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_CRC_H -#define GD32F5XX_CRC_H - -#include "gd32f5xx.h" - -/* CRC definitions */ -#define CRC CRC_BASE /*!< CRC base address */ - -/* registers definitions */ -#define CRC_DATA REG32(CRC + 0x00000000U) /*!< CRC data register */ -#define CRC_FDATA REG32(CRC + 0x00000004U) /*!< CRC free data register */ -#define CRC_CTL REG32(CRC + 0x00000008U) /*!< CRC control register */ - -/* bits definitions */ -/* CRC_DATA */ -#define CRC_DATA_DATA BITS(0,31) /*!< CRC calculation result bits */ - -/* CRC_FDATA */ -#define CRC_FDATA_FDATA BITS(0,7) /*!< CRC free data bits */ - -/* CRC_CTL */ -#define CRC_CTL_RST BIT(0) /*!< CRC reset CRC_DATA register bit */ - - -/* function declarations */ -/* deinit CRC calculation unit */ -void crc_deinit(void); - -/* reset data register(CRC_DATA) to the value of 0xFFFFFFFF */ -void crc_data_register_reset(void); -/* read the value of the data register */ -uint32_t crc_data_register_read(void); - -/* read the value of the free data register */ -uint8_t crc_free_data_register_read(void); -/* write data to the free data register */ -void crc_free_data_register_write(uint8_t free_data); - -/* calculate the CRC value of a 32-bit data */ -uint32_t crc_single_data_calculate(uint32_t sdata); -/* calculate the CRC value of an array of 32-bit values */ -uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size); - -#endif /* GD32F5XX_CRC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h deleted file mode 100644 index b708c960eb1..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ctc.h +++ /dev/null @@ -1,182 +0,0 @@ -/*! - \file gd32f5xx_ctc.h - \brief definitions for the CTC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_CTC_H -#define GD32F5XX_CTC_H - -#include "gd32f5xx.h" - -/* CTC definitions */ -#define CTC CTC_BASE - -/* registers definitions */ -#define CTC_CTL0 REG32((CTC) + 0x00U) /*!< CTC control register 0 */ -#define CTC_CTL1 REG32((CTC) + 0x04U) /*!< CTC control register 1 */ -#define CTC_STAT REG32((CTC) + 0x08U) /*!< CTC status register */ -#define CTC_INTC REG32((CTC) + 0x0CU) /*!< CTC interrupt clear register */ - -/* bits definitions */ -/* CTC_CTL0 */ -#define CTC_CTL0_CKOKIE BIT(0) /*!< clock trim OK(CKOKIF) interrupt enable */ -#define CTC_CTL0_CKWARNIE BIT(1) /*!< clock trim warning(CKWARNIF) interrupt enable */ -#define CTC_CTL0_ERRIE BIT(2) /*!< error(ERRIF) interrupt enable */ -#define CTC_CTL0_EREFIE BIT(3) /*!< EREFIF interrupt enable */ -#define CTC_CTL0_CNTEN BIT(5) /*!< CTC counter enable */ -#define CTC_CTL0_AUTOTRIM BIT(6) /*!< hardware automatically trim mode */ -#define CTC_CTL0_SWREFPUL BIT(7) /*!< software reference source sync pulse */ -#define CTC_CTL0_TRIMVALUE BITS(8,13) /*!< IRC48M trim value */ - -/* CTC_CTL1 */ -#define CTC_CTL1_RLVALUE BITS(0,15) /*!< CTC counter reload value */ -#define CTC_CTL1_CKLIM BITS(16,23) /*!< clock trim base limit value */ -#define CTC_CTL1_REFPSC BITS(24,26) /*!< reference signal source prescaler */ -#define CTC_CTL1_REFSEL BITS(28,29) /*!< reference signal source selection */ -#define CTC_CTL1_REFPOL BIT(31) /*!< reference signal source polarity */ - -/* CTC_STAT */ -#define CTC_STAT_CKOKIF BIT(0) /*!< clock trim OK interrupt flag */ -#define CTC_STAT_CKWARNIF BIT(1) /*!< clock trim warning interrupt flag */ -#define CTC_STAT_ERRIF BIT(2) /*!< error interrupt flag */ -#define CTC_STAT_EREFIF BIT(3) /*!< expect reference interrupt flag */ -#define CTC_STAT_CKERR BIT(8) /*!< clock trim error bit */ -#define CTC_STAT_REFMISS BIT(9) /*!< reference sync pulse miss */ -#define CTC_STAT_TRIMERR BIT(10) /*!< trim value error bit */ -#define CTC_STAT_REFDIR BIT(15) /*!< CTC trim counter direction when reference sync pulse occurred */ -#define CTC_STAT_REFCAP BITS(16,31) /*!< CTC counter capture when reference sync pulse occurred */ - -/* CTC_INTC */ -#define CTC_INTC_CKOKIC BIT(0) /*!< CKOKIF interrupt clear bit */ -#define CTC_INTC_CKWARNIC BIT(1) /*!< CKWARNIF interrupt clear bit */ -#define CTC_INTC_ERRIC BIT(2) /*!< ERRIF interrupt clear bit */ -#define CTC_INTC_EREFIC BIT(3) /*!< EREFIF interrupt clear bit */ - -/* constants definitions */ -/* hardware automatically trim mode definitions */ -#define CTC_HARDWARE_TRIM_MODE_ENABLE CTC_CTL0_AUTOTRIM /*!< hardware automatically trim mode enable*/ -#define CTC_HARDWARE_TRIM_MODE_DISABLE ((uint32_t)0x00000000U) /*!< hardware automatically trim mode disable*/ - -/* reference signal source polarity definitions */ -#define CTC_REFSOURCE_POLARITY_FALLING CTC_CTL1_REFPOL /*!< reference signal source polarity is falling edge*/ -#define CTC_REFSOURCE_POLARITY_RISING ((uint32_t)0x00000000U) /*!< reference signal source polarity is rising edge*/ - -/* reference signal source selection definitions */ -#define CTL1_REFSEL(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) -#define CTC_REFSOURCE_GPIO CTL1_REFSEL(0) /*!< GPIO is selected */ -#define CTC_REFSOURCE_LXTAL CTL1_REFSEL(1) /*!< LXTAL is clock selected */ - -/* reference signal source prescaler definitions */ -#define CTL1_REFPSC(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) -#define CTC_REFSOURCE_PSC_OFF CTL1_REFPSC(0) /*!< reference signal not divided */ -#define CTC_REFSOURCE_PSC_DIV2 CTL1_REFPSC(1) /*!< reference signal divided by 2 */ -#define CTC_REFSOURCE_PSC_DIV4 CTL1_REFPSC(2) /*!< reference signal divided by 4 */ -#define CTC_REFSOURCE_PSC_DIV8 CTL1_REFPSC(3) /*!< reference signal divided by 8 */ -#define CTC_REFSOURCE_PSC_DIV16 CTL1_REFPSC(4) /*!< reference signal divided by 16 */ -#define CTC_REFSOURCE_PSC_DIV32 CTL1_REFPSC(5) /*!< reference signal divided by 32 */ -#define CTC_REFSOURCE_PSC_DIV64 CTL1_REFPSC(6) /*!< reference signal divided by 64 */ -#define CTC_REFSOURCE_PSC_DIV128 CTL1_REFPSC(7) /*!< reference signal divided by 128 */ - -/* CTC interrupt enable definitions */ -#define CTC_INT_CKOK CTC_CTL0_CKOKIE /*!< clock trim OK interrupt enable */ -#define CTC_INT_CKWARN CTC_CTL0_CKWARNIE /*!< clock trim warning interrupt enable */ -#define CTC_INT_ERR CTC_CTL0_ERRIE /*!< error interrupt enable */ -#define CTC_INT_EREF CTC_CTL0_EREFIE /*!< expect reference interrupt enable */ - -/* CTC interrupt source definitions */ -#define CTC_INT_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK interrupt flag */ -#define CTC_INT_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning interrupt flag */ -#define CTC_INT_FLAG_ERR CTC_STAT_ERRIF /*!< error interrupt flag */ -#define CTC_INT_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference interrupt flag */ -#define CTC_INT_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ -#define CTC_INT_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ -#define CTC_INT_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error */ - -/* CTC flag definitions */ -#define CTC_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK flag */ -#define CTC_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning flag */ -#define CTC_FLAG_ERR CTC_STAT_ERRIF /*!< error flag */ -#define CTC_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference flag */ -#define CTC_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ -#define CTC_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ -#define CTC_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error bit */ - -/* function declarations */ -/* reset ctc clock trim controller */ -void ctc_deinit(void); -/* enable CTC trim counter */ -void ctc_counter_enable(void); -/* disable CTC trim counter */ -void ctc_counter_disable(void); - -/* configure the IRC48M trim value */ -void ctc_irc48m_trim_value_config(uint8_t trim_value); -/* generate software reference source sync pulse */ -void ctc_software_refsource_pulse_generate(void); -/* configure hardware automatically trim mode */ -void ctc_hardware_trim_mode_config(uint32_t hardmode); - -/* configure reference signal source polarity */ -void ctc_refsource_polarity_config(uint32_t polarity); -/* select reference signal source */ -void ctc_refsource_signal_select(uint32_t refs); -/* configure reference signal source prescaler */ -void ctc_refsource_prescaler_config(uint32_t prescaler); -/* configure clock trim base limit value */ -void ctc_clock_limit_value_config(uint8_t limit_value); -/* configure CTC counter reload value */ -void ctc_counter_reload_value_config(uint16_t reload_value); - -/* read CTC counter capture value when reference sync pulse occurred */ -uint16_t ctc_counter_capture_value_read(void); -/* read CTC trim counter direction when reference sync pulse occurred */ -FlagStatus ctc_counter_direction_read(void); -/* read CTC counter reload value */ -uint16_t ctc_counter_reload_value_read(void); -/* read the IRC48M trim value */ -uint8_t ctc_irc48m_trim_value_read(void); - -/* interrupt & flag functions */ -/* enable the CTC interrupt */ -void ctc_interrupt_enable(uint32_t interrupt); -/* disable the CTC interrupt */ -void ctc_interrupt_disable(uint32_t interrupt); -/* get CTC interrupt flag */ -FlagStatus ctc_interrupt_flag_get(uint32_t int_flag); -/* clear CTC interrupt flag */ -void ctc_interrupt_flag_clear(uint32_t int_flag); -/* get CTC flag */ -FlagStatus ctc_flag_get(uint32_t flag); -/* clear CTC flag */ -void ctc_flag_clear(uint32_t flag); - -#endif /* GD32F5XX_CTC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h deleted file mode 100644 index 705e265dd93..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dac.h +++ /dev/null @@ -1,277 +0,0 @@ -/*! - \file gd32f5xx_dac.h - \brief definitions for the DAC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_DAC_H -#define GD32F5XX_DAC_H - -#include "gd32f5xx.h" - -/* DACx(x=0) definitions */ -#define DAC0 (DAC_BASE) - -/* registers definitions */ -#define DAC_CTL0(dacx) REG32((dacx) + 0x00000000U) /*!< DACx control register 0 */ -#define DAC_SWT(dacx) REG32((dacx) + 0x00000004U) /*!< DACx software trigger register */ -#define DAC_OUT0_R12DH(dacx) REG32((dacx) + 0x00000008U) /*!< DACx_OUT0 12-bit right-aligned data holding register */ -#define DAC_OUT0_L12DH(dacx) REG32((dacx) + 0x0000000CU) /*!< DACx_OUT0 12-bit left-aligned data holding register */ -#define DAC_OUT0_R8DH(dacx) REG32((dacx) + 0x00000010U) /*!< DACx_OUT0 8-bit right-aligned data holding register */ -#define DAC_OUT1_R12DH(dacx) REG32((dacx) + 0x00000014U) /*!< DACx_OUT1 12-bit right-aligned data holding register */ -#define DAC_OUT1_L12DH(dacx) REG32((dacx) + 0x00000018U) /*!< DACx_OUT1 12-bit left-aligned data holding register */ -#define DAC_OUT1_R8DH(dacx) REG32((dacx) + 0x0000001CU) /*!< DACx_OUT1 8-bit right-aligned data holding register */ -#define DACC_R12DH(dacx) REG32((dacx) + 0x00000020U) /*!< DACx concurrent mode 12-bit right-aligned data holding register */ -#define DACC_L12DH(dacx) REG32((dacx) + 0x00000024U) /*!< DACx concurrent mode 12-bit left-aligned data holding register */ -#define DACC_R8DH(dacx) REG32((dacx) + 0x00000028U) /*!< DACx concurrent mode 8-bit right-aligned data holding register */ -#define DAC_OUT0_DO(dacx) REG32((dacx) + 0x0000002CU) /*!< DACx_OUT0 data output register */ -#define DAC_OUT1_DO(dacx) REG32((dacx) + 0x00000030U) /*!< DACx_OUT1 data output register */ -#define DAC_STAT0(dacx) REG32((dacx) + 0x00000034U) /*!< DACx status register 0 */ - -/* bits definitions */ -/* DAC_CTL0 */ -#define DAC_CTL0_DEN0 BIT(0) /*!< DACx_OUT0 enable */ -#define DAC_CTL0_DBOFF0 BIT(1) /*!< DACx_OUT0 output buffer turn off */ -#define DAC_CTL0_DTEN0 BIT(2) /*!< DACx_OUT0 trigger enable */ -#define DAC_CTL0_DTSEL0 BITS(3,5) /*!< DACx_OUT0 trigger selection */ -#define DAC_CTL0_DWM0 BITS(6,7) /*!< DACx_OUT0 noise wave mode */ -#define DAC_CTL0_DWBW0 BITS(8,11) /*!< DACx_OUT0 noise wave bit width */ -#define DAC_CTL0_DDMAEN0 BIT(12) /*!< DACx_OUT0 DMA enable */ -#define DAC_CTL0_DDUDRIE0 BIT(13) /*!< DACx_OUT0 DMA underrun interrupt enable */ - -#define DAC_CTL0_DEN1 BIT(16) /*!< DACx_OUT1 enable */ -#define DAC_CTL0_DBOFF1 BIT(17) /*!< DACx_OUT1 output buffer turn off */ -#define DAC_CTL0_DTEN1 BIT(18) /*!< DACx_OUT1 trigger enable */ -#define DAC_CTL0_DTSEL1 BITS(19,21) /*!< DACx_OUT1 trigger selection */ -#define DAC_CTL0_DWM1 BITS(22,23) /*!< DACx_OUT1 noise wave mode */ -#define DAC_CTL0_DWBW1 BITS(24,27) /*!< DACx_OUT1 noise wave bit width */ -#define DAC_CTL0_DDMAEN1 BIT(28) /*!< DACx_OUT1 DMA enable */ -#define DAC_CTL0_DDUDRIE1 BIT(29) /*!< DACx_OUT1 DMA underrun interrupt enable */ - -/* DAC_SWT */ -#define DAC_SWT_SWTR0 BIT(0) /*!< DACx_OUT0 software trigger */ -#define DAC_SWT_SWTR1 BIT(1) /*!< DACx_OUT1 software trigger */ - -/* DAC0_OUT0_R12DH */ -#define DAC_OUT0_DH_R12 BITS(0,11) /*!< DACx_OUT0 12-bit right-aligned data */ - -/* DAC0_OUT0_L12DH */ -#define DAC_OUT0_DH_L12 BITS(4,15) /*!< DACx_OUT0 12-bit left-aligned data */ - -/* DAC0_OUT0_R8DH */ -#define DAC_OUT0_DH_R8 BITS(0,7) /*!< DACx_OUT0 8-bit right-aligned data */ - -/* DAC1_OUT1_R12DH */ -#define DAC_OUT1_DH_R12 BITS(0,11) /*!< DACx_OUT1 12-bit right-aligned data */ - -/* DAC1_OUT1_L12DH */ -#define DAC_OUT1_DH_L12 BITS(4,15) /*!< DACx_OUT1 12-bit left-aligned data */ - -/* DAC1_OUT1_R8DH */ -#define DAC_OUT1_DH_R8 BITS(0,7) /*!< DACx_OUT1 8-bit right-aligned data */ - -/* DACC_R12DH */ -#define DACC_OUT0_DH_R12 BITS(0,11) /*!< DAC concurrent mode DACx_OUT0 12-bit right-aligned data */ -#define DACC_OUT1_DH_R12 BITS(16,27) /*!< DAC concurrent mode DACx_OUT1 12-bit right-aligned data */ - -/* DACC_L12DH */ -#define DACC_OUT0_DH_L12 BITS(4,15) /*!< DAC concurrent mode DACx_OUT0 12-bit left-aligned data */ -#define DACC_OUT1_DH_L12 BITS(20,31) /*!< DAC concurrent mode DACx_OUT1 12-bit left-aligned data */ - -/* DACC_R8DH */ -#define DACC_OUT0_DH_R8 BITS(0,7) /*!< DAC concurrent mode DACx_OUT0 8-bit right-aligned data */ -#define DACC_OUT1_DH_R8 BITS(8,15) /*!< DAC concurrent mode DACx_OUT1 8-bit right-aligned data */ - -/* DAC0_OUT0_DO */ -#define DAC_OUT0_DO_BITS BITS(0,11) /*!< DACx_OUT0 12-bit output data */ - -/* DAC1_OUT1_DO */ -#define DAC_OUT1_DO_BITS BITS(0,11) /*!< DACx_OUT1 12-bit output data */ - -/* DAC_STAT0 */ -#define DAC_STAT0_DDUDR0 BIT(13) /*!< DACx_OUT0 DMA underrun flag */ -#define DAC_STAT0_DDUDR1 BIT(29) /*!< DACx_OUT1 DMA underrun flag */ - -/* constants definitions */ -/* DAC trigger source */ -#define CTL0_DTSEL(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) -#define DAC_TRIGGER_T5_TRGO CTL0_DTSEL(0) /*!< TIMER5 TRGO */ -#define DAC_TRIGGER_T7_TRGO CTL0_DTSEL(1) /*!< TIMER7 TRGO */ -#define DAC_TRIGGER_T6_TRGO CTL0_DTSEL(2) /*!< TIMER6 TRGO */ -#define DAC_TRIGGER_T4_TRGO CTL0_DTSEL(3) /*!< TIMER4 TRGO */ -#define DAC_TRIGGER_T1_TRGO CTL0_DTSEL(4) /*!< TIMER1 TRGO */ -#define DAC_TRIGGER_T3_TRGO CTL0_DTSEL(5) /*!< TIMER3 TRGO */ -#define DAC_TRIGGER_EXTI_9 CTL0_DTSEL(6) /*!< EXTI interrupt line9 event */ -#define DAC_TRIGGER_SOFTWARE CTL0_DTSEL(7) /*!< software trigger */ - -/* DAC noise wave mode */ -#define CTL0_DWM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) -#define DAC_WAVE_DISABLE CTL0_DWM(0) /*!< wave disabled */ -#define DAC_WAVE_MODE_LFSR CTL0_DWM(1) /*!< LFSR noise mode */ -#define DAC_WAVE_MODE_TRIANGLE CTL0_DWM(2) /*!< triangle noise mode */ - -/* DAC noise wave bit width */ -#define DWBW(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) -#define DAC_WAVE_BIT_WIDTH_1 DWBW(0) /*!< bit width of the wave signal is 1 */ -#define DAC_WAVE_BIT_WIDTH_2 DWBW(1) /*!< bit width of the wave signal is 2 */ -#define DAC_WAVE_BIT_WIDTH_3 DWBW(2) /*!< bit width of the wave signal is 3 */ -#define DAC_WAVE_BIT_WIDTH_4 DWBW(3) /*!< bit width of the wave signal is 4 */ -#define DAC_WAVE_BIT_WIDTH_5 DWBW(4) /*!< bit width of the wave signal is 5 */ -#define DAC_WAVE_BIT_WIDTH_6 DWBW(5) /*!< bit width of the wave signal is 6 */ -#define DAC_WAVE_BIT_WIDTH_7 DWBW(6) /*!< bit width of the wave signal is 7 */ -#define DAC_WAVE_BIT_WIDTH_8 DWBW(7) /*!< bit width of the wave signal is 8 */ -#define DAC_WAVE_BIT_WIDTH_9 DWBW(8) /*!< bit width of the wave signal is 9 */ -#define DAC_WAVE_BIT_WIDTH_10 DWBW(9) /*!< bit width of the wave signal is 10 */ -#define DAC_WAVE_BIT_WIDTH_11 DWBW(10) /*!< bit width of the wave signal is 11 */ -#define DAC_WAVE_BIT_WIDTH_12 DWBW(11) /*!< bit width of the wave signal is 12 */ - -/* unmask LFSR bits in DAC LFSR noise mode */ -#define DAC_LFSR_BIT0 DAC_WAVE_BIT_WIDTH_1 /*!< unmask the LFSR bit0 */ -#define DAC_LFSR_BITS1_0 DAC_WAVE_BIT_WIDTH_2 /*!< unmask the LFSR bits[1:0] */ -#define DAC_LFSR_BITS2_0 DAC_WAVE_BIT_WIDTH_3 /*!< unmask the LFSR bits[2:0] */ -#define DAC_LFSR_BITS3_0 DAC_WAVE_BIT_WIDTH_4 /*!< unmask the LFSR bits[3:0] */ -#define DAC_LFSR_BITS4_0 DAC_WAVE_BIT_WIDTH_5 /*!< unmask the LFSR bits[4:0] */ -#define DAC_LFSR_BITS5_0 DAC_WAVE_BIT_WIDTH_6 /*!< unmask the LFSR bits[5:0] */ -#define DAC_LFSR_BITS6_0 DAC_WAVE_BIT_WIDTH_7 /*!< unmask the LFSR bits[6:0] */ -#define DAC_LFSR_BITS7_0 DAC_WAVE_BIT_WIDTH_8 /*!< unmask the LFSR bits[7:0] */ -#define DAC_LFSR_BITS8_0 DAC_WAVE_BIT_WIDTH_9 /*!< unmask the LFSR bits[8:0] */ -#define DAC_LFSR_BITS9_0 DAC_WAVE_BIT_WIDTH_10 /*!< unmask the LFSR bits[9:0] */ -#define DAC_LFSR_BITS10_0 DAC_WAVE_BIT_WIDTH_11 /*!< unmask the LFSR bits[10:0] */ -#define DAC_LFSR_BITS11_0 DAC_WAVE_BIT_WIDTH_12 /*!< unmask the LFSR bits[11:0] */ - -/* triangle amplitude in DAC triangle noise mode */ -#define DAC_TRIANGLE_AMPLITUDE_1 DAC_WAVE_BIT_WIDTH_1 /*!< triangle amplitude is 1 */ -#define DAC_TRIANGLE_AMPLITUDE_3 DAC_WAVE_BIT_WIDTH_2 /*!< triangle amplitude is 3 */ -#define DAC_TRIANGLE_AMPLITUDE_7 DAC_WAVE_BIT_WIDTH_3 /*!< triangle amplitude is 7 */ -#define DAC_TRIANGLE_AMPLITUDE_15 DAC_WAVE_BIT_WIDTH_4 /*!< triangle amplitude is 15 */ -#define DAC_TRIANGLE_AMPLITUDE_31 DAC_WAVE_BIT_WIDTH_5 /*!< triangle amplitude is 31 */ -#define DAC_TRIANGLE_AMPLITUDE_63 DAC_WAVE_BIT_WIDTH_6 /*!< triangle amplitude is 63 */ -#define DAC_TRIANGLE_AMPLITUDE_127 DAC_WAVE_BIT_WIDTH_7 /*!< triangle amplitude is 127 */ -#define DAC_TRIANGLE_AMPLITUDE_255 DAC_WAVE_BIT_WIDTH_8 /*!< triangle amplitude is 255 */ -#define DAC_TRIANGLE_AMPLITUDE_511 DAC_WAVE_BIT_WIDTH_9 /*!< triangle amplitude is 511 */ -#define DAC_TRIANGLE_AMPLITUDE_1023 DAC_WAVE_BIT_WIDTH_10 /*!< triangle amplitude is 1023 */ -#define DAC_TRIANGLE_AMPLITUDE_2047 DAC_WAVE_BIT_WIDTH_11 /*!< triangle amplitude is 2047 */ -#define DAC_TRIANGLE_AMPLITUDE_4095 DAC_WAVE_BIT_WIDTH_12 /*!< triangle amplitude is 4095 */ - -/* DAC data alignment */ -#define DATA_ALIGN(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define DAC_ALIGN_12B_R DATA_ALIGN(0) /*!< 12-bit right-aligned data */ -#define DAC_ALIGN_12B_L DATA_ALIGN(1) /*!< 12-bit left-aligned data */ -#define DAC_ALIGN_8B_R DATA_ALIGN(2) /*!< 8-bit right-aligned data */ - -/* DAC output channel definitions */ -#define DAC_OUT0 ((uint8_t)0x00U) /*!< DACx_OUT0 channel */ -#define DAC_OUT1 ((uint8_t)0x01U) /*!< DACx_OUT1 channel */ - -/* DAC interrupt */ -#define DAC_INT_DDUDR0 DAC_CTL0_DDUDRIE0 /*!< DACx_OUT0 DMA underrun interrupt */ -#define DAC_INT_DDUDR1 DAC_CTL0_DDUDRIE1 /*!< DACx_OUT1 DMA underrun interrupt */ - -/* DAC interrupt flag */ -#define DAC_INT_FLAG_DDUDR0 DAC_STAT0_DDUDR0 /*!< DACx_OUT0 DMA underrun interrupt flag */ -#define DAC_INT_FLAG_DDUDR1 DAC_STAT0_DDUDR1 /*!< DACx_OUT1 DMA underrun interrupt flag */ - -/* DAC flags */ -#define DAC_FLAG_DDUDR0 DAC_STAT0_DDUDR0 /*!< DACx_OUT0 DMA underrun flag */ -#define DAC_FLAG_DDUDR1 DAC_STAT0_DDUDR1 /*!< DACx_OUT1 DMA underrun flag */ - -/* function declarations */ -/* DAC initialization functions */ -/* deinitialize DAC */ -void dac_deinit(uint32_t dac_periph); -/* enable DAC */ -void dac_enable(uint32_t dac_periph, uint8_t dac_out); -/* disable DAC */ -void dac_disable(uint32_t dac_periph, uint8_t dac_out); -/* enable DAC DMA function */ -void dac_dma_enable(uint32_t dac_periph, uint8_t dac_out); -/* disable DAC DMA function */ -void dac_dma_disable(uint32_t dac_periph, uint8_t dac_out); - -/* DAC buffer functions */ -/* enable DAC output buffer */ -void dac_output_buffer_enable(uint32_t dac_periph, uint8_t dac_out); -/* disable DAC output buffer */ -void dac_output_buffer_disable(uint32_t dac_periph, uint8_t dac_out); - -/* read and write operation functions */ -/* get DAC output value */ -uint16_t dac_output_value_get(uint32_t dac_periph, uint8_t dac_out); -/* set DAC data holding register value */ -void dac_data_set(uint32_t dac_periph, uint8_t dac_out, uint32_t dac_align, uint16_t data); - -/* DAC trigger configuration */ -/* enable DAC trigger */ -void dac_trigger_enable(uint32_t dac_periph, uint8_t dac_out); -/* disable DAC trigger */ -void dac_trigger_disable(uint32_t dac_periph, uint8_t dac_out); -/* configure DAC trigger source */ -void dac_trigger_source_config(uint32_t dac_periph, uint8_t dac_out, uint32_t triggersource); -/* enable DAC software trigger */ -void dac_software_trigger_enable(uint32_t dac_periph, uint8_t dac_out); - -/* DAC wave mode configuration */ -/* configure DAC wave mode */ -void dac_wave_mode_config(uint32_t dac_periph, uint8_t dac_out, uint32_t wave_mode); -/* configure DAC LFSR noise mode */ -void dac_lfsr_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t unmask_bits); -/* configure DAC triangle noise mode */ -void dac_triangle_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t amplitude); - -/* DAC concurrent mode configuration */ -/* enable DAC concurrent mode */ -void dac_concurrent_enable(uint32_t dac_periph); -/* disable DAC concurrent mode */ -void dac_concurrent_disable(uint32_t dac_periph); -/* enable DAC concurrent software trigger */ -void dac_concurrent_software_trigger_enable(uint32_t dac_periph); -/* enable DAC concurrent buffer function */ -void dac_concurrent_output_buffer_enable(uint32_t dac_periph); -/* disable DAC concurrent buffer function */ -void dac_concurrent_output_buffer_disable(uint32_t dac_periph); -/* set DAC concurrent mode data holding register value */ -void dac_concurrent_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data0, uint16_t data1); - -/* DAC interrupt and flag functions */ -/* get DAC flag */ -FlagStatus dac_flag_get(uint32_t dac_periph, uint32_t flag); -/* clear DAC flag */ -void dac_flag_clear(uint32_t dac_periph, uint32_t flag); -/* enable DAC interrupt */ -void dac_interrupt_enable(uint32_t dac_periph, uint32_t interrupt); -/* disable DAC interrupt */ -void dac_interrupt_disable(uint32_t dac_periph, uint32_t interrupt); -/* get DAC interrupt flag */ -FlagStatus dac_interrupt_flag_get(uint32_t dac_periph, uint32_t int_flag); -/* clear DAC interrupt flag */ -void dac_interrupt_flag_clear(uint32_t dac_periph, uint32_t int_flag); - -#endif /* GD32F5XX_DAC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h deleted file mode 100644 index a1b1319dec3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dbg.h +++ /dev/null @@ -1,165 +0,0 @@ -/*! - \file gd32f5xx_dbg.h - \brief definitions for the DBG - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_DBG_H -#define GD32F5XX_DBG_H - -#include "gd32f5xx.h" - -/* DBG definitions */ -#define DBG DBG_BASE - -/* registers definitions */ -#define DBG_ID REG32(DBG + 0x00U) /*!< DBG_ID code register */ -#define DBG_CTL0 REG32(DBG + 0x04U) /*!< DBG control register 0 */ -#define DBG_CTL1 REG32(DBG + 0x08U) /*!< DBG control register 1 */ -#define DBG_CTL2 REG32(DBG + 0x0CU) /*!< DBG control register 2 */ -#define DBG_CTL3 REG32(DBG + 0x10U) /*!< DBG control register 3 */ - -/* bits definitions */ -/* DBG_ID */ -#define DBG_ID_ID_CODE BITS(0,31) /*!< DBG ID code values */ - -/* DBG_CTL0 */ -#define DBG_CTL0_SLP_HOLD BIT(0) /*!< keep debugger connection during sleep mode */ -#define DBG_CTL0_DSLP_HOLD BIT(1) /*!< keep debugger connection during deepsleep mode */ -#define DBG_CTL0_STB_HOLD BIT(2) /*!< keep debugger connection during standby mode */ -#define DBG_CTL0_TRACE_IOEN BIT(5) /*!< enable trace pin assignment */ - -/* DBG_CTL1 */ -#define DBG_CTL1_TIMER1_HOLD BIT(0) /*!< hold TIMER1 counter when core is halted */ -#define DBG_CTL1_TIMER2_HOLD BIT(1) /*!< hold TIMER2 counter when core is halted */ -#define DBG_CTL1_TIMER3_HOLD BIT(2) /*!< hold TIMER3 counter when core is halted */ -#define DBG_CTL1_TIMER4_HOLD BIT(3) /*!< hold TIMER4 counter when core is halted */ -#define DBG_CTL1_TIMER5_HOLD BIT(4) /*!< hold TIMER5 counter when core is halted */ -#define DBG_CTL1_TIMER6_HOLD BIT(5) /*!< hold TIMER6 counter when core is halted */ -#define DBG_CTL1_TIMER11_HOLD BIT(6) /*!< hold TIMER11 counter when core is halted */ -#define DBG_CTL1_TIMER12_HOLD BIT(7) /*!< hold TIMER12 counter when core is halted */ -#define DBG_CTL1_TIMER13_HOLD BIT(8) /*!< hold TIMER13 counter when core is halted */ -#define DBG_CTL1_RTC_HOLD BIT(10) /*!< hold RTC calendar and wakeup counter when core is halted */ -#define DBG_CTL1_WWDGT_HOLD BIT(11) /*!< debug WWDGT kept when core is halted */ -#define DBG_CTL1_FWDGT_HOLD BIT(12) /*!< debug FWDGT kept when core is halted */ -#define DBG_CTL1_I2C3_HOLD BIT(18) /*!< hold I2C3 smbus when core is halted */ -#define DBG_CTL1_I2C4_HOLD BIT(19) /*!< hold I2C4 smbus when core is halted */ -#define DBG_CTL1_I2C5_HOLD BIT(20) /*!< hold I2C5 smbus when core is halted */ -#define DBG_CTL1_I2C0_HOLD BIT(21) /*!< hold I2C0 smbus when core is halted */ -#define DBG_CTL1_I2C1_HOLD BIT(22) /*!< hold I2C1 smbus when core is halted */ -#define DBG_CTL1_I2C2_HOLD BIT(23) /*!< hold I2C2 smbus when core is halted */ -#define DBG_CTL1_CAN0_HOLD BIT(25) /*!< debug CAN0 kept when core is halted */ -#define DBG_CTL1_CAN1_HOLD BIT(26) /*!< debug CAN1 kept when core is halted */ - -/* DBG_CTL2 */ -#define DBG_CTL2_TIMER0_HOLD BIT(0) /*!< hold TIMER0 counter when core is halted */ -#define DBG_CTL2_TIMER7_HOLD BIT(1) /*!< hold TIMER7 counter when core is halted */ -#define DBG_CTL2_TIMER8_HOLD BIT(16) /*!< hold TIMER8 counter when core is halted */ -#define DBG_CTL2_TIMER9_HOLD BIT(17) /*!< hold TIMER9 counter when core is halted */ -#define DBG_CTL2_TIMER10_HOLD BIT(18) /*!< hold TIMER10 counter when core is halted */ - -/* DBG_CTL3 */ -#define DBG_CTL3_DEVICEID BITS(0,3) /*!< device ID */ - -/* constants definitions */ -#define DBG_LOW_POWER_SLEEP DBG_CTL0_SLP_HOLD /*!< keep debugger connection during sleep mode */ -#define DBG_LOW_POWER_DEEPSLEEP DBG_CTL0_DSLP_HOLD /*!< keep debugger connection during deepsleep mode */ -#define DBG_LOW_POWER_STANDBY DBG_CTL0_STB_HOLD /*!< keep debugger connection during standby mode */ - -/* define the peripheral debug hold bit position and its register index offset */ -#define DBG_REGIDX_BIT(regidx, bitpos) (((regidx) << 6) | (bitpos)) -#define DBG_REG_VAL(periph) (REG32(DBG + ((uint32_t)(periph) >> 6))) -#define DBG_BIT_POS(val) ((uint32_t)(val) & 0x1FU) - -/* register index */ -enum dbg_reg_idx -{ - DBG_IDX_CTL0 = 0x04U, - DBG_IDX_CTL1 = 0x08U, - DBG_IDX_CTL2 = 0x0CU -}; - -typedef enum -{ - DBG_TIMER1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 0U), /*!< hold TIMER1 counter when core is halted */ - DBG_TIMER2_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 1U), /*!< hold TIMER2 counter when core is halted */ - DBG_TIMER3_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 2U), /*!< hold TIMER3 counter when core is halted */ - DBG_TIMER4_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 3U), /*!< hold TIMER4 counter when core is halted */ - DBG_TIMER5_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 4U), /*!< hold TIMER5 counter when core is halted */ - DBG_TIMER6_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 5U), /*!< hold TIMER6 counter when core is halted */ - DBG_TIMER11_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 6U), /*!< hold TIMER11 counter when core is halted */ - DBG_TIMER12_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 7U), /*!< hold TIMER12 counter when core is halted */ - DBG_TIMER13_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 8U), /*!< hold TIMER13 counter when core is halted */ - DBG_RTC_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 10U), /*!< hold RTC calendar and wakeup counter when core is halted */ - DBG_WWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 11U), /*!< debug WWDGT kept when core is halted */ - DBG_FWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 12U), /*!< debug FWDGT kept when core is halted */ - DBG_I2C3_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 18U), /*!< hold I2C3 smbus when core is halted */ - DBG_I2C4_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 19U), /*!< hold I2C4 smbus when core is halted */ - DBG_I2C5_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 20U), /*!< hold I2C5 smbus when core is halted */ - DBG_I2C0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 21U), /*!< hold I2C0 smbus when core is halted */ - DBG_I2C1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 22U), /*!< hold I2C1 smbus when core is halted */ - DBG_I2C2_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 23U), /*!< hold I2C2 smbus when core is halted */ - DBG_CAN0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 25U), /*!< debug CAN0 kept when core is halted */ - DBG_CAN1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL1, 26U), /*!< debug CAN1 kept when core is halted */ - DBG_TIMER0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 0U), /*!< hold TIMER0 counter when core is halted */ - DBG_TIMER7_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 1U), /*!< hold TIMER7 counter when core is halted */ - DBG_TIMER8_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 16U), /*!< hold TIMER8 counter when core is halted */ - DBG_TIMER9_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 17U), /*!< hold TIMER9 counter when core is halted */ - DBG_TIMER10_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL2, 18U) /*!< hold TIMER10 counter when core is halted */ -}dbg_periph_enum; - -/* function declarations */ -/* deinitialize the DBG */ -void dbg_deinit(void); -/* read DBG_ID code register */ -uint32_t dbg_id_get(void); - -/* enable low power behavior when the MCU is in debug mode */ -void dbg_low_power_enable(uint32_t dbg_low_power); -/* disable low power behavior when the MCU is in debug mode */ -void dbg_low_power_disable(uint32_t dbg_low_power); - -/* enable peripheral behavior when the MCU is in debug mode */ -void dbg_periph_enable(dbg_periph_enum dbg_periph); -/* disable peripheral behavior when the MCU is in debug mode */ -void dbg_periph_disable(dbg_periph_enum dbg_periph); - -/* enable trace pin assignment */ -void dbg_trace_pin_enable(void); -/* disable trace pin assignment */ -void dbg_trace_pin_disable(void); - -/* read DBG DEVICE ID */ -uint32_t dbg_deviceid_get(void); -/* write DBG DEVICEID */ -void dbg_deviceid_set(uint32_t deviceid); - -#endif /* GD32F5XX_DBG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h deleted file mode 100644 index 50cca432315..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dci.h +++ /dev/null @@ -1,236 +0,0 @@ -/*! - \file gd32f5xx_dci.h - \brief definitions for the DCI - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_DCI_H -#define GD32F5XX_DCI_H - -#include "gd32f5xx.h" - -/* DCI definitions */ -#define DCI DCI_BASE - -/* registers definitions */ -#define DCI_CTL REG32(DCI + 0x00U) /*!< DCI control register */ -#define DCI_STAT0 REG32(DCI + 0x04U) /*!< DCI status register 0 */ -#define DCI_STAT1 REG32(DCI + 0x08U) /*!< DCI status register 1 */ -#define DCI_INTEN REG32(DCI + 0x0CU) /*!< DCI interrupt enable register */ -#define DCI_INTF REG32(DCI + 0x10U) /*!< DCI interrupt flag register */ -#define DCI_INTC REG32(DCI + 0x14U) /*!< DCI interrupt clear register */ -#define DCI_SC REG32(DCI + 0x18U) /*!< DCI synchronization codes register */ -#define DCI_SCUMSK REG32(DCI + 0x1CU) /*!< DCI synchronization codes unmask register */ -#define DCI_CWSPOS REG32(DCI + 0x20U) /*!< DCI cropping window start position register */ -#define DCI_CWSZ REG32(DCI + 0x24U) /*!< DCI cropping window size register */ -#define DCI_DATA REG32(DCI + 0x28U) /*!< DCI data register */ - -/* bits definitions */ -/* DCI_CTL */ -#define DCI_CTL_CAP BIT(0) /*!< capture enable */ -#define DCI_CTL_SNAP BIT(1) /*!< snapshot mode */ -#define DCI_CTL_WDEN BIT(2) /*!< window enable */ -#define DCI_CTL_JM BIT(3) /*!< JPEG mode */ -#define DCI_CTL_ESM BIT(4) /*!< embedded synchronous mode */ -#define DCI_CTL_CKS BIT(5) /*!< clock polarity selection */ -#define DCI_CTL_HPS BIT(6) /*!< horizontal polarity selection */ -#define DCI_CTL_VPS BIT(7) /*!< vertical polarity selection */ -#define DCI_CTL_FR BITS(8,9) /*!< frame rate */ -#define DCI_CTL_DCIF BITS(10,11) /*!< digital camera interface format */ -#define DCI_CTL_DCIEN BIT(14) /*!< DCI enable */ - -/* DCI_STAT0 */ -#define DCI_STAT0_HS BIT(0) /*!< HS line status */ -#define DCI_STAT0_VS BIT(1) /*!< VS line status */ -#define DCI_STAT0_FV BIT(2) /*!< FIFO valid */ - -/* DCI_STAT1 */ -#define DCI_STAT1_EFF BIT(0) /*!< end of frame flag */ -#define DCI_STAT1_OVRF BIT(1) /*!< FIFO overrun flag */ -#define DCI_STAT1_ESEF BIT(2) /*!< embedded synchronous error flag */ -#define DCI_STAT1_VSF BIT(3) /*!< vsync flag */ -#define DCI_STAT1_ELF BIT(4) /*!< end of line flag */ - -/* DCI_INTEN */ -#define DCI_INTEN_EFIE BIT(0) /*!< end of frame interrupt enable */ -#define DCI_INTEN_OVRIE BIT(1) /*!< FIFO overrun interrupt enable */ -#define DCI_INTEN_ESEIE BIT(2) /*!< embedded synchronous error interrupt enable */ -#define DCI_INTEN_VSIE BIT(3) /*!< vsync interrupt enable */ -#define DCI_INTEN_ELIE BIT(4) /*!< end of line interrupt enable */ - -/* DCI_INTF */ -#define DCI_INTF_EFIF BIT(0) /*!< end of frame interrupt flag */ -#define DCI_INTF_OVRIF BIT(1) /*!< FIFO overrun interrupt flag */ -#define DCI_INTF_ESEIF BIT(2) /*!< embedded synchronous error interrupt flag */ -#define DCI_INTF_VSIF BIT(3) /*!< vsync interrupt flag */ -#define DCI_INTF_ELIF BIT(4) /*!< end of line interrupt flag */ - -/* DCI_INTC */ -#define DCI_INTC_EFFC BIT(0) /*!< clear end of frame flag */ -#define DCI_INTC_OVRFC BIT(1) /*!< clear FIFO overrun flag */ -#define DCI_INTC_ESEFC BIT(2) /*!< clear embedded synchronous error flag */ -#define DCI_INTC_VSFC BIT(3) /*!< vsync flag clear */ -#define DCI_INTC_ELFC BIT(4) /*!< end of line flag clear */ - -/* DCI_SC */ -#define DCI_SC_FS BITS(0,7) /*!< frame start code in embedded synchronous mode */ -#define DCI_SC_LS BITS(8,15) /*!< line start code in embedded synchronous mode */ -#define DCI_SC_LE BITS(16,23) /*!< line end code in embedded synchronous mode */ -#define DCI_SC_FE BITS(24,31) /*!< frame end code in embedded synchronous mode */ - -/* DCI_SCUNMSK */ -#define DCI_SCUMSK_FSM BITS(0,7) /*!< frame start code unmask bits in embedded synchronous mode */ -#define DCI_SCUMSK_LSM BITS(8,15) /*!< line start code unmask bits in embedded synchronous mode */ -#define DCI_SCUMSK_LEM BITS(16,23) /*!< line end code unmask bits in embedded synchronous mode */ -#define DCI_SCUMSK_FEM BITS(24,31) /*!< frame end code unmask bits in embedded synchronous mode */ - -/* DCI_CWSPOS */ -#define DCI_CWSPOS_WHSP BITS(0,13) /*!< window horizontal start position */ -#define DCI_CWSPOS_WVSP BITS(16,28) /*!< window vertical start position */ - -/* DCI_CWSZ */ -#define DCI_CWSZ_WHSZ BITS(0,13) /*!< window horizontal size */ -#define DCI_CWSZ_WVSZ BITS(16,29) /*!< window vertical size */ - -/* constants definitions */ -/* DCI parameter structure definitions */ -typedef struct -{ - uint32_t capture_mode; /*!< DCI capture mode: continuous or snapshot */ - uint32_t clock_polarity; /*!< clock polarity selection */ - uint32_t hsync_polarity; /*!< horizontal polarity selection */ - uint32_t vsync_polarity; /*!< vertical polarity selection */ - uint32_t frame_rate; /*!< frame capture rate */ - uint32_t interface_format; /*!< digital camera interface format */ -}dci_parameter_struct; - -#define DCI_CAPTURE_MODE_CONTINUOUS ((uint32_t)0x00000000U) /*!< continuous capture mode */ -#define DCI_CAPTURE_MODE_SNAPSHOT DCI_CTL_SNAP /*!< snapshot capture mode */ - -#define DCI_CK_POLARITY_FALLING ((uint32_t)0x00000000U) /*!< capture at falling edge */ -#define DCI_CK_POLARITY_RISING DCI_CTL_CKS /*!< capture at rising edge */ - -#define DCI_HSYNC_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level during blanking period */ -#define DCI_HSYNC_POLARITY_HIGH DCI_CTL_HPS /*!< high level during blanking period */ - -#define DCI_VSYNC_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level during blanking period */ -#define DCI_VSYNC_POLARITY_HIGH DCI_CTL_VPS /*!< high level during blanking period*/ - -#define CTL_FR(regval) (BITS(8,9)&((uint32_t)(regval) << 8U)) -#define DCI_FRAME_RATE_ALL CTL_FR(0) /*!< capture all frames */ -#define DCI_FRAME_RATE_1_2 CTL_FR(1) /*!< capture one in 2 frames */ -#define DCI_FRAME_RATE_1_4 CTL_FR(2) /*!< capture one in 4 frames */ - -#define CTL_DCIF(regval) (BITS(10,11)&((uint32_t)(regval) << 10U)) -#define DCI_INTERFACE_FORMAT_8BITS CTL_DCIF(0) /*!< 8-bit data on every pixel clock */ -#define DCI_INTERFACE_FORMAT_10BITS CTL_DCIF(1) /*!< 10-bit data on every pixel clock */ -#define DCI_INTERFACE_FORMAT_12BITS CTL_DCIF(2) /*!< 12-bit data on every pixel clock */ -#define DCI_INTERFACE_FORMAT_14BITS CTL_DCIF(3) /*!< 14-bit data on every pixel clock */ - -/* DCI interrupt constants definitions */ -#define DCI_INT_EF BIT(0) /*!< end of frame interrupt */ -#define DCI_INT_OVR BIT(1) /*!< FIFO overrun interrupt */ -#define DCI_INT_ESE BIT(2) /*!< embedded synchronous error interrupt */ -#define DCI_INT_VSYNC BIT(3) /*!< vsync interrupt */ -#define DCI_INT_EL BIT(4) /*!< end of line interrupt */ - -/* DCI interrupt flag definitions */ -#define DCI_INT_FLAG_EF BIT(0) /*!< end of frame interrupt flag */ -#define DCI_INT_FLAG_OVR BIT(1) /*!< FIFO overrun interrupt flag */ -#define DCI_INT_FLAG_ESE BIT(2) /*!< embedded synchronous error interrupt flag */ -#define DCI_INT_FLAG_VSYNC BIT(3) /*!< vsync interrupt flag */ -#define DCI_INT_FLAG_EL BIT(4) /*!< end of line interrupt flag */ - -/* DCI flag definitions */ -#define DCI_FLAG_HS DCI_STAT0_HS /*!< HS line status */ -#define DCI_FLAG_VS DCI_STAT0_VS /*!< VS line status */ -#define DCI_FLAG_FV DCI_STAT0_FV /*!< FIFO valid */ -#define DCI_FLAG_EF (DCI_STAT1_EFF | BIT(31)) /*!< end of frame flag */ -#define DCI_FLAG_OVR (DCI_STAT1_OVRF | BIT(31)) /*!< FIFO overrun flag */ -#define DCI_FLAG_ESE (DCI_STAT1_ESEF | BIT(31)) /*!< embedded synchronous error flag */ -#define DCI_FLAG_VSYNC (DCI_STAT1_VSF | BIT(31)) /*!< vsync flag */ -#define DCI_FLAG_EL (DCI_STAT1_ELF | BIT(31)) /*!< end of line flag */ - -/* function declarations */ -/* initialization functions */ -/* DCI deinit */ -void dci_deinit(void); -/* initialize DCI registers */ -void dci_init(dci_parameter_struct* dci_struct); - -/* enable DCI function */ -void dci_enable(void); -/* disable DCI function */ -void dci_disable(void); -/* enable DCI capture */ -void dci_capture_enable(void); -/* disable DCI capture */ -void dci_capture_disable(void); -/* enable DCI jpeg mode */ -void dci_jpeg_enable(void); -/* disable DCI jpeg mode */ -void dci_jpeg_disable(void); - -/* function configuration */ -/* enable cropping window function */ -void dci_crop_window_enable(void); -/* disable cropping window function */ -void dci_crop_window_disable(void); -/* configure DCI cropping window */ -void dci_crop_window_config(uint16_t start_x, uint16_t start_y, uint16_t size_width, uint16_t size_height); - -/* enable embedded synchronous mode */ -void dci_embedded_sync_enable(void); -/* disable embedded synchronous mode */ -void dci_embedded_sync_disable(void); -/* configure synchronous codes in embedded synchronous mode */ -void dci_sync_codes_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end); -/* configure synchronous codes unmask in embedded synchronous mode */ -void dci_sync_codes_unmask_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end); - -/* read DCI data register */ -uint32_t dci_data_read(void); - -/* interrupt & flag functions */ -/* get specified flag */ -FlagStatus dci_flag_get(uint32_t flag); -/* enable specified DCI interrupt */ -void dci_interrupt_enable(uint32_t interrupt); -/* disable specified DCI interrupt */ -void dci_interrupt_disable(uint32_t interrupt); - - -/* get specified interrupt flag */ -FlagStatus dci_interrupt_flag_get(uint32_t int_flag); -/* clear specified interrupt flag */ -void dci_interrupt_flag_clear(uint32_t int_flag); - -#endif /* GD32F5XX_DCI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h deleted file mode 100644 index 988d5d959cf..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_dma.h +++ /dev/null @@ -1,433 +0,0 @@ -/*! - \file gd32f5xx_dma.h - \brief definitions for the DMA - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_DMA_H -#define GD32F5XX_DMA_H - -#include "gd32f5xx.h" - -/* DMA definitions */ -#define DMA0 (DMA_BASE) /*!< DMA0 base address */ -#define DMA1 (DMA_BASE + 0x00000400U) /*!< DMA1 base address */ - -/* registers definitions */ -#define DMA_INTF0(dmax) REG32((dmax) + 0x00000000U) /*!< DMA interrupt flag register 0 */ -#define DMA_INTF1(dmax) REG32((dmax) + 0x00000004U) /*!< DMA interrupt flag register 1 */ -#define DMA_INTC0(dmax) REG32((dmax) + 0x00000008U) /*!< DMA interrupt flag clear register 0 */ -#define DMA_INTC1(dmax) REG32((dmax) + 0x0000000CU) /*!< DMA interrupt flag clear register 1 */ - -#define DMA_CH0CTL(dmax) REG32((dmax) + 0x00000010U) /*!< DMA channel 0 control register */ -#define DMA_CH0CNT(dmax) REG32((dmax) + 0x00000014U) /*!< DMA channel 0 counter register */ -#define DMA_CH0PADDR(dmax) REG32((dmax) + 0x00000018U) /*!< DMA channel 0 peripheral base address register */ -#define DMA_CH0M0ADDR(dmax) REG32((dmax) + 0x0000001CU) /*!< DMA channel 0 memory 0 base address register */ -#define DMA_CH0M1ADDR(dmax) REG32((dmax) + 0x00000020U) /*!< DMA channel 0 memory 1 base address register */ -#define DMA_CH0FCTL(dmax) REG32((dmax) + 0x00000024U) /*!< DMA channel 0 FIFO control register */ - -#define DMA_CH1CTL(dmax) REG32((dmax) + 0x00000028U) /*!< DMA channel 1 control register */ -#define DMA_CH1CNT(dmax) REG32((dmax) + 0x0000002CU) /*!< DMA channel 1 counter register */ -#define DMA_CH1PADDR(dmax) REG32((dmax) + 0x00000030U) /*!< DMA channel 1 peripheral base address register */ -#define DMA_CH1M0ADDR(dmax) REG32((dmax) + 0x00000034U) /*!< DMA channel 1 memory 0 base address register */ -#define DMA_CH1M1ADDR(dmax) REG32((dmax) + 0x00000038U) /*!< DMA channel 1 memory 1 base address register */ -#define DMA_CH1FCTL(dmax) REG32((dmax) + 0x0000003CU) /*!< DMA channel 1 FIFO control register */ - -#define DMA_CH2CTL(dmax) REG32((dmax) + 0x00000040U) /*!< DMA channel 2 control register */ -#define DMA_CH2CNT(dmax) REG32((dmax) + 0x00000044U) /*!< DMA channel 2 counter register */ -#define DMA_CH2PADDR(dmax) REG32((dmax) + 0x00000048U) /*!< DMA channel 2 peripheral base address register */ -#define DMA_CH2M0ADDR(dmax) REG32((dmax) + 0x0000004CU) /*!< DMA channel 2 memory 0 base address register */ -#define DMA_CH2M1ADDR(dmax) REG32((dmax) + 0x00000050U) /*!< DMA channel 2 memory 1 base address register */ -#define DMA_CH2FCTL(dmax) REG32((dmax) + 0x00000054U) /*!< DMA channel 2 FIFO control register */ - -#define DMA_CH3CTL(dmax) REG32((dmax) + 0x00000058U) /*!< DMA channel 3 control register */ -#define DMA_CH3CNT(dmax) REG32((dmax) + 0x0000005CU) /*!< DMA channel 3 counter register */ -#define DMA_CH3PADDR(dmax) REG32((dmax) + 0x00000060U) /*!< DMA channel 3 peripheral base address register */ -#define DMA_CH3M0ADDR(dmax) REG32((dmax) + 0x00000064U) /*!< DMA channel 3 memory 0 base address register */ -#define DMA_CH3M1ADDR(dmax) REG32((dmax) + 0x00000068U) /*!< DMA channel 3 memory 1 base address register */ -#define DMA_CH3FCTL(dmax) REG32((dmax) + 0x0000006CU) /*!< DMA channel 3 FIFO control register */ - -#define DMA_CH4CTL(dmax) REG32((dmax) + 0x00000070U) /*!< DMA channel 4 control register */ -#define DMA_CH4CNT(dmax) REG32((dmax) + 0x00000074U) /*!< DMA channel 4 counter register */ -#define DMA_CH4PADDR(dmax) REG32((dmax) + 0x00000078U) /*!< DMA channel 4 peripheral base address register */ -#define DMA_CH4M0ADDR(dmax) REG32((dmax) + 0x0000007CU) /*!< DMA channel 4 memory 0 base address register */ -#define DMA_CH4M1ADDR(dmax) REG32((dmax) + 0x00000080U) /*!< DMA channel 4 memory 1 base address register */ -#define DMA_CH4FCTL(dmax) REG32((dmax) + 0x00000084U) /*!< DMA channel 4 FIFO control register */ - -#define DMA_CH5CTL(dmax) REG32((dmax) + 0x00000088U) /*!< DMA channel 5 control register */ -#define DMA_CH5CNT(dmax) REG32((dmax) + 0x0000008CU) /*!< DMA channel 5 counter register */ -#define DMA_CH5PADDR(dmax) REG32((dmax) + 0x00000090U) /*!< DMA channel 5 peripheral base address register */ -#define DMA_CH5M0ADDR(dmax) REG32((dmax) + 0x00000094U) /*!< DMA channel 5 memory 0 base address register */ -#define DMA_CH5M1ADDR(dmax) REG32((dmax) + 0x00000098U) /*!< DMA channel 5 memory 1 base address register */ -#define DMA_CH5FCTL(dmax) REG32((dmax) + 0x0000009CU) /*!< DMA channel 5 FIFO control register */ - -#define DMA_CH6CTL(dmax) REG32((dmax) + 0x000000A0U) /*!< DMA channel 6 control register */ -#define DMA_CH6CNT(dmax) REG32((dmax) + 0x000000A4U) /*!< DMA channel 6 counter register */ -#define DMA_CH6PADDR(dmax) REG32((dmax) + 0x000000A8U) /*!< DMA channel 6 peripheral base address register */ -#define DMA_CH6M0ADDR(dmax) REG32((dmax) + 0x000000ACU) /*!< DMA channel 6 memory 0 base address register */ -#define DMA_CH6M1ADDR(dmax) REG32((dmax) + 0x000000B0U) /*!< DMA channel 6 memory 1 base address register */ -#define DMA_CH6FCTL(dmax) REG32((dmax) + 0x000000B4U) /*!< DMA channel 6 FIFO control register */ - -#define DMA_CH7CTL(dmax) REG32((dmax) + 0x000000B8U) /*!< DMA channel 7 control register */ -#define DMA_CH7CNT(dmax) REG32((dmax) + 0x000000BCU) /*!< DMA channel 7 counter register */ -#define DMA_CH7PADDR(dmax) REG32((dmax) + 0x000000C0U) /*!< DMA channel 7 peripheral base address register */ -#define DMA_CH7M0ADDR(dmax) REG32((dmax) + 0x000000C4U) /*!< DMA channel 7 memory 0 base address register */ -#define DMA_CH7M1ADDR(dmax) REG32((dmax) + 0x000000C8U) /*!< DMA channel 7 memory 1 base address register */ -#define DMA_CH7FCTL(dmax) REG32((dmax) + 0x000000CCU) /*!< DMA channel 7 FIFO control register */ - -/* bits definitions */ -/* DMA_INTF */ -#define DMA_INTF_FEEIF BIT(0) /*!< FIFO error and exception flag */ -#define DMA_INTF_SDEIF BIT(2) /*!< single data mode exception flag */ -#define DMA_INTF_TAEIF BIT(3) /*!< transfer access error flag */ -#define DMA_INTF_HTFIF BIT(4) /*!< half transfer finish flag */ -#define DMA_INTF_FTFIF BIT(5) /*!< full transger finish flag */ - -/* DMA_INTC */ -#define DMA_INTC_FEEIFC BIT(0) /*!< clear FIFO error and exception flag */ -#define DMA_INTC_SDEIFC BIT(2) /*!< clear single data mode exception flag */ -#define DMA_INTC_TAEIFC BIT(3) /*!< clear single data mode exception flag */ -#define DMA_INTC_HTFIFC BIT(4) /*!< clear half transfer finish flag */ -#define DMA_INTC_FTFIFC BIT(5) /*!< clear full transger finish flag */ - -/* DMA_CHxCTL,x=0..7 */ -#define DMA_CHXCTL_CHEN BIT(0) /*!< channel x enable */ -#define DMA_CHXCTL_SDEIE BIT(1) /*!< enable bit for channel x single data mode exception interrupt */ -#define DMA_CHXCTL_TAEIE BIT(2) /*!< enable bit for channel x tranfer access error interrupt */ -#define DMA_CHXCTL_HTFIE BIT(3) /*!< enable bit for channel x half transfer finish interrupt */ -#define DMA_CHXCTL_FTFIE BIT(4) /*!< enable bit for channel x full transfer finish interrupt */ -#define DMA_CHXCTL_TFCS BIT(5) /*!< transfer flow controller select */ -#define DMA_CHXCTL_TM BITS(6,7) /*!< transfer mode */ -#define DMA_CHXCTL_CMEN BIT(8) /*!< circulation mode */ -#define DMA_CHXCTL_PNAGA BIT(9) /*!< next address generation algorithm of peripheral */ -#define DMA_CHXCTL_MNAGA BIT(10) /*!< next address generation algorithm of memory */ -#define DMA_CHXCTL_PWIDTH BITS(11,12) /*!< transfer width of peipheral */ -#define DMA_CHXCTL_MWIDTH BITS(13,14) /*!< transfer width of memory */ -#define DMA_CHXCTL_PAIF BIT(15) /*!< peripheral address increment fixed */ -#define DMA_CHXCTL_PRIO BITS(16,17) /*!< priority level */ -#define DMA_CHXCTL_SBMEN BIT(18) /*!< switch-buffer mode enable */ -#define DMA_CHXCTL_MBS BIT(19) /*!< memory buffer select */ -#define DMA_CHXCTL_PBURST BITS(21,22) /*!< transfer burst type of peripheral */ -#define DMA_CHXCTL_MBURST BITS(23,24) /*!< transfer burst type of memory */ -#define DMA_CHXCTL_PERIEN BITS(25,27) /*!< peripheral enable */ - -/* DMA_CHxCNT,x=0..7 */ -#define DMA_CHXCNT_CNT BITS(0,15) /*!< transfer counter */ - -/* DMA_CHxPADDR,x=0..7 */ -#define DMA_CHXPADDR_PADDR BITS(0,31) /*!< peripheral base address */ - -/* DMA_CHxM0ADDR,x=0..7 */ -#define DMA_CHXM0ADDR_M0ADDR BITS(0,31) /*!< memory 0 base address */ - -/* DMA_CHxM1ADDR,x=0..7 */ -#define DMA_CHXM1ADDR_M0ADDR BITS(0,31) /*!< memory 1 base address */ - -/* DMA_CHxFCTL,x=0..7 */ -#define DMA_CHXFCTL_FCCV BITS(0,1) /*!< FIFO counter critical value */ -#define DMA_CHXFCTL_MDMEN BIT(2) /*!< multi-data mode enable */ -#define DMA_CHXFCTL_FCNT BITS(3,5) /*!< FIFO counter */ -#define DMA_CHXFCTL_FEEIE BIT(7) /*!< FIFO exception interrupt enable */ - -/* constants definitions */ -/* DMA channel select */ -typedef enum -{ - DMA_CH0 = 0, /*!< DMA Channel 0 */ - DMA_CH1, /*!< DMA Channel 1 */ - DMA_CH2, /*!< DMA Channel 2 */ - DMA_CH3, /*!< DMA Channel 3 */ - DMA_CH4, /*!< DMA Channel 4 */ - DMA_CH5, /*!< DMA Channel 5 */ - DMA_CH6, /*!< DMA Channel 6 */ - DMA_CH7 /*!< DMA Channel 7 */ -} dma_channel_enum; - -/* DMA peripheral select */ -typedef enum -{ - DMA_SUBPERI0 = 0, /*!< DMA Peripheral 0 */ - DMA_SUBPERI1, /*!< DMA Peripheral 1 */ - DMA_SUBPERI2, /*!< DMA Peripheral 2 */ - DMA_SUBPERI3, /*!< DMA Peripheral 3 */ - DMA_SUBPERI4, /*!< DMA Peripheral 4 */ - DMA_SUBPERI5, /*!< DMA Peripheral 5 */ - DMA_SUBPERI6, /*!< DMA Peripheral 6 */ - DMA_SUBPERI7 /*!< DMA Peripheral 7 */ -} dma_subperipheral_enum; - -/* DMA multidata mode initialize struct */ -typedef struct -{ - uint32_t periph_addr; /*!< peripheral base address */ - uint32_t periph_width; /*!< transfer data size of peripheral */ - uint32_t periph_inc; /*!< peripheral increasing mode */ - - uint32_t memory0_addr; /*!< memory 0 base address */ - uint32_t memory_width; /*!< transfer data size of memory */ - uint32_t memory_inc; /*!< memory increasing mode */ - - uint32_t memory_burst_width; /*!< multi data mode enable */ - uint32_t periph_burst_width; /*!< multi data mode enable */ - uint32_t critical_value; /*!< FIFO critical */ - - uint32_t circular_mode; /*!< DMA circular mode */ - uint32_t direction; /*!< channel data transfer direction */ - uint32_t number; /*!< channel transfer number */ - uint32_t priority; /*!< channel priority level */ -}dma_multi_data_parameter_struct; - -/* DMA singledata mode initialize struct */ -typedef struct -{ - uint32_t periph_addr; /*!< peripheral base address */ - uint32_t periph_inc; /*!< peripheral increasing mode */ - - uint32_t memory0_addr; /*!< memory 0 base address */ - uint32_t memory_inc; /*!< memory increasing mode */ - - uint32_t periph_memory_width; /*!< transfer data size of peripheral */ - - uint32_t circular_mode; /*!< DMA circular mode */ - uint32_t direction; /*!< channel data transfer direction */ - uint32_t number; /*!< channel transfer number */ - uint32_t priority; /*!< channel priority level */ -} dma_single_data_parameter_struct; - -#define DMA_FLAG_ADD(flag,channel) ((uint32_t)((flag)<<((((uint32_t)(channel)*6U))+((uint32_t)(((uint32_t)(channel)) >> 1U)&0x01U)*4U))) /*!< DMA channel flag shift */ - -/* DMA_register address */ -#define DMA_CHCTL(dma,channel) REG32(((dma) + 0x10U) + 0x18U*(channel)) /*!< the address of DMA channel CHXCTL register */ -#define DMA_CHCNT(dma,channel) REG32(((dma) + 0x14U) + 0x18U*(channel)) /*!< the address of DMA channel CHXCNT register */ -#define DMA_CHPADDR(dma,channel) REG32(((dma) + 0x18U) + 0x18U*(channel)) /*!< the address of DMA channel CHXPADDR register */ -#define DMA_CHM0ADDR(dma,channel) REG32(((dma) + 0x1CU) + 0x18U*(channel)) /*!< the address of DMA channel CHXM0ADDR register */ -#define DMA_CHM1ADDR(dma,channel) REG32(((dma) + 0x20U) + 0x18U*(channel)) /*!< the address of DMA channel CHXM1ADDR register */ -#define DMA_CHFCTL(dma,channel) REG32(((dma) + 0x24U) + 0x18U*(channel)) /*!< the address of DMA channel CHXMADDR register */ - -/* peripheral select */ -#define CHCTL_PERIEN(regval) (BITS(25,27) & ((uint32_t)(regval) << 25)) -#define DMA_PERIPH_0_SELECT CHCTL_PERIEN(0) /*!< peripheral 0 select */ -#define DMA_PERIPH_1_SELECT CHCTL_PERIEN(1) /*!< peripheral 1 select */ -#define DMA_PERIPH_2_SELECT CHCTL_PERIEN(2) /*!< peripheral 2 select */ -#define DMA_PERIPH_3_SELECT CHCTL_PERIEN(3) /*!< peripheral 3 select */ -#define DMA_PERIPH_4_SELECT CHCTL_PERIEN(4) /*!< peripheral 4 select */ -#define DMA_PERIPH_5_SELECT CHCTL_PERIEN(5) /*!< peripheral 5 select */ -#define DMA_PERIPH_6_SELECT CHCTL_PERIEN(6) /*!< peripheral 6 select */ -#define DMA_PERIPH_7_SELECT CHCTL_PERIEN(7) /*!< peripheral 7 select */ - -/* burst type of memory */ -#define CHCTL_MBURST(regval) (BITS(23,24) & ((uint32_t)(regval) << 23)) -#define DMA_MEMORY_BURST_SINGLE CHCTL_MBURST(0) /*!< single burst */ -#define DMA_MEMORY_BURST_4_BEAT CHCTL_MBURST(1) /*!< 4-beat burst */ -#define DMA_MEMORY_BURST_8_BEAT CHCTL_MBURST(2) /*!< 8-beat burst */ -#define DMA_MEMORY_BURST_16_BEAT CHCTL_MBURST(3) /*!< 16-beat burst */ - -/* burst type of peripheral */ -#define CHCTL_PBURST(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) -#define DMA_PERIPH_BURST_SINGLE CHCTL_PBURST(0) /*!< single burst */ -#define DMA_PERIPH_BURST_4_BEAT CHCTL_PBURST(1) /*!< 4-beat burst */ -#define DMA_PERIPH_BURST_8_BEAT CHCTL_PBURST(2) /*!< 8-beat burst */ -#define DMA_PERIPH_BURST_16_BEAT CHCTL_PBURST(3) /*!< 16-beat burst */ - -/* channel priority level */ -#define CHCTL_PRIO(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define DMA_PRIORITY_LOW CHCTL_PRIO(0) /*!< low priority */ -#define DMA_PRIORITY_MEDIUM CHCTL_PRIO(1) /*!< medium priority */ -#define DMA_PRIORITY_HIGH CHCTL_PRIO(2) /*!< high priority */ -#define DMA_PRIORITY_ULTRA_HIGH CHCTL_PRIO(3) /*!< ultra high priority */ - -/* transfer data width of memory */ -#define CHCTL_MWIDTH(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) -#define DMA_MEMORY_WIDTH_8BIT CHCTL_MWIDTH(0) /*!< transfer data width of memory is 8-bit */ -#define DMA_MEMORY_WIDTH_16BIT CHCTL_MWIDTH(1) /*!< transfer data width of memory is 16-bit */ -#define DMA_MEMORY_WIDTH_32BIT CHCTL_MWIDTH(2) /*!< transfer data width of memory is 32-bit */ - -/* transfer data width of peripheral */ -#define CHCTL_PWIDTH(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) -#define DMA_PERIPH_WIDTH_8BIT CHCTL_PWIDTH(0) /*!< transfer data width of peripheral is 8-bit */ -#define DMA_PERIPH_WIDTH_16BIT CHCTL_PWIDTH(1) /*!< transfer data width of peripheral is 16-bit */ -#define DMA_PERIPH_WIDTH_32BIT CHCTL_PWIDTH(2) /*!< transfer data width of peripheral is 32-bit */ - -/* channel transfer mode */ -#define CHCTL_TM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) -#define DMA_PERIPH_TO_MEMORY CHCTL_TM(0) /*!< read from peripheral and write to memory */ -#define DMA_MEMORY_TO_PERIPH CHCTL_TM(1) /*!< read from memory and write to peripheral */ -#define DMA_MEMORY_TO_MEMORY CHCTL_TM(2) /*!< read from memory and write to memory */ - -/* FIFO counter critical value */ -#define CHFCTL_FCCV(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define DMA_FIFO_1_WORD CHFCTL_FCCV(0) /*!< critical value 1 word */ -#define DMA_FIFO_2_WORD CHFCTL_FCCV(1) /*!< critical value 2 word */ -#define DMA_FIFO_3_WORD CHFCTL_FCCV(2) /*!< critical value 3 word */ -#define DMA_FIFO_4_WORD CHFCTL_FCCV(3) /*!< critical value 4 word */ - -/* memory select */ -#define DMA_MEMORY_0 ((uint32_t)0x00000000U) /*!< select memory 0 */ -#define DMA_MEMORY_1 ((uint32_t)0x00000001U) /*!< select memory 1 */ - -/* DMA circular mode */ -#define DMA_CIRCULAR_MODE_ENABLE ((uint32_t)0x00000000U) /*!< circular mode enable */ -#define DMA_CIRCULAR_MODE_DISABLE ((uint32_t)0x00000001U) /*!< circular mode disable */ - -/* DMA flow controller select */ -#define DMA_FLOW_CONTROLLER_DMA ((uint32_t)0x00000000U) /*!< DMA is the flow controler */ -#define DMA_FLOW_CONTROLLER_PERI ((uint32_t)0x00000001U) /*!< peripheral is the flow controler */ - -/* peripheral increasing mode */ -#define DMA_PERIPH_INCREASE_ENABLE ((uint32_t)0x00000000U) /*!< next address of peripheral is increasing address mode */ -#define DMA_PERIPH_INCREASE_DISABLE ((uint32_t)0x00000001U) /*!< next address of peripheral is fixed address mode */ -#define DMA_PERIPH_INCREASE_FIX ((uint32_t)0x00000002U) /*!< next address of peripheral is increasing fixed */ - -/* memory increasing mode */ -#define DMA_MEMORY_INCREASE_ENABLE ((uint32_t)0x00000000U) /*!< next address of memory is increasing address mode */ -#define DMA_MEMORY_INCREASE_DISABLE ((uint32_t)0x00000001U) /*!< next address of memory is fixed address mode */ - -/* FIFO status */ -#define DMA_FIFO_STATUS_NODATA ((uint32_t)0x00000000U) /*!< the data in the FIFO less than 1 word */ -#define DMA_FIFO_STATUS_1_WORD ((uint32_t)0x00000001U) /*!< the data in the FIFO more than 1 word, less than 2 words */ -#define DMA_FIFO_STATUS_2_WORD ((uint32_t)0x00000002U) /*!< the data in the FIFO more than 2 word, less than 3 words */ -#define DMA_FIFO_STATUS_3_WORD ((uint32_t)0x00000003U) /*!< the data in the FIFO more than 3 word, less than 4 words */ -#define DMA_FIFO_STATUS_EMPTY ((uint32_t)0x00000004U) /*!< the data in the FIFO is empty */ -#define DMA_FIFO_STATUS_FULL ((uint32_t)0x00000005U) /*!< the data in the FIFO is full */ - -/* DMA reset value */ -#define DMA_CHCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCTL register */ -#define DMA_CHCNT_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCNT register */ -#define DMA_CHPADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXPADDR register */ -#define DMA_CHMADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXMADDR register */ -#define DMA_CHINTF_RESET_VALUE ((uint32_t)0x0000003DU) /*!< clear DMA channel CHXINTFS register */ -#define DMA_CHFCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXFCTL register */ - -/* DMA_INTF register */ -/* interrupt flag bits */ -#define DMA_INT_FLAG_FEE DMA_INTF_FEEIF /*!< FIFO error and exception flag */ -#define DMA_INT_FLAG_SDE DMA_INTF_SDEIF /*!< single data mode exception flag */ -#define DMA_INT_FLAG_TAE DMA_INTF_TAEIF /*!< transfer access error flag */ -#define DMA_INT_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag */ -#define DMA_INT_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag */ - -/* flag bits */ -#define DMA_FLAG_FEE DMA_INTF_FEEIF /*!< FIFO error and exception flag */ -#define DMA_FLAG_SDE DMA_INTF_SDEIF /*!< single data mode exception flag */ -#define DMA_FLAG_TAE DMA_INTF_TAEIF /*!< transfer access error flag */ -#define DMA_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag */ -#define DMA_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag */ - -/* DMA_CHxCTL register */ -/* interrupt enable bits */ -#define DMA_INT_SDE DMA_CHXCTL_SDEIE /*!< enable bit for channel x single data mode exception interrupt */ -#define DMA_INT_TAE DMA_CHXCTL_TAEIE /*!< enable bit for channel x tranfer access error interrupt */ -#define DMA_INT_HTF DMA_CHXCTL_HTFIE /*!< enable bit for channel x half transfer finish interrupt */ -#define DMA_INT_FTF DMA_CHXCTL_FTFIE /*!< enable bit for channel x full transfer finish interrupt */ -#define DMA_INT_FEE DMA_CHXFCTL_FEEIE /*!< FIFO exception interrupt enable */ - -/* function declarations */ -/* DMA deinitialization and initialization functions */ -/* deinitialize DMA a channel registers */ -void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx); -/* initialize the DMA single data mode parameters struct with the default values */ -void dma_single_data_para_struct_init(dma_single_data_parameter_struct* init_struct); -/* initialize the DMA multi data mode parameters struct with the default values */ -void dma_multi_data_para_struct_init(dma_multi_data_parameter_struct* init_struct); -/* DMA single data mode initialize */ -void dma_single_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_single_data_parameter_struct* init_struct); -/* DMA multi data mode initialize */ -void dma_multi_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_multi_data_parameter_struct* init_struct); - -/* DMA configuration functions */ -/* set DMA peripheral base address */ -void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); -/* set DMA Memory base address */ -void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t memory_flag, uint32_t address); - -/* set the number of remaining data to be transferred by the DMA */ -void dma_transfer_number_config(uint32_t dma_periph,dma_channel_enum channelx, uint32_t number); -/* get the number of remaining data to be transferred by the DMA */ -uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx); - -/* configure priority level of DMA channel */ -void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority); - -/* configure transfer burst beats of memory */ -void dma_memory_burst_beats_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t mbeat); -/* configure transfer burst beats of peripheral */ -void dma_periph_burst_beats_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t pbeat); -/* configure transfer data size of memory */ -void dma_memory_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t msize); -/* configure transfer data size of peripheral */ -void dma_periph_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t psize); - -/* configure next address increasement algorithm of memory */ -void dma_memory_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm); -/* configure next address increasement algorithm of peripheral */ -void dma_peripheral_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm); - -/* enable DMA circulation mode */ -void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx); -/* disable DMA circulation mode */ -void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx); -/* enable DMA channel */ -void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx); -/* disable DMA channel */ -void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx); - -/* configure the direction of data transfer on the channel */ -void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t direction); - -/* DMA switch buffer mode config */ -void dma_switch_buffer_mode_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t memory1_addr, uint32_t memory_select); -/* DMA using memory get */ -uint32_t dma_using_memory_get(uint32_t dma_periph, dma_channel_enum channelx); - -/* DMA channel peripheral select */ -void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph); -/* DMA flow controller configure */ -void dma_flow_controller_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t controller); -/* DMA switch buffer mode enable */ -void dma_switch_buffer_mode_enable(uint32_t dma_periph, dma_channel_enum channelx, ControlStatus newvalue); -/* DMA FIFO status get */ -uint32_t dma_fifo_status_get(uint32_t dma_periph, dma_channel_enum channelx); - -/* flag and interrupt functions */ -/* check DMA flag is set or not */ -FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); -/* clear DMA a channel flag */ -void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); -/* enable DMA interrupt */ -void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); -/* disable DMA interrupt */ -void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); -/* get DMA interrupt flag is set or not */ -FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); -/* clear DMA a channel interrupt flag */ -void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt); - -#endif /* GD32F5XX_DMA_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h deleted file mode 100644 index 2b86046283b..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_enet.h +++ /dev/null @@ -1,1697 +0,0 @@ -/*! - \file gd32f5xx_enet.h - \brief definitions for the ENET - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_ENET_H -#define GD32F5XX_ENET_H - -#include "gd32f5xx.h" -#include - -#define IF_USE_EXTERNPHY_LIB 0 -#if (1 == IF_USE_EXTERNPHY_LIB) -#include "phy.h" -#endif - -#ifndef ENET_RXBUF_NUM -#define ENET_RXBUF_NUM 5U /*!< ethernet Rx DMA descriptor number */ -#endif - -#ifndef ENET_TXBUF_NUM -#define ENET_TXBUF_NUM 5U /*!< ethernet Tx DMA descriptor number */ -#endif - -#ifndef ENET_RXBUF_SIZE -#define ENET_RXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet receive buffer size */ -#endif - -#ifndef ENET_TXBUF_SIZE -#define ENET_TXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet transmit buffer size */ -#endif - -//#define SELECT_DESCRIPTORS_ENHANCED_MODE - -//#define USE_DELAY - -#ifndef _PHY_H_ -#define DP83848 0 -#define LAN8700 1 -#define PHY_TYPE DP83848 - -#define PHY_ADDRESS ((uint16_t)1U) /*!< phy address determined by the hardware */ - -/* PHY read write timeouts */ -#define PHY_READ_TO ((uint32_t)0x0004FFFFU) /*!< PHY read timeout */ -#define PHY_WRITE_TO ((uint32_t)0x0004FFFFU) /*!< PHY write timeout */ - -/* PHY delay */ -#define PHY_RESETDELAY ((uint32_t)0x008FFFFFU) /*!< PHY reset delay */ -#define PHY_CONFIGDELAY ((uint32_t)0x00FFFFFFU) /*!< PHY configure delay */ - -/* PHY register address */ -#define PHY_REG_BCR 0U /*!< tranceiver basic control register */ -#define PHY_REG_BSR 1U /*!< tranceiver basic status register */ - -/* PHY basic control register */ -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< enable phy loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< configure speed to 100 Mbit/s and the full-duplex mode */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< configure speed to 100 Mbit/s and the half-duplex mode */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< configure speed to 10 Mbit/s and the full-duplex mode */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< configure speed to 10 Mbit/s and the half-duplex mode */ -#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) /*!< enable the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< isolate PHY from MII */ - -/* 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 */ - -#if(PHY_TYPE == LAN8700) -#define PHY_SR 31U /*!< tranceiver status register */ -#define PHY_SPEED_STATUS ((uint16_t)0x0004) /*!< configured information of speed: 10Mbit/s */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0010) /*!< configured information of duplex: full-duplex */ -#elif(PHY_TYPE == DP83848) -#define PHY_SR 16U /*!< tranceiver status register */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< configured information of speed: 10Mbit/s */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< configured information of duplex: full-duplex */ -#endif /* PHY_TYPE */ - -#endif /* _PHY_H_ */ - - -/* ENET definitions */ -#define ENET ENET_BASE - -/* registers definitions */ -#define ENET_MAC_CFG REG32((ENET) + 0x00U) /*!< ethernet MAC configuration register */ -#define ENET_MAC_FRMF REG32((ENET) + 0x04U) /*!< ethernet MAC frame filter register */ -#define ENET_MAC_HLH REG32((ENET) + 0x08U) /*!< ethernet MAC hash list high register */ -#define ENET_MAC_HLL REG32((ENET) + 0x0CU) /*!< ethernet MAC hash list low register */ -#define ENET_MAC_PHY_CTL REG32((ENET) + 0x10U) /*!< ethernet MAC PHY control register */ -#define ENET_MAC_PHY_DATA REG32((ENET) + 0x14U) /*!< ethernet MAC PHY data register */ -#define ENET_MAC_FCTL REG32((ENET) + 0x18U) /*!< ethernet MAC flow control register */ -#define ENET_MAC_VLT REG32((ENET) + 0x1CU) /*!< ethernet MAC VLAN tag register */ -#define ENET_MAC_RWFF REG32((ENET) + 0x28U) /*!< ethernet MAC remote wakeup frame filter register */ -#define ENET_MAC_WUM REG32((ENET) + 0x2CU) /*!< ethernet MAC wakeup management register */ -#define ENET_MAC_DBG REG32((ENET) + 0x34U) /*!< ethernet MAC debug register */ -#define ENET_MAC_INTF REG32((ENET) + 0x38U) /*!< ethernet MAC interrupt flag register */ -#define ENET_MAC_INTMSK REG32((ENET) + 0x3CU) /*!< ethernet MAC interrupt mask register */ -#define ENET_MAC_ADDR0H REG32((ENET) + 0x40U) /*!< ethernet MAC address 0 high register */ -#define ENET_MAC_ADDR0L REG32((ENET) + 0x44U) /*!< ethernet MAC address 0 low register */ -#define ENET_MAC_ADDR1H REG32((ENET) + 0x48U) /*!< ethernet MAC address 1 high register */ -#define ENET_MAC_ADDR1L REG32((ENET) + 0x4CU) /*!< ethernet MAC address 1 low register */ -#define ENET_MAC_ADDT2H REG32((ENET) + 0x50U) /*!< ethernet MAC address 2 high register */ -#define ENET_MAC_ADDR2L REG32((ENET) + 0x54U) /*!< ethernet MAC address 2 low register */ -#define ENET_MAC_ADDR3H REG32((ENET) + 0x58U) /*!< ethernet MAC address 3 high register */ -#define ENET_MAC_ADDR3L REG32((ENET) + 0x5CU) /*!< ethernet MAC address 3 low register */ -#define ENET_MAC_FCTH REG32((ENET) + 0x1080U) /*!< ethernet MAC flow control threshold register */ - -#define ENET_MSC_CTL REG32((ENET) + 0x100U) /*!< ethernet MSC control register */ -#define ENET_MSC_RINTF REG32((ENET) + 0x104U) /*!< ethernet MSC receive interrupt flag register */ -#define ENET_MSC_TINTF REG32((ENET) + 0x108U) /*!< ethernet MSC transmit interrupt flag register */ -#define ENET_MSC_RINTMSK REG32((ENET) + 0x10CU) /*!< ethernet MSC receive interrupt mask register */ -#define ENET_MSC_TINTMSK REG32((ENET) + 0x110U) /*!< ethernet MSC transmit interrupt mask register */ -#define ENET_MSC_SCCNT REG32((ENET) + 0x14CU) /*!< ethernet MSC transmitted good frames after a single collision counter register */ -#define ENET_MSC_MSCCNT REG32((ENET) + 0x150U) /*!< ethernet MSC transmitted good frames after more than a single collision counter register */ -#define ENET_MSC_TGFCNT REG32((ENET) + 0x168U) /*!< ethernet MSC transmitted good frames counter register */ -#define ENET_MSC_RFCECNT REG32((ENET) + 0x194U) /*!< ethernet MSC received frames with CRC error counter register */ -#define ENET_MSC_RFAECNT REG32((ENET) + 0x198U) /*!< ethernet MSC received frames with alignment error counter register */ -#define ENET_MSC_RGUFCNT REG32((ENET) + 0x1C4U) /*!< ethernet MSC received good unicast frames counter register */ - -#define ENET_PTP_TSCTL REG32((ENET) + 0x700U) /*!< ethernet PTP time stamp control register */ -#define ENET_PTP_SSINC REG32((ENET) + 0x704U) /*!< ethernet PTP subsecond increment register */ -#define ENET_PTP_TSH REG32((ENET) + 0x708U) /*!< ethernet PTP time stamp high register */ -#define ENET_PTP_TSL REG32((ENET) + 0x70CU) /*!< ethernet PTP time stamp low register */ -#define ENET_PTP_TSUH REG32((ENET) + 0x710U) /*!< ethernet PTP time stamp update high register */ -#define ENET_PTP_TSUL REG32((ENET) + 0x714U) /*!< ethernet PTP time stamp update low register */ -#define ENET_PTP_TSADDEND REG32((ENET) + 0x718U) /*!< ethernet PTP time stamp addend register */ -#define ENET_PTP_ETH REG32((ENET) + 0x71CU) /*!< ethernet PTP expected time high register */ -#define ENET_PTP_ETL REG32((ENET) + 0x720U) /*!< ethernet PTP expected time low register */ -#define ENET_PTP_TSF REG32((ENET) + 0x728U) /*!< ethernet PTP time stamp flag register */ -#define ENET_PTP_PPSCTL REG32((ENET) + 0x72CU) /*!< ethernet PTP PPS control register */ - -#define ENET_DMA_BCTL REG32((ENET) + 0x1000U) /*!< ethernet DMA bus control register */ -#define ENET_DMA_TPEN REG32((ENET) + 0x1004U) /*!< ethernet DMA transmit poll enable register */ -#define ENET_DMA_RPEN REG32((ENET) + 0x1008U) /*!< ethernet DMA receive poll enable register */ -#define ENET_DMA_RDTADDR REG32((ENET) + 0x100CU) /*!< ethernet DMA receive descriptor table address register */ -#define ENET_DMA_TDTADDR REG32((ENET) + 0x1010U) /*!< ethernet DMA transmit descriptor table address register */ -#define ENET_DMA_STAT REG32((ENET) + 0x1014U) /*!< ethernet DMA status register */ -#define ENET_DMA_CTL REG32((ENET) + 0x1018U) /*!< ethernet DMA control register */ -#define ENET_DMA_INTEN REG32((ENET) + 0x101CU) /*!< ethernet DMA interrupt enable register */ -#define ENET_DMA_MFBOCNT REG32((ENET) + 0x1020U) /*!< ethernet DMA missed frame and buffer overflow counter register */ -#define ENET_DMA_RSWDC REG32((ENET) + 0x1024U) /*!< ethernet DMA receive state watchdog counter register */ -#define ENET_DMA_CTDADDR REG32((ENET) + 0x1048U) /*!< ethernet DMA current transmit descriptor address register */ -#define ENET_DMA_CRDADDR REG32((ENET) + 0x104CU) /*!< ethernet DMA current receive descriptor address register */ -#define ENET_DMA_CTBADDR REG32((ENET) + 0x1050U) /*!< ethernet DMA current transmit buffer address register */ -#define ENET_DMA_CRBADDR REG32((ENET) + 0x1054U) /*!< ethernet DMA current receive buffer address register */ - -/* bits definitions */ -/* ENET_MAC_CFG */ -#define ENET_MAC_CFG_REN BIT(2) /*!< receiver enable */ -#define ENET_MAC_CFG_TEN BIT(3) /*!< transmitter enable */ -#define ENET_MAC_CFG_DFC BIT(4) /*!< defferal check */ -#define ENET_MAC_CFG_BOL BITS(5,6) /*!< back-off limit */ -#define ENET_MAC_CFG_APCD BIT(7) /*!< automatic pad/CRC drop */ -#define ENET_MAC_CFG_RTD BIT(9) /*!< retry disable */ -#define ENET_MAC_CFG_IPFCO BIT(10) /*!< IP frame checksum offload */ -#define ENET_MAC_CFG_DPM BIT(11) /*!< duplex mode */ -#define ENET_MAC_CFG_LBM BIT(12) /*!< loopback mode */ -#define ENET_MAC_CFG_ROD BIT(13) /*!< receive own disable */ -#define ENET_MAC_CFG_SPD BIT(14) /*!< fast eneternet speed */ -#define ENET_MAC_CFG_CSD BIT(16) /*!< carrier sense disable */ -#define ENET_MAC_CFG_IGBS BITS(17,19) /*!< inter-frame gap bit selection */ -#define ENET_MAC_CFG_JBD BIT(22) /*!< jabber disable */ -#define ENET_MAC_CFG_WDD BIT(23) /*!< watchdog disable */ -#define ENET_MAC_CFG_TFCD BIT(25) /*!< type frame CRC dropping */ - -/* ENET_MAC_FRMF */ -#define ENET_MAC_FRMF_PM BIT(0) /*!< promiscuous mode */ -#define ENET_MAC_FRMF_HUF BIT(1) /*!< hash unicast filter */ -#define ENET_MAC_FRMF_HMF BIT(2) /*!< hash multicast filter */ -#define ENET_MAC_FRMF_DAIFLT BIT(3) /*!< destination address inverse filtering enable */ -#define ENET_MAC_FRMF_MFD BIT(4) /*!< multicast filter disable */ -#define ENET_MAC_FRMF_BFRMD BIT(5) /*!< broadcast frame disable */ -#define ENET_MAC_FRMF_PCFRM BITS(6,7) /*!< pass control frames */ -#define ENET_MAC_FRMF_SAIFLT BIT(8) /*!< source address inverse filtering */ -#define ENET_MAC_FRMF_SAFLT BIT(9) /*!< source address filter */ -#define ENET_MAC_FRMF_HPFLT BIT(10) /*!< hash or perfect filter */ -#define ENET_MAC_FRMF_FAR BIT(31) /*!< frames all receive */ - -/* ENET_MAC_HLH */ -#define ENET_MAC_HLH_HLH BITS(0,31) /*!< hash list high */ - -/* ENET_MAC_HLL */ -#define ENET_MAC_HLL_HLL BITS(0,31) /*!< hash list low */ - -/* ENET_MAC_PHY_CTL */ -#define ENET_MAC_PHY_CTL_PB BIT(0) /*!< PHY busy */ -#define ENET_MAC_PHY_CTL_PW BIT(1) /*!< PHY write */ -#define ENET_MAC_PHY_CTL_CLR BITS(2,4) /*!< clock range */ -#define ENET_MAC_PHY_CTL_PR BITS(6,10) /*!< PHY register */ -#define ENET_MAC_PHY_CTL_PA BITS(11,15) /*!< PHY address */ - -/* ENET_MAC_PHY_DATA */ -#define ENET_MAC_PHY_DATA_PD BITS(0,15) /*!< PHY data */ - -/* ENET_MAC_FCTL */ -#define ENET_MAC_FCTL_FLCBBKPA BIT(0) /*!< flow control busy(in full duplex mode)/backpressure activate(in half duplex mode) */ -#define ENET_MAC_FCTL_TFCEN BIT(1) /*!< transmit flow control enable */ -#define ENET_MAC_FCTL_RFCEN BIT(2) /*!< receive flow control enable */ -#define ENET_MAC_FCTL_UPFDT BIT(3) /*!< unicast pause frame detect */ -#define ENET_MAC_FCTL_PLTS BITS(4,5) /*!< pause low threshold */ -#define ENET_MAC_FCTL_DZQP BIT(7) /*!< disable zero-quanta pause */ -#define ENET_MAC_FCTL_PTM BITS(16,31) /*!< pause time */ - -/* ENET_MAC_VLT */ -#define ENET_MAC_VLT_VLTI BITS(0,15) /*!< VLAN tag identifier(for receive frames) */ -#define ENET_MAC_VLT_VLTC BIT(16) /*!< 12-bit VLAN tag comparison */ - -/* ENET_MAC_RWFF */ -#define ENET_MAC_RWFF_DATA BITS(0,31) /*!< wakeup frame filter register data */ - -/* ENET_MAC_WUM */ -#define ENET_MAC_WUM_PWD BIT(0) /*!< power down */ -#define ENET_MAC_WUM_MPEN BIT(1) /*!< magic packet enable */ -#define ENET_MAC_WUM_WFEN BIT(2) /*!< wakeup frame enable */ -#define ENET_MAC_WUM_MPKR BIT(5) /*!< magic packet received */ -#define ENET_MAC_WUM_WUFR BIT(6) /*!< wakeup frame received */ -#define ENET_MAC_WUM_GU BIT(9) /*!< global unicast */ -#define ENET_MAC_WUM_WUFFRPR BIT(31) /*!< wakeup frame filter register pointer reset */ - -/* ENET_MAC_DBG */ -#define ENET_MAC_DBG_MRNI BIT(0) /*!< MAC receive state not idle */ -#define ENET_MAC_DBG_RXAFS BITS(1,2) /*!< Rx asynchronous FIFO status */ -#define ENET_MAC_DBG_RXFW BIT(4) /*!< RxFIFO is writing */ -#define ENET_MAC_DBG_RXFRS BITS(5,6) /*!< RxFIFO read operation status */ -#define ENET_MAC_DBG_RXFS BITS(8,9) /*!< RxFIFO state */ -#define ENET_MAC_DBG_MTNI BIT(16) /*!< MAC transmit state not idle */ -#define ENET_MAC_DBG_SOMT BITS(17,18) /*!< status of mac transmitter */ -#define ENET_MAC_DBG_PCS BIT(19) /*!< pause condition status */ -#define ENET_MAC_DBG_TXFRS BITS(20,21) /*!< TxFIFO read operation status */ -#define ENET_MAC_DBG_TXFW BIT(22) /*!< TxFIFO is writing */ -#define ENET_MAC_DBG_TXFNE BIT(24) /*!< TxFIFO not empty flag */ -#define ENET_MAC_DBG_TXFF BIT(25) /*!< TxFIFO full flag */ - -/* ENET_MAC_INTF */ -#define ENET_MAC_INTF_WUM BIT(3) /*!< WUM status */ -#define ENET_MAC_INTF_MSC BIT(4) /*!< MSC status */ -#define ENET_MAC_INTF_MSCR BIT(5) /*!< MSC receive status */ -#define ENET_MAC_INTF_MSCT BIT(6) /*!< MSC transmit status */ -#define ENET_MAC_INTF_TMST BIT(9) /*!< timestamp trigger status */ - -/* ENET_MAC_INTMSK */ -#define ENET_MAC_INTMSK_WUMIM BIT(3) /*!< WUM interrupt mask */ -#define ENET_MAC_INTMSK_TMSTIM BIT(9) /*!< timestamp trigger interrupt mask */ - -/* ENET_MAC_ADDR0H */ -#define ENET_MAC_ADDR0H_ADDR0H BITS(0,15) /*!< MAC address0 high */ -#define ENET_MAC_ADDR0H_MO BIT(31) /*!< always read 1 and must be kept */ - -/* ENET_MAC_ADDR0L */ -#define ENET_MAC_ADDR0L_ADDR0L BITS(0,31) /*!< MAC address0 low */ - -/* ENET_MAC_ADDR1H */ -#define ENET_MAC_ADDR1H_ADDR1H BITS(0,15) /*!< MAC address1 high */ -#define ENET_MAC_ADDR1H_MB BITS(24,29) /*!< mask byte */ -#define ENET_MAC_ADDR1H_SAF BIT(30) /*!< source address filter */ -#define ENET_MAC_ADDR1H_AFE BIT(31) /*!< address filter enable */ - -/* ENET_MAC_ADDR1L */ -#define ENET_MAC_ADDR1L_ADDR1L BITS(0,31) /*!< MAC address1 low */ - -/* ENET_MAC_ADDR2H */ -#define ENET_MAC_ADDR2H_ADDR2H BITS(0,15) /*!< MAC address2 high */ -#define ENET_MAC_ADDR2H_MB BITS(24,29) /*!< mask byte */ -#define ENET_MAC_ADDR2H_SAF BIT(30) /*!< source address filter */ -#define ENET_MAC_ADDR2H_AFE BIT(31) /*!< address filter enable */ - -/* ENET_MAC_ADDR2L */ -#define ENET_MAC_ADDR2L_ADDR2L BITS(0,31) /*!< MAC address2 low */ - -/* ENET_MAC_ADDR3H */ -#define ENET_MAC_ADDR3H_ADDR3H BITS(0,15) /*!< MAC address3 high */ -#define ENET_MAC_ADDR3H_MB BITS(24,29) /*!< mask byte */ -#define ENET_MAC_ADDR3H_SAF BIT(30) /*!< source address filter */ -#define ENET_MAC_ADDR3H_AFE BIT(31) /*!< address filter enable */ - -/* ENET_MAC_ADDR3L */ -#define ENET_MAC_ADDR3L_ADDR3L BITS(0,31) /*!< MAC address3 low */ - -/* ENET_MAC_FCTH */ -#define ENET_MAC_FCTH_RFA BITS(0,2) /*!< threshold of active flow control */ -#define ENET_MAC_FCTH_RFD BITS(4,6) /*!< threshold of deactive flow control */ - -/* ENET_MSC_CTL */ -#define ENET_MSC_CTL_CTR BIT(0) /*!< counter reset */ -#define ENET_MSC_CTL_CTSR BIT(1) /*!< counter stop rollover */ -#define ENET_MSC_CTL_RTOR BIT(2) /*!< reset on read */ -#define ENET_MSC_CTL_MCFZ BIT(3) /*!< MSC counter freeze */ -#define ENET_MSC_CTL_PMC BIT(4) /*!< preset MSC counter */ -#define ENET_MSC_CTL_AFHPM BIT(5) /*!< almost full or half preset mode */ - -/* ENET_MSC_RINTF */ -#define ENET_MSC_RINTF_RFCE BIT(5) /*!< received frames CRC error */ -#define ENET_MSC_RINTF_RFAE BIT(6) /*!< received frames alignment error */ -#define ENET_MSC_RINTF_RGUF BIT(17) /*!< receive good unicast frames */ - -/* ENET_MSC_TINTF */ -#define ENET_MSC_TINTF_TGFSC BIT(14) /*!< transmitted good frames single collision */ -#define ENET_MSC_TINTF_TGFMSC BIT(15) /*!< transmitted good frames more single collision */ -#define ENET_MSC_TINTF_TGF BIT(21) /*!< transmitted good frames */ - -/* ENET_MSC_RINTMSK */ -#define ENET_MSC_RINTMSK_RFCEIM BIT(5) /*!< received frame CRC error interrupt mask */ -#define ENET_MSC_RINTMSK_RFAEIM BIT(6) /*!< received frames alignment error interrupt mask */ -#define ENET_MSC_RINTMSK_RGUFIM BIT(17) /*!< received good unicast frames interrupt mask */ - -/* ENET_MSC_TINTMSK */ -#define ENET_MSC_TINTMSK_TGFSCIM BIT(14) /*!< transmitted good frames single collision interrupt mask */ -#define ENET_MSC_TINTMSK_TGFMSCIM BIT(15) /*!< transmitted good frames more single collision interrupt mask */ -#define ENET_MSC_TINTMSK_TGFIM BIT(21) /*!< transmitted good frames interrupt mask */ - -/* ENET_MSC_SCCNT */ -#define ENET_MSC_SCCNT_SCC BITS(0,31) /*!< transmitted good frames single collision counter */ - -/* ENET_MSC_MSCCNT */ -#define ENET_MSC_MSCCNT_MSCC BITS(0,31) /*!< transmitted good frames more one single collision counter */ - -/* ENET_MSC_TGFCNT */ -#define ENET_MSC_TGFCNT_TGF BITS(0,31) /*!< transmitted good frames counter */ - -/* ENET_MSC_RFCECNT */ -#define ENET_MSC_RFCECNT_RFCER BITS(0,31) /*!< received frames with CRC error counter */ - -/* ENET_MSC_RFAECNT */ -#define ENET_MSC_RFAECNT_RFAER BITS(0,31) /*!< received frames alignment error counter */ - -/* ENET_MSC_RGUFCNT */ -#define ENET_MSC_RGUFCNT_RGUF BITS(0,31) /*!< received good unicast frames counter */ - -/* ENET_PTP_TSCTL */ -#define PTP_TSCTL_CKNT(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_PTP_TSCTL_CKNT bit field */ - -#define ENET_PTP_TSCTL_TMSEN BIT(0) /*!< timestamp enable */ -#define ENET_PTP_TSCTL_TMSFCU BIT(1) /*!< timestamp fine or coarse update */ -#define ENET_PTP_TSCTL_TMSSTI BIT(2) /*!< timestamp system time initialize */ -#define ENET_PTP_TSCTL_TMSSTU BIT(3) /*!< timestamp system time update */ -#define ENET_PTP_TSCTL_TMSITEN BIT(4) /*!< timestamp interrupt trigger enable */ -#define ENET_PTP_TSCTL_TMSARU BIT(5) /*!< timestamp addend register update */ -#define ENET_PTP_TSCTL_ARFSEN BIT(8) /*!< all received frames snapshot enable */ -#define ENET_PTP_TSCTL_SCROM BIT(9) /*!< subsecond counter rollover mode */ -#define ENET_PTP_TSCTL_PFSV BIT(10) /*!< PTP frame snooping version */ -#define ENET_PTP_TSCTL_ESEN BIT(11) /*!< received Ethernet snapshot enable */ -#define ENET_PTP_TSCTL_IP6SEN BIT(12) /*!< received IPv6 snapshot enable */ -#define ENET_PTP_TSCTL_IP4SEN BIT(13) /*!< received IPv4 snapshot enable */ -#define ENET_PTP_TSCTL_ETMSEN BIT(14) /*!< received event type message snapshot enable */ -#define ENET_PTP_TSCTL_MNMSEN BIT(15) /*!< received master node message snapshot enable */ -#define ENET_PTP_TSCTL_CKNT BITS(16,17) /*!< clock node type for time stamp */ -#define ENET_PTP_TSCTL_MAFEN BIT(18) /*!< MAC address filter enable for PTP frame */ - -/* ENET_PTP_SSINC */ -#define ENET_PTP_SSINC_STMSSI BITS(0,7) /*!< system time subsecond increment */ - -/* ENET_PTP_TSH */ -#define ENET_PTP_TSH_STMS BITS(0,31) /*!< system time second */ - -/* ENET_PTP_TSL */ -#define ENET_PTP_TSL_STMSS BITS(0,30) /*!< system time subseconds */ -#define ENET_PTP_TSL_STS BIT(31) /*!< system time sign */ - -/* ENET_PTP_TSUH */ -#define ENET_PTP_TSUH_TMSUS BITS(0,31) /*!< timestamp update seconds */ - -/* ENET_PTP_TSUL */ -#define ENET_PTP_TSUL_TMSUSS BITS(0,30) /*!< timestamp update subseconds */ -#define ENET_PTP_TSUL_TMSUPNS BIT(31) /*!< timestamp update positive or negative sign */ - -/* ENET_PTP_TSADDEND */ -#define ENET_PTP_TSADDEND_TMSA BITS(0,31) /*!< timestamp addend */ - -/* ENET_PTP_ETH */ -#define ENET_PTP_ETH_ETSH BITS(0,31) /*!< expected time high */ - -/* ENET_PTP_ETL */ -#define ENET_PTP_ETL_ETSL BITS(0,31) /*!< expected time low */ - -/* ENET_PTP_TSF */ -#define ENET_PTP_TSF_TSSCO BIT(0) /*!< timestamp second counter overflow */ -#define ENET_PTP_TSF_TTM BIT(1) /*!< target time match */ - -/* ENET_PTP_PPSCTL */ -#define ENET_PTP_PPSCTL_PPSOFC BITS(0,3) /*!< PPS output frequency configure */ - -/* ENET_DMA_BCTL */ -#define ENET_DMA_BCTL_SWR BIT(0) /*!< software reset */ -#define ENET_DMA_BCTL_DAB BIT(1) /*!< DMA arbitration */ -#define ENET_DMA_BCTL_DPSL BITS(2,6) /*!< descriptor skip length */ -#define ENET_DMA_BCTL_DFM BIT(7) /*!< descriptor format mode */ -#define ENET_DMA_BCTL_PGBL BITS(8,13) /*!< programmable burst length */ -#define ENET_DMA_BCTL_RTPR BITS(14,15) /*!< RxDMA and TxDMA transfer priority ratio */ -#define ENET_DMA_BCTL_FB BIT(16) /*!< fixed Burst */ -#define ENET_DMA_BCTL_RXDP BITS(17,22) /*!< RxDMA PGBL */ -#define ENET_DMA_BCTL_UIP BIT(23) /*!< use independent PGBL */ -#define ENET_DMA_BCTL_FPBL BIT(24) /*!< four times PGBL mode */ -#define ENET_DMA_BCTL_AA BIT(25) /*!< address-aligned */ -#define ENET_DMA_BCTL_MB BIT(26) /*!< mixed burst */ - -/* ENET_DMA_TPEN */ -#define ENET_DMA_TPEN_TPE BITS(0,31) /*!< transmit poll enable */ - -/* ENET_DMA_RPEN */ -#define ENET_DMA_RPEN_RPE BITS(0,31) /*!< receive poll enable */ - -/* ENET_DMA_RDTADDR */ -#define ENET_DMA_RDTADDR_SRT BITS(0,31) /*!< start address of receive table */ - -/* ENET_DMA_TDTADDR */ -#define ENET_DMA_TDTADDR_STT BITS(0,31) /*!< start address of transmit table */ - -/* ENET_DMA_STAT */ -#define ENET_DMA_STAT_TS BIT(0) /*!< transmit status */ -#define ENET_DMA_STAT_TPS BIT(1) /*!< transmit process stopped status */ -#define ENET_DMA_STAT_TBU BIT(2) /*!< transmit buffer unavailable status */ -#define ENET_DMA_STAT_TJT BIT(3) /*!< transmit jabber timeout status */ -#define ENET_DMA_STAT_RO BIT(4) /*!< receive overflow status */ -#define ENET_DMA_STAT_TU BIT(5) /*!< transmit underflow status */ -#define ENET_DMA_STAT_RS BIT(6) /*!< receive status */ -#define ENET_DMA_STAT_RBU BIT(7) /*!< receive buffer unavailable status */ -#define ENET_DMA_STAT_RPS BIT(8) /*!< receive process stopped status */ -#define ENET_DMA_STAT_RWT BIT(9) /*!< receive watchdog timeout status */ -#define ENET_DMA_STAT_ET BIT(10) /*!< early transmit status */ -#define ENET_DMA_STAT_FBE BIT(13) /*!< fatal bus error status */ -#define ENET_DMA_STAT_ER BIT(14) /*!< early receive status */ -#define ENET_DMA_STAT_AI BIT(15) /*!< abnormal interrupt summary */ -#define ENET_DMA_STAT_NI BIT(16) /*!< normal interrupt summary */ -#define ENET_DMA_STAT_RP BITS(17,19) /*!< receive process state */ -#define ENET_DMA_STAT_TP BITS(20,22) /*!< transmit process state */ -#define ENET_DMA_STAT_EB BITS(23,25) /*!< error bits status */ -#define ENET_DMA_STAT_MSC BIT(27) /*!< MSC status */ -#define ENET_DMA_STAT_WUM BIT(28) /*!< WUM status */ -#define ENET_DMA_STAT_TST BIT(29) /*!< timestamp trigger status */ - -/* ENET_DMA_CTL */ -#define ENET_DMA_CTL_SRE BIT(1) /*!< start/stop receive enable */ -#define ENET_DMA_CTL_OSF BIT(2) /*!< operate on second frame */ -#define ENET_DMA_CTL_RTHC BITS(3,4) /*!< receive threshold control */ -#define ENET_DMA_CTL_FUF BIT(6) /*!< forward undersized good frames */ -#define ENET_DMA_CTL_FERF BIT(7) /*!< forward error frames */ -#define ENET_DMA_CTL_STE BIT(13) /*!< start/stop transmission enable */ -#define ENET_DMA_CTL_TTHC BITS(14,16) /*!< transmit threshold control */ -#define ENET_DMA_CTL_FTF BIT(20) /*!< flush transmit FIFO */ -#define ENET_DMA_CTL_TSFD BIT(21) /*!< transmit store-and-forward */ -#define ENET_DMA_CTL_DAFRF BIT(24) /*!< disable flushing of received frames */ -#define ENET_DMA_CTL_RSFD BIT(25) /*!< receive store-and-forward */ -#define ENET_DMA_CTL_DTCERFD BIT(26) /*!< dropping of TCP/IP checksum error frames disable */ - -/* ENET_DMA_INTEN */ -#define ENET_DMA_INTEN_TIE BIT(0) /*!< transmit interrupt enable */ -#define ENET_DMA_INTEN_TPSIE BIT(1) /*!< transmit process stopped interrupt enable */ -#define ENET_DMA_INTEN_TBUIE BIT(2) /*!< transmit buffer unavailable interrupt enable */ -#define ENET_DMA_INTEN_TJTIE BIT(3) /*!< transmit jabber timeout interrupt enable */ -#define ENET_DMA_INTEN_ROIE BIT(4) /*!< receive overflow interrupt enable */ -#define ENET_DMA_INTEN_TUIE BIT(5) /*!< transmit underflow interrupt enable */ -#define ENET_DMA_INTEN_RIE BIT(6) /*!< receive interrupt enable */ -#define ENET_DMA_INTEN_RBUIE BIT(7) /*!< receive buffer unavailable interrupt enable */ -#define ENET_DMA_INTEN_RPSIE BIT(8) /*!< receive process stopped interrupt enable */ -#define ENET_DMA_INTEN_RWTIE BIT(9) /*!< receive watchdog timeout interrupt enable */ -#define ENET_DMA_INTEN_ETIE BIT(10) /*!< early transmit interrupt enable */ -#define ENET_DMA_INTEN_FBEIE BIT(13) /*!< fatal bus error interrupt enable */ -#define ENET_DMA_INTEN_ERIE BIT(14) /*!< early receive interrupt enable */ -#define ENET_DMA_INTEN_AIE BIT(15) /*!< abnormal interrupt summary enable */ -#define ENET_DMA_INTEN_NIE BIT(16) /*!< normal interrupt summary enable */ - -/* ENET_DMA_MFBOCNT */ -#define ENET_DMA_MFBOCNT_MSFC BITS(0,15) /*!< missed frames by the controller */ -#define ENET_DMA_MFBOCNT_MSFA BITS(17,27) /*!< missed frames by the application */ - -/* ENET_DMA_RSWDC */ -#define ENET_DMA_RSWDC_WDCFRS BITS(0,7) /*!< watchdog counter for receive status (RS) */ - -/* ENET_DMA_CTDADDR */ -#define ENET_DMA_CTDADDR_TDAP BITS(0,31) /*!< transmit descriptor address pointer */ - -/* ENET_DMA_CRDADDR */ -#define ENET_DMA_CRDADDR_RDAP BITS(0,31) /*!< receive descriptor address pointer */ - -/* ENET_DMA_CTBADDR */ -#define ENET_DMA_CTBADDR_TBAP BITS(0,31) /*!< transmit buffer address pointer */ - -/* ENET_DMA_CRBADDR */ -#define ENET_DMA_CRBADDR_RBAP BITS(0,31) /*!< receive buffer address pointer */ - -/* ENET DMA Tx descriptor TDES0 */ -#define ENET_TDES0_DB BIT(0) /*!< deferred */ -#define ENET_TDES0_UFE BIT(1) /*!< underflow error */ -#define ENET_TDES0_EXD BIT(2) /*!< excessive deferral */ -#define ENET_TDES0_COCNT BITS(3,6) /*!< collision count */ -#define ENET_TDES0_VFRM BIT(7) /*!< VLAN frame */ -#define ENET_TDES0_ECO BIT(8) /*!< excessive collision */ -#define ENET_TDES0_LCO BIT(9) /*!< late collision */ -#define ENET_TDES0_NCA BIT(10) /*!< no carrier */ -#define ENET_TDES0_LCA BIT(11) /*!< loss of carrier */ -#define ENET_TDES0_IPPE BIT(12) /*!< IP payload error */ -#define ENET_TDES0_FRMF BIT(13) /*!< frame flushed */ -#define ENET_TDES0_JT BIT(14) /*!< jabber timeout */ -#define ENET_TDES0_ES BIT(15) /*!< error summary */ -#define ENET_TDES0_IPHE BIT(16) /*!< IP header error */ -#define ENET_TDES0_TTMSS BIT(17) /*!< transmit timestamp status */ -#define ENET_TDES0_TCHM BIT(20) /*!< the second address chained mode */ -#define ENET_TDES0_TERM BIT(21) /*!< transmit end of ring mode*/ -#define ENET_TDES0_CM BITS(22,23) /*!< checksum mode */ -#define ENET_TDES0_TTSEN BIT(25) /*!< transmit timestamp function enable */ -#define ENET_TDES0_DPAD BIT(26) /*!< disable adding pad */ -#define ENET_TDES0_DCRC BIT(27) /*!< disable CRC */ -#define ENET_TDES0_FSG BIT(28) /*!< first segment */ -#define ENET_TDES0_LSG BIT(29) /*!< last segment */ -#define ENET_TDES0_INTC BIT(30) /*!< interrupt on completion */ -#define ENET_TDES0_DAV BIT(31) /*!< DAV bit */ - -/* ENET DMA Tx descriptor TDES1 */ -#define ENET_TDES1_TB1S BITS(0,12) /*!< transmit buffer 1 size */ -#define ENET_TDES1_TB2S BITS(16,28) /*!< transmit buffer 2 size */ - -/* ENET DMA Tx descriptor TDES2 */ -#define ENET_TDES2_TB1AP BITS(0,31) /*!< transmit buffer 1 address pointer/transmit frame timestamp low 32-bit value */ - -/* ENET DMA Tx descriptor TDES3 */ -#define ENET_TDES3_TB2AP BITS(0,31) /*!< transmit buffer 2 address pointer (or next descriptor address) / transmit frame timestamp high 32-bit value */ - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE -/* ENET DMA Tx descriptor TDES6 */ -#define ENET_TDES6_TTSL BITS(0,31) /*!< transmit frame timestamp low 32-bit value */ - -/* ENET DMA Tx descriptor TDES7 */ -#define ENET_TDES7_TTSH BITS(0,31) /*!< transmit frame timestamp high 32-bit value */ -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -/* ENET DMA Rx descriptor RDES0 */ -#define ENET_RDES0_PCERR BIT(0) /*!< payload checksum error */ -#define ENET_RDES0_EXSV BIT(0) /*!< extended status valid */ -#define ENET_RDES0_CERR BIT(1) /*!< CRC error */ -#define ENET_RDES0_DBERR BIT(2) /*!< dribble bit error */ -#define ENET_RDES0_RERR BIT(3) /*!< receive error */ -#define ENET_RDES0_RWDT BIT(4) /*!< receive watchdog timeout */ -#define ENET_RDES0_FRMT BIT(5) /*!< frame type */ -#define ENET_RDES0_LCO BIT(6) /*!< late collision */ -#define ENET_RDES0_IPHERR BIT(7) /*!< IP frame header error */ -#define ENET_RDES0_TSV BIT(7) /*!< timestamp valid */ -#define ENET_RDES0_LDES BIT(8) /*!< last descriptor */ -#define ENET_RDES0_FDES BIT(9) /*!< first descriptor */ -#define ENET_RDES0_VTAG BIT(10) /*!< VLAN tag */ -#define ENET_RDES0_OERR BIT(11) /*!< overflow Error */ -#define ENET_RDES0_LERR BIT(12) /*!< length error */ -#define ENET_RDES0_SAFF BIT(13) /*!< SA filter fail */ -#define ENET_RDES0_DERR BIT(14) /*!< descriptor error */ -#define ENET_RDES0_ERRS BIT(15) /*!< error summary */ -#define ENET_RDES0_FRML BITS(16,29) /*!< frame length */ -#define ENET_RDES0_DAFF BIT(30) /*!< destination address filter fail */ -#define ENET_RDES0_DAV BIT(31) /*!< descriptor available */ - -/* ENET DMA Rx descriptor RDES1 */ -#define ENET_RDES1_RB1S BITS(0,12) /*!< receive buffer 1 size */ -#define ENET_RDES1_RCHM BIT(14) /*!< receive chained mode for second address */ -#define ENET_RDES1_RERM BIT(15) /*!< receive end of ring mode*/ -#define ENET_RDES1_RB2S BITS(16,28) /*!< receive buffer 2 size */ -#define ENET_RDES1_DINTC BIT(31) /*!< disable interrupt on completion */ - -/* ENET DMA Rx descriptor RDES2 */ -#define ENET_RDES2_RB1AP BITS(0,31) /*!< receive buffer 1 address pointer / receive frame timestamp low 32-bit */ - -/* ENET DMA Rx descriptor RDES3 */ -#define ENET_RDES3_RB2AP BITS(0,31) /*!< receive buffer 2 address pointer (next descriptor address)/receive frame timestamp high 32-bit value */ - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE -/* ENET DMA Rx descriptor RDES4 */ -#define ENET_RDES4_IPPLDT BITS(0,2) /*!< IP frame payload type */ -#define ENET_RDES4_IPHERR BIT(3) /*!< IP frame header error */ -#define ENET_RDES4_IPPLDERR BIT(4) /*!< IP frame payload error */ -#define ENET_RDES4_IPCKSB BIT(5) /*!< IP frame checksum bypassed */ -#define ENET_RDES4_IPF4 BIT(6) /*!< IP frame in version 4 */ -#define ENET_RDES4_IPF6 BIT(7) /*!< IP frame in version 6 */ -#define ENET_RDES4_PTPMT BITS(8,11) /*!< PTP message type */ -#define ENET_RDES4_PTPOEF BIT(12) /*!< PTP on ethernet frame */ -#define ENET_RDES4_PTPVF BIT(13) /*!< PTP version format */ - -/* ENET DMA Rx descriptor RDES6 */ -#define ENET_RDES6_RTSL BITS(0,31) /*!< receive frame timestamp low 32-bit value */ - -/* ENET DMA Rx descriptor RDES7 */ -#define ENET_RDES7_RTSH BITS(0,31) /*!< receive frame timestamp high 32-bit value */ -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -/* constants definitions */ -/* define bit position and its register index offset */ -#define ENET_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define ENET_REG_VAL(periph) (REG32(ENET + ((uint32_t)(periph) >> 6))) -#define ENET_BIT_POS(val) ((uint32_t)(val) & 0x1FU) - -/* ENET clock range judgement */ -#define ENET_RANGE(hclk, n, m) (((hclk) >= (n))&&((hclk) < (m))) - -/* define MAC address configuration and reference address */ -#define ENET_SET_MACADDRH(p) (((uint32_t)(p)[5] << 8) | (uint32_t)(p)[4]) -#define ENET_SET_MACADDRL(p) (((uint32_t)(p)[3] << 24) | ((uint32_t)(p)[2] << 16) | ((uint32_t)(p)[1] << 8) | (uint32_t)(p)[0]) -#define ENET_ADDRH_BASE ((ENET) + 0x40U) -#define ENET_ADDRL_BASE ((ENET) + 0x44U) -#define ENET_GET_MACADDR(offset, n) ((uint8_t)((REG32((ENET_ADDRL_BASE + (offset)) - (((n) / 4U) * 4U)) >> (8U * ((n) % 4U))) & 0xFFU)) - -/* register offset */ -#define MAC_FCTL_REG_OFFSET ((uint16_t)0x0018U) /*!< MAC flow control register offset */ -#define MAC_WUM_REG_OFFSET ((uint16_t)0x002CU) /*!< MAC wakeup management register offset */ -#define MAC_INTF_REG_OFFSET ((uint16_t)0x0038U) /*!< MAC interrupt flag register offset */ -#define MAC_INTMSK_REG_OFFSET ((uint16_t)0x003CU) /*!< MAC interrupt mask register offset */ - -#define MSC_RINTF_REG_OFFSET ((uint16_t)0x0104U) /*!< MSC receive interrupt flag register offset */ -#define MSC_TINTF_REG_OFFSET ((uint16_t)0x0108U) /*!< MSC transmit interrupt flag register offset */ -#define MSC_RINTMSK_REG_OFFSET ((uint16_t)0x010CU) /*!< MSC receive interrupt mask register offset */ -#define MSC_TINTMSK_REG_OFFSET ((uint16_t)0x0110U) /*!< MSC transmit interrupt mask register offset */ -#define MSC_SCCNT_REG_OFFSET ((uint16_t)0x014CU) /*!< MSC transmitted good frames after a single collision counter register offset */ -#define MSC_MSCCNT_REG_OFFSET ((uint16_t)0x0150U) /*!< MSC transmitted good frames after more than a single collision counter register offset */ -#define MSC_TGFCNT_REG_OFFSET ((uint16_t)0x0168U) /*!< MSC transmitted good frames counter register offset */ -#define MSC_RFCECNT_REG_OFFSET ((uint16_t)0x0194U) /*!< MSC received frames with CRC error counter register offset */ -#define MSC_RFAECNT_REG_OFFSET ((uint16_t)0x0198U) /*!< MSC received frames with alignment error counter register offset */ -#define MSC_RGUFCNT_REG_OFFSET ((uint16_t)0x01C4U) /*!< MSC received good unicast frames counter register offset */ - -#define PTP_TSF_REG_OFFSET ((uint16_t)0x0728U) /*!< PTP time stamp flag register offset */ - -#define DMA_STAT_REG_OFFSET ((uint16_t)0x1014U) /*!< DMA status register offset */ -#define DMA_INTEN_REG_OFFSET ((uint16_t)0x101CU) /*!< DMA interrupt enable register offset */ -#define DMA_TDTADDR_REG_OFFSET ((uint16_t)0x1010U) /*!< DMA transmit descriptor table address register offset */ -#define DMA_CTDADDR_REG_OFFSET ((uint16_t)0x1048U) /*!< DMA current transmit descriptor address register */ -#define DMA_CTBADDR_REG_OFFSET ((uint16_t)0x1050U) /*!< DMA current transmit buffer address register */ -#define DMA_RDTADDR_REG_OFFSET ((uint16_t)0x100CU) /*!< DMA receive descriptor table address register */ -#define DMA_CRDADDR_REG_OFFSET ((uint16_t)0x104CU) /*!< DMA current receive descriptor address register */ -#define DMA_CRBADDR_REG_OFFSET ((uint16_t)0x1054U) /*!< DMA current receive buffer address register */ - -/* ENET status flag get */ -typedef enum -{ - /* ENET_MAC_WUM register */ - ENET_MAC_FLAG_MPKR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 5U), /*!< magic packet received flag */ - ENET_MAC_FLAG_WUFR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 6U), /*!< wakeup frame received flag */ - /* ENET_MAC_FCTL register */ - ENET_MAC_FLAG_FLOWCONTROL = ENET_REGIDX_BIT(MAC_FCTL_REG_OFFSET, 0U), /*!< flow control status flag */ - /* ENET_MAC_INTF register */ - ENET_MAC_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ - ENET_MAC_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ - ENET_MAC_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ - ENET_MAC_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ - ENET_MAC_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ - /* ENET_PTP_TSF register */ - ENET_PTP_FLAG_TSSCO = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 0U), /*!< timestamp second counter overflow flag */ - ENET_PTP_FLAG_TTM = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 1U), /*!< target time match flag */ - /* ENET_MSC_RINTF register */ - ENET_MSC_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ - ENET_MSC_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ - ENET_MSC_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ - /* ENET_MSC_TINTF register */ - ENET_MSC_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ - ENET_MSC_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ - ENET_MSC_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ - /* ENET_DMA_STAT register */ - ENET_DMA_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ - ENET_DMA_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ - ENET_DMA_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ - ENET_DMA_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ - ENET_DMA_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ - ENET_DMA_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ - ENET_DMA_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ - ENET_DMA_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ - ENET_DMA_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ - ENET_DMA_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ - ENET_DMA_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ - ENET_DMA_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ - ENET_DMA_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ - ENET_DMA_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ - ENET_DMA_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ - ENET_DMA_FLAG_EB_DMA_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 23U), /*!< error during data transfer by RxDMA/TxDMA flag */ - ENET_DMA_FLAG_EB_TRANSFER_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 24U), /*!< error during write/read transfer flag */ - ENET_DMA_FLAG_EB_ACCESS_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 25U), /*!< error during data buffer/descriptor access flag */ - ENET_DMA_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ - ENET_DMA_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ - ENET_DMA_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U) /*!< timestamp trigger status flag */ -}enet_flag_enum; - -/* ENET stutus flag clear */ -typedef enum -{ - /* ENET_DMA_STAT register */ - ENET_DMA_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ - ENET_DMA_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ - ENET_DMA_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ - ENET_DMA_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ - ENET_DMA_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ - ENET_DMA_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ - ENET_DMA_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ - ENET_DMA_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ - ENET_DMA_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ - ENET_DMA_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ - ENET_DMA_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ - ENET_DMA_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ - ENET_DMA_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ - ENET_DMA_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ - ENET_DMA_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U) /*!< normal interrupt summary flag */ -}enet_flag_clear_enum; - -/* ENET interrupt enable/disable */ -typedef enum -{ - /* ENET_MAC_INTMSK register */ - ENET_MAC_INT_WUMIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 3U), /*!< WUM interrupt mask */ - ENET_MAC_INT_TMSTIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 9U), /*!< timestamp trigger interrupt mask */ - /* ENET_MSC_RINTMSK register */ - ENET_MSC_INT_RFCEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 5U), /*!< received frame CRC error interrupt mask */ - ENET_MSC_INT_RFAEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 6U), /*!< received frames alignment error interrupt mask */ - ENET_MSC_INT_RGUFIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 17U), /*!< received good unicast frames interrupt mask */ - /* ENET_MSC_TINTMSK register */ - ENET_MSC_INT_TGFSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 14U), /*!< transmitted good frames single collision interrupt mask */ - ENET_MSC_INT_TGFMSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 15U), /*!< transmitted good frames more single collision interrupt mask */ - ENET_MSC_INT_TGFIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 21U), /*!< transmitted good frames interrupt mask */ - /* ENET_DMA_INTEN register */ - ENET_DMA_INT_TIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 0U), /*!< transmit interrupt enable */ - ENET_DMA_INT_TPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 1U), /*!< transmit process stopped interrupt enable */ - ENET_DMA_INT_TBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 2U), /*!< transmit buffer unavailable interrupt enable */ - ENET_DMA_INT_TJTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 3U), /*!< transmit jabber timeout interrupt enable */ - ENET_DMA_INT_ROIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 4U), /*!< receive overflow interrupt enable */ - ENET_DMA_INT_TUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 5U), /*!< transmit underflow interrupt enable */ - ENET_DMA_INT_RIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 6U), /*!< receive interrupt enable */ - ENET_DMA_INT_RBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 7U), /*!< receive buffer unavailable interrupt enable */ - ENET_DMA_INT_RPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 8U), /*!< receive process stopped interrupt enable */ - ENET_DMA_INT_RWTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 9U), /*!< receive watchdog timeout interrupt enable */ - ENET_DMA_INT_ETIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 10U), /*!< early transmit interrupt enable */ - ENET_DMA_INT_FBEIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 13U), /*!< fatal bus error interrupt enable */ - ENET_DMA_INT_ERIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 14U), /*!< early receive interrupt enable */ - ENET_DMA_INT_AIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 15U), /*!< abnormal interrupt summary enable */ - ENET_DMA_INT_NIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 16U) /*!< normal interrupt summary enable */ -}enet_int_enum; - -/* ENET interrupt flag get */ -typedef enum -{ - /* ENET_MAC_INTF register */ - ENET_MAC_INT_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ - ENET_MAC_INT_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ - ENET_MAC_INT_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ - ENET_MAC_INT_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ - ENET_MAC_INT_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ - /* ENET_MSC_RINTF register */ - ENET_MSC_INT_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ - ENET_MSC_INT_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ - ENET_MSC_INT_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ - /* ENET_MSC_TINTF register */ - ENET_MSC_INT_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ - ENET_MSC_INT_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ - ENET_MSC_INT_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ - /* ENET_DMA_STAT register */ - ENET_DMA_INT_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ - ENET_DMA_INT_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ - ENET_DMA_INT_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ - ENET_DMA_INT_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ - ENET_DMA_INT_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ - ENET_DMA_INT_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ - ENET_DMA_INT_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ - ENET_DMA_INT_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ - ENET_DMA_INT_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ - ENET_DMA_INT_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ - ENET_DMA_INT_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ - ENET_DMA_INT_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ - ENET_DMA_INT_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ - ENET_DMA_INT_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ - ENET_DMA_INT_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ - ENET_DMA_INT_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ - ENET_DMA_INT_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ - ENET_DMA_INT_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U) /*!< timestamp trigger status flag */ -}enet_int_flag_enum; - -/* ENET interrupt flag clear */ -typedef enum -{ - /* ENET_DMA_STAT register */ - ENET_DMA_INT_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ - ENET_DMA_INT_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ - ENET_DMA_INT_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ - ENET_DMA_INT_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ - ENET_DMA_INT_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ - ENET_DMA_INT_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ - ENET_DMA_INT_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ - ENET_DMA_INT_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ - ENET_DMA_INT_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ - ENET_DMA_INT_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ - ENET_DMA_INT_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ - ENET_DMA_INT_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ - ENET_DMA_INT_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ - ENET_DMA_INT_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ - ENET_DMA_INT_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U) /*!< normal interrupt summary flag */ -}enet_int_flag_clear_enum; - -/* current RX/TX descriptor/buffer/descriptor table address get */ -typedef enum -{ - ENET_RX_DESC_TABLE = DMA_RDTADDR_REG_OFFSET, /*!< RX descriptor table */ - ENET_RX_CURRENT_DESC = DMA_CRDADDR_REG_OFFSET, /*!< current RX descriptor */ - ENET_RX_CURRENT_BUFFER = DMA_CRBADDR_REG_OFFSET, /*!< current RX buffer */ - ENET_TX_DESC_TABLE = DMA_TDTADDR_REG_OFFSET, /*!< TX descriptor table */ - ENET_TX_CURRENT_DESC = DMA_CTDADDR_REG_OFFSET, /*!< current TX descriptor */ - ENET_TX_CURRENT_BUFFER = DMA_CTBADDR_REG_OFFSET /*!< current TX buffer */ -}enet_desc_reg_enum; - -/* MAC statistics counter get */ -typedef enum -{ - ENET_MSC_TX_SCCNT = MSC_SCCNT_REG_OFFSET, /*!< MSC transmitted good frames after a single collision counter */ - ENET_MSC_TX_MSCCNT = MSC_MSCCNT_REG_OFFSET, /*!< MSC transmitted good frames after more than a single collision counter */ - ENET_MSC_TX_TGFCNT = MSC_TGFCNT_REG_OFFSET, /*!< MSC transmitted good frames counter */ - ENET_MSC_RX_RFCECNT = MSC_RFCECNT_REG_OFFSET, /*!< MSC received frames with CRC error counter */ - ENET_MSC_RX_RFAECNT = MSC_RFAECNT_REG_OFFSET, /*!< MSC received frames with alignment error counter */ - ENET_MSC_RX_RGUFCNT = MSC_RGUFCNT_REG_OFFSET /*!< MSC received good unicast frames counter */ -}enet_msc_counter_enum; - -/* function option, used for ENET initialization */ -typedef enum -{ - FORWARD_OPTION = BIT(0), /*!< configure the frame forward related parameters */ - DMABUS_OPTION = BIT(1), /*!< configure the DMA bus mode related parameters */ - DMA_MAXBURST_OPTION = BIT(2), /*!< configure the DMA max burst related parameters */ - DMA_ARBITRATION_OPTION = BIT(3), /*!< configure the DMA arbitration related parameters */ - STORE_OPTION = BIT(4), /*!< configure the store forward mode related parameters */ - DMA_OPTION = BIT(5), /*!< configure the DMA control related parameters */ - VLAN_OPTION = BIT(6), /*!< configure the VLAN tag related parameters */ - FLOWCTL_OPTION = BIT(7), /*!< configure the flow control related parameters */ - HASHH_OPTION = BIT(8), /*!< configure the hash list high 32-bit related parameters */ - HASHL_OPTION = BIT(9), /*!< configure the hash list low 32-bit related parameters */ - FILTER_OPTION = BIT(10), /*!< configure the frame filter control related parameters */ - HALFDUPLEX_OPTION = BIT(11), /*!< configure the halfduplex related parameters */ - TIMER_OPTION = BIT(12), /*!< configure the frame timer related parameters */ - INTERFRAMEGAP_OPTION = BIT(13) /*!< configure the inter frame gap related parameters */ -}enet_option_enum; - -/* phy mode and mac loopback configurations */ -typedef enum -{ - ENET_AUTO_NEGOTIATION = 0x01U, /*!< PHY auto negotiation */ - ENET_100M_FULLDUPLEX = (ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM), /*!< 100Mbit/s, full-duplex */ - ENET_100M_HALFDUPLEX = ENET_MAC_CFG_SPD , /*!< 100Mbit/s, half-duplex */ - ENET_10M_FULLDUPLEX = ENET_MAC_CFG_DPM, /*!< 10Mbit/s, full-duplex */ - ENET_10M_HALFDUPLEX = (uint32_t)0x00000000U, /*!< 10Mbit/s, half-duplex */ - ENET_LOOPBACKMODE = (ENET_MAC_CFG_LBM | ENET_MAC_CFG_DPM) /*!< MAC in loopback mode at the MII */ -}enet_mediamode_enum; - -/* IP frame checksum function */ -typedef enum -{ - ENET_NO_AUTOCHECKSUM = (uint32_t)0x00000000U, /*!< disable IP frame checksum function */ - ENET_AUTOCHECKSUM_DROP_FAILFRAMES = ENET_MAC_CFG_IPFCO, /*!< enable IP frame checksum function */ - ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES = (ENET_MAC_CFG_IPFCO|ENET_DMA_CTL_DTCERFD) /*!< enable IP frame checksum function, and the received frame - with only payload error but no other errors will not be dropped */ -}enet_chksumconf_enum; - -/* received frame filter function */ -typedef enum -{ - ENET_PROMISCUOUS_MODE = ENET_MAC_FRMF_PM, /*!< promiscuous mode enabled */ - ENET_RECEIVEALL = (int32_t)ENET_MAC_FRMF_FAR, /*!< all received frame are forwarded to application */ - ENET_BROADCAST_FRAMES_PASS = (uint32_t)0x00000000U, /*!< the address filters pass all received broadcast frames */ - ENET_BROADCAST_FRAMES_DROP = ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ -}enet_frmrecept_enum; - -/* register group value get */ -typedef enum -{ - ALL_MAC_REG = 0U, /*!< MAC register group */ - ALL_MSC_REG = 22U, /*!< MSC register group */ - ALL_PTP_REG = 33U, /*!< PTP register group */ - ALL_DMA_REG = 44U /*!< DMA register group */ -}enet_registers_type_enum; - -/* dma direction select */ -typedef enum -{ - ENET_DMA_TX = ENET_DMA_STAT_TP, /*!< DMA transmit direction */ - ENET_DMA_RX = ENET_DMA_STAT_RP /*!< DMA receive direction */ -}enet_dmadirection_enum; - -/* PHY operation direction select */ -typedef enum -{ - ENET_PHY_READ = (uint32_t)0x00000000, /*!< read PHY */ - ENET_PHY_WRITE = ENET_MAC_PHY_CTL_PW /*!< write PHY */ -}enet_phydirection_enum; - -/* register operation direction select */ -typedef enum -{ - ENET_REG_READ, /*!< read register */ - ENET_REG_WRITE /*!< write register */ -}enet_regdirection_enum; - -/* ENET MAC addresses */ -typedef enum -{ - ENET_MAC_ADDRESS0 = ((uint32_t)0x00000000), /*!< MAC address0 */ - ENET_MAC_ADDRESS1 = ((uint32_t)0x00000008), /*!< MAC address1 */ - ENET_MAC_ADDRESS2 = ((uint32_t)0x00000010), /*!< MAC address2 */ - ENET_MAC_ADDRESS3 = ((uint32_t)0x00000018) /*!< MAC address3 */ -}enet_macaddress_enum; - -/* descriptor information */ -typedef enum -{ - TXDESC_COLLISION_COUNT, /*!< the number of collisions occurred before the frame was transmitted */ - TXDESC_BUFFER_1_ADDR, /*!< transmit frame buffer 1 address */ - RXDESC_FRAME_LENGTH, /*!< the byte length of the received frame that was transferred to the buffer */ - RXDESC_BUFFER_1_SIZE, /*!< receive buffer 1 size */ - RXDESC_BUFFER_2_SIZE, /*!< receive buffer 2 size */ - RXDESC_BUFFER_1_ADDR /*!< receive frame buffer 1 address */ -}enet_descstate_enum; - -/* MSC counters preset mode */ -typedef enum -{ - ENET_MSC_PRESET_NONE = 0U, /*!< do not preset MSC counter */ - ENET_MSC_PRESET_HALF = ENET_MSC_CTL_PMC, /*!< preset all MSC counters to almost-half(0x7FFF FFF0) value */ - ENET_MSC_PRESET_FULL = ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM /*!< preset all MSC counters to almost-full(0xFFFF FFF0) value */ -}enet_msc_preset_enum; - -typedef enum{ - ENET_CKNT_ORDINARY = PTP_TSCTL_CKNT(0), /*!< type of ordinary clock node type for timestamp */ - ENET_CKNT_BOUNDARY = PTP_TSCTL_CKNT(1), /*!< type of boundary clock node type for timestamp */ - ENET_CKNT_END_TO_END = PTP_TSCTL_CKNT(2), /*!< type of end-to-end transparent clock node type for timestamp */ - ENET_CKNT_PEER_TO_PEER = PTP_TSCTL_CKNT(3), /*!< type of peer-to-peer transparent clock node type for timestamp */ - ENET_PTP_SYSTIME_INIT = ENET_PTP_TSCTL_TMSSTI, /*!< timestamp initialize */ - ENET_PTP_SYSTIME_UPDATE = ENET_PTP_TSCTL_TMSSTU, /*!< timestamp update */ - ENET_PTP_ADDEND_UPDATE = ENET_PTP_TSCTL_TMSARU, /*!< addend register update */ - ENET_PTP_FINEMODE = (int32_t)(ENET_PTP_TSCTL_TMSFCU| BIT(31)), /*!< the system timestamp uses the fine method for updating */ - ENET_PTP_COARSEMODE = ENET_PTP_TSCTL_TMSFCU, /*!< the system timestamp uses the coarse method for updating */ - ENET_SUBSECOND_DIGITAL_ROLLOVER = (int32_t)(ENET_PTP_TSCTL_SCROM | BIT(31)), /*!< digital rollover mode */ - ENET_SUBSECOND_BINARY_ROLLOVER = ENET_PTP_TSCTL_SCROM, /*!< binary rollover mode */ - ENET_SNOOPING_PTP_VERSION_2 = (int32_t)(ENET_PTP_TSCTL_PFSV| BIT(31)), /*!< version 2 */ - ENET_SNOOPING_PTP_VERSION_1 = ENET_PTP_TSCTL_PFSV, /*!< version 1 */ - ENET_EVENT_TYPE_MESSAGES_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_ETMSEN| BIT(31)), /*!< only event type messages are taken snapshot */ - ENET_ALL_TYPE_MESSAGES_SNAPSHOT = ENET_PTP_TSCTL_ETMSEN, /*!< all type messages are taken snapshot except announce, management and signaling message */ - ENET_MASTER_NODE_MESSAGE_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_MNMSEN| BIT(31)), /*!< snapshot is only take for master node message */ - ENET_SLAVE_NODE_MESSAGE_SNAPSHOT = ENET_PTP_TSCTL_MNMSEN /*!< snapshot is only taken for slave node message */ -}enet_ptp_function_enum; - -/* structure for initialization of the ENET */ -typedef struct -{ - uint32_t option_enable; /*!< select which function to configure */ - uint32_t forward_frame; /*!< frame forward related parameters */ - uint32_t dmabus_mode; /*!< DMA bus mode related parameters */ - uint32_t dma_maxburst; /*!< DMA max burst related parameters */ - uint32_t dma_arbitration; /*!< DMA Tx and Rx arbitration related parameters */ - uint32_t store_forward_mode; /*!< store forward mode related parameters */ - uint32_t dma_function; /*!< DMA control related parameters */ - uint32_t vlan_config; /*!< VLAN tag related parameters */ - uint32_t flow_control; /*!< flow control related parameters */ - uint32_t hashtable_high; /*!< hash list high 32-bit related parameters */ - uint32_t hashtable_low; /*!< hash list low 32-bit related parameters */ - uint32_t framesfilter_mode; /*!< frame filter control related parameters */ - uint32_t halfduplex_param; /*!< halfduplex related parameters */ - uint32_t timer_config; /*!< frame timer related parameters */ - uint32_t interframegap; /*!< inter frame gap related parameters */ -}enet_initpara_struct; - -/* structure for ENET DMA desciptors */ -typedef struct -{ - uint32_t status; /*!< status */ - uint32_t control_buffer_size; /*!< control and buffer1, buffer2 lengths */ - uint32_t buffer1_addr; /*!< buffer1 address pointer/timestamp low */ - uint32_t buffer2_next_desc_addr; /*!< buffer2 or next descriptor address pointer/timestamp high */ - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE - uint32_t extended_status; /*!< extended status */ - uint32_t reserved; /*!< reserved */ - uint32_t timestamp_low; /*!< timestamp low */ - uint32_t timestamp_high; /*!< timestamp high */ -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -} enet_descriptors_struct; - -/* structure of PTP system time */ -typedef struct -{ - uint32_t second; /*!< second of system time */ - uint32_t nanosecond; /*!< nanosecond of system time */ - uint32_t sign; /*!< sign of system time */ -}enet_ptp_systime_struct; - -/* mac_cfg register value */ -#define MAC_CFG_BOL(regval) (BITS(5,6) & ((uint32_t)(regval) << 5)) /*!< write value to ENET_MAC_CFG_BOL bit field */ -#define ENET_BACKOFFLIMIT_10 MAC_CFG_BOL(0) /*!< min (n, 10) */ -#define ENET_BACKOFFLIMIT_8 MAC_CFG_BOL(1) /*!< min (n, 8) */ -#define ENET_BACKOFFLIMIT_4 MAC_CFG_BOL(2) /*!< min (n, 4) */ -#define ENET_BACKOFFLIMIT_1 MAC_CFG_BOL(3) /*!< min (n, 1) */ - -#define MAC_CFG_IGBS(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_MAC_CFG_IGBS bit field */ -#define ENET_INTERFRAMEGAP_96BIT MAC_CFG_IGBS(0) /*!< minimum 96 bit times */ -#define ENET_INTERFRAMEGAP_88BIT MAC_CFG_IGBS(1) /*!< minimum 88 bit times */ -#define ENET_INTERFRAMEGAP_80BIT MAC_CFG_IGBS(2) /*!< minimum 80 bit times */ -#define ENET_INTERFRAMEGAP_72BIT MAC_CFG_IGBS(3) /*!< minimum 72 bit times */ -#define ENET_INTERFRAMEGAP_64BIT MAC_CFG_IGBS(4) /*!< minimum 64 bit times */ -#define ENET_INTERFRAMEGAP_56BIT MAC_CFG_IGBS(5) /*!< minimum 56 bit times */ -#define ENET_INTERFRAMEGAP_48BIT MAC_CFG_IGBS(6) /*!< minimum 48 bit times */ -#define ENET_INTERFRAMEGAP_40BIT MAC_CFG_IGBS(7) /*!< minimum 40 bit times */ - -#define ENET_TYPEFRAME_CRC_DROP_ENABLE ENET_MAC_CFG_TFCD /*!< FCS field(last 4 bytes) of frame will be dropped before forwarding */ -#define ENET_TYPEFRAME_CRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< FCS field(last 4 bytes) of frame will not be dropped before forwarding */ -#define ENET_TYPEFRAME_CRC_DROP ENET_MAC_CFG_TFCD /*!< the function that FCS field(last 4 bytes) of frame will be dropped before forwarding */ - -#define ENET_WATCHDOG_ENABLE ((uint32_t)0x00000000U) /*!< the MAC allows no more than 2048 bytes of the frame being received */ -#define ENET_WATCHDOG_DISABLE ENET_MAC_CFG_WDD /*!< the MAC disables the watchdog timer on the receiver, and can receive frames of up to 16384 bytes */ - -#define ENET_JABBER_ENABLE ((uint32_t)0x00000000U) /*!< the maximum transmission byte is 2048 */ -#define ENET_JABBER_DISABLE ENET_MAC_CFG_JBD /*!< the maximum transmission byte can be 16384 */ - -#define ENET_CARRIERSENSE_ENABLE ((uint32_t)0x00000000U) /*!< the MAC transmitter generates carrier sense error and aborts the transmission */ -#define ENET_CARRIERSENSE_DISABLE ENET_MAC_CFG_CSD /*!< the MAC transmitter ignores the MII CRS signal during frame transmission in half-duplex mode */ - -#define ENET_SPEEDMODE_10M ((uint32_t)0x00000000U) /*!< 10 Mbit/s */ -#define ENET_SPEEDMODE_100M ENET_MAC_CFG_SPD /*!< 100 Mbit/s */ - -#define ENET_RECEIVEOWN_ENABLE ((uint32_t)0x00000000U) /*!< the MAC receives all packets that are given by the PHY while transmitting */ -#define ENET_RECEIVEOWN_DISABLE ENET_MAC_CFG_ROD /*!< the MAC disables the reception of frames in half-duplex mode */ - -#define ENET_LOOPBACKMODE_ENABLE ENET_MAC_CFG_LBM /*!< the MAC operates in loopback mode at the MII */ -#define ENET_LOOPBACKMODE_DISABLE ((uint32_t)0x00000000U) /*!< the MAC operates in normal mode */ - -#define ENET_MODE_FULLDUPLEX ENET_MAC_CFG_DPM /*!< full-duplex mode enable */ -#define ENET_MODE_HALFDUPLEX ((uint32_t)0x00000000U) /*!< half-duplex mode enable */ - -#define ENET_CHECKSUMOFFLOAD_ENABLE ENET_MAC_CFG_IPFCO /*!< IP frame checksum offload function enabled for received IP frame */ -#define ENET_CHECKSUMOFFLOAD_DISABLE ((uint32_t)0x00000000U) /*!< the checksum offload function in the receiver is disabled */ - -#define ENET_RETRYTRANSMISSION_ENABLE ((uint32_t)0x00000000U) /*!< the MAC attempts retries up to 16 times based on the settings of BOL*/ -#define ENET_RETRYTRANSMISSION_DISABLE ENET_MAC_CFG_RTD /*!< the MAC attempts only 1 transmission */ - -#define ENET_AUTO_PADCRC_DROP_ENABLE ENET_MAC_CFG_APCD /*!< the MAC strips the Pad/FCS field on received frames */ -#define ENET_AUTO_PADCRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< the MAC forwards all received frames without modify it */ -#define ENET_AUTO_PADCRC_DROP ENET_MAC_CFG_APCD /*!< the function of the MAC strips the Pad/FCS field on received frames */ - -#define ENET_DEFERRALCHECK_ENABLE ENET_MAC_CFG_DFC /*!< the deferral check function is enabled in the MAC */ -#define ENET_DEFERRALCHECK_DISABLE ((uint32_t)0x00000000U) /*!< the deferral check function is disabled */ - -/* mac_frmf register value */ -#define MAC_FRMF_PCFRM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_FRMF_PCFRM bit field */ -#define ENET_PCFRM_PREVENT_ALL MAC_FRMF_PCFRM(0) /*!< MAC prevents all control frames from reaching the application */ -#define ENET_PCFRM_PREVENT_PAUSEFRAME MAC_FRMF_PCFRM(1) /*!< MAC only forwards all other control frames except pause control frame */ -#define ENET_PCFRM_FORWARD_ALL MAC_FRMF_PCFRM(2) /*!< MAC forwards all control frames to application even if they fail the address filter */ -#define ENET_PCFRM_FORWARD_FILTERED MAC_FRMF_PCFRM(3) /*!< MAC forwards control frames that only pass the address filter */ - -#define ENET_RX_FILTER_DISABLE ENET_MAC_FRMF_FAR /*!< all received frame are forwarded to application */ -#define ENET_RX_FILTER_ENABLE ((uint32_t)0x00000000U) /*!< only the frame passed the filter can be forwarded to application */ - -#define ENET_SRC_FILTER_NORMAL_ENABLE ENET_MAC_FRMF_SAFLT /*!< filter source address */ -#define ENET_SRC_FILTER_INVERSE_ENABLE (ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT) /*!< inverse source address filtering result */ -#define ENET_SRC_FILTER_DISABLE ((uint32_t)0x00000000U) /*!< source address function in filter disable */ -#define ENET_SRC_FILTER ENET_MAC_FRMF_SAFLT /*!< filter source address function */ -#define ENET_SRC_FILTER_INVERSE ENET_MAC_FRMF_SAIFLT /*!< inverse source address filtering result function */ - -#define ENET_BROADCASTFRAMES_ENABLE ((uint32_t)0x00000000U) /*!< the address filters pass all received broadcast frames */ -#define ENET_BROADCASTFRAMES_DISABLE ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ - -#define ENET_DEST_FILTER_INVERSE_ENABLE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result */ -#define ENET_DEST_FILTER_INVERSE_DISABLE ((uint32_t)0x00000000U) /*!< not inverse DA filtering result */ -#define ENET_DEST_FILTER_INVERSE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result function */ - -#define ENET_PROMISCUOUS_ENABLE ENET_MAC_FRMF_PM /*!< promiscuous mode enabled */ -#define ENET_PROMISCUOUS_DISABLE ((uint32_t)0x00000000U) /*!< promiscuous mode disabled */ - -#define ENET_MULTICAST_FILTER_HASH_OR_PERFECT (ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT) /*!< pass multicast frames that match either the perfect or the hash filtering */ -#define ENET_MULTICAST_FILTER_HASH ENET_MAC_FRMF_HMF /*!< pass multicast frames that match the hash filtering */ -#define ENET_MULTICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass multicast frames that match the perfect filtering */ -#define ENET_MULTICAST_FILTER_NONE ENET_MAC_FRMF_MFD /*!< all multicast frames are passed */ -#define ENET_MULTICAST_FILTER_PASS ENET_MAC_FRMF_MFD /*!< pass all multicast frames function */ -#define ENET_MULTICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HMF /*!< HASH multicast filter function */ -#define ENET_FILTER_MODE_EITHER ENET_MAC_FRMF_HPFLT /*!< HASH or perfect filter function */ - -#define ENET_UNICAST_FILTER_EITHER (ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_HPFLT) /*!< pass unicast frames that match either the perfect or the hash filtering */ -#define ENET_UNICAST_FILTER_HASH ENET_MAC_FRMF_HUF /*!< pass unicast frames that match the hash filtering */ -#define ENET_UNICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass unicast frames that match the perfect filtering */ -#define ENET_UNICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HUF /*!< HASH unicast filter function */ - -/* mac_phy_ctl register value */ -#define MAC_PHY_CTL_CLR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_MAC_PHY_CTL_CLR bit field */ -#define ENET_MDC_HCLK_DIV42 MAC_PHY_CTL_CLR(0) /*!< HCLK:60-100 MHz; MDC clock= HCLK/42 */ -#define ENET_MDC_HCLK_DIV62 MAC_PHY_CTL_CLR(1) /*!< HCLK:100-150 MHz; MDC clock= HCLK/62 */ -#define ENET_MDC_HCLK_DIV16 MAC_PHY_CTL_CLR(2) /*!< HCLK:20-35 MHz; MDC clock= HCLK/16 */ -#define ENET_MDC_HCLK_DIV26 MAC_PHY_CTL_CLR(3) /*!< HCLK:35-60 MHz; MDC clock= HCLK/26 */ -#define ENET_MDC_HCLK_DIV102 MAC_PHY_CTL_CLR(4) /*!< HCLK:150-240 MHz; MDC clock= HCLK/102 */ - -#define MAC_PHY_CTL_PR(regval) (BITS(6,10) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_PHY_CTL_PR bit field */ - -#define MAC_PHY_CTL_PA(regval) (BITS(11,15) & ((uint32_t)(regval) << 11)) /*!< write value to ENET_MAC_PHY_CTL_PA bit field */ - -/* mac_phy_data register value */ -#define MAC_PHY_DATA_PD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_PHY_DATA_PD bit field */ - -/* mac_fctl register value */ -#define MAC_FCTL_PLTS(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) /*!< write value to ENET_MAC_FCTL_PLTS bit field */ -#define ENET_PAUSETIME_MINUS4 MAC_FCTL_PLTS(0) /*!< pause time minus 4 slot times */ -#define ENET_PAUSETIME_MINUS28 MAC_FCTL_PLTS(1) /*!< pause time minus 28 slot times */ -#define ENET_PAUSETIME_MINUS144 MAC_FCTL_PLTS(2) /*!< pause time minus 144 slot times */ -#define ENET_PAUSETIME_MINUS256 MAC_FCTL_PLTS(3) /*!< pause time minus 256 slot times */ - -#define ENET_ZERO_QUANTA_PAUSE_ENABLE ((uint32_t)0x00000000U) /*!< enable the automatic zero-quanta generation function */ -#define ENET_ZERO_QUANTA_PAUSE_DISABLE ENET_MAC_FCTL_DZQP /*!< disable the automatic zero-quanta generation function */ -#define ENET_ZERO_QUANTA_PAUSE ENET_MAC_FCTL_DZQP /*!< the automatic zero-quanta generation function */ - -#define ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT ENET_MAC_FCTL_UPFDT /*!< besides the unique multicast address, MAC also use the MAC0 address to detect pause frame */ -#define ENET_UNIQUE_PAUSEDETECT ((uint32_t)0x00000000U) /*!< only the unique multicast address for pause frame which is specified in IEEE802.3 can be detected */ - -#define ENET_RX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_RFCEN /*!< enable decoding function for the received pause frame and process it */ -#define ENET_RX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< decode function for pause frame is disabled */ -#define ENET_RX_FLOWCONTROL ENET_MAC_FCTL_RFCEN /*!< decoding function for the received pause frame and process it */ - -#define ENET_TX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_TFCEN /*!< enable the flow control operation in the MAC */ -#define ENET_TX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< disable the flow control operation in the MAC */ -#define ENET_TX_FLOWCONTROL ENET_MAC_FCTL_TFCEN /*!< the flow control operation in the MAC */ - -#define ENET_BACK_PRESSURE_ENABLE ENET_MAC_FCTL_FLCBBKPA /*!< enable the back pressure operation in the MAC */ -#define ENET_BACK_PRESSURE_DISABLE ((uint32_t)0x00000000U) /*!< disable the back pressure operation in the MAC */ -#define ENET_BACK_PRESSURE ENET_MAC_FCTL_FLCBBKPA /*!< the back pressure operation in the MAC */ - -#define MAC_FCTL_PTM(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_MAC_FCTL_PTM bit field */ -/* mac_vlt register value */ -#define MAC_VLT_VLTI(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_VLT_VLTI bit field */ - -#define ENET_VLANTAGCOMPARISON_12BIT ENET_MAC_VLT_VLTC /*!< only low 12 bits of the VLAN tag are used for comparison */ -#define ENET_VLANTAGCOMPARISON_16BIT ((uint32_t)0x00000000U) /*!< all 16 bits of the VLAN tag are used for comparison */ - -/* mac_wum register value */ -#define ENET_WUM_FLAG_WUFFRPR ENET_MAC_WUM_WUFFRPR /*!< wakeup frame filter register poniter reset */ -#define ENET_WUM_FLAG_WUFR ENET_MAC_WUM_WUFR /*!< wakeup frame received */ -#define ENET_WUM_FLAG_MPKR ENET_MAC_WUM_MPKR /*!< magic packet received */ -#define ENET_WUM_POWER_DOWN ENET_MAC_WUM_PWD /*!< power down mode */ -#define ENET_WUM_MAGIC_PACKET_FRAME ENET_MAC_WUM_MPEN /*!< enable a wakeup event due to magic packet reception */ -#define ENET_WUM_WAKE_UP_FRAME ENET_MAC_WUM_WFEN /*!< enable a wakeup event due to wakeup frame reception */ -#define ENET_WUM_GLOBAL_UNICAST ENET_MAC_WUM_GU /*!< any received unicast frame passed filter is considered to be a wakeup frame */ - -/* mac_dbg register value */ -#define ENET_MAC_RECEIVER_NOT_IDLE ENET_MAC_DBG_MRNI /*!< MAC receiver is not in idle state */ -#define ENET_RX_ASYNCHRONOUS_FIFO_STATE ENET_MAC_DBG_RXAFS /*!< Rx asynchronous FIFO status */ -#define ENET_RXFIFO_WRITING ENET_MAC_DBG_RXFW /*!< RxFIFO is doing write operation */ -#define ENET_RXFIFO_READ_STATUS ENET_MAC_DBG_RXFRS /*!< RxFIFO read operation status */ -#define ENET_RXFIFO_STATE ENET_MAC_DBG_RXFS /*!< RxFIFO state */ -#define ENET_MAC_TRANSMITTER_NOT_IDLE ENET_MAC_DBG_MTNI /*!< MAC transmitter is not in idle state */ -#define ENET_MAC_TRANSMITTER_STATUS ENET_MAC_DBG_SOMT /*!< status of MAC transmitter */ -#define ENET_PAUSE_CONDITION_STATUS ENET_MAC_DBG_PCS /*!< pause condition status */ -#define ENET_TXFIFO_READ_STATUS ENET_MAC_DBG_TXFRS /*!< TxFIFO read operation status */ -#define ENET_TXFIFO_WRITING ENET_MAC_DBG_TXFW /*!< TxFIFO is doing write operation */ -#define ENET_TXFIFO_NOT_EMPTY ENET_MAC_DBG_TXFNE /*!< TxFIFO is not empty */ -#define ENET_TXFIFO_FULL ENET_MAC_DBG_TXFF /*!< TxFIFO is full */ - -#define GET_MAC_DBG_RXAFS(regval) GET_BITS((regval),1,2) /*!< get value of ENET_MAC_DBG_RXAFS bit field */ - -#define GET_MAC_DBG_RXFRS(regval) GET_BITS((regval),5,6) /*!< get value of ENET_MAC_DBG_RXFRS bit field */ - -#define GET_MAC_DBG_RXFS(regval) GET_BITS((regval),8,9) /*!< get value of ENET_MAC_DBG_RXFS bit field */ - -#define GET_MAC_DBG_SOMT(regval) GET_BITS((regval),17,18) /*!< get value of ENET_MAC_DBG_SOMT bit field */ - -#define GET_MAC_DBG_TXFRS(regval) GET_BITS((regval),20,21) /*!< get value of ENET_MAC_DBG_TXFRS bit field */ - -/* mac_addr0h register value */ -#define MAC_ADDR0H_ADDR0H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDR0H_ADDR0H bit field */ - -/* mac_addrxh register value, x = 1,2,3 */ -#define MAC_ADDR123H_ADDR123H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDRxH_ADDRxH(x=1,2,3) bit field */ - -#define ENET_ADDRESS_MASK_BYTE0 BIT(24) /*!< low register bits [7:0] */ -#define ENET_ADDRESS_MASK_BYTE1 BIT(25) /*!< low register bits [15:8] */ -#define ENET_ADDRESS_MASK_BYTE2 BIT(26) /*!< low register bits [23:16] */ -#define ENET_ADDRESS_MASK_BYTE3 BIT(27) /*!< low register bits [31:24] */ -#define ENET_ADDRESS_MASK_BYTE4 BIT(28) /*!< high register bits [7:0] */ -#define ENET_ADDRESS_MASK_BYTE5 BIT(29) /*!< high register bits [15:8] */ - -#define ENET_ADDRESS_FILTER_SA BIT(30) /*!< use MAC address[47:0] is to compare with the SA fields of the received frame */ -#define ENET_ADDRESS_FILTER_DA ((uint32_t)0x00000000) /*!< use MAC address[47:0] is to compare with the DA fields of the received frame */ - -/* mac_fcth register value */ -#define MAC_FCTH_RFA(regval) ((BITS(0,2) & ((uint32_t)(regval) << 0)) << 8) /*!< write value to ENET_MAC_FCTH_RFA bit field */ -#define ENET_ACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFA(0) /*!< threshold level is 256 bytes */ -#define ENET_ACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFA(1) /*!< threshold level is 512 bytes */ -#define ENET_ACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFA(2) /*!< threshold level is 768 bytes */ -#define ENET_ACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFA(3) /*!< threshold level is 1024 bytes */ -#define ENET_ACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFA(4) /*!< threshold level is 1280 bytes */ -#define ENET_ACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFA(5) /*!< threshold level is 1536 bytes */ -#define ENET_ACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFA(6) /*!< threshold level is 1792 bytes */ - -#define MAC_FCTH_RFD(regval) ((BITS(4,6) & ((uint32_t)(regval) << 4)) << 8) /*!< write value to ENET_MAC_FCTH_RFD bit field */ -#define ENET_DEACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFD(0) /*!< threshold level is 256 bytes */ -#define ENET_DEACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFD(1) /*!< threshold level is 512 bytes */ -#define ENET_DEACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFD(2) /*!< threshold level is 768 bytes */ -#define ENET_DEACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFD(3) /*!< threshold level is 1024 bytes */ -#define ENET_DEACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFD(4) /*!< threshold level is 1280 bytes */ -#define ENET_DEACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFD(5) /*!< threshold level is 1536 bytes */ -#define ENET_DEACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFD(6) /*!< threshold level is 1792 bytes */ - -/* msc_ctl register value */ -#define ENET_MSC_COUNTER_STOP_ROLLOVER ENET_MSC_CTL_CTSR /*!< counter stop rollover */ -#define ENET_MSC_RESET_ON_READ ENET_MSC_CTL_RTOR /*!< reset on read */ -#define ENET_MSC_COUNTERS_FREEZE ENET_MSC_CTL_MCFZ /*!< MSC counter freeze */ - -/* ptp_tsctl register value */ -#define ENET_RXTX_TIMESTAMP ENET_PTP_TSCTL_TMSEN /*!< enable timestamp function for transmit and receive frames */ -#define ENET_PTP_TIMESTAMP_INT ENET_PTP_TSCTL_TMSITEN /*!< timestamp interrupt trigger enable */ -#define ENET_ALL_RX_TIMESTAMP ENET_PTP_TSCTL_ARFSEN /*!< all received frames are taken snapshot */ -#define ENET_NONTYPE_FRAME_SNAPSHOT ENET_PTP_TSCTL_ESEN /*!< take snapshot when received non type frame */ -#define ENET_IPV6_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP6SEN /*!< take snapshot for IPv6 frame */ -#define ENET_IPV4_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP4SEN /*!< take snapshot for IPv4 frame */ -#define ENET_PTP_FRAME_USE_MACADDRESS_FILTER ENET_PTP_TSCTL_MAFEN /*!< enable MAC address1-3 to filter the PTP frame */ - -/* ptp_ssinc register value */ -#define PTP_SSINC_STMSSI(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_SSINC_STMSSI bit field */ - -/* ptp_tsl register value */ -#define GET_PTP_TSL_STMSS(regval) GET_BITS((uint32_t)(regval),0,30) /*!< get value of ENET_PTP_TSL_STMSS bit field */ - -#define ENET_PTP_TIME_POSITIVE ((uint32_t)0x00000000) /*!< time value is positive */ -#define ENET_PTP_TIME_NEGATIVE ENET_PTP_TSL_STS /*!< time value is negative */ - -#define GET_PTP_TSL_STS(regval) (((regval) & BIT(31)) >> (31U)) /*!< get value of ENET_PTP_TSL_STS bit field */ - -/* ptp_tsul register value */ -#define PTP_TSUL_TMSUSS(regval) (BITS(0,30) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_TSUL_TMSUSS bit field */ - -#define ENET_PTP_ADD_TO_TIME ((uint32_t)0x00000000) /*!< timestamp update value is added to system time */ -#define ENET_PTP_SUBSTRACT_FROM_TIME ENET_PTP_TSUL_TMSUPNS /*!< timestamp update value is subtracted from system time */ - -/* ptp_ppsctl register value */ -#define PTP_PPSCTL_PPSOFC(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_PPSCTL_PPSOFC bit field */ -#define ENET_PPSOFC_1HZ PTP_PPSCTL_PPSOFC(0) /*!< PPS output 1Hz frequency */ -#define ENET_PPSOFC_2HZ PTP_PPSCTL_PPSOFC(1) /*!< PPS output 2Hz frequency */ -#define ENET_PPSOFC_4HZ PTP_PPSCTL_PPSOFC(2) /*!< PPS output 4Hz frequency */ -#define ENET_PPSOFC_8HZ PTP_PPSCTL_PPSOFC(3) /*!< PPS output 8Hz frequency */ -#define ENET_PPSOFC_16HZ PTP_PPSCTL_PPSOFC(4) /*!< PPS output 16Hz frequency */ -#define ENET_PPSOFC_32HZ PTP_PPSCTL_PPSOFC(5) /*!< PPS output 32Hz frequency */ -#define ENET_PPSOFC_64HZ PTP_PPSCTL_PPSOFC(6) /*!< PPS output 64Hz frequency */ -#define ENET_PPSOFC_128HZ PTP_PPSCTL_PPSOFC(7) /*!< PPS output 128Hz frequency */ -#define ENET_PPSOFC_256HZ PTP_PPSCTL_PPSOFC(8) /*!< PPS output 256Hz frequency */ -#define ENET_PPSOFC_512HZ PTP_PPSCTL_PPSOFC(9) /*!< PPS output 512Hz frequency */ -#define ENET_PPSOFC_1024HZ PTP_PPSCTL_PPSOFC(10) /*!< PPS output 1024Hz frequency */ -#define ENET_PPSOFC_2048HZ PTP_PPSCTL_PPSOFC(11) /*!< PPS output 2048Hz frequency */ -#define ENET_PPSOFC_4096HZ PTP_PPSCTL_PPSOFC(12) /*!< PPS output 4096Hz frequency */ -#define ENET_PPSOFC_8192HZ PTP_PPSCTL_PPSOFC(13) /*!< PPS output 8192Hz frequency */ -#define ENET_PPSOFC_16384HZ PTP_PPSCTL_PPSOFC(14) /*!< PPS output 16384Hz frequency */ -#define ENET_PPSOFC_32768HZ PTP_PPSCTL_PPSOFC(15) /*!< PPS output 32768Hz frequency */ - -/* dma_bctl register value */ -#define DMA_BCTL_DPSL(regval) (BITS(2,6) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_DMA_BCTL_DPSL bit field */ -#define GET_DMA_BCTL_DPSL(regval) GET_BITS((regval),2,6) /*!< get value of ENET_DMA_BCTL_DPSL bit field */ - -#define ENET_ENHANCED_DESCRIPTOR ENET_DMA_BCTL_DFM /*!< enhanced mode descriptor */ -#define ENET_NORMAL_DESCRIPTOR ((uint32_t)0x00000000) /*!< normal mode descriptor */ - -#define DMA_BCTL_PGBL(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) /*!< write value to ENET_DMA_BCTL_PGBL bit field */ -#define ENET_PGBL_1BEAT DMA_BCTL_PGBL(1) /*!< maximum number of beats is 1 */ -#define ENET_PGBL_2BEAT DMA_BCTL_PGBL(2) /*!< maximum number of beats is 2 */ -#define ENET_PGBL_4BEAT DMA_BCTL_PGBL(4) /*!< maximum number of beats is 4 */ -#define ENET_PGBL_8BEAT DMA_BCTL_PGBL(8) /*!< maximum number of beats is 8 */ -#define ENET_PGBL_16BEAT DMA_BCTL_PGBL(16) /*!< maximum number of beats is 16 */ -#define ENET_PGBL_32BEAT DMA_BCTL_PGBL(32) /*!< maximum number of beats is 32 */ -#define ENET_PGBL_4xPGBL_4BEAT (DMA_BCTL_PGBL(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 4 */ -#define ENET_PGBL_4xPGBL_8BEAT (DMA_BCTL_PGBL(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 8 */ -#define ENET_PGBL_4xPGBL_16BEAT (DMA_BCTL_PGBL(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 16 */ -#define ENET_PGBL_4xPGBL_32BEAT (DMA_BCTL_PGBL(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 32 */ -#define ENET_PGBL_4xPGBL_64BEAT (DMA_BCTL_PGBL(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 64 */ -#define ENET_PGBL_4xPGBL_128BEAT (DMA_BCTL_PGBL(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 128 */ - -#define DMA_BCTL_RTPR(regval) (BITS(14,15) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_BCTL_RTPR bit field */ -#define ENET_ARBITRATION_RXTX_1_1 DMA_BCTL_RTPR(0) /*!< receive and transmit priority ratio is 1:1*/ -#define ENET_ARBITRATION_RXTX_2_1 DMA_BCTL_RTPR(1) /*!< receive and transmit priority ratio is 2:1*/ -#define ENET_ARBITRATION_RXTX_3_1 DMA_BCTL_RTPR(2) /*!< receive and transmit priority ratio is 3:1 */ -#define ENET_ARBITRATION_RXTX_4_1 DMA_BCTL_RTPR(3) /*!< receive and transmit priority ratio is 4:1 */ -#define ENET_ARBITRATION_RXPRIORTX ENET_DMA_BCTL_DAB /*!< RxDMA has higher priority than TxDMA */ - -#define ENET_FIXED_BURST_ENABLE ENET_DMA_BCTL_FB /*!< AHB can only use SINGLE/INCR4/INCR8/INCR16 during start of normal burst transfers */ -#define ENET_FIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB can use SINGLE/INCR burst transfer operations */ - -#define DMA_BCTL_RXDP(regval) (BITS(17,22) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_DMA_BCTL_RXDP bit field */ -#define ENET_RXDP_1BEAT DMA_BCTL_RXDP(1) /*!< maximum number of beats 1 */ -#define ENET_RXDP_2BEAT DMA_BCTL_RXDP(2) /*!< maximum number of beats 2 */ -#define ENET_RXDP_4BEAT DMA_BCTL_RXDP(4) /*!< maximum number of beats 4 */ -#define ENET_RXDP_8BEAT DMA_BCTL_RXDP(8) /*!< maximum number of beats 8 */ -#define ENET_RXDP_16BEAT DMA_BCTL_RXDP(16) /*!< maximum number of beats 16 */ -#define ENET_RXDP_32BEAT DMA_BCTL_RXDP(32) /*!< maximum number of beats 32 */ -#define ENET_RXDP_4xPGBL_4BEAT (DMA_BCTL_RXDP(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 4 */ -#define ENET_RXDP_4xPGBL_8BEAT (DMA_BCTL_RXDP(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 8 */ -#define ENET_RXDP_4xPGBL_16BEAT (DMA_BCTL_RXDP(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 16 */ -#define ENET_RXDP_4xPGBL_32BEAT (DMA_BCTL_RXDP(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 32 */ -#define ENET_RXDP_4xPGBL_64BEAT (DMA_BCTL_RXDP(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 64 */ -#define ENET_RXDP_4xPGBL_128BEAT (DMA_BCTL_RXDP(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 128 */ - -#define ENET_RXTX_DIFFERENT_PGBL ENET_DMA_BCTL_UIP /*!< RxDMA uses the RXDP[5:0], while TxDMA uses the PGBL[5:0] */ -#define ENET_RXTX_SAME_PGBL ((uint32_t)0x00000000) /*!< RxDMA/TxDMA uses PGBL[5:0] */ - -#define ENET_ADDRESS_ALIGN_ENABLE ENET_DMA_BCTL_AA /*!< enabled address-aligned */ -#define ENET_ADDRESS_ALIGN_DISABLE ((uint32_t)0x00000000) /*!< disable address-aligned */ - -#define ENET_MIXED_BURST_ENABLE ENET_DMA_BCTL_MB /*!< AHB master interface transfer burst length greater than 16 with INCR */ -#define ENET_MIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB master interface only transfer fixed burst length with 16 and below */ - -/* dma_stat register value */ -#define GET_DMA_STAT_RP(regval) GET_BITS((uint32_t)(regval),17,19) /*!< get value of ENET_DMA_STAT_RP bit field */ -#define ENET_RX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop rx command issued */ -#define ENET_RX_STATE_FETCHING BIT(17) /*!< fetching the Rx descriptor */ -#define ENET_RX_STATE_WAITING (BIT(17)|BIT(18)) /*!< waiting for receive packet */ -#define ENET_RX_STATE_SUSPENDED BIT(19) /*!< Rx descriptor unavailable */ -#define ENET_RX_STATE_CLOSING (BIT(17)|BIT(19)) /*!< closing receive descriptor */ -#define ENET_RX_STATE_QUEUING ENET_DMA_STAT_RP /*!< transferring the receive packet data from recevie buffer to host memory */ - -#define GET_DMA_STAT_TP(regval) GET_BITS((uint32_t)(regval),20,22) /*!< get value of ENET_DMA_STAT_TP bit field */ -#define ENET_TX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop Tx Command issued */ -#define ENET_TX_STATE_FETCHING BIT(20) /*!< fetching the Tx descriptor */ -#define ENET_TX_STATE_WAITING BIT(21) /*!< waiting for status */ -#define ENET_TX_STATE_READING (BIT(20)|BIT(21)) /*!< reading the data from host memory buffer and queuing it to transmit buffer */ -#define ENET_TX_STATE_SUSPENDED (BIT(21)|BIT(22)) /*!< Tx descriptor unavailabe or transmit buffer underflow */ -#define ENET_TX_STATE_CLOSING ENET_DMA_STAT_TP /*!< closing Tx descriptor */ - -#define GET_DMA_STAT_EB(regval) GET_BITS((uint32_t)(regval),23,25) /*!< get value of ENET_DMA_STAT_EB bit field */ -#define ENET_ERROR_TXDATA_TRANSFER BIT(23) /*!< error during data transfer by TxDMA or RxDMA */ -#define ENET_ERROR_READ_TRANSFER BIT(24) /*!< error during write transfer or read transfer */ -#define ENET_ERROR_DESC_ACCESS BIT(25) /*!< error during descriptor or buffer access */ - -/* dma_ctl register value */ -#define DMA_CTL_RTHC(regval) (BITS(3,4) & ((uint32_t)(regval) << 3)) /*!< write value to ENET_DMA_CTL_RTHC bit field */ -#define ENET_RX_THRESHOLD_64BYTES DMA_CTL_RTHC(0) /*!< threshold level is 64 Bytes */ -#define ENET_RX_THRESHOLD_32BYTES DMA_CTL_RTHC(1) /*!< threshold level is 32 Bytes */ -#define ENET_RX_THRESHOLD_96BYTES DMA_CTL_RTHC(2) /*!< threshold level is 96 Bytes */ -#define ENET_RX_THRESHOLD_128BYTES DMA_CTL_RTHC(3) /*!< threshold level is 128 Bytes */ - -#define DMA_CTL_TTHC(regval) (BITS(14,16) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_CTL_TTHC bit field */ -#define ENET_TX_THRESHOLD_64BYTES DMA_CTL_TTHC(0) /*!< threshold level is 64 Bytes */ -#define ENET_TX_THRESHOLD_128BYTES DMA_CTL_TTHC(1) /*!< threshold level is 128 Bytes */ -#define ENET_TX_THRESHOLD_192BYTES DMA_CTL_TTHC(2) /*!< threshold level is 192 Bytes */ -#define ENET_TX_THRESHOLD_256BYTES DMA_CTL_TTHC(3) /*!< threshold level is 256 Bytes */ -#define ENET_TX_THRESHOLD_40BYTES DMA_CTL_TTHC(4) /*!< threshold level is 40 Bytes */ -#define ENET_TX_THRESHOLD_32BYTES DMA_CTL_TTHC(5) /*!< threshold level is 32 Bytes */ -#define ENET_TX_THRESHOLD_24BYTES DMA_CTL_TTHC(6) /*!< threshold level is 24 Bytes */ -#define ENET_TX_THRESHOLD_16BYTES DMA_CTL_TTHC(7) /*!< threshold level is 16 Bytes */ - -#define ENET_TCPIP_CKSUMERROR_ACCEPT ENET_DMA_CTL_DTCERFD /*!< Rx frame with only payload error but no other errors will not be dropped */ -#define ENET_TCPIP_CKSUMERROR_DROP ((uint32_t)0x00000000) /*!< all error frames will be dropped when FERF = 0 */ - -#define ENET_RX_MODE_STOREFORWARD ENET_DMA_CTL_RSFD /*!< RxFIFO operates in store-and-forward mode */ -#define ENET_RX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< RxFIFO operates in cut-through mode */ - -#define ENET_FLUSH_RXFRAME_ENABLE ((uint32_t)0x00000000) /*!< RxDMA flushes all frames */ -#define ENET_FLUSH_RXFRAME_DISABLE ENET_DMA_CTL_DAFRF /*!< RxDMA does not flush any frames */ -#define ENET_NO_FLUSH_RXFRAME ENET_DMA_CTL_DAFRF /*!< RxDMA flushes frames function */ - -#define ENET_TX_MODE_STOREFORWARD ENET_DMA_CTL_TSFD /*!< TxFIFO operates in store-and-forward mode */ -#define ENET_TX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< TxFIFO operates in cut-through mode */ - -#define ENET_FORWARD_ERRFRAMES_ENABLE (ENET_DMA_CTL_FERF << 2) /*!< all frame received with error except runt error are forwarded to memory */ -#define ENET_FORWARD_ERRFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drop error frame */ -#define ENET_FORWARD_ERRFRAMES (ENET_DMA_CTL_FERF << 2) /*!< the function that all frame received with error except runt error are forwarded to memory */ - -#define ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE (ENET_DMA_CTL_FUF << 2) /*!< forward undersized good frames */ -#define ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drops all frames whose length is less than 64 bytes */ -#define ENET_FORWARD_UNDERSZ_GOODFRAMES (ENET_DMA_CTL_FUF << 2) /*!< the function that forwarding undersized good frames */ - -#define ENET_SECONDFRAME_OPT_ENABLE ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame mode enable*/ -#define ENET_SECONDFRAME_OPT_DISABLE ((uint32_t)0x00000000) /*!< TxDMA controller operate on second frame mode disable */ -#define ENET_SECONDFRAME_OPT ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame function */ -/* dma_mfbocnt register value */ -#define GET_DMA_MFBOCNT_MSFC(regval) GET_BITS((regval),0,15) /*!< get value of ENET_DMA_MFBOCNT_MSFC bit field */ - -#define GET_DMA_MFBOCNT_MSFA(regval) GET_BITS((regval),17,27) /*!< get value of ENET_DMA_MFBOCNT_MSFA bit field */ - -/* dma_rswdc register value */ -#define DMA_RSWDC_WDCFRS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_DMA_RSWDC_WDCFRS bit field */ - -/* dma tx descriptor tdes0 register value */ -#define TDES0_CONT(regval) (BITS(3,6) & ((uint32_t)(regval) << 3)) /*!< write value to ENET DMA TDES0 CONT bit field */ -#define GET_TDES0_COCNT(regval) GET_BITS((regval),3,6) /*!< get value of ENET DMA TDES0 CONT bit field */ - -#define TDES0_CM(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) /*!< write value to ENET DMA TDES0 CM bit field */ -#define ENET_CHECKSUM_DISABLE TDES0_CM(0) /*!< checksum insertion disabled */ -#define ENET_CHECKSUM_IPV4HEADER TDES0_CM(1) /*!< only IP header checksum calculation and insertion are enabled */ -#define ENET_CHECKSUM_TCPUDPICMP_SEGMENT TDES0_CM(2) /*!< TCP/UDP/ICMP checksum insertion calculated but pseudo-header */ -#define ENET_CHECKSUM_TCPUDPICMP_FULL TDES0_CM(3) /*!< TCP/UDP/ICMP checksum insertion fully calculated */ - -/* dma tx descriptor tdes1 register value */ -#define TDES1_TB1S(regval) (BITS(0,12) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA TDES1 TB1S bit field */ - -#define TDES1_TB2S(regval) (BITS(16,28) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA TDES1 TB2S bit field */ - -/* dma rx descriptor rdes0 register value */ -#define RDES0_FRML(regval) (BITS(16,29) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA RDES0 FRML bit field */ -#define GET_RDES0_FRML(regval) GET_BITS((regval),16,29) /*!< get value of ENET DMA RDES0 FRML bit field */ - -/* dma rx descriptor rdes1 register value */ -#define ENET_RECEIVE_COMPLETE_INT_ENABLE ((uint32_t)0x00000000U) /*!< RS bit immediately set after Rx completed */ -#define ENET_RECEIVE_COMPLETE_INT_DISABLE ENET_RDES1_DINTC /*!< RS bit not immediately set after Rx completed */ - -#define GET_RDES1_RB1S(regval) GET_BITS((regval),0,12) /*!< get value of ENET DMA RDES1 RB1S bit field */ - -#define GET_RDES1_RB2S(regval) GET_BITS((regval),16,28) /*!< get value of ENET DMA RDES1 RB2S bit field */ - -/* dma rx descriptor rdes4 register value */ -#define RDES4_IPPLDT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA RDES4 IPPLDT bit field */ -#define GET_RDES4_IPPLDT(regval) GET_BITS((regval),0,2) /*!< get value of ENET DMA RDES4 IPPLDT bit field */ - -#define RDES4_PTPMT(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) /*!< write value to ENET DMA RDES4 PTPMT bit field */ -#define GET_RDES4_PTPMT(regval) GET_BITS((regval),8,11) /*!< get value of ENET DMA RDES4 PTPMT bit field */ - -/* ENET register mask value */ -#define MAC_CFG_MASK ((uint32_t)0xFD30810FU) /*!< ENET_MAC_CFG register mask */ -#define MAC_FCTL_MASK ((uint32_t)0x0000FF41U) /*!< ENET_MAC_FCTL register mask */ -#define DMA_CTL_MASK ((uint32_t)0xF8DE3F23U) /*!< ENET_DMA_CTL register mask */ -#define DMA_BCTL_MASK ((uint32_t)0xF800007DU) /*!< ENET_DMA_BCTL register mask */ -#define ENET_MSC_PRESET_MASK (~(ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM)) /*!< ENET_MSC_CTL preset mask */ - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE -#define ETH_DMATXDESC_SIZE ((uint32_t)0x00000020U) /*!< TxDMA enhanced descriptor size */ -#define ETH_DMARXDESC_SIZE ((uint32_t)0x00000020U) /*!< RxDMA enhanced descriptor size */ -#else -#define ETH_DMATXDESC_SIZE ((uint32_t)0x00000010U) /*!< TxDMA descriptor size */ -#define ETH_DMARXDESC_SIZE ((uint32_t)0x00000010U) /*!< RxDMA descriptor size */ -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -/* ENET remote wake-up frame register length */ -#define ETH_WAKEUP_REGISTER_LENGTH 8U /*!< remote wake-up frame register length */ - -/* ENET frame size */ -#define ENET_MAX_FRAME_SIZE 1524U /*!< header + frame_extra + payload + CRC */ - -/* ENET delay timeout */ -#define ENET_DELAY_TO ((uint32_t)0x0004FFFFU) /*!< ENET delay timeout */ -#define ENET_RESET_TO ((uint32_t)0x000004FFU) /*!< ENET reset timeout */ - - - -/* function declarations */ -/* main function */ -/* deinitialize the ENET, and reset structure parameters for ENET initialization */ -void enet_deinit(void); -/* configure the parameters which are usually less cared for initialization */ -void enet_initpara_config(enet_option_enum option, uint32_t para); -/* initialize ENET peripheral with generally concerned parameters and the less cared parameters */ -ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept); -/* reset all core internal registers located in CLK_TX and CLK_RX */ -ErrStatus enet_software_reset(void); -/* check receive frame valid and return frame size */ -uint32_t enet_rxframe_size_get(void); -/* initialize the dma tx/rx descriptors's parameters in chain mode */ -void enet_descriptors_chain_init(enet_dmadirection_enum direction); -/* initialize the dma tx/rx descriptors's parameters in ring mode */ -void enet_descriptors_ring_init(enet_dmadirection_enum direction); -/* handle current received frame data to application buffer */ -ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize); -/* handle current received frame but without data copy to application buffer */ -#define ENET_NOCOPY_FRAME_RECEIVE() enet_frame_receive(NULL, 0U) -/* handle application buffer data to transmit it */ -ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length); -/* handle current transmit frame but without data copy from application buffer */ -#define ENET_NOCOPY_FRAME_TRANSMIT(len) enet_frame_transmit(NULL, (len)) -/* configure the transmit IP frame checksum offload calculation and insertion */ -ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum); -/* ENET Tx and Rx function enable (include MAC and DMA module) */ -void enet_enable(void); -/* ENET Tx and Rx function disable (include MAC and DMA module) */ -void enet_disable(void); -/* configure MAC address */ -void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]); -/* get MAC address */ -ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize); - -/* get the ENET MAC/MSC/PTP/DMA status flag */ -FlagStatus enet_flag_get(enet_flag_enum enet_flag); -/* clear the ENET DMA status flag */ -void enet_flag_clear(enet_flag_clear_enum enet_flag); -/* enable ENET MAC/MSC/DMA interrupt */ -void enet_interrupt_enable(enet_int_enum enet_int); -/* disable ENET MAC/MSC/DMA interrupt */ -void enet_interrupt_disable(enet_int_enum enet_int); -/* get ENET MAC/MSC/DMA interrupt flag */ -FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag); -/* clear ENET DMA interrupt flag */ -void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear); - -/* MAC function */ -/* ENET Tx function enable (include MAC and DMA module) */ -void enet_tx_enable(void); -/* ENET Tx function disable (include MAC and DMA module) */ -void enet_tx_disable(void); -/* ENET Rx function enable (include MAC and DMA module) */ -void enet_rx_enable(void); -/* ENET Rx function disable (include MAC and DMA module) */ -void enet_rx_disable(void); -/* put registers value into the application buffer */ -void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num); -/* get the enet debug status from the debug register */ -uint32_t enet_debug_status_get(uint32_t mac_debug); -/* enable the MAC address filter */ -void enet_address_filter_enable(enet_macaddress_enum mac_addr); -/* disable the MAC address filter */ -void enet_address_filter_disable(enet_macaddress_enum mac_addr); -/* configure the MAC address filter */ -void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type); -/* PHY interface configuration (configure SMI clock and reset PHY chip) */ -ErrStatus enet_phy_config(void); -/* write to/read from a PHY register */ -ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, uint16_t *pvalue); -/* enable the loopback function of phy chip */ -ErrStatus enet_phyloopback_enable(void); -/* disable the loopback function of phy chip */ -ErrStatus enet_phyloopback_disable(void); -/* enable ENET forward feature */ -void enet_forward_feature_enable(uint32_t feature); -/* disable ENET forward feature */ -void enet_forward_feature_disable(uint32_t feature); -/* enable ENET fliter feature */ -void enet_fliter_feature_enable(uint32_t feature); -/* disable ENET fliter feature */ -void enet_fliter_feature_disable(uint32_t feature); - -/* flow control function */ -/* generate the pause frame, ENET will send pause frame after enable transmit flow control */ -ErrStatus enet_pauseframe_generate(void); -/* configure the pause frame detect type */ -void enet_pauseframe_detect_config(uint32_t detect); -/* configure the pause frame parameters */ -void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold); -/* configure the threshold of the flow control(deactive and active threshold) */ -void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active); -/* enable ENET flow control feature */ -void enet_flowcontrol_feature_enable(uint32_t feature); -/* disable ENET flow control feature */ -void enet_flowcontrol_feature_disable(uint32_t feature); - -/* DMA function */ -/* get the dma transmit/receive process state */ -uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction); -/* poll the dma transmission/reception enable */ -void enet_dmaprocess_resume(enet_dmadirection_enum direction); -/* check and recover the Rx process */ -void enet_rxprocess_check_recovery(void); -/* flush the ENET transmit fifo, and wait until the flush operation completes */ -ErrStatus enet_txfifo_flush(void); -/* get the transmit/receive address of current descriptor, or current buffer, or descriptor table */ -uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get); -/* get the Tx or Rx descriptor information */ -uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get); -/* get the number of missed frames during receiving */ -void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop); - -/* descriptor function */ -/* get the bit flag of ENET dma descriptor */ -FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag); -/* set the bit flag of ENET dma tx descriptor */ -void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag); -/* clear the bit flag of ENET dma tx descriptor */ -void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag); -/* when receiving the completed, set RS bit in ENET_DMA_STAT register will immediately set */ -void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc); -/* when receiving the completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time */ -void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time); -/* drop current receive frame */ -void enet_rxframe_drop(void); -/* enable DMA feature */ -void enet_dma_feature_enable(uint32_t feature); -/* disable DMA feature */ -void enet_dma_feature_disable(uint32_t feature); - - -/* special enhanced mode function */ -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE -/* get the bit of extended status flag in ENET DMA descriptor */ -uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status); -/* configure descriptor to work in enhanced mode */ -void enet_desc_select_enhanced_mode(void); -/* initialize the dma Tx/Rx descriptors's parameters in enhanced chain mode with ptp function */ -void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction); -/* initialize the dma Tx/Rx descriptors's parameters in enhanced ring mode with ptp function */ -void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction); -/* receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode */ -ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); -/* handle current received frame but without data copy to application buffer in PTP enhanced mode */ -#define ENET_NOCOPY_PTPFRAME_RECEIVE_ENHANCED_MODE(ptr) enet_ptpframe_receive_enhanced_mode(NULL, 0U, (ptr)) -/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode */ -ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); -/* handle current transmit frame but without data copy from application buffer in PTP enhanced mode */ -#define ENET_NOCOPY_PTPFRAME_TRANSMIT_ENHANCED_MODE(len, ptr) enet_ptpframe_transmit_enhanced_mode(NULL, (len), (ptr)) - -#else - -/* configure descriptor to work in normal mode */ -void enet_desc_select_normal_mode(void); -/* initialize the dma Tx/Rx descriptors's parameters in normal chain mode with ptp function */ -void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); -/* initialize the dma Tx/Rx descriptors's parameters in normal ring mode with ptp function */ -void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); -/* receive a packet data with timestamp values to application buffer, when the DMA is in normal mode */ -ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); -/* handle current received frame but without data copy to application buffer in PTP normal mode */ -#define ENET_NOCOPY_PTPFRAME_RECEIVE_NORMAL_MODE(ptr) enet_ptpframe_receive_normal_mode(NULL, 0U, (ptr)) -/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode */ -ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); -/* handle current transmit frame but without data copy from application buffer in PTP normal mode */ -#define ENET_NOCOPY_PTPFRAME_TRANSMIT_NORMAL_MODE(len, ptr) enet_ptpframe_transmit_normal_mode(NULL, (len), (ptr)) - -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -/* WUM function */ -/* wakeup frame filter register pointer reset */ -void enet_wum_filter_register_pointer_reset(void); -/* set the remote wakeup frame registers */ -void enet_wum_filter_config(uint32_t pdata[]); -/* enable wakeup management features */ -void enet_wum_feature_enable(uint32_t feature); -/* disable wakeup management features */ -void enet_wum_feature_disable(uint32_t feature); - -/* MSC function */ -/* reset the MAC statistics counters */ -void enet_msc_counters_reset(void); -/* enable the MAC statistics counter features */ -void enet_msc_feature_enable(uint32_t feature); -/* disable the MAC statistics counter features */ -void enet_msc_feature_disable(uint32_t feature); -/* configure MAC statistics counters preset mode */ -void enet_msc_counters_preset_config(enet_msc_preset_enum mode); -/* get MAC statistics counter */ -uint32_t enet_msc_counters_get(enet_msc_counter_enum counter); - -/* PTP function */ -/* change subsecond to nanosecond */ -uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond); -/* change nanosecond to subsecond */ -uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond); -/* enable the PTP features */ -void enet_ptp_feature_enable(uint32_t feature); -/* disable the PTP features */ -void enet_ptp_feature_disable(uint32_t feature); -/* configure the PTP timestamp function */ -ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func); -/* configure the PTP system time subsecond increment value */ -void enet_ptp_subsecond_increment_config(uint32_t subsecond); -/* adjusting the PTP clock frequency only in fine update mode */ -void enet_ptp_timestamp_addend_config(uint32_t add); -/* initializing or adding/subtracting to second of the PTP system time */ -void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond); -/* configure the PTP expected target time */ -void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond); -/* get the PTP current system time */ -void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct); -/* configure the PPS output frequency */ -void enet_ptp_pps_output_frequency_config(uint32_t freq); -/* configure and start PTP timestamp counter */ -void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg); -/* adjust frequency in fine method by configure addend register */ -void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg); -/* update system time in coarse method */ -void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct); -/* set system time in fine method */ -void enet_ptp_finecorrection_settime(enet_ptp_systime_struct * systime_struct); -/* get the ptp flag status */ -FlagStatus enet_ptp_flag_get(uint32_t flag); - -/* internal function */ -/* reset the ENET initpara struct, call it before using enet_initpara_config() */ -void enet_initpara_reset(void); -#ifdef USE_DELAY -/* user can provide more timing precise _ENET_DELAY_ function */ -#define _ENET_DELAY_ delay_ms -#else -/* default _ENET_DELAY_ function with less precise timing */ -#define _ENET_DELAY_ enet_delay -#endif - -#endif /* GD32F5XX_ENET_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h deleted file mode 100644 index 988899456ee..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exmc.h +++ /dev/null @@ -1,812 +0,0 @@ -/*! - \file gd32f5xx_exmc.h - \brief definitions for the EXMC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_EXMC_H -#define GD32F5XX_EXMC_H - -#include "gd32f5xx.h" - -/* EXMC definitions */ -#define EXMC (EXMC_BASE) /*!< EXMC register base address */ -#define EXMC_NOR_PSRAM (EXMC_BASE - 0x40000000U) /*!< EXMC NOR/PSRAM base address */ -#define EXMC_NAND (EXMC_BASE - 0x30000000U) /*!< EXMC NAND base address */ -#define EXMC_PCCARD (EXMC_BASE - 0x10000000U) /*!< EXMC PC card base address */ -#define EXMC_SDRAM (EXMC_BASE + 0x20000000U) /*!< EXMC SDRAM base address */ - -/* registers definitions */ -/* NOR/PSRAM */ -#define EXMC_SNCTL0 REG32(EXMC + 0x00000000U) /*!< EXMC SRAM/NOR flash control register for region0 */ -#define EXMC_SNTCFG0 REG32(EXMC + 0x00000004U) /*!< EXMC SRAM/NOR flash timing configuration register for region0 */ -#define EXMC_SNWTCFG0 REG32(EXMC + 0x00000104U) /*!< EXMC SRAM/NOR flash write timing configuration register for region0 */ - -#define EXMC_SNCTL1 REG32(EXMC + 0x00000008U) /*!< EXMC SRAM/NOR flash control register for region1 */ -#define EXMC_SNTCFG1 REG32(EXMC + 0x0000000CU) /*!< EXMC SRAM/NOR flash timing configuration register for region1 */ -#define EXMC_SNWTCFG1 REG32(EXMC + 0x0000010CU) /*!< EXMC SRAM/NOR flash write timing configuration register for region1 */ - -#define EXMC_SNCTL2 REG32(EXMC + 0x00000010U) /*!< EXMC SRAM/NOR flash control register for region2 */ -#define EXMC_SNTCFG2 REG32(EXMC + 0x00000014U) /*!< EXMC SRAM/NOR flash timing configuration register for region2 */ -#define EXMC_SNWTCFG2 REG32(EXMC + 0x00000114U) /*!< EXMC SRAM/NOR flash write timing configuration register for region2 */ - -#define EXMC_SNCTL3 REG32(EXMC + 0x00000018U) /*!< EXMC SRAM/NOR flash control register for region3 */ -#define EXMC_SNTCFG3 REG32(EXMC + 0x0000001CU) /*!< EXMC SRAM/NOR flash timing configuration register for region3 */ -#define EXMC_SNWTCFG3 REG32(EXMC + 0x0000011CU) /*!< EXMC SRAM/NOR flash write timing configuration register for region3 */ - -#define EXMC_SNLATDEC0 REG32(EXMC + 0x00000300U) /*!< EXMC SRAM/NOR flash data latency decrease register0 */ -#define EXMC_SNLATDEC1 REG32(EXMC + 0x00000304U) /*!< EXMC SRAM/NOR flash data latency decrease register1 */ -#define EXMC_SNLATDEC2 REG32(EXMC + 0x00000308U) /*!< EXMC SRAM/NOR flash data latency decrease register2 */ -#define EXMC_SNLATDEC3 REG32(EXMC + 0x0000030CU) /*!< EXMC SRAM/NOR flash data latency decrease register3 */ - -/* NAND/PC card */ -#define EXMC_NPCTL1 REG32(EXMC + 0x00000060U) /*!< EXMC NAND/PC card control register for bank1 */ -#define EXMC_NPINTEN1 REG32(EXMC + 0x00000064U) /*!< EXMC NAND/PC card interrupt enable register for bank1 */ -#define EXMC_NPCTCFG1 REG32(EXMC + 0x00000068U) /*!< EXMC NAND/PC card common space timing configuration register for bank1 */ -#define EXMC_NPATCFG1 REG32(EXMC + 0x0000006CU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank1 */ -#define EXMC_NECC1 REG32(EXMC + 0x00000074U) /*!< EXMC NAND ECC register */ - -#define EXMC_NPCTL2 REG32(EXMC + 0x00000080U) /*!< EXMC NAND/PC card control register for bank2 */ -#define EXMC_NPINTEN2 REG32(EXMC + 0x00000084U) /*!< EXMC NAND/PC card interrupt enable register for bank2 */ -#define EXMC_NPCTCFG2 REG32(EXMC + 0x00000088U) /*!< EXMC NAND/PC card common space timing configuration register for bank2 */ -#define EXMC_NPATCFG2 REG32(EXMC + 0x0000008CU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank2 */ -#define EXMC_NECC2 REG32(EXMC + 0x00000094U) /*!< EXMC NAND ECC register */ - -#define EXMC_NPCTL3 REG32(EXMC + 0x000000A0U) /*!< EXMC NAND/PC card control register for bank3 */ -#define EXMC_NPINTEN3 REG32(EXMC + 0x000000A4U) /*!< EXMC NAND/PC card interrupt enable register for bank3 */ -#define EXMC_NPCTCFG3 REG32(EXMC + 0x000000A8U) /*!< EXMC NAND/PC card common space timing configuration register for bank3 */ -#define EXMC_NPATCFG3 REG32(EXMC + 0x000000ACU) /*!< EXMC NAND/PC card attribute space timing configuration register for bank3 */ -#define EXMC_PIOTCFG3 REG32(EXMC + 0x000000B0U) /*!< EXMC PC card I/O space timing configuration register for bank3 */ - -/* SDRAM */ -#define EXMC_SDCTL0 REG32(EXMC + 0x00000140U) /*!< EXMC SDRAM control register for device0 */ -#define EXMC_SDTCFG0 REG32(EXMC + 0x00000148U) /*!< EXMC SDRAM timing configuration register register for device0 */ - -#define EXMC_SDCTL1 REG32(EXMC + 0x00000144U) /*!< EXMC SDRAM control register for device1 */ -#define EXMC_SDTCFG1 REG32(EXMC + 0x0000014CU) /*!< EXMC SDRAM timing configuration register register for device1 */ - -#define EXMC_SDCMD REG32(EXMC + 0x00000150U) /*!< EXMC SDRAM command register */ -#define EXMC_SDARI REG32(EXMC + 0x00000154U) /*!< EXMC SDRAM auto-refresh interval register */ -#define EXMC_SDSTAT REG32(EXMC + 0x00000158U) /*!< EXMC SDRAM status register */ -#define EXMC_SDRSCTL REG32(EXMC + 0x00000180U) /*!< EXMC SDRAM read sample control register */ - -/* SQPI PSRAM */ -#define EXMC_SINIT REG32(EXMC + 0x00000310U) /*!< EXMC SPI initialization register */ -#define EXMC_SRCMD REG32(EXMC + 0x00000320U) /*!< EXMC SPI read command register */ -#define EXMC_SWCMD REG32(EXMC + 0x00000330U) /*!< EXMC SPI write command register */ -#define EXMC_SIDL REG32(EXMC + 0x00000340U) /*!< EXMC SPI ID low register */ -#define EXMC_SIDH REG32(EXMC + 0x00000350U) /*!< EXMC SPI ID high register */ - -/* bits definitions */ -/* EXMC_SNCTLx,x=0..3 */ -#define EXMC_SNCTL_NRBKEN BIT(0) /*!< NOR bank enable */ -#define EXMC_SNCTL_NRMUX BIT(1) /*!< NOR bank memory address/data multiplexing enable */ -#define EXMC_SNCTL_NRTP BITS(2,3) /*!< NOR bank memory type */ -#define EXMC_SNCTL_NRW BITS(4,5) /*!< NOR bank memory data bus width */ -#define EXMC_SNCTL_NREN BIT(6) /*!< NOR flash access enable */ -#define EXMC_SNCTL_SBRSTEN BIT(8) /*!< synchronous burst enable */ -#define EXMC_SNCTL_NRWTPOL BIT(9) /*!< NWAIT signal polarity */ -#define EXMC_SNCTL_WRAPEN BIT(10) /*!< wrapped burst mode enable */ -#define EXMC_SNCTL_NRWTCFG BIT(11) /*!< NWAIT signal configuration, only work in synchronous mode */ -#define EXMC_SNCTL_WEN BIT(12) /*!< write enable */ -#define EXMC_SNCTL_NRWTEN BIT(13) /*!< NWAIT signal enable */ -#define EXMC_SNCTL_EXMODEN BIT(14) /*!< extended mode enable */ -#define EXMC_SNCTL_ASYNCWTEN BIT(15) /*!< asynchronous wait enable */ -#define EXMC_SNCTL_CPS BITS(16,18) /*!< CRAM page size */ -#define EXMC_SNCTL_SYNCWR BIT(19) /*!< synchronous write configuration */ -#define EXMC_SNCTL_CCK BIT(20) /*!< consecutive clock configuration */ - -/* EXMC_SNTCFGx,x=0..3 */ -#define EXMC_SNTCFG_ASET BITS(0,3) /*!< asynchronous address setup time */ -#define EXMC_SNTCFG_AHLD BITS(4,7) /*!< asynchronous address hold time */ -#define EXMC_SNTCFG_DSET BITS(8,15) /*!< asynchronous data setup time */ -#define EXMC_SNTCFG_BUSLAT BITS(16,19) /*!< bus latency */ -#define EXMC_SNTCFG_CKDIV BITS(20,23) /*!< synchronous clock divide ratio */ -#define EXMC_SNTCFG_DLAT BITS(24,27) /*!< synchronous data latency for NOR flash */ -#define EXMC_SNTCFG_ASYNCMOD BITS(28,29) /*!< asynchronous access mode */ - -/* EXMC_SNWTCFGx,x=0..3 */ -#define EXMC_SNWTCFG_WASET BITS(0,3) /*!< asynchronous address setup time */ -#define EXMC_SNWTCFG_WAHLD BITS(4,7) /*!< asynchronous address hold time */ -#define EXMC_SNWTCFG_WDSET BITS(8,15) /*!< asynchronous data setup time */ -#define EXMC_SNWTCFG_WBUSLAT BITS(16,19) /*!< bus latency */ -#define EXMC_SNWTCFG_WASYNCMOD BITS(28,29) /*!< asynchronous access mode */ - -/* EXMC_SNLATDECx,x=0..3 */ -#define EXMC_SNLATDEC_LATDEC BITS(0,2) /*!< data latency decrease for NOR Flash and only valid in synchronous read access */ - -/* EXMC_NPCTLx,x=1..3 */ -#define EXMC_NPCTL_NDWTEN BIT(1) /*!< wait feature enable */ -#define EXMC_NPCTL_NDBKEN BIT(2) /*!< NAND bank enable */ -#define EXMC_NPCTL_NDTP BIT(3) /*!< NAND bank memory type */ -#define EXMC_NPCTL_NDW BITS(4,5) /*!< NAND bank memory data bus width */ -#define EXMC_NPCTL_ECCEN BIT(6) /*!< ECC enable */ -#define EXMC_NPCTL_CTR BITS(9,12) /*!< CLE to RE delay */ -#define EXMC_NPCTL_ATR BITS(13,16) /*!< ALE to RE delay */ -#define EXMC_NPCTL_ECCSZ BITS(17,19) /*!< ECC size */ - -/* EXMC_NPINTENx,x=1..3 */ -#define EXMC_NPINTEN_INTRS BIT(0) /*!< interrupt rising edge status */ -#define EXMC_NPINTEN_INTHS BIT(1) /*!< interrupt high-level status */ -#define EXMC_NPINTEN_INTFS BIT(2) /*!< interrupt falling edge status */ -#define EXMC_NPINTEN_INTREN BIT(3) /*!< interrupt rising edge detection enable */ -#define EXMC_NPINTEN_INTHEN BIT(4) /*!< interrupt high-level detection enable */ -#define EXMC_NPINTEN_INTFEN BIT(5) /*!< interrupt falling edge detection enable */ -#define EXMC_NPINTEN_FFEPT BIT(6) /*!< FIFO empty flag */ - -/* EXMC_NPCTCFGx,x=1..3 */ -#define EXMC_NPCTCFG_COMSET BITS(0,7) /*!< common memory setup time */ -#define EXMC_NPCTCFG_COMWAIT BITS(8,15) /*!< common memory wait time */ -#define EXMC_NPCTCFG_COMHLD BITS(16,23) /*!< common memory hold time */ -#define EXMC_NPCTCFG_COMHIZ BITS(24,31) /*!< common memory data bus HiZ time */ - -/* EXMC_NPATCFGx,x=1..3 */ -#define EXMC_NPATCFG_ATTSET BITS(0,7) /*!< attribute memory setup time */ -#define EXMC_NPATCFG_ATTWAIT BITS(8,15) /*!< attribute memory wait time */ -#define EXMC_NPATCFG_ATTHLD BITS(16,23) /*!< attribute memory hold time */ -#define EXMC_NPATCFG_ATTHIZ BITS(24,31) /*!< attribute memory data bus HiZ time */ - -/* EXMC_PIOTCFG3 */ -#define EXMC_PIOTCFG3_IOSET BITS(0,7) /*!< IO space setup time */ -#define EXMC_PIOTCFG3_IOWAIT BITS(8,15) /*!< IO space wait time */ -#define EXMC_PIOTCFG3_IOHLD BITS(16,23) /*!< IO space hold time */ -#define EXMC_PIOTCFG3_IOHIZ BITS(24,31) /*!< IO space data bus HiZ time */ - -/* EXMC_NECCx,x=1..2 */ -#define EXMC_NECC_ECC BITS(0,31) /*!< ECC result */ - -/* EXMC_SDCTLx,x=0..1 */ -#define EXMC_SDCTL_CAW BITS(0,1) /*!< column address bit width */ -#define EXMC_SDCTL_RAW BITS(2,3) /*!< row address bit width */ -#define EXMC_SDCTL_SDW BITS(4,5) /*!< SDRAM data bus width */ -#define EXMC_SDCTL_NBK BIT(6) /*!< number of banks */ -#define EXMC_SDCTL_CL BIT(7,8) /*!< CAS Latency */ -#define EXMC_SDCTL_WPEN BIT(9) /*!< write protection enable */ -#define EXMC_SDCTL_SDCLK BITS(10,11) /*!< SDRAM clock configuration */ -#define EXMC_SDCTL_BRSTRD BIT(12) /*!< burst read enable */ -#define EXMC_SDCTL_PIPED BITS(13,14) /*!< pipeline delay */ - -/* EXMC_SDTCFGx,x=0..1 */ -#define EXMC_SDTCFG_LMRD BITS(0,3) /*!< load mode register delay */ -#define EXMC_SDTCFG_XSRD BITS(4,7) /*!< exit self-refresh delay */ -#define EXMC_SDTCFG_RASD BITS(8,11) /*!< row address select delay */ -#define EXMC_SDTCFG_ARFD BITS(12,15) /*!< auto refresh delay */ -#define EXMC_SDTCFG_WRD BITS(16,19) /*!< write recovery delay */ -#define EXMC_SDTCFG_RPD BITS(20,23) /*!< row precharge delay */ -#define EXMC_SDTCFG_RCD BITS(24,27) /*!< row to column delay */ - -/* EXMC_SDCMD */ -#define EXMC_SDCMD_CMD BITS(0,2) /*!< command */ -#define EXMC_SDCMD_DS1 BIT(3) /*!< select device1 */ -#define EXMC_SDCMD_DS0 BIT(4) /*!< select device0 */ -#define EXMC_SDCMD_NARF BITS(5,8) /*!< number of successive auto-refresh */ -#define EXMC_SDCMD_MRC BITS(9,21) /*!< mode register content */ - -/* EXMC_SDARI */ -#define EXMC_SDARI_REC BIT(0) /*!< refresh error flag clear */ -#define EXMC_SDARI_ARINTV BITS(1,13) /*!< auto-refresh interval */ -#define EXMC_SDARI_REIE BIT(14) /*!< refresh error interrupt enable */ - -/* EXMC_SDSTAT */ -#define EXMC_SDSDAT_REIF BIT(0) /*!< refresh error interrupt flag */ -#define EXMC_SDSDAT_STA0 BITS(1,2) /*!< device0 status */ -#define EXMC_SDSDAT_STA1 BITS(3,4) /*!< device1 status */ -#define EXMC_SDSDAT_NRDY BIT(5) /*!< not ready status */ - -/* EXMC_SDRSCTL */ -#define EXMC_SDRSCTL_RSEN BIT(0) /*!< read sample enable */ -#define EXMC_SDRSCTL_SSCR BIT(1) /*!< select sample cycle of read data */ -#define EXMC_SDRSCTL_SDSC BITS(4,7) /*!< select the delayed sample clock of read data */ - -/* EXMC_SINIT */ -#define EXMC_SINIT_CMDBIT BITS(16,17) /*!< bit number of SPI PSRAM command phase */ -#define EXMC_SINIT_ARDBIT BITS(24,28) /*!< bit number of SPI PSRAM address phase */ -#define EXMC_SINIT_IDL BITS(29,30) /*!< SPI PSRAM ID length */ -#define EXMC_SINIT_POL BIT(31) /*!< read data sample polarity */ - -/* EXMC_SRCMD */ -#define EXMC_SRCMD_RCMD BITS(0,15) /*!< SPI read command for AHB read transfer */ -#define EXMC_SRCMD_RWAITCYCLE BITS(16,19) /*!< SPI read wait cycle number after address phase */ -#define EXMC_SRCMD_RMODE BITS(20,21) /*!< SPI PSRAM read command mode */ -#define EXMC_SRCMD_RDID BIT(31) /*!< send SPI read ID command */ - -/* EXMC_SWCMD */ -#define EXMC_SWCMD_WCMD BITS(0,15) /*!< SPI write command for AHB write transfer */ -#define EXMC_SWCMD_WWAITCYCLE BITS(16,19) /*!< SPI write wait cycle number after address phase */ -#define EXMC_SWCMD_WMODE BITS(20,21) /*!< SPI PSRAM write command mode */ -#define EXMC_SWCMD_SC BIT(31) /*!< send SPI special command */ - -/* EXMC_SIDL */ -#define EXMC_SIDL_SIDL BITS(0,31) /*!< ID low data saved for SPI read ID command */ - -/* EXMC_SIDH */ -#define EXMC_SIDL_SIDH BITS(0,31) /*!< ID high Data saved for SPI read ID command */ - -/* constants definitions */ -/* EXMC NOR/SRAM timing initialize structure */ -typedef struct { - uint32_t asyn_access_mode; /*!< asynchronous access mode */ - uint32_t syn_data_latency; /*!< configure the data latency */ - uint32_t syn_data_latency_dec; /*!< configure the data latency decreasing value */ - uint32_t syn_clk_division; /*!< configure the clock divide ratio */ - uint32_t bus_latency; /*!< configure the bus latency */ - uint32_t asyn_data_setuptime; /*!< configure the data setup time, asynchronous access mode valid */ - uint32_t asyn_address_holdtime; /*!< configure the address hold time, asynchronous access mode valid */ - uint32_t asyn_address_setuptime; /*!< configure the address setup time, asynchronous access mode valid */ -} exmc_norsram_timing_parameter_struct; - -/* EXMC NOR/SRAM initialize structure */ -typedef struct { - uint32_t norsram_region; /*!< select the region of EXMC NOR/SRAM bank */ - uint32_t write_mode; /*!< the write mode, synchronous mode or asynchronous mode */ - uint32_t extended_mode; /*!< enable or disable the extended mode */ - uint32_t asyn_wait; /*!< enable or disable the asynchronous wait function */ - uint32_t nwait_signal; /*!< enable or disable the NWAIT signal while in synchronous bust mode */ - uint32_t memory_write; /*!< enable or disable the write operation */ - uint32_t nwait_config; /*!< NWAIT signal configuration */ - uint32_t wrap_burst_mode; /*!< enable or disable the wrap burst mode */ - uint32_t nwait_polarity; /*!< specifies the polarity of NWAIT signal from memory */ - uint32_t burst_mode; /*!< enable or disable the burst mode */ - uint32_t databus_width; /*!< specifies the databus width of external memory */ - uint32_t memory_type; /*!< specifies the type of external memory */ - uint32_t address_data_mux; /*!< specifies whether the data bus and address bus are multiplexed */ - exmc_norsram_timing_parameter_struct *read_write_timing; /*!< timing parameters for read and write if the extendedmode is not used or the timing - parameters for read if the extendedmode is used. */ - exmc_norsram_timing_parameter_struct *write_timing; /*!< timing parameters for write when the extendedmode is used. */ -} exmc_norsram_parameter_struct; - -/* EXMC NAND/PC card timing initialize structure */ -typedef struct { - uint32_t databus_hiztime; /*!< configure the dadtabus HiZ time for write operation */ - uint32_t holdtime; /*!< configure the address hold time(or the data hold time for write operation) */ - uint32_t waittime; /*!< configure the minimum wait time */ - uint32_t setuptime; /*!< configure the address setup time */ -} exmc_nand_pccard_timing_parameter_struct; - -/* EXMC NAND initialize structure */ -typedef struct { - uint32_t nand_bank; /*!< select the bank of NAND */ - uint32_t ecc_size; /*!< the page size for the ECC calculation */ - uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ - uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ - uint32_t ecc_logic; /*!< enable or disable the ECC calculation logic */ - uint32_t databus_width; /*!< the NAND flash databus width */ - uint32_t wait_feature; /*!< enable or disable the wait feature */ - exmc_nand_pccard_timing_parameter_struct *common_space_timing; /*!< the timing parameters for NAND flash common space */ - exmc_nand_pccard_timing_parameter_struct *attribute_space_timing; /*!< the timing parameters for NAND flash attribute space */ -} exmc_nand_parameter_struct; - -/* EXMC PC card initialize structure */ -typedef struct { - uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ - uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ - uint32_t wait_feature; /*!< enable or disable the wait feature */ - exmc_nand_pccard_timing_parameter_struct *common_space_timing; /*!< the timing parameters for PC card common space */ - exmc_nand_pccard_timing_parameter_struct *attribute_space_timing; /*!< the timing parameters for PC card attribute space */ - exmc_nand_pccard_timing_parameter_struct *io_space_timing; /*!< the timing parameters for PC card IO space */ -} exmc_pccard_parameter_struct; - -/* EXMC SDRAM timing initialize structure */ -typedef struct { - uint32_t row_to_column_delay; /*!< configure the row to column delay */ - uint32_t row_precharge_delay; /*!< configure the row precharge delay */ - uint32_t write_recovery_delay; /*!< configure the write recovery delay */ - uint32_t auto_refresh_delay; /*!< configure the auto refresh delay */ - uint32_t row_address_select_delay; /*!< configure the row address select delay */ - uint32_t exit_selfrefresh_delay; /*!< configure the exit self-refresh delay */ - uint32_t load_mode_register_delay; /*!< configure the load mode register delay */ -} exmc_sdram_timing_parameter_struct; - -/* EXMC SDRAM initialize structure */ -typedef struct { - uint32_t sdram_device; /*!< device of SDRAM */ - uint32_t pipeline_read_delay; /*!< the delay for reading data after CAS latency in HCLK clock cycles */ - uint32_t burst_read_switch; /*!< enable or disable the burst read */ - uint32_t sdclock_config; /*!< the SDCLK memory clock for both SDRAM banks */ - uint32_t write_protection; /*!< enable or disable SDRAM bank write protection function */ - uint32_t cas_latency; /*!< configure the SDRAM CAS latency */ - uint32_t internal_bank_number; /*!< the number of internal bank */ - uint32_t data_width; /*!< the databus width of SDRAM memory */ - uint32_t row_address_width; /*!< the bit width of a row address */ - uint32_t column_address_width; /*!< the bit width of a column address */ - exmc_sdram_timing_parameter_struct *timing; /*!< the timing parameters for write and read SDRAM */ -} exmc_sdram_parameter_struct; - -/* EXMC SDRAM command initialize structure */ -typedef struct { - uint32_t mode_register_content; /*!< the SDRAM mode register content */ - uint32_t auto_refresh_number; /*!< the number of successive auto-refresh cycles will be send when CMD = 011 */ - uint32_t bank_select; /*!< the bank which command will be sent to */ - uint32_t command; /*!< the commands that will be sent to SDRAM */ -} exmc_sdram_command_parameter_struct; - -/* EXMC SQPISRAM initialize structure */ -typedef struct { - uint32_t sample_polarity; /*!< read data sample polarity */ - uint32_t id_length; /*!< SPI PSRAM ID length */ - uint32_t address_bits; /*!< bit number of SPI PSRAM address phase */ - uint32_t command_bits; /*!< bit number of SPI PSRAM command phase */ -} exmc_sqpipsram_parameter_struct; - -/* EXMC register address */ -#define EXMC_SNCTL(region) REG32(EXMC + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash control registers, region = 0,1,2,3 */ -#define EXMC_SNTCFG(region) REG32(EXMC + 0x04U + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash timing configuration registers, region = 0,1,2,3 */ -#define EXMC_SNWTCFG(region) REG32(EXMC + 0x104U + 0x08U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash write timing configuration registers, region = 0,1,2,3 */ -#define EXMC_SNLATDEC(region) REG32(EXMC + 0x300U + 0x04U*((uint32_t)(region))) /*!< EXMC SRAM/NOR flash data latency decrease registers, region = 0,1,2,3 */ - -#define EXMC_NPCTL(bank) REG32(EXMC + 0x40U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card control registers, bank = 1,2,3 */ -#define EXMC_NPINTEN(bank) REG32(EXMC + 0x44U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card interrupt enable registers, bank = 1,2,3 */ -#define EXMC_NPCTCFG(bank) REG32(EXMC + 0x48U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card common space timing configuration registers, bank = 1,2,3 */ -#define EXMC_NPATCFG(bank) REG32(EXMC + 0x4CU + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND/PC card attribute space timing configuration registers, bank = 1,2,3 */ -#define EXMC_NECC(bank) REG32(EXMC + 0x54U + 0x20U*((uint32_t)(bank))) /*!< EXMC NAND ECC registers, bank = 1,2 */ - -#define EXMC_SDCTL(device) REG32(EXMC + 0x140U + 0x4U*(((uint32_t)(device)) - 0x4U)) /*!< EXMC SDRAM control registers,device = 0,1 */ -#define EXMC_SDTCFG(device) REG32(EXMC + 0x148U + 0x4U*(((uint32_t)(device)) - 0x4U)) /*!< EXMC SDRAM timing configuration registers,device = 0,1 */ - -/* CRAM page size */ -#define SNCTL_CPS(regval) (BITS(16,18) & ((uint32_t)(regval) << 16)) -#define EXMC_CRAM_AUTO_SPLIT SNCTL_CPS(0) /*!< automatic burst split on page boundary crossing */ -#define EXMC_CRAM_PAGE_SIZE_128_BYTES SNCTL_CPS(1) /*!< page size is 128 bytes */ -#define EXMC_CRAM_PAGE_SIZE_256_BYTES SNCTL_CPS(2) /*!< page size is 256 bytes */ -#define EXMC_CRAM_PAGE_SIZE_512_BYTES SNCTL_CPS(3) /*!< page size is 512 bytes */ -#define EXMC_CRAM_PAGE_SIZE_1024_BYTES SNCTL_CPS(4) /*!< page size is 1024 bytes */ - -/* NOR bank memory data bus width */ -#define SNCTL_NRW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) -#define EXMC_NOR_DATABUS_WIDTH_8B SNCTL_NRW(0) /*!< NOR data width is 8 bits */ -#define EXMC_NOR_DATABUS_WIDTH_16B SNCTL_NRW(1) /*!< NOR data width is 16 bits */ - -/* NOR bank memory type */ -#define SNCTL_NRTP(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) -#define EXMC_MEMORY_TYPE_SRAM SNCTL_NRTP(0) /*!< SRAM,ROM */ -#define EXMC_MEMORY_TYPE_PSRAM SNCTL_NRTP(1) /*!< PSRAM, CRAM */ -#define EXMC_MEMORY_TYPE_NOR SNCTL_NRTP(2) /*!< NOR flash */ - -/* asynchronous access mode */ -#define SNTCFG_ASYNCMOD(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) -#define EXMC_ACCESS_MODE_A SNTCFG_ASYNCMOD(0) /*!< mode A access */ -#define EXMC_ACCESS_MODE_B SNTCFG_ASYNCMOD(1) /*!< mode B access */ -#define EXMC_ACCESS_MODE_C SNTCFG_ASYNCMOD(2) /*!< mode C access */ -#define EXMC_ACCESS_MODE_D SNTCFG_ASYNCMOD(3) /*!< mode D access */ - -/* data latency for NOR flash */ -#define SNTCFG_DLAT(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) -#define EXMC_DATALAT_2_CLK SNTCFG_DLAT(0) /*!< data latency of first burst access is 2 EXMC_CLK */ -#define EXMC_DATALAT_3_CLK SNTCFG_DLAT(1) /*!< data latency of first burst access is 3 EXMC_CLK */ -#define EXMC_DATALAT_4_CLK SNTCFG_DLAT(2) /*!< data latency of first burst access is 4 EXMC_CLK */ -#define EXMC_DATALAT_5_CLK SNTCFG_DLAT(3) /*!< data latency of first burst access is 5 EXMC_CLK */ -#define EXMC_DATALAT_6_CLK SNTCFG_DLAT(4) /*!< data latency of first burst access is 6 EXMC_CLK */ -#define EXMC_DATALAT_7_CLK SNTCFG_DLAT(5) /*!< data latency of first burst access is 7 EXMC_CLK */ -#define EXMC_DATALAT_8_CLK SNTCFG_DLAT(6) /*!< data latency of first burst access is 8 EXMC_CLK */ -#define EXMC_DATALAT_9_CLK SNTCFG_DLAT(7) /*!< data latency of first burst access is 9 EXMC_CLK */ -#define EXMC_DATALAT_10_CLK SNTCFG_DLAT(8) /*!< data latency of first burst access is 10 EXMC_CLK */ -#define EXMC_DATALAT_11_CLK SNTCFG_DLAT(9) /*!< data latency of first burst access is 11 EXMC_CLK */ -#define EXMC_DATALAT_12_CLK SNTCFG_DLAT(10) /*!< data latency of first burst access is 12 EXMC_CLK */ -#define EXMC_DATALAT_13_CLK SNTCFG_DLAT(11) /*!< data latency of first burst access is 13 EXMC_CLK */ -#define EXMC_DATALAT_14_CLK SNTCFG_DLAT(12) /*!< data latency of first burst access is 14 EXMC_CLK */ -#define EXMC_DATALAT_15_CLK SNTCFG_DLAT(13) /*!< data latency of first burst access is 15 EXMC_CLK */ -#define EXMC_DATALAT_16_CLK SNTCFG_DLAT(14) /*!< data latency of first burst access is 16 EXMC_CLK */ -#define EXMC_DATALAT_17_CLK SNTCFG_DLAT(15) /*!< data latency of first burst access is 17 EXMC_CLK */ - -/* synchronous clock divide ratio */ -#define SNTCFG_CKDIV(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) -#define EXMC_SYN_CLOCK_RATIO_DISABLE SNTCFG_CKDIV(0) /*!< EXMC_CLK disable */ -#define EXMC_SYN_CLOCK_RATIO_2_CLK SNTCFG_CKDIV(1) /*!< EXMC_CLK = 2*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_3_CLK SNTCFG_CKDIV(2) /*!< EXMC_CLK = 3*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_4_CLK SNTCFG_CKDIV(3) /*!< EXMC_CLK = 4*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_5_CLK SNTCFG_CKDIV(4) /*!< EXMC_CLK = 5*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_6_CLK SNTCFG_CKDIV(5) /*!< EXMC_CLK = 6*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_7_CLK SNTCFG_CKDIV(6) /*!< EXMC_CLK = 7*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_8_CLK SNTCFG_CKDIV(7) /*!< EXMC_CLK = 8*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_9_CLK SNTCFG_CKDIV(8) /*!< EXMC_CLK = 9*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_10_CLK SNTCFG_CKDIV(9) /*!< EXMC_CLK = 10*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_11_CLK SNTCFG_CKDIV(10) /*!< EXMC_CLK = 11*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_12_CLK SNTCFG_CKDIV(11) /*!< EXMC_CLK = 12*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_13_CLK SNTCFG_CKDIV(12) /*!< EXMC_CLK = 13*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_14_CLK SNTCFG_CKDIV(13) /*!< EXMC_CLK = 14*HCLK*/ -#define EXMC_SYN_CLOCK_RATIO_15_CLK SNTCFG_CKDIV(14) /*!< EXMC_CLK = 15*HCLK */ -#define EXMC_SYN_CLOCK_RATIO_16_CLK SNTCFG_CKDIV(15) /*!< EXMC_CLK = 16*HCLK */ - -/* ECC size */ -#define NPCTL_ECCSZ(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) -#define EXMC_ECC_SIZE_256BYTES NPCTL_ECCSZ(0) /*!< ECC size is 256 bytes */ -#define EXMC_ECC_SIZE_512BYTES NPCTL_ECCSZ(1) /*!< ECC size is 512 bytes */ -#define EXMC_ECC_SIZE_1024BYTES NPCTL_ECCSZ(2) /*!< ECC size is 1024 bytes */ -#define EXMC_ECC_SIZE_2048BYTES NPCTL_ECCSZ(3) /*!< ECC size is 2048 bytes */ -#define EXMC_ECC_SIZE_4096BYTES NPCTL_ECCSZ(4) /*!< ECC size is 4096 bytes */ -#define EXMC_ECC_SIZE_8192BYTES NPCTL_ECCSZ(5) /*!< ECC size is 8192 bytes */ - -/* ALE to RE delay */ -#define NPCTL_ATR(regval) (BITS(13,16) & ((uint32_t)(regval) << 13)) -#define EXMC_ALE_RE_DELAY_1_HCLK NPCTL_ATR(0) /*!< ALE to RE delay = 1*HCLK */ -#define EXMC_ALE_RE_DELAY_2_HCLK NPCTL_ATR(1) /*!< ALE to RE delay = 2*HCLK */ -#define EXMC_ALE_RE_DELAY_3_HCLK NPCTL_ATR(2) /*!< ALE to RE delay = 3*HCLK */ -#define EXMC_ALE_RE_DELAY_4_HCLK NPCTL_ATR(3) /*!< ALE to RE delay = 4*HCLK */ -#define EXMC_ALE_RE_DELAY_5_HCLK NPCTL_ATR(4) /*!< ALE to RE delay = 5*HCLK */ -#define EXMC_ALE_RE_DELAY_6_HCLK NPCTL_ATR(5) /*!< ALE to RE delay = 6*HCLK */ -#define EXMC_ALE_RE_DELAY_7_HCLK NPCTL_ATR(6) /*!< ALE to RE delay = 7*HCLK */ -#define EXMC_ALE_RE_DELAY_8_HCLK NPCTL_ATR(7) /*!< ALE to RE delay = 8*HCLK */ -#define EXMC_ALE_RE_DELAY_9_HCLK NPCTL_ATR(8) /*!< ALE to RE delay = 9*HCLK */ -#define EXMC_ALE_RE_DELAY_10_HCLK NPCTL_ATR(9) /*!< ALE to RE delay = 10*HCLK */ -#define EXMC_ALE_RE_DELAY_11_HCLK NPCTL_ATR(10) /*!< ALE to RE delay = 11*HCLK */ -#define EXMC_ALE_RE_DELAY_12_HCLK NPCTL_ATR(11) /*!< ALE to RE delay = 12*HCLK */ -#define EXMC_ALE_RE_DELAY_13_HCLK NPCTL_ATR(12) /*!< ALE to RE delay = 13*HCLK */ -#define EXMC_ALE_RE_DELAY_14_HCLK NPCTL_ATR(13) /*!< ALE to RE delay = 14*HCLK */ -#define EXMC_ALE_RE_DELAY_15_HCLK NPCTL_ATR(14) /*!< ALE to RE delay = 15*HCLK */ -#define EXMC_ALE_RE_DELAY_16_HCLK NPCTL_ATR(15) /*!< ALE to RE delay = 16*HCLK */ - -/* CLE to RE delay */ -#define NPCTL_CTR(regval) (BITS(9,12) & ((uint32_t)(regval) << 9)) -#define EXMC_CLE_RE_DELAY_1_HCLK NPCTL_CTR(0) /*!< CLE to RE delay = 1*HCLK */ -#define EXMC_CLE_RE_DELAY_2_HCLK NPCTL_CTR(1) /*!< CLE to RE delay = 2*HCLK */ -#define EXMC_CLE_RE_DELAY_3_HCLK NPCTL_CTR(2) /*!< CLE to RE delay = 3*HCLK */ -#define EXMC_CLE_RE_DELAY_4_HCLK NPCTL_CTR(3) /*!< CLE to RE delay = 4*HCLK */ -#define EXMC_CLE_RE_DELAY_5_HCLK NPCTL_CTR(4) /*!< CLE to RE delay = 5*HCLK */ -#define EXMC_CLE_RE_DELAY_6_HCLK NPCTL_CTR(5) /*!< CLE to RE delay = 6*HCLK */ -#define EXMC_CLE_RE_DELAY_7_HCLK NPCTL_CTR(6) /*!< CLE to RE delay = 7*HCLK */ -#define EXMC_CLE_RE_DELAY_8_HCLK NPCTL_CTR(7) /*!< CLE to RE delay = 8*HCLK */ -#define EXMC_CLE_RE_DELAY_9_HCLK NPCTL_CTR(8) /*!< CLE to RE delay = 9*HCLK */ -#define EXMC_CLE_RE_DELAY_10_HCLK NPCTL_CTR(9) /*!< CLE to RE delay = 10*HCLK */ -#define EXMC_CLE_RE_DELAY_11_HCLK NPCTL_CTR(10) /*!< CLE to RE delay = 11*HCLK */ -#define EXMC_CLE_RE_DELAY_12_HCLK NPCTL_CTR(11) /*!< CLE to RE delay = 12*HCLK */ -#define EXMC_CLE_RE_DELAY_13_HCLK NPCTL_CTR(12) /*!< CLE to RE delay = 13*HCLK */ -#define EXMC_CLE_RE_DELAY_14_HCLK NPCTL_CTR(13) /*!< CLE to RE delay = 14*HCLK */ -#define EXMC_CLE_RE_DELAY_15_HCLK NPCTL_CTR(14) /*!< CLE to RE delay = 15*HCLK */ -#define EXMC_CLE_RE_DELAY_16_HCLK NPCTL_CTR(15) /*!< CLE to RE delay = 16*HCLK */ - -/* NAND bank memory data bus width */ -#define NPCTL_NDW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) -#define EXMC_NAND_DATABUS_WIDTH_8B NPCTL_NDW(0) /*!< NAND data width is 8 bits */ -#define EXMC_NAND_DATABUS_WIDTH_16B NPCTL_NDW(1) /*!< NAND data width is 16 bits */ - -/* SDRAM pipeline delay */ -#define SDCTL_PIPED(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) -#define EXMC_PIPELINE_DELAY_0_HCLK SDCTL_PIPED(0) /*!< 0 HCLK clock cycle delay */ -#define EXMC_PIPELINE_DELAY_1_HCLK SDCTL_PIPED(1) /*!< 1 HCLK clock cycle delay */ -#define EXMC_PIPELINE_DELAY_2_HCLK SDCTL_PIPED(2) /*!< 2 HCLK clock cycle delay */ - -/* SDRAM clock configuration */ -#define SDCTL_SDCLK(regval) (BITS(10,11) & ((uint32_t)(regval) << 10)) -#define EXMC_SDCLK_DISABLE SDCTL_SDCLK(0) /*!< SDCLK memory clock disabled */ -#define EXMC_SDCLK_PERIODS_2_HCLK SDCTL_SDCLK(2) /*!< SDCLK memory period = 2*HCLK */ -#define EXMC_SDCLK_PERIODS_3_HCLK SDCTL_SDCLK(3) /*!< SDCLK memory period = 3*HCLK */ - -/* CAS latency */ -#define SDCTL_CL(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) -#define EXMC_CAS_LATENCY_1_SDCLK SDCTL_CL(1) /*!< CAS latency is 1 memory clock cycle */ -#define EXMC_CAS_LATENCY_2_SDCLK SDCTL_CL(2) /*!< CAS latency is 2 memory clock cycle */ -#define EXMC_CAS_LATENCY_3_SDCLK SDCTL_CL(3) /*!< CAS latency is 3 memory clock cycle */ - -/* SDRAM data bus width */ -#define SDCTL_SDW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) -#define EXMC_SDRAM_DATABUS_WIDTH_8B SDCTL_SDW(0) /*!< SDRAM data width 8 bits */ -#define EXMC_SDRAM_DATABUS_WIDTH_16B SDCTL_SDW(1) /*!< SDRAM data width 16 bits */ -#define EXMC_SDRAM_DATABUS_WIDTH_32B SDCTL_SDW(2) /*!< SDRAM data width 32 bits */ - -/* SDRAM row address bit width */ -#define SDCTL_RAW(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) -#define EXMC_SDRAM_ROW_ADDRESS_11 SDCTL_RAW(0) /*!< row address bit width is 11 bits */ -#define EXMC_SDRAM_ROW_ADDRESS_12 SDCTL_RAW(1) /*!< row address bit width is 12 bits */ -#define EXMC_SDRAM_ROW_ADDRESS_13 SDCTL_RAW(2) /*!< row address bit width is 13 bits */ - -/* SDRAM column address bit width */ -#define SDCTL_CAW(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define EXMC_SDRAM_COW_ADDRESS_8 SDCTL_CAW(0) /*!< column address bit width is 8 bits */ -#define EXMC_SDRAM_COW_ADDRESS_9 SDCTL_CAW(1) /*!< column address bit width is 9 bits */ -#define EXMC_SDRAM_COW_ADDRESS_10 SDCTL_CAW(2) /*!< column address bit width is 10 bits */ -#define EXMC_SDRAM_COW_ADDRESS_11 SDCTL_CAW(3) /*!< column address bit width is 11 bits */ - -/* SDRAM number of successive auto-refresh */ -#define SDCMD_NARF(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) -#define EXMC_SDRAM_AUTO_REFLESH_1_SDCLK SDCMD_NARF(0) /*!< 1 auto-refresh cycle */ -#define EXMC_SDRAM_AUTO_REFLESH_2_SDCLK SDCMD_NARF(1) /*!< 2 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_3_SDCLK SDCMD_NARF(2) /*!< 3 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_4_SDCLK SDCMD_NARF(3) /*!< 4 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_5_SDCLK SDCMD_NARF(4) /*!< 5 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_6_SDCLK SDCMD_NARF(5) /*!< 6 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_7_SDCLK SDCMD_NARF(6) /*!< 7 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_8_SDCLK SDCMD_NARF(7) /*!< 8 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_9_SDCLK SDCMD_NARF(8) /*!< 9 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_10_SDCLK SDCMD_NARF(9) /*!< 10 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_11_SDCLK SDCMD_NARF(10) /*!< 11 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_12_SDCLK SDCMD_NARF(11) /*!< 12 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_13_SDCLK SDCMD_NARF(12) /*!< 13 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_14_SDCLK SDCMD_NARF(13) /*!< 14 auto-refresh cycles */ -#define EXMC_SDRAM_AUTO_REFLESH_15_SDCLK SDCMD_NARF(14) /*!< 15 auto-refresh cycles */ - -/* SDRAM command selection */ -#define SDCMD_CMD(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) -#define EXMC_SDRAM_NORMAL_OPERATION SDCMD_CMD(0) /*!< normal operation command */ -#define EXMC_SDRAM_CLOCK_ENABLE SDCMD_CMD(1) /*!< clock enable command */ -#define EXMC_SDRAM_PRECHARGE_ALL SDCMD_CMD(2) /*!< precharge all command */ -#define EXMC_SDRAM_AUTO_REFRESH SDCMD_CMD(3) /*!< auto-refresh command */ -#define EXMC_SDRAM_LOAD_MODE_REGISTER SDCMD_CMD(4) /*!< load mode register command */ -#define EXMC_SDRAM_SELF_REFRESH SDCMD_CMD(5) /*!< self-refresh command */ -#define EXMC_SDRAM_POWERDOWN_ENTRY SDCMD_CMD(6) /*!< power-down entry command */ - -/* SDRAM the delayed sample clock of read data */ -#define SDRSCTL_SDSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) -#define EXMC_SDRAM_0_DELAY_CELL SDRSCTL_SDSC(0) /*!< select the clock after 0 delay cell */ -#define EXMC_SDRAM_1_DELAY_CELL SDRSCTL_SDSC(1) /*!< select the clock after 1 delay cell */ -#define EXMC_SDRAM_2_DELAY_CELL SDRSCTL_SDSC(2) /*!< select the clock after 2 delay cell */ -#define EXMC_SDRAM_3_DELAY_CELL SDRSCTL_SDSC(3) /*!< select the clock after 3 delay cell */ -#define EXMC_SDRAM_4_DELAY_CELL SDRSCTL_SDSC(4) /*!< select the clock after 4 delay cell */ -#define EXMC_SDRAM_5_DELAY_CELL SDRSCTL_SDSC(5) /*!< select the clock after 5 delay cell */ -#define EXMC_SDRAM_6_DELAY_CELL SDRSCTL_SDSC(6) /*!< select the clock after 6 delay cell */ -#define EXMC_SDRAM_7_DELAY_CELL SDRSCTL_SDSC(7) /*!< select the clock after 7 delay cell */ -#define EXMC_SDRAM_8_DELAY_CELL SDRSCTL_SDSC(8) /*!< select the clock after 8 delay cell */ -#define EXMC_SDRAM_9_DELAY_CELL SDRSCTL_SDSC(9) /*!< select the clock after 9 delay cell */ -#define EXMC_SDRAM_10_DELAY_CELL SDRSCTL_SDSC(10) /*!< select the clock after 10 delay cell */ -#define EXMC_SDRAM_11_DELAY_CELL SDRSCTL_SDSC(11) /*!< select the clock after 11 delay cell */ -#define EXMC_SDRAM_12_DELAY_CELL SDRSCTL_SDSC(12) /*!< select the clock after 12 delay cell */ -#define EXMC_SDRAM_13_DELAY_CELL SDRSCTL_SDSC(13) /*!< select the clock after 13 delay cell */ -#define EXMC_SDRAM_14_DELAY_CELL SDRSCTL_SDSC(14) /*!< select the clock after 14 delay cell */ -#define EXMC_SDRAM_15_DELAY_CELL SDRSCTL_SDSC(15) /*!< select the clock after 15 delay cell */ - -/* SPI PSRAM ID length */ -#define SINIT_IDL(regval) (BITS(29,30) & ((uint32_t)(regval) << 29)) -#define EXMC_SQPIPSRAM_ID_LENGTH_64B SINIT_IDL(0) /*!< SPI PSRAM ID length is 64 bits */ -#define EXMC_SQPIPSRAM_ID_LENGTH_32B SINIT_IDL(1) /*!< SPI PSRAM ID length is 32 bits */ -#define EXMC_SQPIPSRAM_ID_LENGTH_16B SINIT_IDL(2) /*!< SPI PSRAM ID length is 16 bits */ -#define EXMC_SQPIPSRAM_ID_LENGTH_8B SINIT_IDL(3) /*!< SPI PSRAM ID length is 8 bits */ - -/* SPI PSRAM bit number of address phase */ -#define SINIT_ADRBIT(regval) (BITS(24,28) & ((uint32_t)(regval) << 24)) -#define EXMC_SQPIPSRAM_ADDR_LENGTH_1B SINIT_ADRBIT(1) /*!< SPI PSRAM address is 1 bit */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_2B SINIT_ADRBIT(2) /*!< SPI PSRAM address is 2 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_3B SINIT_ADRBIT(3) /*!< SPI PSRAM address is 3 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_4B SINIT_ADRBIT(4) /*!< SPI PSRAM address is 4 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_5B SINIT_ADRBIT(5) /*!< SPI PSRAM address is 5 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_6B SINIT_ADRBIT(6) /*!< SPI PSRAM address is 6 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_7B SINIT_ADRBIT(7) /*!< SPI PSRAM address is 7 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_8B SINIT_ADRBIT(8) /*!< SPI PSRAM address is 8 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_9B SINIT_ADRBIT(9) /*!< SPI PSRAM address is 9 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_10B SINIT_ADRBIT(10) /*!< SPI PSRAM address is 10 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_11B SINIT_ADRBIT(11) /*!< SPI PSRAM address is 11 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_12B SINIT_ADRBIT(12) /*!< SPI PSRAM address is 12 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_13B SINIT_ADRBIT(13) /*!< SPI PSRAM address is 13 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_14B SINIT_ADRBIT(14) /*!< SPI PSRAM address is 14 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_15B SINIT_ADRBIT(15) /*!< SPI PSRAM address is 15 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_16B SINIT_ADRBIT(16) /*!< SPI PSRAM address is 16 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_17B SINIT_ADRBIT(17) /*!< SPI PSRAM address is 17 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_18B SINIT_ADRBIT(18) /*!< SPI PSRAM address is 18 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_19B SINIT_ADRBIT(19) /*!< SPI PSRAM address is 19 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_20B SINIT_ADRBIT(20) /*!< SPI PSRAM address is 20 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_21B SINIT_ADRBIT(21) /*!< SPI PSRAM address is 21 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_22B SINIT_ADRBIT(22) /*!< SPI PSRAM address is 22 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_23B SINIT_ADRBIT(23) /*!< SPI PSRAM address is 23 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_24B SINIT_ADRBIT(24) /*!< SPI PSRAM address is 24 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_25B SINIT_ADRBIT(25) /*!< SPI PSRAM address is 25 bits */ -#define EXMC_SQPIPSRAM_ADDR_LENGTH_26B SINIT_ADRBIT(26) /*!< SPI PSRAM address is 26 bits */ - -/* SPI PSRAM bit number of command phase */ -#define SINIT_CMDBIT(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define EXMC_SQPIPSRAM_COMMAND_LENGTH_4B SINIT_CMDBIT(0) /*!< SPI PSRAM command is 4 bits */ -#define EXMC_SQPIPSRAM_COMMAND_LENGTH_8B SINIT_CMDBIT(1) /*!< SPI PSRAM command is 8 bits */ -#define EXMC_SQPIPSRAM_COMMAND_LENGTH_16B SINIT_CMDBIT(2) /*!< SPI PSRAM command is 16 bits */ - -/* SPI PSRAM read command mode */ -#define SRCMD_RMODE(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) -#define EXMC_SQPIPSRAM_READ_MODE_DISABLE SRCMD_RMODE(0) /*!< not SPI mode */ -#define EXMC_SQPIPSRAM_READ_MODE_SPI SRCMD_RMODE(1) /*!< SPI mode */ -#define EXMC_SQPIPSRAM_READ_MODE_SQPI SRCMD_RMODE(2) /*!< SQPI mode */ -#define EXMC_SQPIPSRAM_READ_MODE_QPI SRCMD_RMODE(3) /*!< QPI mode */ - -/* SPI PSRAM write command mode */ -#define SRCMD_WMODE(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) -#define EXMC_SQPIPSRAM_WRITE_MODE_DISABLE SRCMD_WMODE(0) /*!< not SPI mode */ -#define EXMC_SQPIPSRAM_WRITE_MODE_SPI SRCMD_WMODE(1) /*!< SPI mode */ -#define EXMC_SQPIPSRAM_WRITE_MODE_SQPI SRCMD_WMODE(2) /*!< SQPI mode */ -#define EXMC_SQPIPSRAM_WRITE_MODE_QPI SRCMD_WMODE(3) /*!< QPI mode */ - -/* EXMC NOR/SRAM bank region definition */ -#define EXMC_BANK0_NORSRAM_REGION0 ((uint32_t)0x00000000U) /*!< bank0 NOR/SRAM region0 */ -#define EXMC_BANK0_NORSRAM_REGION1 ((uint32_t)0x00000001U) /*!< bank0 NOR/SRAM region1 */ -#define EXMC_BANK0_NORSRAM_REGION2 ((uint32_t)0x00000002U) /*!< bank0 NOR/SRAM region2 */ -#define EXMC_BANK0_NORSRAM_REGION3 ((uint32_t)0x00000003U) /*!< bank0 NOR/SRAM region3 */ - -/* EXMC consecutive clock */ -#define EXMC_CLOCK_SYN_MODE ((uint32_t)0x00000000U) /*!< EXMC_CLK is generated only during synchronous access */ -#define EXMC_CLOCK_UNCONDITIONALLY EXMC_SNCTL_CCK /*!< EXMC_CLK is generated unconditionally */ - -/* EXMC NOR/SRAM write mode */ -#define EXMC_ASYN_WRITE ((uint32_t)0x00000000U) /*!< asynchronous write mode */ -#define EXMC_SYN_WRITE EXMC_SNCTL_SYNCWR /*!< synchronous write mode */ - -/* EXMC NWAIT signal configuration */ -#define EXMC_NWAIT_CONFIG_BEFORE ((uint32_t)0x00000000U) /*!< NWAIT signal is active one data cycle before wait state */ -#define EXMC_NWAIT_CONFIG_DURING EXMC_SNCTL_NRWTCFG /*!< NWAIT signal is active during wait state */ - -/* EXMC NWAIT signal polarity configuration */ -#define EXMC_NWAIT_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level is active of NWAIT */ -#define EXMC_NWAIT_POLARITY_HIGH EXMC_SNCTL_NRWTPOL /*!< high level is active of NWAIT */ - -/* EXMC NAND/PC card bank definition */ -#define EXMC_BANK1_NAND ((uint32_t)0x00000001U) /*!< NAND flash bank1 */ -#define EXMC_BANK2_NAND ((uint32_t)0x00000002U) /*!< NAND flash bank2 */ -#define EXMC_BANK3_PCCARD ((uint32_t)0x00000003U) /*!< PC card bank3 */ - -/* EXMC SDRAM bank definition */ -#define EXMC_SDRAM_DEVICE0 ((uint32_t)0x00000004U) /*!< SDRAM device0 */ -#define EXMC_SDRAM_DEVICE1 ((uint32_t)0x00000005U) /*!< SDRAM device1 */ - -/* EXMC SDRAM internal banks */ -#define EXMC_SDRAM_2_INTER_BANK ((uint32_t)0x00000000U) /*!< 2 internal banks */ -#define EXMC_SDRAM_4_INTER_BANK EXMC_SDCTL_NBK /*!< 4 internal banks */ - -/* SDRAM device0 selection */ -#define EXMC_SDRAM_DEVICE0_UNSELECT ((uint32_t)0x00000000U) /*!< unselect SDRAM device0 */ -#define EXMC_SDRAM_DEVICE0_SELECT EXMC_SDCMD_DS0 /*!< select SDRAM device0 */ - -/* SDRAM device1 selection */ -#define EXMC_SDRAM_DEVICE1_UNSELECT ((uint32_t)0x00000000U) /*!< unselect SDRAM device1 */ -#define EXMC_SDRAM_DEVICE1_SELECT EXMC_SDCMD_DS1 /*!< select SDRAM device1 */ - -/* SDRAM device status */ -#define EXMC_SDRAM_DEVICE_NORMAL ((uint32_t)0x00000000U) /*!< normal status */ -#define EXMC_SDRAM_DEVICE_SELF_REFRESH ((uint32_t)0x00000001U) /*!< self refresh status */ -#define EXMC_SDRAM_DEVICE_POWER_DOWN ((uint32_t)0x00000002U) /*!< power down status */ - -/* sample cycle of read data */ -#define EXMC_SDRAM_READSAMPLE_0_EXTRAHCLK ((uint32_t)0x00000000U) /*!< add 0 extra HCLK cycle to the read data sample clock besides the delay chain */ -#define EXMC_SDRAM_READSAMPLE_1_EXTRAHCLK EXMC_SDRSCTL_SSCR /*!< add 1 extra HCLK cycle to the read data sample clock besides the delay chain */ - -/* read data sample polarity */ -#define EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE ((uint32_t)0x00000000U) /*!< sample data at rising edge */ -#define EXMC_SQPIPSRAM_SAMPLE_FALLING_EDGE EXMC_SINIT_POL /*!< sample data at falling edge */ - -/* SQPI SRAM command flag */ -#define EXMC_SEND_COMMAND_FLAG_RDID EXMC_SRCMD_RDID /*!< EXMC_SRCMD_RDID flag bit */ -#define EXMC_SEND_COMMAND_FLAG_SC EXMC_SWCMD_SC /*!< EXMC_SWCMD_SC flag bit */ - -/* EXMC flag bits */ -#define EXMC_NAND_PCCARD_FLAG_RISE EXMC_NPINTEN_INTRS /*!< interrupt rising edge status */ -#define EXMC_NAND_PCCARD_FLAG_LEVEL EXMC_NPINTEN_INTHS /*!< interrupt high-level status */ -#define EXMC_NAND_PCCARD_FLAG_FALL EXMC_NPINTEN_INTFS /*!< interrupt falling edge status */ -#define EXMC_NAND_PCCARD_FLAG_FIFOE EXMC_NPINTEN_FFEPT /*!< FIFO empty flag */ -#define EXMC_SDRAM_FLAG_REFRESH EXMC_SDSDAT_REIF /*!< refresh error interrupt flag */ -#define EXMC_SDRAM_FLAG_NREADY EXMC_SDSDAT_NRDY /*!< not ready status */ - -/* EXMC interrupt flag bits */ -#define EXMC_NAND_PCCARD_INT_FLAG_RISE EXMC_NPINTEN_INTREN /*!< rising edge interrupt and flag */ -#define EXMC_NAND_PCCARD_INT_FLAG_LEVEL EXMC_NPINTEN_INTHEN /*!< high-level interrupt and flag */ -#define EXMC_NAND_PCCARD_INT_FLAG_FALL EXMC_NPINTEN_INTFEN /*!< falling edge interrupt and flag */ -#define EXMC_SDRAM_INT_FLAG_REFRESH EXMC_SDARI_REIE /*!< refresh error interrupt and flag */ - -/* function declarations */ -/* initialization functions */ -/* NOR/SRAM */ -/* deinitialize EXMC NOR/SRAM region */ -void exmc_norsram_deinit(uint32_t exmc_norsram_region); -/* initialize exmc_norsram_parameter_struct with the default values */ -void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct); -/* initialize EXMC NOR/SRAM region */ -void exmc_norsram_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct); -/* enable EXMC NOR/SRAM region */ -void exmc_norsram_enable(uint32_t exmc_norsram_region); -/* disable EXMC NOR/SRAM region */ -void exmc_norsram_disable(uint32_t exmc_norsram_region); -/* NAND */ -/* deinitialize EXMC NAND bank */ -void exmc_nand_deinit(uint32_t exmc_nand_bank); -/* initialize exmc_nand_parameter_struct with the default values */ -void exmc_nand_struct_para_init(exmc_nand_parameter_struct *exmc_nand_init_struct); -/* initialize EXMC NAND bank */ -void exmc_nand_init(exmc_nand_parameter_struct *exmc_nand_init_struct); -/* enable EXMC NAND bank */ -void exmc_nand_enable(uint32_t exmc_nand_bank); -/* disable EXMC NAND bank */ -void exmc_nand_disable(uint32_t exmc_nand_bank); -/* PC card */ -/* deinitialize EXMC PC card bank */ -void exmc_pccard_deinit(void); -/* initialize exmc_pccard_parameter_struct with the default values */ -void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct); -/* initialize EXMC PC card bank */ -void exmc_pccard_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct); -/* enable EXMC PC card bank */ -void exmc_pccard_enable(void); -/* disable EXMC PC card bank */ -void exmc_pccard_disable(void); -/* SDRAM */ -/* deinitialize EXMC SDRAM device */ -void exmc_sdram_deinit(uint32_t exmc_sdram_device); -/* initialize exmc_sdram_parameter_struct with the default values */ -void exmc_sdram_struct_para_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct); -/* initialize EXMC SDRAM device */ -void exmc_sdram_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct); -/* initialize exmc_sdram_command_parameter_struct with the default values */ -void exmc_sdram_struct_command_para_init(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct); -/* SQPIPSRAM */ -/* deinitialize EXMC SQPIPSRAM */ -void exmc_sqpipsram_deinit(void); -/* initialize exmc_sqpipsram_parameter_struct with the default values */ -void exmc_sqpipsram_struct_para_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct); -/* initialize EXMC SQPIPSRAM */ -void exmc_sqpipsram_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct); - -/* function configuration */ -/* NOR/SRAM */ -/* configure consecutive clock */ -void exmc_norsram_consecutive_clock_config(uint32_t clock_mode); -/* configure CRAM page size */ -void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size); -/* NAND */ -/* enable or disable the EXMC NAND ECC function */ -void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue); -/* get the EXMC ECC value */ -uint32_t exmc_ecc_get(uint32_t exmc_nand_bank); -/* SDRAM */ -/* enable or disable read sample */ -void exmc_sdram_readsample_enable(ControlStatus newvalue); -/* configure the delayed sample clock of read data */ -void exmc_sdram_readsample_config(uint32_t delay_cell, uint32_t extra_hclk); -/* configure the SDRAM memory command */ -void exmc_sdram_command_config(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct); -/* set auto-refresh interval */ -void exmc_sdram_refresh_count_set(uint32_t exmc_count); -/* set the number of successive auto-refresh command */ -void exmc_sdram_autorefresh_number_set(uint32_t exmc_number); -/* configure the write protection function */ -void exmc_sdram_write_protection_config(uint32_t exmc_sdram_device, ControlStatus newvalue); -/* get the status of SDRAM device0 or device1 */ -uint32_t exmc_sdram_bankstatus_get(uint32_t exmc_sdram_device); -/* SQPIPSRAM */ -/* set the read command */ -void exmc_sqpipsram_read_command_set(uint32_t read_command_mode, uint32_t read_wait_cycle, uint32_t read_command_code); -/* set the write command */ -void exmc_sqpipsram_write_command_set(uint32_t write_command_mode, uint32_t write_wait_cycle, uint32_t write_command_code); -/* send SPI read ID command */ -void exmc_sqpipsram_read_id_command_send(void); -/* send SPI special command which does not have address and data phase */ -void exmc_sqpipsram_write_cmd_send(void); -/* get the EXMC SPI ID low data */ -uint32_t exmc_sqpipsram_low_id_get(void); -/* get the EXMC SPI ID high data */ -uint32_t exmc_sqpipsram_high_id_get(void); -/* get the bit value of EXMC send write command bit or read ID command */ -FlagStatus exmc_sqpipsram_send_command_state_get(uint32_t send_command_flag); - -/* interrupt & flag functions */ -/* enable EXMC interrupt */ -void exmc_interrupt_enable(uint32_t exmc_bank, uint32_t interrupt); -/* disable EXMC interrupt */ -void exmc_interrupt_disable(uint32_t exmc_bank, uint32_t interrupt); -/* get EXMC flag status */ -FlagStatus exmc_flag_get(uint32_t exmc_bank, uint32_t flag); -/* clear EXMC flag status */ -void exmc_flag_clear(uint32_t exmc_bank, uint32_t flag); -/* get EXMC interrupt flag */ -FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank, uint32_t int_flag); -/* clear EXMC interrupt flag */ -void exmc_interrupt_flag_clear(uint32_t exmc_bank, uint32_t int_flag); - -#endif /* GD32F5XX_EXMC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h deleted file mode 100644 index 66a667166f6..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_exti.h +++ /dev/null @@ -1,293 +0,0 @@ -/*! - \file gd32f5xx_exti.h - \brief definitions for the EXTI - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_EXTI_H -#define GD32F5XX_EXTI_H - -#include "gd32f5xx.h" - -/* EXTI definitions */ -#define EXTI EXTI_BASE - -/* registers definitions */ -#define EXTI_INTEN REG32(EXTI + 0x00U) /*!< interrupt enable register */ -#define EXTI_EVEN REG32(EXTI + 0x04U) /*!< event enable register */ -#define EXTI_RTEN REG32(EXTI + 0x08U) /*!< rising edge trigger enable register */ -#define EXTI_FTEN REG32(EXTI + 0x0CU) /*!< falling edge trigger enable register */ -#define EXTI_SWIEV REG32(EXTI + 0x10U) /*!< software interrupt event register */ -#define EXTI_PD REG32(EXTI + 0x14U) /*!< pending register */ - -/* bits definitions */ -/* EXTI_INTEN */ -#define EXTI_INTEN_INTEN0 BIT(0) /*!< interrupt from line 0 */ -#define EXTI_INTEN_INTEN1 BIT(1) /*!< interrupt from line 1 */ -#define EXTI_INTEN_INTEN2 BIT(2) /*!< interrupt from line 2 */ -#define EXTI_INTEN_INTEN3 BIT(3) /*!< interrupt from line 3 */ -#define EXTI_INTEN_INTEN4 BIT(4) /*!< interrupt from line 4 */ -#define EXTI_INTEN_INTEN5 BIT(5) /*!< interrupt from line 5 */ -#define EXTI_INTEN_INTEN6 BIT(6) /*!< interrupt from line 6 */ -#define EXTI_INTEN_INTEN7 BIT(7) /*!< interrupt from line 7 */ -#define EXTI_INTEN_INTEN8 BIT(8) /*!< interrupt from line 8 */ -#define EXTI_INTEN_INTEN9 BIT(9) /*!< interrupt from line 9 */ -#define EXTI_INTEN_INTEN10 BIT(10) /*!< interrupt from line 10 */ -#define EXTI_INTEN_INTEN11 BIT(11) /*!< interrupt from line 11 */ -#define EXTI_INTEN_INTEN12 BIT(12) /*!< interrupt from line 12 */ -#define EXTI_INTEN_INTEN13 BIT(13) /*!< interrupt from line 13 */ -#define EXTI_INTEN_INTEN14 BIT(14) /*!< interrupt from line 14 */ -#define EXTI_INTEN_INTEN15 BIT(15) /*!< interrupt from line 15 */ -#define EXTI_INTEN_INTEN16 BIT(16) /*!< interrupt from line 16 */ -#define EXTI_INTEN_INTEN17 BIT(17) /*!< interrupt from line 17 */ -#define EXTI_INTEN_INTEN18 BIT(18) /*!< interrupt from line 18 */ -#define EXTI_INTEN_INTEN19 BIT(19) /*!< interrupt from line 19 */ -#define EXTI_INTEN_INTEN20 BIT(20) /*!< interrupt from line 20 */ -#define EXTI_INTEN_INTEN21 BIT(21) /*!< interrupt from line 21 */ -#define EXTI_INTEN_INTEN22 BIT(22) /*!< interrupt from line 22 */ -#define EXTI_INTEN_INTEN23 BIT(23) /*!< interrupt from line 23 */ -#define EXTI_INTEN_INTEN24 BIT(24) /*!< interrupt from line 24 */ -#define EXTI_INTEN_INTEN25 BIT(25) /*!< interrupt from line 25 */ - -/* EXTI_EVEN */ -#define EXTI_EVEN_EVEN0 BIT(0) /*!< event from line 0 */ -#define EXTI_EVEN_EVEN1 BIT(1) /*!< event from line 1 */ -#define EXTI_EVEN_EVEN2 BIT(2) /*!< event from line 2 */ -#define EXTI_EVEN_EVEN3 BIT(3) /*!< event from line 3 */ -#define EXTI_EVEN_EVEN4 BIT(4) /*!< event from line 4 */ -#define EXTI_EVEN_EVEN5 BIT(5) /*!< event from line 5 */ -#define EXTI_EVEN_EVEN6 BIT(6) /*!< event from line 6 */ -#define EXTI_EVEN_EVEN7 BIT(7) /*!< event from line 7 */ -#define EXTI_EVEN_EVEN8 BIT(8) /*!< event from line 8 */ -#define EXTI_EVEN_EVEN9 BIT(9) /*!< event from line 9 */ -#define EXTI_EVEN_EVEN10 BIT(10) /*!< event from line 10 */ -#define EXTI_EVEN_EVEN11 BIT(11) /*!< event from line 11 */ -#define EXTI_EVEN_EVEN12 BIT(12) /*!< event from line 12 */ -#define EXTI_EVEN_EVEN13 BIT(13) /*!< event from line 13 */ -#define EXTI_EVEN_EVEN14 BIT(14) /*!< event from line 14 */ -#define EXTI_EVEN_EVEN15 BIT(15) /*!< event from line 15 */ -#define EXTI_EVEN_EVEN16 BIT(16) /*!< event from line 16 */ -#define EXTI_EVEN_EVEN17 BIT(17) /*!< event from line 17 */ -#define EXTI_EVEN_EVEN18 BIT(18) /*!< event from line 18 */ -#define EXTI_EVEN_EVEN19 BIT(19) /*!< event from line 19 */ -#define EXTI_EVEN_EVEN20 BIT(20) /*!< event from line 20 */ -#define EXTI_EVEN_EVEN21 BIT(21) /*!< event from line 21 */ -#define EXTI_EVEN_EVEN22 BIT(22) /*!< event from line 22 */ -#define EXTI_EVEN_EVEN23 BIT(23) /*!< event from line 23 */ -#define EXTI_EVEN_EVEN24 BIT(24) /*!< event from line 24 */ -#define EXTI_EVEN_EVEN25 BIT(25) /*!< event from line 25 */ - -/* EXTI_RTEN */ -#define EXTI_RTEN_RTEN0 BIT(0) /*!< rising edge from line 0 */ -#define EXTI_RTEN_RTEN1 BIT(1) /*!< rising edge from line 1 */ -#define EXTI_RTEN_RTEN2 BIT(2) /*!< rising edge from line 2 */ -#define EXTI_RTEN_RTEN3 BIT(3) /*!< rising edge from line 3 */ -#define EXTI_RTEN_RTEN4 BIT(4) /*!< rising edge from line 4 */ -#define EXTI_RTEN_RTEN5 BIT(5) /*!< rising edge from line 5 */ -#define EXTI_RTEN_RTEN6 BIT(6) /*!< rising edge from line 6 */ -#define EXTI_RTEN_RTEN7 BIT(7) /*!< rising edge from line 7 */ -#define EXTI_RTEN_RTEN8 BIT(8) /*!< rising edge from line 8 */ -#define EXTI_RTEN_RTEN9 BIT(9) /*!< rising edge from line 9 */ -#define EXTI_RTEN_RTEN10 BIT(10) /*!< rising edge from line 10 */ -#define EXTI_RTEN_RTEN11 BIT(11) /*!< rising edge from line 11 */ -#define EXTI_RTEN_RTEN12 BIT(12) /*!< rising edge from line 12 */ -#define EXTI_RTEN_RTEN13 BIT(13) /*!< rising edge from line 13 */ -#define EXTI_RTEN_RTEN14 BIT(14) /*!< rising edge from line 14 */ -#define EXTI_RTEN_RTEN15 BIT(15) /*!< rising edge from line 15 */ -#define EXTI_RTEN_RTEN16 BIT(16) /*!< rising edge from line 16 */ -#define EXTI_RTEN_RTEN17 BIT(17) /*!< rising edge from line 17 */ -#define EXTI_RTEN_RTEN18 BIT(18) /*!< rising edge from line 18 */ -#define EXTI_RTEN_RTEN19 BIT(19) /*!< rising edge from line 19 */ -#define EXTI_RTEN_RTEN20 BIT(20) /*!< rising edge from line 20 */ -#define EXTI_RTEN_RTEN21 BIT(21) /*!< rising edge from line 21 */ -#define EXTI_RTEN_RTEN22 BIT(22) /*!< rising edge from line 22 */ -#define EXTI_RTEN_RTEN23 BIT(23) /*!< rising edge from line 23 */ -#define EXTI_RTEN_RTEN24 BIT(24) /*!< rising edge from line 24 */ -#define EXTI_RTEN_RTEN25 BIT(25) /*!< rising edge from line 25 */ - -/* EXTI_FTEN */ -#define EXTI_FTEN_FTEN0 BIT(0) /*!< falling edge from line 0 */ -#define EXTI_FTEN_FTEN1 BIT(1) /*!< falling edge from line 1 */ -#define EXTI_FTEN_FTEN2 BIT(2) /*!< falling edge from line 2 */ -#define EXTI_FTEN_FTEN3 BIT(3) /*!< falling edge from line 3 */ -#define EXTI_FTEN_FTEN4 BIT(4) /*!< falling edge from line 4 */ -#define EXTI_FTEN_FTEN5 BIT(5) /*!< falling edge from line 5 */ -#define EXTI_FTEN_FTEN6 BIT(6) /*!< falling edge from line 6 */ -#define EXTI_FTEN_FTEN7 BIT(7) /*!< falling edge from line 7 */ -#define EXTI_FTEN_FTEN8 BIT(8) /*!< falling edge from line 8 */ -#define EXTI_FTEN_FTEN9 BIT(9) /*!< falling edge from line 9 */ -#define EXTI_FTEN_FTEN10 BIT(10) /*!< falling edge from line 10 */ -#define EXTI_FTEN_FTEN11 BIT(11) /*!< falling edge from line 11 */ -#define EXTI_FTEN_FTEN12 BIT(12) /*!< falling edge from line 12 */ -#define EXTI_FTEN_FTEN13 BIT(13) /*!< falling edge from line 13 */ -#define EXTI_FTEN_FTEN14 BIT(14) /*!< falling edge from line 14 */ -#define EXTI_FTEN_FTEN15 BIT(15) /*!< falling edge from line 15 */ -#define EXTI_FTEN_FTEN16 BIT(16) /*!< falling edge from line 16 */ -#define EXTI_FTEN_FTEN17 BIT(17) /*!< falling edge from line 17 */ -#define EXTI_FTEN_FTEN18 BIT(18) /*!< falling edge from line 18 */ -#define EXTI_FTEN_FTEN19 BIT(19) /*!< falling edge from line 19 */ -#define EXTI_FTEN_FTEN20 BIT(20) /*!< falling edge from line 20 */ -#define EXTI_FTEN_FTEN21 BIT(21) /*!< falling edge from line 21 */ -#define EXTI_FTEN_FTEN22 BIT(22) /*!< falling edge from line 22 */ -#define EXTI_FTEN_FTEN23 BIT(23) /*!< falling edge from line 23 */ -#define EXTI_FTEN_FTEN24 BIT(24) /*!< falling edge from line 24 */ -#define EXTI_FTEN_FTEN25 BIT(25) /*!< falling edge from line 25 */ - -/* EXTI_SWIEV */ -#define EXTI_SWIEV_SWIEV0 BIT(0) /*!< software interrupt/event request from line 0 */ -#define EXTI_SWIEV_SWIEV1 BIT(1) /*!< software interrupt/event request from line 1 */ -#define EXTI_SWIEV_SWIEV2 BIT(2) /*!< software interrupt/event request from line 2 */ -#define EXTI_SWIEV_SWIEV3 BIT(3) /*!< software interrupt/event request from line 3 */ -#define EXTI_SWIEV_SWIEV4 BIT(4) /*!< software interrupt/event request from line 4 */ -#define EXTI_SWIEV_SWIEV5 BIT(5) /*!< software interrupt/event request from line 5 */ -#define EXTI_SWIEV_SWIEV6 BIT(6) /*!< software interrupt/event request from line 6 */ -#define EXTI_SWIEV_SWIEV7 BIT(7) /*!< software interrupt/event request from line 7 */ -#define EXTI_SWIEV_SWIEV8 BIT(8) /*!< software interrupt/event request from line 8 */ -#define EXTI_SWIEV_SWIEV9 BIT(9) /*!< software interrupt/event request from line 9 */ -#define EXTI_SWIEV_SWIEV10 BIT(10) /*!< software interrupt/event request from line 10 */ -#define EXTI_SWIEV_SWIEV11 BIT(11) /*!< software interrupt/event request from line 11 */ -#define EXTI_SWIEV_SWIEV12 BIT(12) /*!< software interrupt/event request from line 12 */ -#define EXTI_SWIEV_SWIEV13 BIT(13) /*!< software interrupt/event request from line 13 */ -#define EXTI_SWIEV_SWIEV14 BIT(14) /*!< software interrupt/event request from line 14 */ -#define EXTI_SWIEV_SWIEV15 BIT(15) /*!< software interrupt/event request from line 15 */ -#define EXTI_SWIEV_SWIEV16 BIT(16) /*!< software interrupt/event request from line 16 */ -#define EXTI_SWIEV_SWIEV17 BIT(17) /*!< software interrupt/event request from line 17 */ -#define EXTI_SWIEV_SWIEV18 BIT(18) /*!< software interrupt/event request from line 18 */ -#define EXTI_SWIEV_SWIEV19 BIT(19) /*!< software interrupt/event request from line 19 */ -#define EXTI_SWIEV_SWIEV20 BIT(20) /*!< software interrupt/event request from line 20 */ -#define EXTI_SWIEV_SWIEV21 BIT(21) /*!< software interrupt/event request from line 21 */ -#define EXTI_SWIEV_SWIEV22 BIT(22) /*!< software interrupt/event request from line 22 */ -#define EXTI_SWIEV_SWIEV23 BIT(23) /*!< software interrupt/event request from line 23 */ -#define EXTI_SWIEV_SWIEV24 BIT(24) /*!< software interrupt/event request from line 24 */ -#define EXTI_SWIEV_SWIEV25 BIT(25) /*!< software interrupt/event request from line 25 */ - -/* EXTI_PD */ -#define EXTI_PD_PD0 BIT(0) /*!< interrupt pending status from line 0 */ -#define EXTI_PD_PD1 BIT(1) /*!< interrupt pending status from line 1 */ -#define EXTI_PD_PD2 BIT(2) /*!< interrupt pending status from line 2 */ -#define EXTI_PD_PD3 BIT(3) /*!< interrupt pending status from line 3 */ -#define EXTI_PD_PD4 BIT(4) /*!< interrupt pending status from line 4 */ -#define EXTI_PD_PD5 BIT(5) /*!< interrupt pending status from line 5 */ -#define EXTI_PD_PD6 BIT(6) /*!< interrupt pending status from line 6 */ -#define EXTI_PD_PD7 BIT(7) /*!< interrupt pending status from line 7 */ -#define EXTI_PD_PD8 BIT(8) /*!< interrupt pending status from line 8 */ -#define EXTI_PD_PD9 BIT(9) /*!< interrupt pending status from line 9 */ -#define EXTI_PD_PD10 BIT(10) /*!< interrupt pending status from line 10 */ -#define EXTI_PD_PD11 BIT(11) /*!< interrupt pending status from line 11 */ -#define EXTI_PD_PD12 BIT(12) /*!< interrupt pending status from line 12 */ -#define EXTI_PD_PD13 BIT(13) /*!< interrupt pending status from line 13 */ -#define EXTI_PD_PD14 BIT(14) /*!< interrupt pending status from line 14 */ -#define EXTI_PD_PD15 BIT(15) /*!< interrupt pending status from line 15 */ -#define EXTI_PD_PD16 BIT(16) /*!< interrupt pending status from line 16 */ -#define EXTI_PD_PD17 BIT(17) /*!< interrupt pending status from line 17 */ -#define EXTI_PD_PD18 BIT(18) /*!< interrupt pending status from line 18 */ -#define EXTI_PD_PD19 BIT(19) /*!< interrupt pending status from line 19 */ -#define EXTI_PD_PD20 BIT(20) /*!< interrupt pending status from line 20 */ -#define EXTI_PD_PD21 BIT(21) /*!< interrupt pending status from line 21 */ -#define EXTI_PD_PD22 BIT(22) /*!< interrupt pending status from line 22 */ -#define EXTI_PD_PD23 BIT(23) /*!< interrupt pending status from line 23 */ -#define EXTI_PD_PD24 BIT(24) /*!< interrupt pending status from line 24 */ -#define EXTI_PD_PD25 BIT(25) /*!< interrupt pending status from line 25 */ - -/* constants definitions */ -/* EXTI line number */ -typedef enum { - EXTI_0 = BIT(0), /*!< EXTI line 0 */ - EXTI_1 = BIT(1), /*!< EXTI line 1 */ - EXTI_2 = BIT(2), /*!< EXTI line 2 */ - EXTI_3 = BIT(3), /*!< EXTI line 3 */ - EXTI_4 = BIT(4), /*!< EXTI line 4 */ - EXTI_5 = BIT(5), /*!< EXTI line 5 */ - EXTI_6 = BIT(6), /*!< EXTI line 6 */ - EXTI_7 = BIT(7), /*!< EXTI line 7 */ - EXTI_8 = BIT(8), /*!< EXTI line 8 */ - EXTI_9 = BIT(9), /*!< EXTI line 9 */ - EXTI_10 = BIT(10), /*!< EXTI line 10 */ - EXTI_11 = BIT(11), /*!< EXTI line 11 */ - EXTI_12 = BIT(12), /*!< EXTI line 12 */ - EXTI_13 = BIT(13), /*!< EXTI line 13 */ - EXTI_14 = BIT(14), /*!< EXTI line 14 */ - EXTI_15 = BIT(15), /*!< EXTI line 15 */ - EXTI_16 = BIT(16), /*!< EXTI line 16 */ - EXTI_17 = BIT(17), /*!< EXTI line 17 */ - EXTI_18 = BIT(18), /*!< EXTI line 18 */ - EXTI_19 = BIT(19), /*!< EXTI line 19 */ - EXTI_20 = BIT(20), /*!< EXTI line 20 */ - EXTI_21 = BIT(21), /*!< EXTI line 21 */ - EXTI_22 = BIT(22), /*!< EXTI line 22 */ - EXTI_23 = BIT(23), /*!< EXTI line 23 */ - EXTI_24 = BIT(24), /*!< EXTI line 24 */ - EXTI_25 = BIT(25) /*!< EXTI line 25 */ -} exti_line_enum; - -/* external interrupt and event */ -typedef enum { - EXTI_INTERRUPT = 0, /*!< EXTI interrupt mode */ - EXTI_EVENT /*!< EXTI event mode */ -} exti_mode_enum; - -/* interrupt trigger mode */ -typedef enum { - EXTI_TRIG_RISING = 0, /*!< EXTI rising edge trigger */ - EXTI_TRIG_FALLING, /*!< EXTI falling edge trigger */ - EXTI_TRIG_BOTH, /*!< EXTI rising and falling edge trigger */ - EXTI_TRIG_NONE /*!< EXTI without rising or falling edge trigger */ -} exti_trig_type_enum; - -/* function declarations */ -/* deinitialize the EXTI */ -void exti_deinit(void); -/* initialize the EXTI line x */ -void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type); -/* enable the interrupts from EXTI line x */ -void exti_interrupt_enable(exti_line_enum linex); -/* disable the interrupts from EXTI line x */ -void exti_interrupt_disable(exti_line_enum linex); -/* enable the events from EXTI line x */ -void exti_event_enable(exti_line_enum linex); -/* disable the events from EXTI line x */ -void exti_event_disable(exti_line_enum linex); -/* enable the software interrupt event from EXTI line x */ -void exti_software_interrupt_enable(exti_line_enum linex); -/* disable the software interrupt event from EXTI line x */ -void exti_software_interrupt_disable(exti_line_enum linex); - -/* interrupt & flag functions */ -/* get EXTI line x interrupt pending flag */ -FlagStatus exti_flag_get(exti_line_enum linex); -/* clear EXTI line x interrupt pending flag */ -void exti_flag_clear(exti_line_enum linex); -/* get EXTI line x interrupt pending flag */ -FlagStatus exti_interrupt_flag_get(exti_line_enum linex); -/* clear EXTI line x interrupt pending flag */ -void exti_interrupt_flag_clear(exti_line_enum linex); - -#endif /* GD32F5XX_EXTI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h deleted file mode 100644 index d6b13a1df40..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fmc.h +++ /dev/null @@ -1,644 +0,0 @@ -/*! - \file gd32f5xx_fmc.h - \brief definitions for the FMC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#ifndef GD32F5XX_FMC_H -#define GD32F5XX_FMC_H - -#include "gd32f5xx.h" - -/* FMC and option byte definition */ -#define FMC FMC_BASE /*!< FMC register base address */ -#define OB OB_BASE /*!< option byte base address */ - -/* registers definitions */ -#define FMC_KEY REG32((FMC) + 0x00000004U) /*!< FMC unlock key register */ -#define FMC_OBKEY REG32((FMC) + 0x00000008U) /*!< FMC option byte unlock key register */ -#define FMC_STAT REG32((FMC) + 0x0000000CU) /*!< FMC status register */ -#define FMC_CTL REG32((FMC) + 0x00000010U) /*!< FMC control register */ -#define FMC_OBCTL0 REG32((FMC) + 0x00000014U) /*!< FMC option byte control register 0 */ -#define FMC_OBCTL1 REG32((FMC) + 0x00000018U) /*!< FMC option byte control register 1 */ -#define FMC_PECFG REG32((FMC) + 0x00000020U) /*!< FMC page erase configuration register */ -#define FMC_PEKEY REG32((FMC) + 0x00000024U) /*!< FMC unlock page erase key register */ -#define FMC_OTP1CFG REG32((FMC) + 0x00000028U) /*!< FMC OTP1 configuration register */ -#define FMC_LDECCADDR0 REG32((FMC) + 0x0000002CU) /*!< FMC two bits ECC error address0 when load code from flash/bootloader/OTP1 */ -#define FMC_LDECCADDR1 REG32((FMC) + 0x00000030U) /*!< FMC two bits ECC error address1 when load code from flash/bootloader/OTP1 */ -#define FMC_LDECCADDR2 REG32((FMC) + 0x00000034U) /*!< FMC two bits ECC error address2 when load code from flash/bootloader/OTP1 */ -#define FMC_OBSTAT REG32((FMC) + 0x00000040U) /*!< FMC option bytes status register */ -#define FMC_PID REG32((FMC) + 0x00000100U) /*!< FMC product ID register */ -#define EFUSE_CS REG32((FMC) + 0x00000200U) /*!< EFUSE control and status register */ -#define EFUSE_ADDR REG32((FMC) + 0x00000204U) /*!< EFUSE address register */ -#define EFUSE_CTL REG32((FMC) + 0x00000208U) /*!< EFUSE efuse controlregister */ -#define EFUSE_USER_DATA REG32((FMC) + 0x0000020CU) /*!< EFUSE user data register */ - -#define OB_USER REG8((OB) + 0x00010000U) /*!< option byte user value*/ -#define OB_SPC REG8((OB) + 0x00010001U) /*!< option byte security protection value */ -#define OB_WP0_0 REG8((OB) + 0x00010008U) /*!< option byte write protection 0 */ -#define OB_WP0_1 REG8((OB) + 0x00010009U) /*!< option byte write protection 0 */ -#define OB_WP0_2 REG8((OB) + 0x0001000CU) /*!< option byte write protection 0 */ -#define OB_WP1_0 REG8((OB) + 0x00000008U) /*!< option byte write protection 1 */ -#define OB_WP1_1 REG8((OB) + 0x00000009U) /*!< option byte write protection 1 */ -#define OB_WP1_2 REG8((OB) + 0x0000000CU) /*!< option byte write protection 1 */ - -/* registers offset */ -#define EFUSE_CTL_OFFSET ((uint32_t)0x00000208U) /*!< EFUSE efuse control register offset */ -#define EFUSE_USER_DATA_OFFSET ((uint32_t)0x0000020CU) /*!< EFUSE user data register offset */ - -/* bits definitions */ -/* FMC_KEY */ -#define FMC_KEY_KEY BITS(0,31) /*!< FMC main flash key bits */ - -/* FMC_OBKEY */ -#define FMC_OBKEY_OBKEY BITS(0,31) /*!< option byte key bits */ - -/* FMC_STAT */ -#define FMC_STAT_END BIT(0) /*!< end of operation flag bit */ -#define FMC_STAT_OPERR BIT(1) /*!< flash operation error flag bit */ -#define FMC_STAT_LDECCDET BIT(2) /*!< two bits ECC error when load code from flash/OTP1/bootloader */ -#define FMC_STAT_WPERR BIT(4) /*!< erase/Program protection error flag bit */ -#define FMC_STAT_PGAERR BIT(5) /*!< Program alignment error flag bit */ -#define FMC_STAT_PGMERR BIT(6) /*!< program size not match error flag bit */ -#define FMC_STAT_PGSERR BIT(7) /*!< program sequence error flag bit */ -#define FMC_STAT_RDCERR BIT(8) /*!< CBUS data read protection error flag bit */ -#define FMC_STAT_BUSY BIT(16) /*!< flash busy flag bit */ - -/* FMC_CTL */ -#define FMC_CTL_PG BIT(0) /*!< main flash program command bit */ -#define FMC_CTL_SER BIT(1) /*!< main flash sector erase command bit */ -#define FMC_CTL_MER0 BIT(2) /*!< main flash mass erase for bank0 command bit */ -#define FMC_CTL_SN BITS(3,7) /*!< select which sector number to be erased */ -#define FMC_CTL_PSZ BITS(8,9) /*!< program size bit */ -#define FMC_CTL_DWPGE BIT(10) /*!< double word Program size bit enable bit */ -#define FMC_CTL_SN_5 BIT(11) /*!< bit 5 of SN */ -#define FMC_CTL_MER1 BIT(15) /*!< main flash mass erase for bank1 command bit */ -#define FMC_CTL_START BIT(16) /*!< send erase command to FMC bit */ -#define FMC_CTL_ENDIE BIT(24) /*!< end of operation interrupt enable bit */ -#define FMC_CTL_ERRIE BIT(25) /*!< error interrupt enable bit */ -#define FMC_CTL_LDECCIE BIT(26) /*!< load code ECC error interrupt enable bit */ -#define FMC_CTL_NWLDE BIT(29) /*!< No wait time area load enable when system reset */ -#define FMC_CTL_RLBP BIT(30) /*!< Read lock block protection for OTP2 */ -#define FMC_CTL_LK BIT(31) /*!< FMC_CTL lock bit */ - -/* FMC_OBCTL0 */ -#define FMC_OBCTL0_OB_LK BIT(0) /*!< FMC_OBCTL0 lock bit */ -#define FMC_OBCTL0_OB_START BIT(1) /*!< send option byte change command to FMC bit */ -#define FMC_OBCTL0_BOR_TH BITS(2,3) /*!< option byte BOR threshold value */ -#define FMC_OBCTL0_BB BIT(4) /*!< option byte boot bank value */ -#define FMC_OBCTL0_NWDG_HW BIT(5) /*!< option byte watchdog value */ -#define FMC_OBCTL0_NRST_DPSLP BIT(6) /*!< option byte deepsleep reset value */ -#define FMC_OBCTL0_NRST_STDBY BIT(7) /*!< option byte standby reset value */ -#define FMC_OBCTL0_SPC BITS(8,15) /*!< option byte Security Protection code */ -#define FMC_OBCTL0_WP0 BITS(16,27) /*!< erase/program protection of low 12 sectors of bank0 when DRP is 0 */ -#define FMC_OBCTL0_ECCEN BIT(28) /*!< ECC enable bit */ -#define FMC_OBCTL0_NWA BIT(29) /*!< no waiting time area select bit */ -#define FMC_OBCTL0_DRP BIT(31) /*!< CBUS read protection bit */ - -/* FMC_OBCTL1 */ -#define FMC_OBCTL1_WP0_H BITS(0,7) /*!< erase/program protection of high 8 sectors of bank0 when DRP is 0 */ -#define FMC_OBCTL1_WP1_H BITS(8,15) /*!< erase/program protection of high 8 sectors of bank1 when DRP is 0 */ -#define FMC_OBCTL1_WP1_L BITS(16,27) /*!< erase/program protection of low 12 sectors of bank1 when DRP is 0 */ - -/* FMC_PECFG */ -#define FMC_PECFG_PE_ADDR BITS(0,28) /*!< page address (4KB alignment) */ -#define FMC_PECFG_PE_EN BIT(31) /*!< the enable bit of page erase function */ - -/* FMC_PEKEY */ -#define FMC_PEKEY_PE_KEY BITS(0,31) /*!< FMC_PECFG unlock key value */ - -/* FMC_OTP1CFG */ -#define FMC_OTP1CFG_OTP1REN BITS(0,15) /*!< FMC OTP1 read enable bits */ - -/* FMC_LDECCADDR0 */ -#define FMC_LDECCADDR0_LDECCADDR0 BITS(0,31) /*!< ECC two bits error address0 when load code from flash/bootloader/OTP1 */ - -/* FMC_LDECCADDR1 */ -#define FMC_LDECCADDR1_LDECCADDR1 BITS(0,31) /*!< ECC two bits error address1 when load code from flash/bootloader/OTP1 */ - -/* FMC_LDECCADDR2 */ -#define FMC_LDECCADDR2_LDECCADDR2 BITS(0,31) /*!< ECC two bits error address2 when load code from flash/bootloader/OTP1 */ - -/* FMC_OBSTAT */ -#define FMC_OB_SPCL BIT(1) /*!< security protection is level low */ -#define FMC_OB_SPCH BIT(2) /*!< security protection is level high */ - -/* FMC_PID */ -#define FMC_PID_PID BITS(0,31) /*!< product ID bits */ - -/* EFUSE_CS */ -#define EFUSE_CS_EFSTR BIT(0) /*!< start efuse operation */ -#define EFUSE_CS_EFRW BIT(1) /*!< the selection of efuse operation */ -#define EFUSE_CS_EFBYP BIT(2) /*!< EFUSE program supply selection */ -#define EFUSE_CS_PGIF BIT(16) /*!< program operation complete flag */ -#define EFUSE_CS_RDIF BIT(17) /*!< read operation complete flag */ -#define EFUSE_CS_OVBERIF BIT(18) /*!< overstep boundary error flag */ -#define EFUSE_CS_PGIE BIT(20) /*!< enable bit for program operation completed interrupt */ -#define EFUSE_CS_RDIE BIT(21) /*!< enable bit for read operation completed interrupt */ -#define EFUSE_CS_OVBERIE BIT(22) /*!< enable bit for overstep boundary error interrupt */ -#define EFUSE_CS_PGIC BIT(24) /*!< clear bit for program operation completed interrupt flag */ -#define EFUSE_CS_RDIC BIT(25) /*!< clear bit for read operation completed interrupt flag */ -#define EFUSE_CS_OVBERIC BIT(26) /*!< clear bit for overstep boundary error interrupt flag */ - -/* EFUSE_ADDR */ -#define EFUSE_ADDR_EFADDR BITS(0,4) /*!< read or program efuse data start address */ -#define EFUSE_ADDR_EFSIZE BITS(8,12) /*!< read or program efuse data size */ - -/* EFUSE_CTL */ -#define EFUSE_CTL_EFSPC BIT(0) /*!< EFUSE security protection level */ -#define EFUSE_CTL_NDBG BIT(1) /*!< debugging permission setting */ -#define EFUSE_CTL_NBTSB BIT(2) /*!< not boot from sram or bootloader */ -#define EFUSE_CTL_BTFOSEL BIT(3) /*!< select boot from flash or OTP1 when NBTSB is 1 or BOOT0 is 0 */ -#define EFUSE_CTL_UDLK BIT(6) /*!< EFUSE_USER_DATA register lock bit */ -#define EFUSE_CTL_LK BIT(7) /*!< EFUSE_CTL register lock bit */ - -/* EFUSE_USER_DATA */ -#define EFUSE_USER_DATA_USERDATA BITS(0,7) /*!< EFUSE USER_DATA value */ - -/* unlock key */ -#define UNLOCK_KEY0 ((uint32_t)0x45670123U) /*!< unlock key 0 */ -#define UNLOCK_KEY1 ((uint32_t)0xCDEF89ABU) /*!< unlock key 1 */ -#define UNLOCK_PE_KEY ((uint32_t)0xA9B8C7D6U) /*!< unlock page erase function key */ - -#define OB_UNLOCK_KEY0 ((uint32_t)0x08192A3BU) /*!< ob unlock key 0 */ -#define OB_UNLOCK_KEY1 ((uint32_t)0x4C5D6E7FU) /*!< ob unlock key 1 */ - -/* option byte BOR threshold value */ -#define OBCTL0_BOR_TH(regval) (BITS(2,3) & ((uint32_t)(regval)) << 2U) -#define OB_BOR_TH_VALUE3 OBCTL0_BOR_TH(0) /*!< BOR threshold value 3 */ -#define OB_BOR_TH_VALUE2 OBCTL0_BOR_TH(1) /*!< BOR threshold value 2 */ -#define OB_BOR_TH_VALUE1 OBCTL0_BOR_TH(2) /*!< BOR threshold value 1 */ -#define OB_BOR_TH_OFF OBCTL0_BOR_TH(3) /*!< no BOR function */ - -/* option byte boot bank value */ -#define OBCTL0_BB(regval) (BIT(4) & ((uint32_t)(regval) << 4U)) -#define OB_BB_DISABLE OBCTL0_BB(0) /*!< boot from bank0 */ -#define OB_BB_ENABLE OBCTL0_BB(1) /*!< boot from bank1 or bank0 if bank1 is void */ - -/* option byte software/hardware free watch dog timer */ -#define OBCTL0_NWDG_HW(regval) (BIT(5) & ((uint32_t)(regval)) << 5U) -#define OB_FWDGT_SW OBCTL0_NWDG_HW(1) /*!< software free watchdog */ -#define OB_FWDGT_HW OBCTL0_NWDG_HW(0) /*!< hardware free watchdog */ - -/* option byte reset or not entering deep sleep mode */ -#define OBCTL0_NRST_DPSLP(regval) (BIT(6) & ((uint32_t)(regval)) << 6U) -#define OB_DEEPSLEEP_NRST OBCTL0_NRST_DPSLP(1) /*!< no reset when entering deepsleep mode */ -#define OB_DEEPSLEEP_RST OBCTL0_NRST_DPSLP(0) /*!< generate a reset instead of entering deepsleep mode */ - -/* option byte reset or not entering standby mode */ -#define OBCTL0_NRST_STDBY(regval) (BIT(7) & ((uint32_t)(regval)) << 7U) -#define OB_STDBY_NRST OBCTL0_NRST_STDBY(1) /*!< no reset when entering deepsleep mode */ -#define OB_STDBY_RST OBCTL0_NRST_STDBY(0) /*!< generate a reset instead of entering standby mode */ - -/* option byte sram/flash ECC configure */ -#define OBCTL0_ECCEN(regval) (BIT(28) & ((uint32_t)(regval) << 28U)) -#define OB_ECC_DISABLE OBCTL0_ECCEN(0) /*!< sram/flash ECC disable */ -#define OB_ECC_ENABLE OBCTL0_ECCEN(1) /*!< sram/flash ECC enable */ - -/* option byte no waiting time area select */ -#define OBCTL0_NWA(regval) (BIT(29) & ((uint32_t)(regval) << 29U)) -#define OB_NWA_BANK1 OBCTL0_NWA(0) /*!< bank1 is no waiting time area */ -#define OB_NWA_BANK0 OBCTL0_NWA(1) /*!< bank0 is no waiting time area */ - -/* read protect configure */ -#define FMC_NSPC ((uint8_t)0xAAU) /*!< no security protection */ -#define FMC_LSPC ((uint8_t)0xBBU) /*!< low security protection */ -#define FMC_HSPC ((uint8_t)0xCCU) /*!< high security protection */ - -/* option bytes write protection */ -#define OB_WP_0 ((uint64_t)0x0000000000000001U) /*!< erase/program protection of sector 0 */ -#define OB_WP_1 ((uint64_t)0x0000000000000002U) /*!< erase/program protection of sector 1 */ -#define OB_WP_2 ((uint64_t)0x0000000000000004U) /*!< erase/program protection of sector 2 */ -#define OB_WP_3 ((uint64_t)0x0000000000000008U) /*!< erase/program protection of sector 3 */ -#define OB_WP_4 ((uint64_t)0x0000000000000010U) /*!< erase/program protection of sector 4 */ -#define OB_WP_5 ((uint64_t)0x0000000000000020U) /*!< erase/program protection of sector 5 */ -#define OB_WP_6 ((uint64_t)0x0000000000000040U) /*!< erase/program protection of sector 6 */ -#define OB_WP_7 ((uint64_t)0x0000000000000080U) /*!< erase/program protection of sector 7 */ -#define OB_WP_8 ((uint64_t)0x0000000000000100U) /*!< erase/program protection of sector 8 */ -#define OB_WP_9 ((uint64_t)0x0000000000000200U) /*!< erase/program protection of sector 9 */ -#define OB_WP_10 ((uint64_t)0x0000000000000400U) /*!< erase/program protection of sector 10 */ -#define OB_WP_11 ((uint64_t)0x0000000000000800U) /*!< erase/program protection of sector 11 */ -#define OB_WP_12 ((uint64_t)0x0000000000001000U) /*!< erase/program protection of sector 12 */ -#define OB_WP_13 ((uint64_t)0x0000000000002000U) /*!< erase/program protection of sector 13 */ -#define OB_WP_14 ((uint64_t)0x0000000000004000U) /*!< erase/program protection of sector 14 */ -#define OB_WP_15 ((uint64_t)0x0000000000008000U) /*!< erase/program protection of sector 15 */ -#define OB_WP_16 ((uint64_t)0x0000000000010000U) /*!< erase/program protection of sector 16 */ -#define OB_WP_17 ((uint64_t)0x0000000000020000U) /*!< erase/program protection of sector 17 */ -#define OB_WP_18 ((uint64_t)0x0000000000040000U) /*!< erase/program protection of sector 18 */ -#define OB_WP_19 ((uint64_t)0x0000000000080000U) /*!< erase/program protection of sector 19 */ -#define OB_WP_20 ((uint64_t)0x0000000000100000U) /*!< erase/program protection of sector 20 */ -#define OB_WP_21 ((uint64_t)0x0000000000200000U) /*!< erase/program protection of sector 21 */ -#define OB_WP_22 ((uint64_t)0x0000000000400000U) /*!< erase/program protection of sector 22 */ -#define OB_WP_23 ((uint64_t)0x0000000000800000U) /*!< erase/program protection of sector 23 */ -#define OB_WP_24 ((uint64_t)0x0000000001000000U) /*!< erase/program protection of sector 24 */ -#define OB_WP_25 ((uint64_t)0x0000000002000000U) /*!< erase/program protection of sector 25 */ -#define OB_WP_26 ((uint64_t)0x0000000004000000U) /*!< erase/program protection of sector 26 */ -#define OB_WP_27 ((uint64_t)0x0000000008000000U) /*!< erase/program protection of sector 27 */ -#define OB_WP_28 ((uint64_t)0x0000000010000000U) /*!< erase/program protection of sector 28 */ -#define OB_WP_29 ((uint64_t)0x0000000020000000U) /*!< erase/program protection of sector 29 */ -#define OB_WP_30 ((uint64_t)0x0000000040000000U) /*!< erase/program protection of sector 30 */ -#define OB_WP_31 ((uint64_t)0x0000000080000000U) /*!< erase/program protection of sector 31 */ -#define OB_WP_32 ((uint64_t)0x0000000100000000U) /*!< erase/program protection of sector 32 */ -#define OB_WP_33 ((uint64_t)0x0000000200000000U) /*!< erase/program protection of sector 33 */ -#define OB_WP_34 ((uint64_t)0x0000000400000000U) /*!< erase/program protection of sector 34 */ -#define OB_WP_35 ((uint64_t)0x0000000800000000U) /*!< erase/program protection of sector 35 */ -#define OB_WP_36 ((uint64_t)0x0000001000000000U) /*!< erase/program protection of sector 36 */ -#define OB_WP_37 ((uint64_t)0x0000002000000000U) /*!< erase/program protection of sector 37 */ -#define OB_WP_38 ((uint64_t)0x0000004000000000U) /*!< erase/program protection of sector 38 */ -#define OB_WP_39_53 ((uint64_t)0x0000008000000000U) /*!< erase/program protection of sector 39~53 */ -#define OB_WP_ALL ((uint64_t)0x000000FFFFFFFFFFU) /*!< erase/program protection of all sectors */ - -/* option bytes CBUS read protection */ -#define OB_DRP_0 ((uint64_t)0x0000000000000001U) /*!< CBUS read protection protection of sector 0 */ -#define OB_DRP_1 ((uint64_t)0x0000000000000002U) /*!< CBUS read protection protection of sector 1 */ -#define OB_DRP_2 ((uint64_t)0x0000000000000004U) /*!< CBUS read protection protection of sector 2 */ -#define OB_DRP_3 ((uint64_t)0x0000000000000008U) /*!< CBUS read protection protection of sector 3 */ -#define OB_DRP_4 ((uint64_t)0x0000000000000010U) /*!< CBUS read protection protection of sector 4 */ -#define OB_DRP_5 ((uint64_t)0x0000000000000020U) /*!< CBUS read protection protection of sector 5 */ -#define OB_DRP_6 ((uint64_t)0x0000000000000040U) /*!< CBUS read protection protection of sector 6 */ -#define OB_DRP_7 ((uint64_t)0x0000000000000080U) /*!< CBUS read protection protection of sector 7 */ -#define OB_DRP_8 ((uint64_t)0x0000000000000100U) /*!< CBUS read protection protection of sector 8 */ -#define OB_DRP_9 ((uint64_t)0x0000000000000200U) /*!< CBUS read protection protection of sector 9 */ -#define OB_DRP_10 ((uint64_t)0x0000000000000400U) /*!< CBUS read protection protection of sector 10 */ -#define OB_DRP_11 ((uint64_t)0x0000000000000800U) /*!< CBUS read protection protection of sector 11 */ -#define OB_DRP_12 ((uint64_t)0x0000000000001000U) /*!< CBUS read protection protection of sector 12 */ -#define OB_DRP_13 ((uint64_t)0x0000000000002000U) /*!< CBUS read protection protection of sector 13 */ -#define OB_DRP_14 ((uint64_t)0x0000000000004000U) /*!< CBUS read protection protection of sector 14 */ -#define OB_DRP_15 ((uint64_t)0x0000000000008000U) /*!< CBUS read protection protection of sector 15 */ -#define OB_DRP_16 ((uint64_t)0x0000000000010000U) /*!< CBUS read protection protection of sector 16 */ -#define OB_DRP_17 ((uint64_t)0x0000000000020000U) /*!< CBUS read protection protection of sector 17 */ -#define OB_DRP_18 ((uint64_t)0x0000000000040000U) /*!< CBUS read protection protection of sector 18 */ -#define OB_DRP_19 ((uint64_t)0x0000000000080000U) /*!< CBUS read protection protection of sector 19 */ -#define OB_DRP_20 ((uint64_t)0x0000000000100000U) /*!< CBUS read protection protection of sector 20 */ -#define OB_DRP_21 ((uint64_t)0x0000000000200000U) /*!< CBUS read protection protection of sector 21 */ -#define OB_DRP_22 ((uint64_t)0x0000000000400000U) /*!< CBUS read protection protection of sector 22 */ -#define OB_DRP_23 ((uint64_t)0x0000000000800000U) /*!< CBUS read protection protection of sector 23 */ -#define OB_DRP_24 ((uint64_t)0x0000000001000000U) /*!< CBUS read protection protection of sector 24 */ -#define OB_DRP_25 ((uint64_t)0x0000000002000000U) /*!< CBUS read protection protection of sector 25 */ -#define OB_DRP_26 ((uint64_t)0x0000000004000000U) /*!< CBUS read protection protection of sector 26 */ -#define OB_DRP_27 ((uint64_t)0x0000000008000000U) /*!< CBUS read protection protection of sector 27 */ -#define OB_DRP_28 ((uint64_t)0x0000000010000000U) /*!< CBUS read protection protection of sector 28 */ -#define OB_DRP_29 ((uint64_t)0x0000000020000000U) /*!< CBUS read protection protection of sector 29 */ -#define OB_DRP_30 ((uint64_t)0x0000000040000000U) /*!< CBUS read protection protection of sector 30 */ -#define OB_DRP_31 ((uint64_t)0x0000000080000000U) /*!< CBUS read protection protection of sector 31 */ -#define OB_DRP_32 ((uint64_t)0x0000000100000000U) /*!< CBUS read protection protection of sector 32 */ -#define OB_DRP_33 ((uint64_t)0x0000000200000000U) /*!< CBUS read protection protection of sector 33 */ -#define OB_DRP_34 ((uint64_t)0x0000000400000000U) /*!< CBUS read protection protection of sector 34 */ -#define OB_DRP_35 ((uint64_t)0x0000000800000000U) /*!< CBUS read protection protection of sector 35 */ -#define OB_DRP_36 ((uint64_t)0x0000001000000000U) /*!< CBUS read protection protection of sector 36 */ -#define OB_DRP_37 ((uint64_t)0x0000002000000000U) /*!< CBUS read protection protection of sector 37 */ -#define OB_DRP_38 ((uint64_t)0x0000004000000000U) /*!< CBUS read protection protection of sector 38 */ -#define OB_DRP_39_53 ((uint64_t)0x0000008000000000U) /*!< CBUS read protection protection of sector 39~53 */ -#define OB_DRP_ALL ((uint64_t)0x000000FFFFFFFFFFU) /*!< CBUS read protection protection of all sectors */ - -/* option bytes CBUS read protection mode */ -#define OBCTL0_DRP(regval) (BIT(31) & ((uint32_t)(regval) << 31U)) -#define OB_DRP_DISABLE OBCTL0_DRP(0) /*!< the WPx bits used as erase/program protection of each sector */ -#define OB_DRP_ENABLE OBCTL0_DRP(1) /*!< the WPx bits used as erase/program protection and CBUS read protection of each sector */ - -/* FMC sectors */ -#define SN_5 FMC_CTL_SN_5 /* bit 5 of sector number */ -#define CTL_SN(regval) (BITS(3,7) & ((uint32_t)(regval)) << 3) -#define CTL_SECTOR_NUMBER_0 CTL_SN(0) /*!< sector 0 */ -#define CTL_SECTOR_NUMBER_1 CTL_SN(1) /*!< sector 1 */ -#define CTL_SECTOR_NUMBER_2 CTL_SN(2) /*!< sector 2 */ -#define CTL_SECTOR_NUMBER_3 CTL_SN(3) /*!< sector 3 */ -#define CTL_SECTOR_NUMBER_4 CTL_SN(4) /*!< sector 4 */ -#define CTL_SECTOR_NUMBER_5 CTL_SN(5) /*!< sector 5 */ -#define CTL_SECTOR_NUMBER_6 CTL_SN(6) /*!< sector 6 */ -#define CTL_SECTOR_NUMBER_7 CTL_SN(7) /*!< sector 7 */ -#define CTL_SECTOR_NUMBER_8 CTL_SN(8) /*!< sector 8 */ -#define CTL_SECTOR_NUMBER_9 CTL_SN(9) /*!< sector 9 */ -#define CTL_SECTOR_NUMBER_10 CTL_SN(10) /*!< sector 10 */ -#define CTL_SECTOR_NUMBER_11 CTL_SN(11) /*!< sector 11 */ -#define CTL_SECTOR_NUMBER_12 CTL_SN(12) /*!< sector 12 */ -#define CTL_SECTOR_NUMBER_13 CTL_SN(13) /*!< sector 13 */ -#define CTL_SECTOR_NUMBER_14 CTL_SN(14) /*!< sector 14 */ -#define CTL_SECTOR_NUMBER_15 CTL_SN(15) /*!< sector 15 */ -#define CTL_SECTOR_NUMBER_16 CTL_SN(16) /*!< sector 16 */ -#define CTL_SECTOR_NUMBER_17 CTL_SN(17) /*!< sector 17 */ -#define CTL_SECTOR_NUMBER_18 CTL_SN(18) /*!< sector 18 */ -#define CTL_SECTOR_NUMBER_19 CTL_SN(19) /*!< sector 19 */ -#define CTL_SECTOR_NUMBER_20 CTL_SN(20) /*!< sector 20 */ -#define CTL_SECTOR_NUMBER_21 CTL_SN(21) /*!< sector 21 */ -#define CTL_SECTOR_NUMBER_22 CTL_SN(22) /*!< sector 22 */ -#define CTL_SECTOR_NUMBER_23 CTL_SN(23) /*!< sector 23 */ -#define CTL_SECTOR_NUMBER_24 CTL_SN(24) /*!< sector 24 */ -#define CTL_SECTOR_NUMBER_25 CTL_SN(25) /*!< sector 25 */ -#define CTL_SECTOR_NUMBER_26 CTL_SN(26) /*!< sector 26 */ -#define CTL_SECTOR_NUMBER_27 CTL_SN(27) /*!< sector 27 */ -#define CTL_SECTOR_NUMBER_28 CTL_SN(28) /*!< sector 28 */ -#define CTL_SECTOR_NUMBER_29 CTL_SN(29) /*!< sector 29 */ -#define CTL_SECTOR_NUMBER_30 CTL_SN(30) /*!< sector 30 */ -#define CTL_SECTOR_NUMBER_31 CTL_SN(31) /*!< sector 31 */ -#define CTL_SECTOR_NUMBER_32 (SN_5 | CTL_SN(0)) /*!< sector 32 */ -#define CTL_SECTOR_NUMBER_33 (SN_5 | CTL_SN(1)) /*!< sector 33 */ -#define CTL_SECTOR_NUMBER_34 (SN_5 | CTL_SN(2)) /*!< sector 34 */ -#define CTL_SECTOR_NUMBER_35 (SN_5 | CTL_SN(3)) /*!< sector 35 */ -#define CTL_SECTOR_NUMBER_36 (SN_5 | CTL_SN(4)) /*!< sector 36 */ -#define CTL_SECTOR_NUMBER_37 (SN_5 | CTL_SN(5)) /*!< sector 37 */ -#define CTL_SECTOR_NUMBER_38 (SN_5 | CTL_SN(6)) /*!< sector 38 */ -#define CTL_SECTOR_NUMBER_39 (SN_5 | CTL_SN(7)) /*!< sector 39 */ -#define CTL_SECTOR_NUMBER_40 (SN_5 | CTL_SN(8)) /*!< sector 40 */ -#define CTL_SECTOR_NUMBER_41 (SN_5 | CTL_SN(9)) /*!< sector 41 */ -#define CTL_SECTOR_NUMBER_42 (SN_5 | CTL_SN(10)) /*!< sector 42 */ -#define CTL_SECTOR_NUMBER_43 (SN_5 | CTL_SN(11)) /*!< sector 43 */ -#define CTL_SECTOR_NUMBER_44 (SN_5 | CTL_SN(12)) /*!< sector 44 */ -#define CTL_SECTOR_NUMBER_45 (SN_5 | CTL_SN(13)) /*!< sector 45 */ -#define CTL_SECTOR_NUMBER_46 (SN_5 | CTL_SN(14)) /*!< sector 46 */ -#define CTL_SECTOR_NUMBER_47 (SN_5 | CTL_SN(15)) /*!< sector 47 */ -#define CTL_SECTOR_NUMBER_48 (SN_5 | CTL_SN(16)) /*!< sector 48 */ -#define CTL_SECTOR_NUMBER_49 (SN_5 | CTL_SN(17)) /*!< sector 49 */ -#define CTL_SECTOR_NUMBER_50 (SN_5 | CTL_SN(18)) /*!< sector 50 */ -#define CTL_SECTOR_NUMBER_51 (SN_5 | CTL_SN(19)) /*!< sector 51 */ -#define CTL_SECTOR_NUMBER_52 (SN_5 | CTL_SN(20)) /*!< sector 52 */ -#define CTL_SECTOR_NUMBER_53 (SN_5 | CTL_SN(21)) /*!< sector 53 */ - -/* FMC program size */ -#define CTL_PSZ(regval) (BITS(8,9) & ((uint32_t)(regval)) << 8U) -#define CTL_PSZ_BYTE CTL_PSZ(0) /*!< FMC program by byte access */ -#define CTL_PSZ_HALF_WORD CTL_PSZ(1) /*!< FMC program by half-word access */ -#define CTL_PSZ_WORD CTL_PSZ(2) /*!< FMC program by word access */ - -/* FMC interrupt enable */ -#define FMC_INT_END FMC_CTL_ENDIE /*!< enable FMC end of program interrupt */ -#define FMC_INT_ERR FMC_CTL_ERRIE /*!< enable FMC error interrupt */ -#define FMC_INT_LDECC FMC_CTL_LDECCIE /*!< enable FMC load code ECC error interrupt */ - -/* FMC flags */ -#define FMC_FLAG_END FMC_STAT_END /*!< FMC end of operation flag bit */ -#define FMC_FLAG_OPERR FMC_STAT_OPERR /*!< FMC operation error flag bit */ -#define FMC_FLAG_LDECCDET FMC_STAT_LDECCDET /*!< FMC two bits ECC error when load code from flash/OTP1/bootloader */ -#define FMC_FLAG_WPERR FMC_STAT_WPERR /*!< FMC erase/program protection error flag bit */ -#define FMC_FLAG_PGAERR FMC_STAT_PGAERR /*!< FMC program alignment error flag bit */ -#define FMC_FLAG_PGMERR FMC_STAT_PGMERR /*!< FMC program size not match error flag bit */ -#define FMC_FLAG_PGSERR FMC_STAT_PGSERR /*!< FMC program sequence error flag bit */ -#define FMC_FLAG_RDCERR FMC_STAT_RDCERR /*!< FMC CBUS data read protection error flag bit */ -#define FMC_FLAG_BUSY FMC_STAT_BUSY /*!< FMC busy flag */ - -/* FMC interrupt flags */ -#define FMC_INT_FLAG_END FMC_STAT_END /*!< FMC end of operation interrupt flag */ -#define FMC_INT_FLAG_OPERR FMC_STAT_OPERR /*!< FMC operation error interrupt flag */ -#define FMC_INT_FLAG_LDECCDET FMC_STAT_LDECCDET /*!< FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag */ -#define FMC_INT_FLAG_WPERR FMC_STAT_WPERR /*!< FMC erase/program protection error interrupt flag */ -#define FMC_INT_FLAG_PGAERR FMC_STAT_PGAERR /*!< FMC program alignment error interrupt flag */ -#define FMC_INT_FLAG_PGMERR FMC_STAT_PGMERR /*!< FMC program size not match error interrupt flag */ -#define FMC_INT_FLAG_PGSERR FMC_STAT_PGSERR /*!< FMC program sequence error interrupt flag */ -#define FMC_INT_FLAG_RDCERR FMC_STAT_RDCERR /*!< FMC CBUS data read protection error interrupt flag */ - -/* FMC time out */ -#define FMC_TIMEOUT_COUNT ((uint32_t)0x4FFFFFFFU) /*!< count to judge of FMC timeout */ - -/* EFUSE flags */ -#define EFUSE_PGIF EFUSE_CS_PGIF /*!< programming operation completion flag */ -#define EFUSE_RDIF EFUSE_CS_RDIF /*!< read operation completion flag */ -#define EFUSE_OBERIF EFUSE_CS_OVBERIF /*!< overstep boundary error flag */ - -/* EFUSE flags clear */ -#define EFUSE_PGIC EFUSE_CS_PGIC /*!< clear programming operation completion flag */ -#define EFUSE_RDIC EFUSE_CS_RDIC /*!< clear read operation completion flag */ -#define EFUSE_OBERIC EFUSE_CS_OVBERIC /*!< clear overstep boundary error flag */ - -/* EFUSE interrupt enable */ -#define EFUSE_INT_OBER EFUSE_CS_OVBERIE /*!< overstep boundary error interrupt enable */ -#define EFUSE_INT_PG EFUSE_CS_PGIE /*!< programming operation completion interrupt enable */ -#define EFUSE_INT_RD EFUSE_CS_RDIE /*!< read operation completion interrupt enable */ - -/* EFUSE interrupt flags */ -#define EFUSE_INT_OBERIF EFUSE_CS_OVBERIF /*!< overstep boundary error interrupt flag */ -#define EFUSE_INT_PGIF EFUSE_CS_PGIF /*!< programming operation completion interrupt flag */ -#define EFUSE_INT_RDIF EFUSE_CS_RDIF /*!< read operation completion interrupt flag */ - -/* EFUSE interrupt flags clear */ -#define EFUSE_INT_OBERIC EFUSE_CS_OVBERIC /*!< clear overstep boundary error interrupt flag */ -#define EFUSE_INT_PGIC EFUSE_CS_PGIC /*!< clear programming operation completion interrupt flag */ -#define EFUSE_INT_RDIC EFUSE_CS_RDIC /*!< clear read operation completion interrupt flag */ - -/* EFUSE macro address */ -#define EFUSE_CTL_EFADDR ((uint32_t)0x00000001U) /*!< efuse control address */ -#define USER_DATA_EFADDR ((uint32_t)0x00000002U) /*!< user data address */ - -/* EFUSE time out */ -#define EFUSE_TIMEOUT_COUNT ((uint32_t)0x0000FFFFU) /*!< count to judge of EFUSE timeout */ - -/* OTP0 address */ -#define OTP0_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FFF7800U) /*!< OTP0 data block base address */ -#define OTP0_LOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FFF7840U) /*!< OTP0 lock block base address */ - -/* OTP1 address */ -#define OTP1_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF00000U) /*!< OTP1 data block base address */ -#define OTP1_LOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20200U) /*!< OTP1 lock block base address */ - -/* OTP2 address */ -#define OTP2_DATA_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20000U) /*!< OTP2 data block base address */ -#define OTP2_WLOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20210U) /*!< OTP2 write lock block base address */ -#define OTP2_RLOCK_BLOCK_BASE_ADDRESS ((uint32_t)0x1FF20220U) /*!< OTP2 read lock block base address */ - -/* OTP1 data blockx read enable */ -#define OTP1_DATA_BLOCK_0 BIT(0) /*!< erase/program protection of sector 0 */ -#define OTP1_DATA_BLOCK_1 BIT(1) /*!< erase/program protection of sector 1 */ -#define OTP1_DATA_BLOCK_2 BIT(2) /*!< erase/program protection of sector 2 */ -#define OTP1_DATA_BLOCK_3 BIT(3) /*!< erase/program protection of sector 3 */ -#define OTP1_DATA_BLOCK_4 BIT(4) /*!< erase/program protection of sector 4 */ -#define OTP1_DATA_BLOCK_5 BIT(5) /*!< erase/program protection of sector 5 */ -#define OTP1_DATA_BLOCK_6 BIT(6) /*!< erase/program protection of sector 6 */ -#define OTP1_DATA_BLOCK_7 BIT(7) /*!< erase/program protection of sector 7 */ -#define OTP1_DATA_BLOCK_8 BIT(8) /*!< erase/program protection of sector 8 */ -#define OTP1_DATA_BLOCK_9 BIT(9) /*!< erase/program protection of sector 9 */ -#define OTP1_DATA_BLOCK_10 BIT(10) /*!< erase/program protection of sector 10 */ -#define OTP1_DATA_BLOCK_11 BIT(11) /*!< erase/program protection of sector 11 */ -#define OTP1_DATA_BLOCK_12 BIT(12) /*!< erase/program protection of sector 12 */ -#define OTP1_DATA_BLOCK_13 BIT(13) /*!< erase/program protection of sector 13 */ -#define OTP1_DATA_BLOCK_14 BIT(14) /*!< erase/program protection of sector 14 */ -#define OTP1_DATA_BLOCK_15 BIT(15) /*!< erase/program protection of sector 15 */ -#define OTP1_DATA_BLOCK_ALL BITS(0,15) /*!< ALL erase/program protection of sector */ - -/* constants definitions */ -/* fmc state */ -typedef enum { - FMC_READY = 0U, /*!< the operation has been completed */ - FMC_BUSY, /*!< the operation is in progress */ - FMC_RDCERR, /*!< CBUS data read protection error */ - FMC_PGSERR, /*!< program sequence error */ - FMC_PGMERR, /*!< program size not match error */ - FMC_PGAERR, /*!< program alignment error */ - FMC_WPERR, /*!< erase/program protection error */ - FMC_OPERR, /*!< operation error */ - FMC_LDECCDET, /*!< two bits ECC error when load code from flash/OTP1/bootloader */ - FMC_TOERR /*!< timeout error */ -} fmc_state_enum; - -/* EFUSE state */ -typedef enum { - EFUSE_READY = 0U, /*!< EFUSE operation has been completed */ - EFUSE_BUSY, /*!< EFUSE operation is in progress */ - EFUSE_OBER, /*!< EFUSE overstep boundary error */ - EFUSE_TOERR /*!< EFUSE timeout error */ -} efuse_state_enum; - -/* function declarations */ -/* FMC main memory programming functions */ -/* unlock the main FMC operation */ -void fmc_unlock(void); -/* lock the main FMC operation */ -void fmc_lock(void); -/* FMC erase page */ -fmc_state_enum fmc_page_erase(uint32_t page_addr); -/* FMC erase sector */ -fmc_state_enum fmc_sector_erase(uint32_t fmc_sector); -/* FMC erase whole chip */ -fmc_state_enum fmc_mass_erase(void); -/* FMC erase whole bank0 */ -fmc_state_enum fmc_bank0_erase(void); -/* FMC erase whole bank1(include bank1_ex) */ -fmc_state_enum fmc_bank1_erase(void); -/* FMC program a double word at the corresponding address */ -fmc_state_enum fmc_doubleword_program(uint32_t address, uint64_t data); -/* FMC program a word at the corresponding address */ -fmc_state_enum fmc_word_program(uint32_t address, uint32_t data); -/* FMC program a half word at the corresponding address */ -fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data); -/* FMC program a byte at the corresponding address */ -fmc_state_enum fmc_byte_program(uint32_t address, uint8_t data); - -/* enable no waitinging time area load after system reset */ -void fmc_nwa_enable(void); -/* disable no waiting time area load after system reset */ -void fmc_nwa_disable(void); -/* set OTP1 data block not be read */ -void otp1_read_disable(uint32_t block); -/* enable read lock block protection for OTP2 */ -void otp2_rlock_enable(void); - -/* FMC option bytes programming functions */ -/* unlock the option byte operation */ -void ob_unlock(void); -/* lock the option byte operation */ -void ob_lock(void); -/* send option byte change command */ -void ob_start(void); -/* erase option byte */ -void ob_erase(void); -/* enable write protect */ -ErrStatus ob_write_protection_enable(uint64_t ob_wp); -/* disable write protect */ -ErrStatus ob_write_protection_disable(uint64_t ob_wp); -/* enable erase/program protection and CBUS read protection */ -void ob_drp_enable(uint64_t ob_drp); -/* disable all erase/program protection and CBUS read protection */ -void ob_drp_disable(void); -/* configure security protection level */ -void ob_security_protection_config(uint8_t ob_spc); -/* program the FMC user option byte */ -void ob_user_write(uint32_t ob_fwdgt, uint32_t ob_deepsleep, uint32_t ob_stdby); -/* program the option byte BOR threshold value */ -void ob_user_bor_threshold(uint32_t ob_bor_th); -/* configure the option byte boot bank value */ -void ob_boot_mode_config(uint32_t boot_mode); -/* configure FMC/SRAM ECC checking, only valid after power reset */ -void ob_ecc_config(uint32_t ecc_config); -/* select no waiting time area, only valid after power reset, only for 4MB dual bank series */ -void ob_nwa_select(uint32_t nwa_select); -/* get the FMC user option byte */ -uint8_t ob_user_get(void); -/* get the FMC option byte write protection of bank0 */ -uint32_t ob_write_protection0_get(void); -/* get the FMC option byte write protection of bank1 */ -uint32_t ob_write_protection1_get(void); -/* get the FMC erase/program protection and CBUS read protection option bytes value of bank0 */ -uint32_t ob_drp0_get(void); -/* get the FMC erase/program protection and CBUS read protection option bytes value of bank1 */ -uint32_t ob_drp1_get(void); -/* get option byte security protection code value */ -FlagStatus ob_spc_get(void); -/* get the FMC option byte BOR threshold value */ -uint32_t ob_user_bor_threshold_get(void); -/* get the boot mode */ -uint32_t ob_boot_mode_get(void); -/* get FMC/SRAM ECC checking */ -uint32_t ob_ecc_get(void); -/* get no waiting time area */ -uint32_t ob_nwa_get(void); - -/* FMC interrupts and flags management functions */ -/* get flag set or reset */ -FlagStatus fmc_flag_get(uint32_t fmc_flag); -/* clear the FMC pending flag */ -void fmc_flag_clear(uint32_t fmc_flag); -/* enable FMC interrupt */ -void fmc_interrupt_enable(uint32_t fmc_int); -/* disable FMC interrupt */ -void fmc_interrupt_disable(uint32_t fmc_int); -/* get FMC interrupt flag set or reset */ -FlagStatus fmc_interrupt_flag_get(uint32_t fmc_int_flag); -/* clear the FMC interrupt flag */ -void fmc_interrupt_flag_clear(uint32_t fmc_int_flag); -/* get the FMC state */ -fmc_state_enum fmc_state_get(void); -/* check whether FMC is ready or not */ -fmc_state_enum fmc_ready_wait(uint32_t timeout); - -/* EFUSE operation functions */ -/* unlock the EFUSE_CTL register */ -void efuse_ctrl_unlock(void); -/* lock the EFUSE_CTL register */ -void efuse_ctrl_lock(void); -/* unlock the EFUSE_USER_DATA register */ -void efuse_user_data_unlock(void); -/* lock the EFUSE_USER_DATA register */ -void efuse_user_data_lock(void); -/* read EFUSE value */ -efuse_state_enum efuse_read(uint32_t ef_addr, uint32_t size, uint32_t buf[]); -/* write EFUSE */ -efuse_state_enum efuse_write(uint32_t ef_addr, uint32_t size, uint8_t ef_data); -/* write efuse control parameter */ -efuse_state_enum efuse_control_write(uint8_t ef_data); -/* write user data parameter */ -efuse_state_enum efuse_user_data_write(uint8_t ef_data); - -/* flag and interrupt functions */ -/* check EFUSE flag is set or not */ -FlagStatus efuse_flag_get(uint32_t efuse_flag); -/* clear EFUSE pending flag */ -void efuse_flag_clear(uint32_t efuse_cflag); -/* enable EFUSE interrupt */ -void efuse_interrupt_enable(uint32_t source); -/* disable EFUSE interrupt */ -void efuse_interrupt_disable(uint32_t source); -/* check EFUSE interrupt flag is set or not */ -FlagStatus efuse_interrupt_flag_get(uint32_t int_flag); -/* clear EFUSE pending interrupt flag */ -void efuse_interrupt_flag_clear(uint32_t int_cflag); -/* check EFUSE operation ready or not */ -efuse_state_enum efuse_ready_wait(uint32_t efuse_flag, uint32_t timeout); - -#endif /* GD32F5XX_FMC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h deleted file mode 100644 index be3a7accdf9..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_fwdgt.h +++ /dev/null @@ -1,118 +0,0 @@ -/*! - \file gd32f5xx_fwdgt.h - \brief definitions for the FWDGT - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_FWDGT_H -#define GD32F5XX_FWDGT_H - -#include "gd32f5xx.h" - -/* FWDGT definitions */ -#define FWDGT FWDGT_BASE /*!< FWDGT base address */ - -/* registers definitions */ -#define FWDGT_CTL REG32((FWDGT) + 0x00U) /*!< FWDGT control register */ -#define FWDGT_PSC REG32((FWDGT) + 0x04U) /*!< FWDGT prescaler register */ -#define FWDGT_RLD REG32((FWDGT) + 0x08U) /*!< FWDGT reload register */ -#define FWDGT_STAT REG32((FWDGT) + 0x0CU) /*!< FWDGT status register */ - -/* bits definitions */ -/* FWDGT_CTL */ -#define FWDGT_CTL_CMD BITS(0,15) /*!< FWDGT command value */ - -/* FWDGT_PSC */ -#define FWDGT_PSC_PSC BITS(0,3) /*!< FWDGT prescaler divider value */ - -/* FWDGT_RLD */ -#define FWDGT_RLD_RLD BITS(0,11) /*!< FWDGT counter reload value */ - -/* FWDGT_STAT */ -#define FWDGT_STAT_PUD BIT(0) /*!< FWDGT prescaler divider value update */ -#define FWDGT_STAT_RUD BIT(1) /*!< FWDGT counter reload value update */ - -/* constants definitions */ -/* psc register value */ -#define PSC_PSC(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) -#define FWDGT_PSC_DIV4 ((uint8_t)PSC_PSC(0)) /*!< FWDGT prescaler set to 4 */ -#define FWDGT_PSC_DIV8 ((uint8_t)PSC_PSC(1)) /*!< FWDGT prescaler set to 8 */ -#define FWDGT_PSC_DIV16 ((uint8_t)PSC_PSC(2)) /*!< FWDGT prescaler set to 16 */ -#define FWDGT_PSC_DIV32 ((uint8_t)PSC_PSC(3)) /*!< FWDGT prescaler set to 32 */ -#define FWDGT_PSC_DIV64 ((uint8_t)PSC_PSC(4)) /*!< FWDGT prescaler set to 64 */ -#define FWDGT_PSC_DIV128 ((uint8_t)PSC_PSC(5)) /*!< FWDGT prescaler set to 128 */ -#define FWDGT_PSC_DIV256 ((uint8_t)PSC_PSC(6)) /*!< FWDGT prescaler set to 256 */ -#define FWDGT_PSC_DIV512 ((uint8_t)PSC_PSC(7)) /*!< FWDGT prescaler set to 512 */ -#define FWDGT_PSC_DIV1024 ((uint8_t)PSC_PSC(8)) /*!< FWDGT prescaler set to 1024 */ -#define FWDGT_PSC_DIV2048 ((uint8_t)PSC_PSC(9)) /*!< FWDGT prescaler set to 2048 */ -#define FWDGT_PSC_DIV4096 ((uint8_t)PSC_PSC(10)) /*!< FWDGT prescaler set to 4096 */ -#define FWDGT_PSC_DIV8192 ((uint8_t)PSC_PSC(11)) /*!< FWDGT prescaler set to 8192 */ -#define FWDGT_PSC_DIV16384 ((uint8_t)PSC_PSC(12)) /*!< FWDGT prescaler set to 16384 */ -#define FWDGT_PSC_DIV32768 ((uint8_t)PSC_PSC(13)) /*!< FWDGT prescaler set to 32768 */ - -/* control value */ -#define FWDGT_WRITEACCESS_ENABLE ((uint16_t)0x5555U) /*!< FWDGT_CTL bits write access enable value */ -#define FWDGT_WRITEACCESS_DISABLE ((uint16_t)0x0000U) /*!< FWDGT_CTL bits write access disable value */ -#define FWDGT_KEY_RELOAD ((uint16_t)0xAAAAU) /*!< FWDGT_CTL bits fwdgt counter reload value */ -#define FWDGT_KEY_ENABLE ((uint16_t)0xCCCCU) /*!< FWDGT_CTL bits fwdgt counter enable value */ - -/* FWDGT timeout value */ -#define FWDGT_PSC_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_PSC register write operation state flag timeout */ -#define FWDGT_RLD_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_RLD register write operation state flag timeout */ - -/* FWDGT flag definitions */ -#define FWDGT_FLAG_PUD FWDGT_STAT_PUD /*!< FWDGT prescaler divider value update flag */ -#define FWDGT_FLAG_RUD FWDGT_STAT_RUD /*!< FWDGT counter reload value update flag */ - -/* write value to FWDGT_RLD_RLD bit field */ -#define RLD_RLD(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) - -/* function declarations */ -/* enable write access to FWDGT_PSC and FWDGT_RLD */ -void fwdgt_write_enable(void); -/* disable write access to FWDGT_PSC and FWDGT_RLD */ -void fwdgt_write_disable(void); -/* start the free watchdog timer counter */ -void fwdgt_enable(void); - -/* configure the free watchdog timer counter prescaler value */ -ErrStatus fwdgt_prescaler_value_config(uint16_t prescaler_value); -/* configure the free watchdog timer counter reload value */ -ErrStatus fwdgt_reload_value_config(uint16_t reload_value); -/* reload the counter of FWDGT */ -void fwdgt_counter_reload(void); -/* configure counter reload value, and prescaler divider value */ -ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div); - -/* get flag state of FWDGT */ -FlagStatus fwdgt_flag_get(uint16_t flag); - -#endif /* GD32F5XX_FWDGT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h deleted file mode 100644 index 5325912526e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_gpio.h +++ /dev/null @@ -1,406 +0,0 @@ -/*! - \file gd32f5xx_gpio.h - \brief definitions for the GPIO - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_GPIO_H -#define GD32F5XX_GPIO_H - -#include "gd32f5xx.h" - -/* GPIOx(x=A,B,C,D,E,F,G,H,I) definitions */ -#define GPIOA (GPIO_BASE + 0x00000000U) /*!< GPIOA base address */ -#define GPIOB (GPIO_BASE + 0x00000400U) /*!< GPIOB base address */ -#define GPIOC (GPIO_BASE + 0x00000800U) /*!< GPIOC base address */ -#define GPIOD (GPIO_BASE + 0x00000C00U) /*!< GPIOD base address */ -#define GPIOE (GPIO_BASE + 0x00001000U) /*!< GPIOE base address */ -#define GPIOF (GPIO_BASE + 0x00001400U) /*!< GPIOF base address */ -#define GPIOG (GPIO_BASE + 0x00001800U) /*!< GPIOG base address */ -#define GPIOH (GPIO_BASE + 0x00001C00U) /*!< GPIOH base address */ -#define GPIOI (GPIO_BASE + 0x00002000U) /*!< GPIOI base address */ - -/* registers definitions */ -#define GPIO_CTL(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register */ -#define GPIO_OMODE(gpiox) REG32((gpiox) + 0x04U) /*!< GPIO port output mode register */ -#define GPIO_OSPD(gpiox) REG32((gpiox) + 0x08U) /*!< GPIO port output speed register */ -#define GPIO_PUD(gpiox) REG32((gpiox) + 0x0CU) /*!< GPIO port pull-up/pull-down register */ -#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port input status register */ -#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO port output control register */ -#define GPIO_BOP(gpiox) REG32((gpiox) + 0x18U) /*!< GPIO port bit operate register */ -#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x1CU) /*!< GPIO port configuration lock register */ -#define GPIO_AFSEL0(gpiox) REG32((gpiox) + 0x20U) /*!< GPIO alternate function selected register 0 */ -#define GPIO_AFSEL1(gpiox) REG32((gpiox) + 0x24U) /*!< GPIO alternate function selected register 1 */ -#define GPIO_BC(gpiox) REG32((gpiox) + 0x28U) /*!< GPIO bit clear register */ -#define GPIO_TG(gpiox) REG32((gpiox) + 0x2CU) /*!< GPIO port bit toggle register */ - -/* bits definitions */ -/* GPIO_CTL */ -#define GPIO_CTL_CTL0 BITS(0,1) /*!< pin 0 configuration bits */ -#define GPIO_CTL_CTL1 BITS(2,3) /*!< pin 1 configuration bits */ -#define GPIO_CTL_CTL2 BITS(4,5) /*!< pin 2 configuration bits */ -#define GPIO_CTL_CTL3 BITS(6,7) /*!< pin 3 configuration bits */ -#define GPIO_CTL_CTL4 BITS(8,9) /*!< pin 4 configuration bits */ -#define GPIO_CTL_CTL5 BITS(10,11) /*!< pin 5 configuration bits */ -#define GPIO_CTL_CTL6 BITS(12,13) /*!< pin 6 configuration bits */ -#define GPIO_CTL_CTL7 BITS(14,15) /*!< pin 7 configuration bits */ -#define GPIO_CTL_CTL8 BITS(16,17) /*!< pin 8 configuration bits */ -#define GPIO_CTL_CTL9 BITS(18,19) /*!< pin 9 configuration bits */ -#define GPIO_CTL_CTL10 BITS(20,21) /*!< pin 10 configuration bits */ -#define GPIO_CTL_CTL11 BITS(22,23) /*!< pin 11 configuration bits */ -#define GPIO_CTL_CTL12 BITS(24,25) /*!< pin 12 configuration bits */ -#define GPIO_CTL_CTL13 BITS(26,27) /*!< pin 13 configuration bits */ -#define GPIO_CTL_CTL14 BITS(28,29) /*!< pin 14 configuration bits */ -#define GPIO_CTL_CTL15 BITS(30,31) /*!< pin 15 configuration bits */ - -/* GPIO_OMODE */ -#define GPIO_OMODE_OM0 BIT(0) /*!< pin 0 output mode bit */ -#define GPIO_OMODE_OM1 BIT(1) /*!< pin 1 output mode bit */ -#define GPIO_OMODE_OM2 BIT(2) /*!< pin 2 output mode bit */ -#define GPIO_OMODE_OM3 BIT(3) /*!< pin 3 output mode bit */ -#define GPIO_OMODE_OM4 BIT(4) /*!< pin 4 output mode bit */ -#define GPIO_OMODE_OM5 BIT(5) /*!< pin 5 output mode bit */ -#define GPIO_OMODE_OM6 BIT(6) /*!< pin 6 output mode bit */ -#define GPIO_OMODE_OM7 BIT(7) /*!< pin 7 output mode bit */ -#define GPIO_OMODE_OM8 BIT(8) /*!< pin 8 output mode bit */ -#define GPIO_OMODE_OM9 BIT(9) /*!< pin 9 output mode bit */ -#define GPIO_OMODE_OM10 BIT(10) /*!< pin 10 output mode bit */ -#define GPIO_OMODE_OM11 BIT(11) /*!< pin 11 output mode bit */ -#define GPIO_OMODE_OM12 BIT(12) /*!< pin 12 output mode bit */ -#define GPIO_OMODE_OM13 BIT(13) /*!< pin 13 output mode bit */ -#define GPIO_OMODE_OM14 BIT(14) /*!< pin 14 output mode bit */ -#define GPIO_OMODE_OM15 BIT(15) /*!< pin 15 output mode bit */ - -/* GPIO_OSPD */ -#define GPIO_OSPD_OSPD0 BITS(0,1) /*!< pin 0 output max speed bits */ -#define GPIO_OSPD_OSPD1 BITS(2,3) /*!< pin 1 output max speed bits */ -#define GPIO_OSPD_OSPD2 BITS(4,5) /*!< pin 2 output max speed bits */ -#define GPIO_OSPD_OSPD3 BITS(6,7) /*!< pin 3 output max speed bits */ -#define GPIO_OSPD_OSPD4 BITS(8,9) /*!< pin 4 output max speed bits */ -#define GPIO_OSPD_OSPD5 BITS(10,11) /*!< pin 5 output max speed bits */ -#define GPIO_OSPD_OSPD6 BITS(12,13) /*!< pin 6 output max speed bits */ -#define GPIO_OSPD_OSPD7 BITS(14,15) /*!< pin 7 output max speed bits */ -#define GPIO_OSPD_OSPD8 BITS(16,17) /*!< pin 8 output max speed bits */ -#define GPIO_OSPD_OSPD9 BITS(18,19) /*!< pin 9 output max speed bits */ -#define GPIO_OSPD_OSPD10 BITS(20,21) /*!< pin 10 output max speed bits */ -#define GPIO_OSPD_OSPD11 BITS(22,23) /*!< pin 11 output max speed bits */ -#define GPIO_OSPD_OSPD12 BITS(24,25) /*!< pin 12 output max speed bits */ -#define GPIO_OSPD_OSPD13 BITS(26,27) /*!< pin 13 output max speed bits */ -#define GPIO_OSPD_OSPD14 BITS(28,29) /*!< pin 14 output max speed bits */ -#define GPIO_OSPD_OSPD15 BITS(30,31) /*!< pin 15 output max speed bits */ - -/* GPIO_PUD */ -#define GPIO_PUD_PUD0 BITS(0,1) /*!< pin 0 pull-up or pull-down bits */ -#define GPIO_PUD_PUD1 BITS(2,3) /*!< pin 1 pull-up or pull-down bits */ -#define GPIO_PUD_PUD2 BITS(4,5) /*!< pin 2 pull-up or pull-down bits */ -#define GPIO_PUD_PUD3 BITS(6,7) /*!< pin 3 pull-up or pull-down bits */ -#define GPIO_PUD_PUD4 BITS(8,9) /*!< pin 4 pull-up or pull-down bits */ -#define GPIO_PUD_PUD5 BITS(10,11) /*!< pin 5 pull-up or pull-down bits */ -#define GPIO_PUD_PUD6 BITS(12,13) /*!< pin 6 pull-up or pull-down bits */ -#define GPIO_PUD_PUD7 BITS(14,15) /*!< pin 7 pull-up or pull-down bits */ -#define GPIO_PUD_PUD8 BITS(16,17) /*!< pin 8 pull-up or pull-down bits */ -#define GPIO_PUD_PUD9 BITS(18,19) /*!< pin 9 pull-up or pull-down bits */ -#define GPIO_PUD_PUD10 BITS(20,21) /*!< pin 10 pull-up or pull-down bits */ -#define GPIO_PUD_PUD11 BITS(22,23) /*!< pin 11 pull-up or pull-down bits */ -#define GPIO_PUD_PUD12 BITS(24,25) /*!< pin 12 pull-up or pull-down bits */ -#define GPIO_PUD_PUD13 BITS(26,27) /*!< pin 13 pull-up or pull-down bits */ -#define GPIO_PUD_PUD14 BITS(28,29) /*!< pin 14 pull-up or pull-down bits */ -#define GPIO_PUD_PUD15 BITS(30,31) /*!< pin 15 pull-up or pull-down bits */ - -/* GPIO_ISTAT */ -#define GPIO_ISTAT_ISTAT0 BIT(0) /*!< pin 0 input status */ -#define GPIO_ISTAT_ISTAT1 BIT(1) /*!< pin 1 input status */ -#define GPIO_ISTAT_ISTAT2 BIT(2) /*!< pin 2 input status */ -#define GPIO_ISTAT_ISTAT3 BIT(3) /*!< pin 3 input status */ -#define GPIO_ISTAT_ISTAT4 BIT(4) /*!< pin 4 input status */ -#define GPIO_ISTAT_ISTAT5 BIT(5) /*!< pin 5 input status */ -#define GPIO_ISTAT_ISTAT6 BIT(6) /*!< pin 6 input status */ -#define GPIO_ISTAT_ISTAT7 BIT(7) /*!< pin 7 input status */ -#define GPIO_ISTAT_ISTAT8 BIT(8) /*!< pin 8 input status */ -#define GPIO_ISTAT_ISTAT9 BIT(9) /*!< pin 9 input status */ -#define GPIO_ISTAT_ISTAT10 BIT(10) /*!< pin 10 input status */ -#define GPIO_ISTAT_ISTAT11 BIT(11) /*!< pin 11 input status */ -#define GPIO_ISTAT_ISTAT12 BIT(12) /*!< pin 12 input status */ -#define GPIO_ISTAT_ISTAT13 BIT(13) /*!< pin 13 input status */ -#define GPIO_ISTAT_ISTAT14 BIT(14) /*!< pin 14 input status */ -#define GPIO_ISTAT_ISTAT15 BIT(15) /*!< pin 15 input status */ - -/* GPIO_OCTL */ -#define GPIO_OCTL_OCTL0 BIT(0) /*!< pin 0 output control bit */ -#define GPIO_OCTL_OCTL1 BIT(1) /*!< pin 1 output control bit */ -#define GPIO_OCTL_OCTL2 BIT(2) /*!< pin 2 output control bit */ -#define GPIO_OCTL_OCTL3 BIT(3) /*!< pin 3 output control bit */ -#define GPIO_OCTL_OCTL4 BIT(4) /*!< pin 4 output control bit */ -#define GPIO_OCTL_OCTL5 BIT(5) /*!< pin 5 output control bit */ -#define GPIO_OCTL_OCTL6 BIT(6) /*!< pin 6 output control bit */ -#define GPIO_OCTL_OCTL7 BIT(7) /*!< pin 7 output control bit */ -#define GPIO_OCTL_OCTL8 BIT(8) /*!< pin 8 output control bit */ -#define GPIO_OCTL_OCTL9 BIT(9) /*!< pin 9 output control bit */ -#define GPIO_OCTL_OCTL10 BIT(10) /*!< pin 10 output control bit */ -#define GPIO_OCTL_OCTL11 BIT(11) /*!< pin 11 output control bit */ -#define GPIO_OCTL_OCTL12 BIT(12) /*!< pin 12 output control bit */ -#define GPIO_OCTL_OCTL13 BIT(13) /*!< pin 13 output control bit */ -#define GPIO_OCTL_OCTL14 BIT(14) /*!< pin 14 output control bit */ -#define GPIO_OCTL_OCTL15 BIT(15) /*!< pin 15 output control bit */ - -/* GPIO_BOP */ -#define GPIO_BOP_BOP0 BIT(0) /*!< pin 0 set bit */ -#define GPIO_BOP_BOP1 BIT(1) /*!< pin 1 set bit */ -#define GPIO_BOP_BOP2 BIT(2) /*!< pin 2 set bit */ -#define GPIO_BOP_BOP3 BIT(3) /*!< pin 3 set bit */ -#define GPIO_BOP_BOP4 BIT(4) /*!< pin 4 set bit */ -#define GPIO_BOP_BOP5 BIT(5) /*!< pin 5 set bit */ -#define GPIO_BOP_BOP6 BIT(6) /*!< pin 6 set bit */ -#define GPIO_BOP_BOP7 BIT(7) /*!< pin 7 set bit */ -#define GPIO_BOP_BOP8 BIT(8) /*!< pin 8 set bit */ -#define GPIO_BOP_BOP9 BIT(9) /*!< pin 9 set bit */ -#define GPIO_BOP_BOP10 BIT(10) /*!< pin 10 set bit */ -#define GPIO_BOP_BOP11 BIT(11) /*!< pin 11 set bit */ -#define GPIO_BOP_BOP12 BIT(12) /*!< pin 12 set bit */ -#define GPIO_BOP_BOP13 BIT(13) /*!< pin 13 set bit */ -#define GPIO_BOP_BOP14 BIT(14) /*!< pin 14 set bit */ -#define GPIO_BOP_BOP15 BIT(15) /*!< pin 15 set bit */ -#define GPIO_BOP_CR0 BIT(16) /*!< pin 0 clear bit */ -#define GPIO_BOP_CR1 BIT(17) /*!< pin 1 clear bit */ -#define GPIO_BOP_CR2 BIT(18) /*!< pin 2 clear bit */ -#define GPIO_BOP_CR3 BIT(19) /*!< pin 3 clear bit */ -#define GPIO_BOP_CR4 BIT(20) /*!< pin 4 clear bit */ -#define GPIO_BOP_CR5 BIT(21) /*!< pin 5 clear bit */ -#define GPIO_BOP_CR6 BIT(22) /*!< pin 6 clear bit */ -#define GPIO_BOP_CR7 BIT(23) /*!< pin 7 clear bit */ -#define GPIO_BOP_CR8 BIT(24) /*!< pin 8 clear bit */ -#define GPIO_BOP_CR9 BIT(25) /*!< pin 9 clear bit */ -#define GPIO_BOP_CR10 BIT(26) /*!< pin 10 clear bit */ -#define GPIO_BOP_CR11 BIT(27) /*!< pin 11 clear bit */ -#define GPIO_BOP_CR12 BIT(28) /*!< pin 12 clear bit */ -#define GPIO_BOP_CR13 BIT(29) /*!< pin 13 clear bit */ -#define GPIO_BOP_CR14 BIT(30) /*!< pin 14 clear bit */ -#define GPIO_BOP_CR15 BIT(31) /*!< pin 15 clear bit */ - -/* GPIO_LOCK */ -#define GPIO_LOCK_LK0 BIT(0) /*!< pin 0 lock bit */ -#define GPIO_LOCK_LK1 BIT(1) /*!< pin 1 lock bit */ -#define GPIO_LOCK_LK2 BIT(2) /*!< pin 2 lock bit */ -#define GPIO_LOCK_LK3 BIT(3) /*!< pin 3 lock bit */ -#define GPIO_LOCK_LK4 BIT(4) /*!< pin 4 lock bit */ -#define GPIO_LOCK_LK5 BIT(5) /*!< pin 5 lock bit */ -#define GPIO_LOCK_LK6 BIT(6) /*!< pin 6 lock bit */ -#define GPIO_LOCK_LK7 BIT(7) /*!< pin 7 lock bit */ -#define GPIO_LOCK_LK8 BIT(8) /*!< pin 8 lock bit */ -#define GPIO_LOCK_LK9 BIT(9) /*!< pin 9 lock bit */ -#define GPIO_LOCK_LK10 BIT(10) /*!< pin 10 lock bit */ -#define GPIO_LOCK_LK11 BIT(11) /*!< pin 11 lock bit */ -#define GPIO_LOCK_LK12 BIT(12) /*!< pin 12 lock bit */ -#define GPIO_LOCK_LK13 BIT(13) /*!< pin 13 lock bit */ -#define GPIO_LOCK_LK14 BIT(14) /*!< pin 14 lock bit */ -#define GPIO_LOCK_LK15 BIT(15) /*!< pin 15 lock bit */ -#define GPIO_LOCK_LKK BIT(16) /*!< pin lock sequence key */ - -/* GPIO_AFSEL0 */ -#define GPIO_AFSEL0_SEL0 BITS(0,3) /*!< pin 0 alternate function selected */ -#define GPIO_AFSEL0_SEL1 BITS(4,7) /*!< pin 1 alternate function selected */ -#define GPIO_AFSEL0_SEL2 BITS(8,11) /*!< pin 2 alternate function selected */ -#define GPIO_AFSEL0_SEL3 BITS(12,15) /*!< pin 3 alternate function selected */ -#define GPIO_AFSEL0_SEL4 BITS(16,19) /*!< pin 4 alternate function selected */ -#define GPIO_AFSEL0_SEL5 BITS(20,23) /*!< pin 5 alternate function selected */ -#define GPIO_AFSEL0_SEL6 BITS(24,27) /*!< pin 6 alternate function selected */ -#define GPIO_AFSEL0_SEL7 BITS(28,31) /*!< pin 7 alternate function selected */ - -/* GPIO_AFSEL1 */ -#define GPIO_AFSEL1_SEL8 BITS(0,3) /*!< pin 8 alternate function selected */ -#define GPIO_AFSEL1_SEL9 BITS(4,7) /*!< pin 9 alternate function selected */ -#define GPIO_AFSEL1_SEL10 BITS(8,11) /*!< pin 10 alternate function selected */ -#define GPIO_AFSEL1_SEL11 BITS(12,15) /*!< pin 11 alternate function selected */ -#define GPIO_AFSEL1_SEL12 BITS(16,19) /*!< pin 12 alternate function selected */ -#define GPIO_AFSEL1_SEL13 BITS(20,23) /*!< pin 13 alternate function selected */ -#define GPIO_AFSEL1_SEL14 BITS(24,27) /*!< pin 14 alternate function selected */ -#define GPIO_AFSEL1_SEL15 BITS(28,31) /*!< pin 15 alternate function selected */ - -/* GPIO_BC */ -#define GPIO_BC_CR0 BIT(0) /*!< pin 0 clear bit */ -#define GPIO_BC_CR1 BIT(1) /*!< pin 1 clear bit */ -#define GPIO_BC_CR2 BIT(2) /*!< pin 2 clear bit */ -#define GPIO_BC_CR3 BIT(3) /*!< pin 3 clear bit */ -#define GPIO_BC_CR4 BIT(4) /*!< pin 4 clear bit */ -#define GPIO_BC_CR5 BIT(5) /*!< pin 5 clear bit */ -#define GPIO_BC_CR6 BIT(6) /*!< pin 6 clear bit */ -#define GPIO_BC_CR7 BIT(7) /*!< pin 7 clear bit */ -#define GPIO_BC_CR8 BIT(8) /*!< pin 8 clear bit */ -#define GPIO_BC_CR9 BIT(9) /*!< pin 9 clear bit */ -#define GPIO_BC_CR10 BIT(10) /*!< pin 10 clear bit */ -#define GPIO_BC_CR11 BIT(11) /*!< pin 11 clear bit */ -#define GPIO_BC_CR12 BIT(12) /*!< pin 12 clear bit */ -#define GPIO_BC_CR13 BIT(13) /*!< pin 13 clear bit */ -#define GPIO_BC_CR14 BIT(14) /*!< pin 14 clear bit */ -#define GPIO_BC_CR15 BIT(15) /*!< pin 15 clear bit */ - -/* GPIO_TG */ -#define GPIO_TG_TG0 BIT(0) /*!< pin 0 toggle bit */ -#define GPIO_TG_TG1 BIT(1) /*!< pin 1 toggle bit */ -#define GPIO_TG_TG2 BIT(2) /*!< pin 2 toggle bit */ -#define GPIO_TG_TG3 BIT(3) /*!< pin 3 toggle bit */ -#define GPIO_TG_TG4 BIT(4) /*!< pin 4 toggle bit */ -#define GPIO_TG_TG5 BIT(5) /*!< pin 5 toggle bit */ -#define GPIO_TG_TG6 BIT(6) /*!< pin 6 toggle bit */ -#define GPIO_TG_TG7 BIT(7) /*!< pin 7 toggle bit */ -#define GPIO_TG_TG8 BIT(8) /*!< pin 8 toggle bit */ -#define GPIO_TG_TG9 BIT(9) /*!< pin 9 toggle bit */ -#define GPIO_TG_TG10 BIT(10) /*!< pin 10 toggle bit */ -#define GPIO_TG_TG11 BIT(11) /*!< pin 11 toggle bit */ -#define GPIO_TG_TG12 BIT(12) /*!< pin 12 toggle bit */ -#define GPIO_TG_TG13 BIT(13) /*!< pin 13 toggle bit */ -#define GPIO_TG_TG14 BIT(14) /*!< pin 14 toggle bit */ -#define GPIO_TG_TG15 BIT(15) /*!< pin 15 toggle bit */ - -/* constants definitions */ -typedef FlagStatus bit_status; - -/* output mode definitions */ -#define CTL_CLTR(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define GPIO_MODE_INPUT CTL_CLTR(0) /*!< input mode */ -#define GPIO_MODE_OUTPUT CTL_CLTR(1) /*!< output mode */ -#define GPIO_MODE_AF CTL_CLTR(2) /*!< alternate function mode */ -#define GPIO_MODE_ANALOG CTL_CLTR(3) /*!< analog mode */ - -/* pull-up/ pull-down definitions */ -#define PUD_PUPD(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define GPIO_PUPD_NONE PUD_PUPD(0) /*!< floating mode, no pull-up and pull-down resistors */ -#define GPIO_PUPD_PULLUP PUD_PUPD(1) /*!< with pull-up resistor */ -#define GPIO_PUPD_PULLDOWN PUD_PUPD(2) /*!< with pull-down resistor */ - -/* GPIO pin definitions */ -#define GPIO_PIN_0 BIT(0) /*!< GPIO pin 0 */ -#define GPIO_PIN_1 BIT(1) /*!< GPIO pin 1 */ -#define GPIO_PIN_2 BIT(2) /*!< GPIO pin 2 */ -#define GPIO_PIN_3 BIT(3) /*!< GPIO pin 3 */ -#define GPIO_PIN_4 BIT(4) /*!< GPIO pin 4 */ -#define GPIO_PIN_5 BIT(5) /*!< GPIO pin 5 */ -#define GPIO_PIN_6 BIT(6) /*!< GPIO pin 6 */ -#define GPIO_PIN_7 BIT(7) /*!< GPIO pin 7 */ -#define GPIO_PIN_8 BIT(8) /*!< GPIO pin 8 */ -#define GPIO_PIN_9 BIT(9) /*!< GPIO pin 9 */ -#define GPIO_PIN_10 BIT(10) /*!< GPIO pin 10 */ -#define GPIO_PIN_11 BIT(11) /*!< GPIO pin 11 */ -#define GPIO_PIN_12 BIT(12) /*!< GPIO pin 12 */ -#define GPIO_PIN_13 BIT(13) /*!< GPIO pin 13 */ -#define GPIO_PIN_14 BIT(14) /*!< GPIO pin 14 */ -#define GPIO_PIN_15 BIT(15) /*!< GPIO pin 15 */ -#define GPIO_PIN_ALL BITS(0,15) /*!< GPIO pin all */ - -/* GPIO mode configuration values */ -#define GPIO_MODE_SET(n, mode) ((uint32_t)((uint32_t)(mode) << (2U * (n)))) -#define GPIO_MODE_MASK(n) (0x3U << (2U * (n))) - -/* GPIO pull-up/ pull-down values */ -#define GPIO_PUPD_SET(n, pupd) ((uint32_t)((uint32_t)(pupd) << (2U * (n)))) -#define GPIO_PUPD_MASK(n) (0x3U << (2U * (n))) - -/* GPIO output speed values */ -#define GPIO_OSPEED_SET(n, speed) ((uint32_t)((uint32_t)(speed) << (2U * (n)))) -#define GPIO_OSPEED_MASK(n) (0x3U << (2U * (n))) - -/* GPIO output type */ -#define GPIO_OTYPE_PP ((uint8_t)(0x00U)) /*!< push pull mode */ -#define GPIO_OTYPE_OD ((uint8_t)(0x01U)) /*!< open drain mode */ - -/* GPIO output max speed level */ -#define OSPD_OSPD(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define GPIO_OSPEED_LEVEL0 OSPD_OSPD(0) /*!< output max speed level 0 */ -#define GPIO_OSPEED_LEVEL1 OSPD_OSPD(1) /*!< output max speed level 1 */ -#define GPIO_OSPEED_LEVEL2 OSPD_OSPD(2) /*!< output max speed level 2 */ -#define GPIO_OSPEED_LEVEL3 OSPD_OSPD(3) /*!< output max speed level 3 */ - -/* GPIO output max speed value */ -#define GPIO_OSPEED_2MHZ GPIO_OSPEED_LEVEL0 /*!< output max speed 2MHz */ -#define GPIO_OSPEED_10MHZ GPIO_OSPEED_LEVEL1 /*!< output max speed 10MHz */ -#define GPIO_OSPEED_50MHZ GPIO_OSPEED_LEVEL2 /*!< output max speed 50MHz */ -#define GPIO_OSPEED_MAX GPIO_OSPEED_LEVEL3 /*!< GPIO very high output speed, max speed more than 50MHz */ - -/* GPIO alternate function values */ -#define GPIO_AFR_SET(n, af) ((uint32_t)((uint32_t)(af) << (4U * (n)))) -#define GPIO_AFR_MASK(n) (0xFU << (4U * (n))) - -/* GPIO alternate function */ -#define AF(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) -#define GPIO_AF_0 AF(0) /*!< alternate function 0 selected */ -#define GPIO_AF_1 AF(1) /*!< alternate function 1 selected */ -#define GPIO_AF_2 AF(2) /*!< alternate function 2 selected */ -#define GPIO_AF_3 AF(3) /*!< alternate function 3 selected */ -#define GPIO_AF_4 AF(4) /*!< alternate function 4 selected */ -#define GPIO_AF_5 AF(5) /*!< alternate function 5 selected */ -#define GPIO_AF_6 AF(6) /*!< alternate function 6 selected */ -#define GPIO_AF_7 AF(7) /*!< alternate function 7 selected */ -#define GPIO_AF_8 AF(8) /*!< alternate function 8 selected */ -#define GPIO_AF_9 AF(9) /*!< alternate function 9 selected */ -#define GPIO_AF_10 AF(10) /*!< alternate function 10 selected */ -#define GPIO_AF_11 AF(11) /*!< alternate function 11 selected */ -#define GPIO_AF_12 AF(12) /*!< alternate function 12 selected */ -#define GPIO_AF_13 AF(13) /*!< alternate function 13 selected */ -#define GPIO_AF_14 AF(14) /*!< alternate function 14 selected */ -#define GPIO_AF_15 AF(15) /*!< alternate function 15 selected */ - -/* function declarations */ -/* reset GPIO port */ -void gpio_deinit(uint32_t gpio_periph); -/* set GPIO mode */ -void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin); -/* set GPIO output type and speed */ -void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin); - -/* set GPIO pin bit */ -void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); -/* reset GPIO pin bit */ -void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin); -/* write data to the specified GPIO pin */ -void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); -/* write data to the specified GPIO port */ -void gpio_port_write(uint32_t gpio_periph, uint16_t data); - -/* get GPIO pin input status */ -FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin); -/* get GPIO port input status */ -uint16_t gpio_input_port_get(uint32_t gpio_periph); -/* get GPIO pin output status */ -FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin); -/* get GPIO port output status */ -uint16_t gpio_output_port_get(uint32_t gpio_periph); - -/* set GPIO alternate function */ -void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin); -/* lock GPIO pin bit */ -void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin); - -/* toggle GPIO pin status */ -void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin); -/* toggle GPIO port status */ -void gpio_port_toggle(uint32_t gpio_periph); - -#endif /* GD32F5XX_GPIO_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h deleted file mode 100644 index 651b280bd14..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_hau.h +++ /dev/null @@ -1,223 +0,0 @@ -/*! - \file gd32f5xx_hau.h - \brief definitions for the HAU - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_HAU_H -#define GD32F5XX_HAU_H - -#include "gd32f5xx.h" - -/* HAU definitions */ -#define HAU HAU_BASE /*!< HAU base address */ - -/* registers definitions */ -#define HAU_CTL REG32(HAU + 0x00000000U) /*!< control register */ -#define HAU_DI REG32(HAU + 0x00000004U) /*!< data input register */ -#define HAU_CFG REG32(HAU + 0x00000008U) /*!< configuration register */ -#define HAU_DO0 REG32(HAU + 0x0000000CU) /*!< data output register 0 */ -#define HAU_DO1 REG32(HAU + 0x00000010U) /*!< data output register 1 */ -#define HAU_DO2 REG32(HAU + 0x00000014U) /*!< data output register 2 */ -#define HAU_DO3 REG32(HAU + 0x00000018U) /*!< data output register 3 */ -#define HAU_DO4 REG32(HAU + 0x0000001CU) /*!< data output register 4 */ -#define HAU_DO5 REG32(HAU + 0x00000324U) /*!< data output register 5 */ -#define HAU_DO6 REG32(HAU + 0x00000328U) /*!< data output register 6 */ -#define HAU_DO7 REG32(HAU + 0x0000032CU) /*!< data output register 7 */ -#define HAU_INTEN REG32(HAU + 0x00000020U) /*!< interrupt enable register */ -#define HAU_STAT REG32(HAU + 0x00000024U) /*!< status and interrupt flag register */ -#define HAU_CTXS(regval) REG32(HAU + 0x000000F8U + 0x04U * (regval)) /*!< context switch register, regval<=53 */ - -/* bits definitions */ -/* HAU_CTL */ -#define HAU_CTL_START BIT(2) /*!< set to 1 to reset the HAU processor core, so that it is ready to start the digest calculation */ -#define HAU_CTL_DMAE BIT(3) /*!< DMA enable */ -#define HAU_CTL_DATAM BITS(4,5) /*!< data type mode */ -#define HAU_CTL_HMS BIT(6) /*!< HAU mode selection */ -#define HAU_CTL_ALGM_0 BIT(7) /*!< algorithm selection bit 0 */ -#define HAU_CTL_NWIF BITS(8,11) /*!< number of words in the input FIFO */ -#define HAU_CTL_DINE BIT(12) /*!< DI register not empty */ -#define HAU_CTL_MDS BIT(13) /*!< multiple DMA selection */ -#define HAU_CTL_KLM BIT(16) /*!< key length mode */ -#define HAU_CTL_ALGM_1 BIT(18) /*!< algorithm selection bit 1 */ - -/* HAU_DI */ -#define HAU_DI_DI BITS(0,31) /*!< message data input */ - -/* HAU_CFG */ -#define HAU_CFG_VBL BITS(0,4) /*!< valid bits length in the last word */ -#define HAU_CFG_CALEN BIT(8) /*!< digest calculation enable */ - -/* HAU_DOx x=0..7 */ -#define HAU_DOX_DOX BITS(0,31) /*!< message digest result of hash algorithm */ - -/* HAU_INTEN */ -#define HAU_INTEN_DIIE BIT(0) /*!< data input interrupt enable */ -#define HAU_INTEN_CCIE BIT(1) /*!< calculation completion interrupt enable */ - -/* HAU_STAT */ -#define HAU_STAT_DIF BIT(0) /*!< data input interrupt flag */ -#define HAU_STAT_CCF BIT(1) /*!< digest calculation completion interrupt flag */ -#define HAU_STAT_DMAS BIT(2) /*!< DMA status */ -#define HAU_STAT_BUSY BIT(3) /*!< busy bit */ - -/* constants definitions */ -/* structure for initialization of the hau */ -typedef struct -{ - uint32_t algo; /*!< algorithm selection */ - uint32_t mode; /*!< HAU mode selection */ - uint32_t datatype; /*!< data type mode */ - uint32_t keytype; /*!< key length mode */ -}hau_init_parameter_struct; - -/* structure for message digest result of the hau */ -typedef struct -{ - uint32_t out[8]; /*!< message digest result 0-7 */ -}hau_digest_parameter_struct; - -/* structure for context switch */ -typedef struct -{ - uint32_t hau_ctl_bak; /*!< backup of HAU_CTL register */ - uint32_t hau_cfg_bak; /*!< backup of HAU_CFG register */ - uint32_t hau_inten_bak; /*!< backup of HAU_INTEN register */ - uint32_t hau_ctxs_bak[54];/*!< backup of HAU_CTXSx registers */ -}hau_context_parameter_struct; - -/* hau_ctl register value */ -#define HAU_ALGO_SHA1 ((uint32_t)0x00000000U) /*!< HAU function is SHA1 */ -#define HAU_ALGO_SHA224 HAU_CTL_ALGM_1 /*!< HAU function is SHA224 */ -#define HAU_ALGO_SHA256 (HAU_CTL_ALGM_1 | HAU_CTL_ALGM_0) /*!< HAU function is SHA256 */ -#define HAU_ALGO_MD5 HAU_CTL_ALGM_0 /*!< HAU function is MD5 */ - -#define HAU_MODE_HASH ((uint32_t)0x00000000U) /*!< HAU mode is HASH */ -#define HAU_MODE_HMAC HAU_CTL_HMS /*!< HAU mode is HMAC */ - -#define CTL_DATAM_1(regval) (BITS(4,5) & ((uint32_t)(regval) << 4U)) /*!< write value to HAU_CTL_DATAM bit field */ -#define HAU_SWAPPING_32BIT CTL_DATAM_1(0) /*!< no swapping */ -#define HAU_SWAPPING_16BIT CTL_DATAM_1(1) /*!< half-word swapping */ -#define HAU_SWAPPING_8BIT CTL_DATAM_1(2) /*!< bytes swapping */ -#define HAU_SWAPPING_1BIT CTL_DATAM_1(3) /*!< bit swapping */ - -#define HAU_KEY_SHORTER_64 ((uint32_t)0x00000000U) /*!< HMAC key is <= 64 bytes */ -#define HAU_KEY_LONGGER_64 HAU_CTL_KLM /*!< HMAC key is > 64 bytes */ - -#define GET_CTL_NWIF(regval) GET_BITS((regval),8,11) /*!< get value of HAU_CTL_NWIF bit field */ - -#define SINGLE_DMA_AUTO_DIGEST ((uint32_t)0x00000000U) /*!< message padding and message digest calculation at the end of a DMA transfer */ -#define MULTIPLE_DMA_NO_DIGEST HAU_CTL_MDS /*!< multiple DMA transfers needed and CALEN bit is not automatically set at the end of a DMA transfer */ - -/* hau_cfg register value */ -#define CFG_VBL(regval) (BITS(0,4) & ((regval) << 0U)) /*!< write value to HAU_CFG_VBL bit field */ - -/* hau_inten register value */ -#define HAU_INT_DATA_INPUT HAU_INTEN_DIIE /*!< a new block can be entered into the IN buffer */ -#define HAU_INT_CALCULATION_COMPLETE HAU_INTEN_CCIE /*!< calculation complete */ - -#define HAU_FLAG_DATA_INPUT HAU_STAT_DIF /*!< there is enough space (16 bytes) in the input FIFO */ -#define HAU_FLAG_CALCULATION_COMPLETE HAU_STAT_CCF /*!< digest calculation is completed */ -#define HAU_FLAG_DMA HAU_STAT_DMAS /*!< DMA is enabled (DMAE =1) or a transfer is processing */ -#define HAU_FLAG_BUSY HAU_STAT_BUSY /*!< data block is in process */ -#define HAU_FLAG_INFIFO_NO_EMPTY HAU_CTL_DINE /*!< the input FIFO is not empty */ - -#define HAU_INT_FLAG_DATA_INPUT HAU_STAT_DIF /*!< there is enough space (16 bytes) in the input FIFO */ -#define HAU_INT_FLAG_CALCULATION_COMPLETE HAU_STAT_CCF /*!< digest calculation is completed */ - -/* function declarations */ -/* initialization functions */ -/* reset the HAU peripheral */ -void hau_deinit(void); -/* initialize the HAU peripheral parameters */ -void hau_init(hau_init_parameter_struct* initpara); -/* initialize the structure hau_initpara */ -void hau_init_struct_para_init(hau_init_parameter_struct* initpara); -/* reset the HAU processor core */ -void hau_reset(void); -/* configure the number of valid bits in last word of the message */ -void hau_last_word_validbits_num_config(uint32_t valid_num); -/* write data to the IN FIFO */ -void hau_data_write(uint32_t data); -/* return the number of words already written into the IN FIFO */ -uint32_t hau_infifo_words_num_get(void); -/* read the message digest result */ -void hau_digest_read(hau_digest_parameter_struct* digestpara); -/* enable digest calculation */ -void hau_digest_calculation_enable(void); -/* configure single or multiple DMA is used, and digest calculation at the end of a DMA transfer or not */ -void hau_multiple_single_dma_config(uint32_t multi_single); -/* enable the HAU DMA interface */ -void hau_dma_enable(void); -/* disable the HAU DMA interface */ -void hau_dma_disable(void); - -/* context swapping functions */ -/* initialize the struct context */ -void hau_context_struct_para_init(hau_context_parameter_struct* context); -/* save the HAU peripheral context */ -void hau_context_save(hau_context_parameter_struct* context_save); -/* restore the HAU peripheral context */ -void hau_context_restore(hau_context_parameter_struct* context_restore); - -/* calculate digest in HASH mode */ -/* calculate digest using SHA1 in HASH mode */ -ErrStatus hau_hash_sha_1(uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using SHA1 in HMAC mode */ -ErrStatus hau_hmac_sha_1(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using SHA224 in HASH mode */ -ErrStatus hau_hash_sha_224(uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using SHA224 in HMAC mode */ -ErrStatus hau_hmac_sha_224(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using SHA256 in HASH mode */ -ErrStatus hau_hash_sha_256(uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using SHA256 in HMAC mode */ -ErrStatus hau_hmac_sha_256(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using MD5 in HASH mode */ -ErrStatus hau_hash_md5(uint8_t *input, uint32_t in_length, uint8_t output[]); -/* calculate digest using MD5 in HMAC mode */ -ErrStatus hau_hmac_md5(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]); - -/* interrupt & flag functions */ -/* get the HAU flag status */ -FlagStatus hau_flag_get(uint32_t flag); -/* clear the HAU flag status */ -void hau_flag_clear(uint32_t flag); -/* enable the HAU interrupts */ -void hau_interrupt_enable(uint32_t interrupt); -/* disable the HAU interrupts */ -void hau_interrupt_disable(uint32_t interrupt); -/* get the HAU interrupt flag status */ -FlagStatus hau_interrupt_flag_get(uint32_t int_flag); -/* clear the HAU interrupt flag status */ -void hau_interrupt_flag_clear(uint32_t int_flag); - -#endif /* GD32F5XX_HAU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h deleted file mode 100644 index 80e5721da8c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c.h +++ /dev/null @@ -1,416 +0,0 @@ -/*! - \file gd32f5xx_i2c.h - \brief definitions for the I2C0-2 - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_I2C_SIMPLE_H -#define GD32F5XX_I2C_SIMPLE_H - -#include "gd32f5xx.h" - -/* I2Cx(x=0,1,2) definitions */ -#define I2C0 I2C_BASE /*!< I2C0 base address */ -#define I2C1 (I2C_BASE + 0x00000400U) /*!< I2C1 base address */ -#define I2C2 (I2C_BASE + 0x00000800U) /*!< I2C2 base address */ - -/* registers definitions */ -#define I2C_CTL0(i2cx) REG32((i2cx) + 0x00000000U) /*!< I2C control register 0 */ -#define I2C_CTL1(i2cx) REG32((i2cx) + 0x00000004U) /*!< I2C control register 1 */ -#define I2C_SADDR0(i2cx) REG32((i2cx) + 0x00000008U) /*!< I2C slave address register 0 */ -#define I2C_SADDR1(i2cx) REG32((i2cx) + 0x0000000CU) /*!< I2C slave address register 1 */ -#define I2C_DATA(i2cx) REG32((i2cx) + 0x00000010U) /*!< I2C transfer buffer register */ -#define I2C_STAT0(i2cx) REG32((i2cx) + 0x00000014U) /*!< I2C transfer status register 0 */ -#define I2C_STAT1(i2cx) REG32((i2cx) + 0x00000018U) /*!< I2C transfer status register */ -#define I2C_CKCFG(i2cx) REG32((i2cx) + 0x0000001CU) /*!< I2C clock configure register */ -#define I2C_RT(i2cx) REG32((i2cx) + 0x00000020U) /*!< I2C rise time register */ -#define I2C_FCTL(i2cx) REG32((i2cx) + 0x00000024U) /*!< I2C filter control register */ -#define I2C_SAMCS(i2cx) REG32((i2cx) + 0x00000080U) /*!< I2C SAM control and status register */ - -/* bits definitions */ -/* I2Cx_CTL0 */ -#define I2C_CTL0_I2CEN BIT(0) /*!< peripheral enable */ -#define I2C_CTL0_SMBEN BIT(1) /*!< SMBus mode */ -#define I2C_CTL0_SMBSEL BIT(3) /*!< SMBus type */ -#define I2C_CTL0_ARPEN BIT(4) /*!< ARP enable */ -#define I2C_CTL0_PECEN BIT(5) /*!< PEC enable */ -#define I2C_CTL0_GCEN BIT(6) /*!< general call enable */ -#define I2C_CTL0_SS BIT(7) /*!< clock stretching disable (slave mode) */ -#define I2C_CTL0_START BIT(8) /*!< start generation */ -#define I2C_CTL0_STOP BIT(9) /*!< stop generation */ -#define I2C_CTL0_ACKEN BIT(10) /*!< acknowledge enable */ -#define I2C_CTL0_POAP BIT(11) /*!< acknowledge/PEC position (for data reception) */ -#define I2C_CTL0_PECTRANS BIT(12) /*!< packet error checking */ -#define I2C_CTL0_SALT BIT(13) /*!< SMBus alert */ -#define I2C_CTL0_SRESET BIT(15) /*!< software reset */ - -/* I2Cx_CTL1 */ -#define I2C_CTL1_I2CCLK BITS(0,5) /*!< I2CCLK[5:0] bits (peripheral clock frequency) */ -#define I2C_CTL1_ERRIE BIT(8) /*!< error interrupt enable */ -#define I2C_CTL1_EVIE BIT(9) /*!< event interrupt enable */ -#define I2C_CTL1_BUFIE BIT(10) /*!< buffer interrupt enable */ -#define I2C_CTL1_DMAON BIT(11) /*!< DMA requests enable */ -#define I2C_CTL1_DMALST BIT(12) /*!< DMA last transfer */ -#define I2C_CTL1_CFGRBNE BIT(15) /*!< RBNE clear condition control */ - -/* I2Cx_SADDR0 */ -#define I2C_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ -#define I2C_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ -#define I2C_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ -#define I2C_SADDR0_ADDFORMAT BIT(15) /*!< address mode for the I2C slave */ - -/* I2Cx_SADDR1 */ -#define I2C_SADDR1_DUADEN BIT(0) /*!< aual-address mode switch */ -#define I2C_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave in dual-address mode */ - -/* I2Cx_DATA */ -#define I2C_DATA_TRB BITS(0,7) /*!< 8-bit data register */ - -/* I2Cx_STAT0 */ -#define I2C_STAT0_SBSEND BIT(0) /*!< start bit (master mode) */ -#define I2C_STAT0_ADDSEND BIT(1) /*!< address sent (master mode)/matched (slave mode) */ -#define I2C_STAT0_BTC BIT(2) /*!< byte transfer finished */ -#define I2C_STAT0_ADD10SEND BIT(3) /*!< 10-bit header sent (master mode) */ -#define I2C_STAT0_STPDET BIT(4) /*!< stop detection (slave mode) */ -#define I2C_STAT0_RBNE BIT(6) /*!< data register not empty (receivers) */ -#define I2C_STAT0_TBE BIT(7) /*!< data register empty (transmitters) */ -#define I2C_STAT0_BERR BIT(8) /*!< bus error */ -#define I2C_STAT0_LOSTARB BIT(9) /*!< arbitration lost (master mode) */ -#define I2C_STAT0_AERR BIT(10) /*!< acknowledge failure */ -#define I2C_STAT0_OUERR BIT(11) /*!< overrun/underrun */ -#define I2C_STAT0_PECERR BIT(12) /*!< PEC error in reception */ -#define I2C_STAT0_SMBTO BIT(14) /*!< timeout signal in SMBus mode */ -#define I2C_STAT0_SMBALT BIT(15) /*!< SMBus alert status */ - -/* I2Cx_STAT1 */ -#define I2C_STAT1_MASTER BIT(0) /*!< master/slave */ -#define I2C_STAT1_I2CBSY BIT(1) /*!< bus busy */ -#define I2C_STAT1_TR BIT(2) /*!< transmitter/receiver */ -#define I2C_STAT1_RXGC BIT(4) /*!< general call address (slave mode) */ -#define I2C_STAT1_DEFSMB BIT(5) /*!< SMBus device default address (slave mode) */ -#define I2C_STAT1_HSTSMB BIT(6) /*!< SMBus host header (slave mode) */ -#define I2C_STAT1_DUMODF BIT(7) /*!< dual flag (slave mode) */ -#define I2C_STAT1_PECV BITS(8,15) /*!< packet error checking value */ - -/* I2Cx_CKCFG */ -#define I2C_CKCFG_CLKC BITS(0,11) /*!< clock control register in fast/standard mode (master mode) */ -#define I2C_CKCFG_DTCY BIT(14) /*!< fast mode duty cycle */ -#define I2C_CKCFG_FAST BIT(15) /*!< I2C speed selection in master mode */ - -/* I2Cx_RT */ -#define I2C_RT_RISETIME BITS(0,5) /*!< maximum rise time in fast/standard mode (Master mode) */ - -/* I2Cx_FCTL */ -#define I2C_FCTL_DF BITS(0,3) /*!< digital noise filter */ -#define I2C_FCTL_AFD BIT(4) /*!< analog noise filter disable */ - -/* I2Cx_SAMCS */ -#define I2C_SAMCS_SAMEN BIT(0) /*!< SAM_V interface enable */ -#define I2C_SAMCS_STOEN BIT(1) /*!< SAM_V interface timeout detect enable */ -#define I2C_SAMCS_TFFIE BIT(4) /*!< txframe fall interrupt enable */ -#define I2C_SAMCS_TFRIE BIT(5) /*!< txframe rise interrupt enable */ -#define I2C_SAMCS_RFFIE BIT(6) /*!< rxframe fall interrupt enable */ -#define I2C_SAMCS_RFRIE BIT(7) /*!< rxframe rise interrupt enable */ -#define I2C_SAMCS_TXF BIT(8) /*!< level of txframe signal */ -#define I2C_SAMCS_RXF BIT(9) /*!< level of rxframe signal */ -#define I2C_SAMCS_TFF BIT(12) /*!< txframe fall flag */ -#define I2C_SAMCS_TFR BIT(13) /*!< txframe rise flag */ -#define I2C_SAMCS_RFF BIT(14) /*!< rxframe fall flag */ -#define I2C_SAMCS_RFR BIT(15) /*!< rxframe rise flag */ - -/* constants definitions */ -/* define the I2C bit position and its register index offset */ -#define I2C_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define I2C_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0x0000FFFFU) >> 6))) -#define I2C_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) -#define I2C_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ - | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) -#define I2C_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) -#define I2C_BIT_POS2(val) (((uint32_t)(val) & 0x001F0000U) >> 16) - -/* register offset */ -#define I2C_CTL1_REG_OFFSET ((uint32_t)0x00000004U) /*!< CTL1 register offset */ -#define I2C_STAT0_REG_OFFSET ((uint32_t)0x00000014U) /*!< STAT0 register offset */ -#define I2C_STAT1_REG_OFFSET ((uint32_t)0x00000018U) /*!< STAT1 register offset */ -#define I2C_SAMCS_REG_OFFSET ((uint32_t)0x00000080U) /*!< SAMCS register offset */ - -/* I2C flags */ -typedef enum { - /* flags in STAT0 register */ - I2C_FLAG_SBSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode */ - I2C_FLAG_ADDSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode */ - I2C_FLAG_BTC = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ - I2C_FLAG_ADD10SEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode */ - I2C_FLAG_STPDET = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode */ - I2C_FLAG_RBNE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not empty during receiving */ - I2C_FLAG_TBE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting */ - I2C_FLAG_BERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus */ - I2C_FLAG_LOSTARB = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode */ - I2C_FLAG_AERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error */ - I2C_FLAG_OUERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode */ - I2C_FLAG_PECERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data */ - I2C_FLAG_SMBTO = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode */ - I2C_FLAG_SMBALT = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status */ - /* flags in STAT1 register */ - I2C_FLAG_MASTER = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 0U), /*!< a flag indicating whether I2C block is in master or slave mode */ - I2C_FLAG_I2CBSY = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 1U), /*!< busy flag */ - I2C_FLAG_TR = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 2U), /*!< whether the I2C is a transmitter or a receiver */ - I2C_FLAG_RXGC = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 4U), /*!< general call address (00h) received */ - I2C_FLAG_DEFSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 5U), /*!< default address of SMBus device */ - I2C_FLAG_HSTSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 6U), /*!< SMBus host header detected in slave mode */ - I2C_FLAG_DUMOD = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 7U), /*!< dual flag in slave mode indicating which address is matched in dual-address mode */ - /* flags in SAMCS register */ - I2C_FLAG_TFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 12U), /*!< txframe fall flag */ - I2C_FLAG_TFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 13U), /*!< txframe rise flag */ - I2C_FLAG_RFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 14U), /*!< rxframe fall flag */ - I2C_FLAG_RFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 15U) /*!< rxframe rise flag */ -} i2c_flag_enum; - -/* I2C interrupt flags */ -typedef enum { - /* interrupt flags in CTL1 register */ - I2C_INT_FLAG_SBSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode interrupt flag */ - I2C_INT_FLAG_ADDSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode interrupt flag */ - I2C_INT_FLAG_BTC = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes interrupt flag */ - I2C_INT_FLAG_ADD10SEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode interrupt flag */ - I2C_INT_FLAG_STPDET = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode interrupt flag */ - I2C_INT_FLAG_RBNE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving interrupt flag */ - I2C_INT_FLAG_TBE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting interrupt flag */ - I2C_INT_FLAG_BERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag */ - I2C_INT_FLAG_LOSTARB = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode interrupt flag */ - I2C_INT_FLAG_AERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error interrupt flag */ - I2C_INT_FLAG_OUERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode interrupt flag */ - I2C_INT_FLAG_PECERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data interrupt flag */ - I2C_INT_FLAG_SMBTO = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode interrupt flag */ - I2C_INT_FLAG_SMBALT = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status interrupt flag */ - /* interrupt flags in SAMCS register */ - I2C_INT_FLAG_TFF = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 4U, I2C_SAMCS_REG_OFFSET, 12U), /*!< txframe fall interrupt flag */ - I2C_INT_FLAG_TFR = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 5U, I2C_SAMCS_REG_OFFSET, 13U), /*!< txframe rise interrupt flag */ - I2C_INT_FLAG_RFF = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 6U, I2C_SAMCS_REG_OFFSET, 14U), /*!< rxframe fall interrupt flag */ - I2C_INT_FLAG_RFR = I2C_REGIDX_BIT2(I2C_SAMCS_REG_OFFSET, 7U, I2C_SAMCS_REG_OFFSET, 15U) /*!< rxframe rise interrupt flag */ -} i2c_interrupt_flag_enum; - -/* I2C interrupt */ -typedef enum { - /* interrupt in CTL1 register */ - I2C_INT_ERR = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 8U), /*!< error interrupt */ - I2C_INT_EV = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 9U), /*!< event interrupt */ - I2C_INT_BUF = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 10U), /*!< buffer interrupt */ - /* interrupt in SAMCS register */ - I2C_INT_TFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 4U), /*!< txframe fall interrupt */ - I2C_INT_TFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 5U), /*!< txframe rise interrupt */ - I2C_INT_RFF = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 6U), /*!< rxframe fall interrupt */ - I2C_INT_RFR = I2C_REGIDX_BIT(I2C_SAMCS_REG_OFFSET, 7U) /*!< rxframe rise interrupt */ -} i2c_interrupt_enum; - -/* the digital noise filter can filter spikes's length */ -typedef enum { - I2C_DF_DISABLE = 0, /*!< disable digital noise filter */ - I2C_DF_1PCLK, /*!< enable digital noise filter and the maximum filtered spiker's length 1 PCLK1 */ - I2C_DF_2PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 2 PCLK1 */ - I2C_DF_3PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 3 PCLK1 */ - I2C_DF_4PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 4 PCLK1 */ - I2C_DF_5PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 5 PCLK1 */ - I2C_DF_6PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 6 PCLK1 */ - I2C_DF_7PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 7 PCLK1 */ - I2C_DF_8PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 8 PCLK1 */ - I2C_DF_9PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 9 PCLK1 */ - I2C_DF_10PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 10 PCLK1 */ - I2C_DF_11PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 11 PCLK1 */ - I2C_DF_12PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 12 PCLK1 */ - I2C_DF_13PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 13 PCLK1 */ - I2C_DF_14PCLKS, /*!< enable digital noise filter and the maximum filtered spiker's length 14 PCLK1 */ - I2C_DF_15PCLKS /*!< enable digital noise filter and the maximum filtered spiker's length 15 PCLK1 */ -} i2c_digital_filter_enum; - -/* SMBus/I2C mode switch and SMBus type selection */ -#define I2C_I2CMODE_ENABLE ((uint32_t)0x00000000U) /*!< I2C mode */ -#define I2C_SMBUSMODE_ENABLE I2C_CTL0_SMBEN /*!< SMBus mode */ - -/* SMBus/I2C mode switch and SMBus type selection */ -#define I2C_SMBUS_DEVICE ((uint32_t)0x00000000U) /*!< SMBus mode device type */ -#define I2C_SMBUS_HOST I2C_CTL0_SMBSEL /*!< SMBus mode host type */ - -/* I2C transfer direction */ -#define I2C_RECEIVER ((uint32_t)0x00000001U) /*!< receiver */ -#define I2C_TRANSMITTER ((uint32_t)0xFFFFFFFEU) /*!< transmitter */ - -/* whether or not to send an ACK */ -#define I2C_ACK_DISABLE ((uint32_t)0x00000000U) /*!< ACK will be not sent */ -#define I2C_ACK_ENABLE I2C_CTL0_ACKEN /*!< ACK will be sent */ - -/* I2C POAP position*/ -#define I2C_ACKPOS_CURRENT ((uint32_t)0x00000000U) /*!< ACKEN bit decides whether or not to send ACK or not for the current byte */ -#define I2C_ACKPOS_NEXT I2C_CTL0_POAP /*!< ACKEN bit decides whether or not to send ACK for the next byte */ - -/* whether or not to stretch SCL low */ -#define I2C_SCLSTRETCH_ENABLE ((uint32_t)0x00000000U) /*!< enable SCL stretching */ -#define I2C_SCLSTRETCH_DISABLE I2C_CTL0_SS /*!< disable SCL stretching */ - -/* whether or not to response to a general call */ -#define I2C_GCEN_ENABLE I2C_CTL0_GCEN /*!< slave will response to a general call */ -#define I2C_GCEN_DISABLE ((uint32_t)0x00000000U) /*!< slave will not response to a general call */ - -/* software reset I2C */ -#define I2C_SRESET_RESET ((uint32_t)0x00000000U) /*!< I2C is not under reset */ -#define I2C_SRESET_SET I2C_CTL0_SRESET /*!< I2C is under reset */ - -/* I2C DMA mode configure */ -/* DMA mode switch */ -#define I2C_DMA_OFF ((uint32_t)0x00000000U) /*!< disable DMA mode */ -#define I2C_DMA_ON I2C_CTL1_DMAON /*!< enable DMA mode */ - -/* flag indicating DMA last transfer */ -#define I2C_DMALST_OFF ((uint32_t)0x00000000U) /*!< next DMA EOT is not the last transfer */ -#define I2C_DMALST_ON I2C_CTL1_DMALST /*!< next DMA EOT is the last transfer */ - -/* RBNE clear condition control */ -#define I2C_CFGRBNE_OFF ((uint32_t)0x00000000U) /*!< RBNE can be cleared when RXDATA is read and BTC is cleared */ -#define I2C_CFGRBNE_ON I2C_CTL1_CFGRBNE /*!< RBNE can be cleared when RXDATA is read */ - -/* I2C PEC configure */ -/* PEC enable */ -#define I2C_PEC_DISABLE ((uint32_t)0x00000000U) /*!< PEC calculation off */ -#define I2C_PEC_ENABLE I2C_CTL0_PECEN /*!< PEC calculation on */ - -/* PEC transfer */ -#define I2C_PECTRANS_DISABLE ((uint32_t)0x00000000U) /*!< not transfer PEC value */ -#define I2C_PECTRANS_ENABLE I2C_CTL0_PECTRANS /*!< transfer PEC value */ - -/* I2C SMBus configure */ -/* issue or not alert through SMBA pin */ -#define I2C_SALTSEND_DISABLE ((uint32_t)0x00000000U) /*!< not issue alert through SMBA */ -#define I2C_SALTSEND_ENABLE I2C_CTL0_SALT /*!< issue alert through SMBA pin */ - -/* ARP protocol in SMBus switch */ -#define I2C_ARP_DISABLE ((uint32_t)0x00000000U) /*!< disable ARP */ -#define I2C_ARP_ENABLE I2C_CTL0_ARPEN /*!< enable ARP */ - -/* transmit I2C data */ -#define DATA_TRANS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) - -/* receive I2C data */ -#define DATA_RECV(regval) GET_BITS((uint32_t)(regval), 0, 7) - -/* I2C duty cycle in fast mode */ -#define I2C_DTCY_2 ((uint32_t)0x00000000U) /*!< T_low/T_high = 2 in fast mode */ -#define I2C_DTCY_16_9 I2C_CKCFG_DTCY /*!< T_low/T_high = 16/9 in fast mode */ - -/* address mode for the I2C slave */ -#define I2C_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address format is 7 bits */ -#define I2C_ADDFORMAT_10BITS I2C_SADDR0_ADDFORMAT /*!< address format is 10 bits */ - -/* function declarations */ -/* initialization functions */ -/* reset I2C */ -void i2c_deinit(uint32_t i2c_periph); -/* configure I2C clock */ -void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc); -/* configure I2C address */ -void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr); - -/* application function declarations */ -/* select SMBus type */ -void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type); -/* whether or not to send an ACK */ -void i2c_ack_config(uint32_t i2c_periph, uint32_t ack); -/* configure I2C POAP position */ -void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos); -/* master sends slave address */ -void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection); -/* enable dual-address mode */ -void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr); -/* disable dual-address mode */ -void i2c_dualaddr_disable(uint32_t i2c_periph); -/* enable I2C */ -void i2c_enable(uint32_t i2c_periph); -/* disable I2C */ -void i2c_disable(uint32_t i2c_periph); -/* generate a START condition on I2C bus */ -void i2c_start_on_bus(uint32_t i2c_periph); -/* generate a STOP condition on I2C bus */ -void i2c_stop_on_bus(uint32_t i2c_periph); -/* I2C transmit data function */ -void i2c_data_transmit(uint32_t i2c_periph, uint8_t data); -/* I2C receive data function */ -uint8_t i2c_data_receive(uint32_t i2c_periph); -/* configure I2C DMA mode */ -void i2c_dma_config(uint32_t i2c_periph, uint32_t dmastate); -/* configure whether next DMA EOT is DMA last transfer or not */ -void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast); -/* configure RBNE clear condition */ -void i2c_rbne_clear_config(uint32_t i2c_periph, uint32_t rbnecondition); -/* whether to stretch SCL low when data is not ready in slave mode */ -void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara); -/* whether or not to response to a general call */ -void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara); -/* configure software reset of I2C */ -void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset); -/* configure I2C PEC calculation */ -void i2c_pec_config(uint32_t i2c_periph, uint32_t pecstate); -/* configure whether to transfer PEC value */ -void i2c_pec_transfer_config(uint32_t i2c_periph, uint32_t pecpara); -/* get packet error checking value */ -uint8_t i2c_pec_value_get(uint32_t i2c_periph); -/* configure I2C alert through SMBA pin */ -void i2c_smbus_alert_config(uint32_t i2c_periph, uint32_t smbuspara); -/* configure I2C ARP protocol in SMBus */ -void i2c_smbus_arp_config(uint32_t i2c_periph, uint32_t arpstate); -/* disable analog noise filter */ -void i2c_analog_noise_filter_disable(uint32_t i2c_periph); -/* enable analog noise filter */ -void i2c_analog_noise_filter_enable(uint32_t i2c_periph); -/* configure digital noise filter */ -void i2c_digital_noise_filter_config(uint32_t i2c_periph, i2c_digital_filter_enum dfilterpara); -/* enable SAM_V interface */ -void i2c_sam_enable(uint32_t i2c_periph); -/* disable SAM_V interface */ -void i2c_sam_disable(uint32_t i2c_periph); -/* enable SAM_V interface timeout detect */ -void i2c_sam_timeout_enable(uint32_t i2c_periph); -/* disable SAM_V interface timeout detect */ -void i2c_sam_timeout_disable(uint32_t i2c_periph); - -/* interrupt & flag functions */ -/* get I2C flag status */ -FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag); -/* clear I2C flag status */ -void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag); -/* enable I2C interrupt */ -void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); -/* disable I2C interrupt */ -void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); -/* get I2C interrupt flag status */ -FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); -/* clear I2C interrupt flag status */ -void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); - -#endif /* GD32F5XX_I2C_SIMPLE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h deleted file mode 100644 index abeab6008ce..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_i2c_add.h +++ /dev/null @@ -1,410 +0,0 @@ -/*! - \file gd32f5xx_i2c.h - \brief definitions for the I2C3-5 - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_I2C_ADD_H -#define GD32F5XX_I2C_ADD_H - -#include "gd32f5xx.h" - -/* I2Cx(x=3,4,5) definitions */ -#define I2C0 I2C_BASE /*!< I2C0 base address */ - -#define I2C3 (I2C_BASE + 0x00002C00U) /*!< I2C3 base address */ -#define I2C4 (I2C_BASE + 0x00003000U) /*!< I2C4 base address */ -#define I2C5 (I2C_BASE + 0x00003400U) /*!< I2C5 base address */ - -/* registers definitions */ -/* registers of I2Cx(x=3,4,5) */ -#define I2C_ADD_CTL0(i2cx) REG32((i2cx) + 0x00000000U) /*!< I2C control register 0 */ -#define I2C_ADD_CTL1(i2cx) REG32((i2cx) + 0x00000004U) /*!< I2C control register 1 */ -#define I2C_ADD_SADDR0(i2cx) REG32((i2cx) + 0x00000008U) /*!< I2C slave address register 0*/ -#define I2C_ADD_SADDR1(i2cx) REG32((i2cx) + 0x0000000CU) /*!< I2C slave address register 1*/ -#define I2C_ADD_TIMING(i2cx) REG32((i2cx) + 0x00000010U) /*!< I2C timing register */ -#define I2C_ADD_TIMEOUT(i2cx) REG32((i2cx) + 0x00000014U) /*!< I2C timeout register */ -#define I2C_ADD_STAT(i2cx) REG32((i2cx) + 0x00000018U) /*!< I2C status register */ -#define I2C_ADD_STATC(i2cx) REG32((i2cx) + 0x0000001CU) /*!< I2C status clear register */ -#define I2C_ADD_PEC(i2cx) REG32((i2cx) + 0x00000020U) /*!< I2C PEC register */ -#define I2C_ADD_RDATA(i2cx) REG32((i2cx) + 0x00000024U) /*!< I2C receive data register */ -#define I2C_ADD_TDATA(i2cx) REG32((i2cx) + 0x00000028U) /*!< I2C transmit data register */ -#define I2C_ADD_CTL2(i2cx) REG32((i2cx) + 0x00000090U) /*!< I2C control register 2 */ - -/* bits definitions */ -/* I2Cx_CTL0 */ -#define I2C_ADD_CTL0_I2CEN BIT(0) /*!< I2C peripheral enable */ -#define I2C_ADD_CTL0_TIE BIT(1) /*!< transmit interrupt enable */ -#define I2C_ADD_CTL0_RBNEIE BIT(2) /*!< receive interrupt enable */ -#define I2C_ADD_CTL0_ADDMIE BIT(3) /*!< address match interrupt enable in slave mode */ -#define I2C_ADD_CTL0_NACKIE BIT(4) /*!< not acknowledge received interrupt enable */ -#define I2C_ADD_CTL0_STPDETIE BIT(5) /*!< stop detection interrupt enable */ -#define I2C_ADD_CTL0_TCIE BIT(6) /*!< transfer complete interrupt enable */ -#define I2C_ADD_CTL0_ERRIE BIT(7) /*!< error interrupt enable */ -#define I2C_ADD_CTL0_DNF BITS(8,11) /*!< digital noise filter */ -#define I2C_ADD_CTL0_ANOFF BIT(12) /*!< analog noise filter */ -#define I2C_ADD_CTL0_DENT BIT(14) /*!< DMA enable for transmission */ -#define I2C_ADD_CTL0_DENR BIT(15) /*!< DMA enable for reception */ -#define I2C_ADD_CTL0_SBCTL BIT(16) /*!< slave byte control */ -#define I2C_ADD_CTL0_SS BIT(17) /*!< whether to stretch SCL low when data is not ready in slave mode */ -#define I2C_ADD_CTL0_WUEN BIT(18) /*!< wakeup from deep-sleep mode enable */ -#define I2C_ADD_CTL0_GCEN BIT(19) /*!< whether or not to response to a general call (0x00) */ -#define I2C_ADD_CTL0_SMBHAEN BIT(20) /*!< SMBus host address enable */ -#define I2C_ADD_CTL0_SMBDAEN BIT(21) /*!< SMBus device default address enable */ -#define I2C_ADD_CTL0_SMBALTEN BIT(22) /*!< SMBus alert enable */ -#define I2C_ADD_CTL0_PECEN BIT(23) /*!< PEC calculation switch */ - -/* I2Cx_CTL1 */ -#define I2C_ADD_CTL1_SADDRESS BITS(0,9) /*!< received slave address */ -#define I2C_ADD_CTL1_TRDIR BIT(10) /*!< transfer direction in master mode */ -#define I2C_ADD_CTL1_ADD10EN BIT(11) /*!< 10-bit addressing mode enable in master mode */ -#define I2C_ADD_CTL1_HEAD10R BIT(12) /*!< 10-bit address header executes read direction only in master receive mode */ -#define I2C_ADD_CTL1_START BIT(13) /*!< generate a START condition on I2C bus */ -#define I2C_ADD_CTL1_STOP BIT(14) /*!< generate a STOP condition on I2C bus */ -#define I2C_ADD_CTL1_NACKEN BIT(15) /*!< generate NACK in slave mode */ -#define I2C_ADD_CTL1_BYTENUM BITS(16,23) /*!< number of bytes to be transferred */ -#define I2C_ADD_CTL1_RELOAD BIT(24) /*!< reload mode enable */ -#define I2C_ADD_CTL1_AUTOEND BIT(25) /*!< automatic end mode in master mode */ -#define I2C_ADD_CTL1_PECTRANS BIT(26) /*!< PEC transfer */ - -/* I2Cx_SADDR0 */ -#define I2C_ADD_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ -#define I2C_ADD_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ -#define I2C_ADD_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ -#define I2C_ADD_SADDR0_ADDFORMAT BIT(10) /*!< address mode for the I2C slave */ -#define I2C_ADD_SADDR0_ADDRESSEN BIT(15) /*!< I2C address enable */ - -/* I2Cx_SADDR1 */ -#define I2C_ADD_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave */ -#define I2C_ADD_SADDR1_ADDMSK2 BITS(8,10) /*!< ADDRESS2[7:1] mask */ -#define I2C_ADD_SADDR1_ADDRESS2EN BIT(15) /*!< second I2C address enable */ - -/* I2Cx_TIMING */ -#define I2C_ADD_TIMING_SCLL BITS(0,7) /*!< SCL low period */ -#define I2C_ADD_TIMING_SCLH BITS(8,15) /*!< SCL high period */ -#define I2C_ADD_TIMING_SDADELY BITS(16,19) /*!< data hold time */ -#define I2C_ADD_TIMING_SCLDELY BITS(20,23) /*!< data setup time */ -#define I2C_ADD_TIMING_PSC BITS(28,31) /*!< timing prescaler */ - -/* I2Cx_TIMEOUT */ -#define I2C_ADD_TIMEOUT_BUSTOA BITS(0,11) /*!< bus timeout A */ -#define I2C_ADD_TIMEOUT_TOIDLE BIT(12) /*!< idle clock timeout detection */ -#define I2C_ADD_TIMEOUT_TOEN BIT(15) /*!< clock timeout detection enable */ -#define I2C_ADD_TIMEOUT_BUSTOB BITS(16,27) /*!< bus timeout B */ -#define I2C_ADD_TIMEOUT_EXTOEN BIT(31) /*!< extended clock timeout detection enable */ - -/* I2Cx_STAT */ -#define I2C_ADD_STAT_TBE BIT(0) /*!< I2C_ADD_TDATA is empty during transmitting */ -#define I2C_ADD_STAT_TI BIT(1) /*!< transmit interrupt */ -#define I2C_ADD_STAT_RBNE BIT(2) /*!< I2C_ADD_RDATA is not empty during receiving */ -#define I2C_ADD_STAT_ADDSEND BIT(3) /*!< address received matches in slave mode */ -#define I2C_ADD_STAT_NACK BIT(4) /*!< not acknowledge flag */ -#define I2C_ADD_STAT_STPDET BIT(5) /*!< STOP condition detected in slave mode */ -#define I2C_ADD_STAT_TC BIT(6) /*!< transfer complete in master mode */ -#define I2C_ADD_STAT_TCR BIT(7) /*!< transfer complete reload */ -#define I2C_ADD_STAT_BERR BIT(8) /*!< bus error */ -#define I2C_ADD_STAT_LOSTARB BIT(9) /*!< arbitration lost */ -#define I2C_ADD_STAT_OUERR BIT(10) /*!< overrun/underrun error in slave mode */ -#define I2C_ADD_STAT_PECERR BIT(11) /*!< PEC error */ -#define I2C_ADD_STAT_TIMEOUT BIT(12) /*!< timeout flag */ -#define I2C_ADD_STAT_SMBALT BIT(13) /*!< SMBus Alert */ -#define I2C_ADD_STAT_I2CBSY BIT(15) /*!< busy flag */ -#define I2C_ADD_STAT_TR BIT(16) /*!< whether the I2C is a transmitter or a receiver in slave mode */ -#define I2C_ADD_STAT_READDR BITS(17,23) /*!< received match address in slave mode */ - -/* I2Cx_STATC */ -#define I2C_ADD_STATC_ADDSENDC BIT(3) /*!< ADDSEND flag clear */ -#define I2C_ADD_STATC_NACKC BIT(4) /*!< not acknowledge flag clear */ -#define I2C_ADD_STATC_STPDETC BIT(5) /*!< STPDET flag clear */ -#define I2C_ADD_STATC_BERRC BIT(8) /*!< bus error flag clear */ -#define I2C_ADD_STATC_LOSTARBC BIT(9) /*!< arbitration Lost flag clear */ -#define I2C_ADD_STATC_OUERRC BIT(10) /*!< overrun/underrun flag clear */ -#define I2C_ADD_STATC_PECERRC BIT(11) /*!< PEC error flag clear */ -#define I2C_ADD_STATC_TIMEOUTC BIT(12) /*!< TIMEOUT flag clear */ -#define I2C_ADD_STATC_SMBALTC BIT(13) /*!< SMBus Alert flag clear */ - -/* I2Cx_PEC */ -#define I2C_ADD_PEC_PECV BITS(0,7) /*!< Packet Error Checking Value that calculated by hardware when PEC is enabled */ - -/* I2Cx_RDATA */ -#define I2C_ADD_RDATA_RDATA BITS(0,7) /*!< receive data value */ - -/* I2Cx_TDATA */ -#define I2C_ADD_TDATA_TDATA BITS(0,7) /*!< transmit data value */ - -/* I2Cx_CTL2 */ -#define I2C_ADD_CTL2_ADDM BITS(9,15) /*!< address bits compare select */ - -/* constants definitions */ -/* define the I2C bit position and its register index offset */ -#define I2C_ADD_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define I2C_ADD_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0x0000FFFFU) >> 6))) -#define I2C_ADD_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) -#define I2C_ADD_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ - | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) -#define I2C_ADD_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) -#define I2C_ADD_BIT_POS2(val) (((uint32_t)(val) & 0x001F0000U) >> 16) - -/* register offset */ -#define I2C_ADD_CTL0_REG_OFFSET ((uint32_t)0x00000000U) /*!< CTL0 register offset */ -#define I2C_ADD_STAT_REG_OFFSET ((uint32_t)0x00000018U) /*!< STAT register offset */ - -/* I2C interrupt flags */ -typedef enum { - I2C_ADD_INT_FLAG_TI = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 1U, I2C_ADD_STAT_REG_OFFSET, 1U), /*!< transmit interrupt flag */ - I2C_ADD_INT_FLAG_RBNE = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 2U, I2C_ADD_STAT_REG_OFFSET, 2U), /*!< I2C_ADD_RDATA is not empty during receiving interrupt flag */ - I2C_ADD_INT_FLAG_ADDSEND = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 3U, I2C_ADD_STAT_REG_OFFSET, 3U), /*!< address received matches in slave mode interrupt flag */ - I2C_ADD_INT_FLAG_NACK = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 4U, I2C_ADD_STAT_REG_OFFSET, 4U), /*!< not acknowledge interrupt flag */ - I2C_ADD_INT_FLAG_STPDET = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 5U, I2C_ADD_STAT_REG_OFFSET, 5U), /*!< stop condition detected in slave mode interrupt flag */ - I2C_ADD_INT_FLAG_TC = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 6U, I2C_ADD_STAT_REG_OFFSET, 6U), /*!< transfer complete in master mode interrupt flag */ - I2C_ADD_INT_FLAG_TCR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 6U, I2C_ADD_STAT_REG_OFFSET, 7U), /*!< transfer complete reload interrupt flag */ - I2C_ADD_INT_FLAG_BERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 8U), /*!< bus error interrupt flag */ - I2C_ADD_INT_FLAG_LOSTARB = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 9U), /*!< arbitration lost interrupt flag */ - I2C_ADD_INT_FLAG_OUERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 10U), /*!< overrun/underrun error in slave mode interrupt flag */ - I2C_ADD_INT_FLAG_PECERR = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 11U), /*!< PEC error interrupt flag */ - I2C_ADD_INT_FLAG_TIMEOUT = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 12U), /*!< timeout interrupt flag */ - I2C_ADD_INT_FLAG_SMBALT = I2C_ADD_REGIDX_BIT2(I2C_ADD_CTL0_REG_OFFSET, 7U, I2C_ADD_STAT_REG_OFFSET, 13U) /*!< SMBus Alert interrupt flag */ -} i2c_add_interrupt_flag_enum; - -/* I2C DMA constants definitions */ -#define I2C_ADD_DMA_TRANSMIT ((uint32_t)0x00000000U) /*!< I2C transmit data use DMA */ -#define I2C_ADD_DMA_RECEIVE ((uint32_t)0x00000001U) /*!< I2C receive data use DMA */ - -/* I2C interrupt enable or disable */ -#define I2C_ADD_INT_ERR I2C_ADD_CTL0_ERRIE /*!< error interrupt enable */ -#define I2C_ADD_INT_TC I2C_ADD_CTL0_TCIE /*!< transfer complete interrupt enable */ -#define I2C_ADD_INT_STPDET I2C_ADD_CTL0_STPDETIE /*!< stop detection interrupt enable */ -#define I2C_ADD_INT_NACK I2C_ADD_CTL0_NACKIE /*!< not acknowledge received interrupt enable */ -#define I2C_ADD_INT_ADDM I2C_ADD_CTL0_ADDMIE /*!< address match interrupt enable */ -#define I2C_ADD_INT_RBNE I2C_ADD_CTL0_RBNEIE /*!< receive interrupt enable */ -#define I2C_ADD_INT_TI I2C_ADD_CTL0_TIE /*!< transmit interrupt enable */ - -/* I2C transfer direction in master mode */ -#define I2C_ADD_MASTER_TRANSMIT ((uint32_t)0x00000000U) /*!< I2C master transmit */ -#define I2C_ADD_MASTER_RECEIVE I2C_ADD_CTL1_TRDIR /*!< I2C master receive */ - -/* address mode for the I2C slave */ -#define I2C_ADD_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address:7 bits */ -#define I2C_ADD_ADDFORMAT_10BITS I2C_ADD_SADDR0_ADDFORMAT /*!< address:10 bits */ - -/* the length of filter spikes */ -#define FILTER_DISABLE ((uint32_t)0x00000000U) /*!< digital filter is disabled */ -#define FILTER_LENGTH_1 ((uint32_t)0x00000001U) /*!< digital filter is enabled and filter spikes with a length of up to 1 tI2CCLK */ -#define FILTER_LENGTH_2 ((uint32_t)0x00000002U) /*!< digital filter is enabled and filter spikes with a length of up to 2 tI2CCLK */ -#define FILTER_LENGTH_3 ((uint32_t)0x00000003U) /*!< digital filter is enabled and filter spikes with a length of up to 3 tI2CCLK */ -#define FILTER_LENGTH_4 ((uint32_t)0x00000004U) /*!< digital filter is enabled and filter spikes with a length of up to 4 tI2CCLK */ -#define FILTER_LENGTH_5 ((uint32_t)0x00000005U) /*!< digital filter is enabled and filter spikes with a length of up to 5 tI2CCLK */ -#define FILTER_LENGTH_6 ((uint32_t)0x00000006U) /*!< digital filter is enabled and filter spikes with a length of up to 6 tI2CCLK */ -#define FILTER_LENGTH_7 ((uint32_t)0x00000007U) /*!< digital filter is enabled and filter spikes with a length of up to 7 tI2CCLK */ -#define FILTER_LENGTH_8 ((uint32_t)0x00000008U) /*!< digital filter is enabled and filter spikes with a length of up to 8 tI2CCLK */ -#define FILTER_LENGTH_9 ((uint32_t)0x00000009U) /*!< digital filter is enabled and filter spikes with a length of up to 9 tI2CCLK */ -#define FILTER_LENGTH_10 ((uint32_t)0x0000000AU) /*!< digital filter is enabled and filter spikes with a length of up to 10 tI2CCLK */ -#define FILTER_LENGTH_11 ((uint32_t)0x0000000BU) /*!< digital filter is enabled and filter spikes with a length of up to 11 tI2CCLK */ -#define FILTER_LENGTH_12 ((uint32_t)0x0000000CU) /*!< digital filter is enabled and filter spikes with a length of up to 12 tI2CCLK */ -#define FILTER_LENGTH_13 ((uint32_t)0x0000000DU) /*!< digital filter is enabled and filter spikes with a length of up to 13 tI2CCLK */ -#define FILTER_LENGTH_14 ((uint32_t)0x0000000EU) /*!< digital filter is enabled and filter spikes with a length of up to 14 tI2CCLK */ -#define FILTER_LENGTH_15 ((uint32_t)0x0000000FU) /*!< digital filter is enabled and filter spikes with a length of up to 15 tI2CCLK */ - -/* defines which bits of register ADDRESS[7:1] are compared with an incoming address byte */ -#define ADDRESS_BIT1_COMPARE ((uint32_t)0x00000200U) /*!< address bit1 needs compare */ -#define ADDRESS_BIT2_COMPARE ((uint32_t)0x00000400U) /*!< address bit2 needs compare */ -#define ADDRESS_BIT3_COMPARE ((uint32_t)0x00000800U) /*!< address bit3 needs compare */ -#define ADDRESS_BIT4_COMPARE ((uint32_t)0x00001000U) /*!< address bit4 needs compare */ -#define ADDRESS_BIT5_COMPARE ((uint32_t)0x00002000U) /*!< address bit5 needs compare */ -#define ADDRESS_BIT6_COMPARE ((uint32_t)0x00004000U) /*!< address bit6 needs compare */ -#define ADDRESS_BIT7_COMPARE ((uint32_t)0x00008000U) /*!< address bit7 needs compare */ - -/* defines which bits of ADDRESS2[7:1] are compared with an incoming address byte, and which bits are masked (don??t care) */ -#define ADDRESS2_NO_MASK ((uint32_t)0x00000000U) /*!< no mask, all the bits must be compared */ -#define ADDRESS2_MASK_BIT1 ((uint32_t)0x00000001U) /*!< ADDRESS2[1] is masked, only ADDRESS2[7:2] are compared */ -#define ADDRESS2_MASK_BIT1_2 ((uint32_t)0x00000002U) /*!< ADDRESS2[2:1] is masked, only ADDRESS2[7:3] are compared */ -#define ADDRESS2_MASK_BIT1_3 ((uint32_t)0x00000003U) /*!< ADDRESS2[3:1] is masked, only ADDRESS2[7:4] are compared */ -#define ADDRESS2_MASK_BIT1_4 ((uint32_t)0x00000004U) /*!< ADDRESS2[4:1] is masked, only ADDRESS2[7:5] are compared */ -#define ADDRESS2_MASK_BIT1_5 ((uint32_t)0x00000005U) /*!< ADDRESS2[5:1] is masked, only ADDRESS2[7:6] are compared */ -#define ADDRESS2_MASK_BIT1_6 ((uint32_t)0x00000006U) /*!< ADDRESS2[6:1] is masked, only ADDRESS2[7] are compared */ -#define ADDRESS2_MASK_ALL ((uint32_t)0x00000007U) /*!< all the ADDRESS2[7:1] bits are masked */ - -/* idle clock timeout detection */ -#define BUSTOA_DETECT_SCL_LOW ((uint32_t)0x00000000U) /*!< BUSTOA is used to detect SCL low timeout */ -#define BUSTOA_DETECT_IDLE I2C_ADD_TIMEOUT_TOIDLE /*!< BUSTOA is used to detect both SCL and SDA high timeout when the bus is idle */ - -/* I2C flag definitions */ -#define I2C_ADD_FLAG_TBE I2C_ADD_STAT_TBE /*!< I2C_ADD_TDATA is empty during transmitting */ -#define I2C_ADD_FLAG_TI I2C_ADD_STAT_TI /*!< transmit interrupt */ -#define I2C_ADD_FLAG_RBNE I2C_ADD_STAT_RBNE /*!< I2C_ADD_RDATA is not empty during receiving */ -#define I2C_ADD_FLAG_ADDSEND I2C_ADD_STAT_ADDSEND /*!< address received matches in slave mode */ -#define I2C_ADD_FLAG_NACK I2C_ADD_STAT_NACK /*!< not acknowledge flag */ -#define I2C_ADD_FLAG_STPDET I2C_ADD_STAT_STPDET /*!< STOP condition detected in slave mode */ -#define I2C_ADD_FLAG_TC I2C_ADD_STAT_TC /*!< transfer complete in master mode */ -#define I2C_ADD_FLAG_TCR I2C_ADD_STAT_TCR /*!< transfer complete reload */ -#define I2C_ADD_FLAG_BERR I2C_ADD_STAT_BERR /*!< bus error */ -#define I2C_ADD_FLAG_LOSTARB I2C_ADD_STAT_LOSTARB /*!< arbitration lost */ -#define I2C_ADD_FLAG_OUERR I2C_ADD_STAT_OUERR /*!< overrun/underrun error in slave mode */ -#define I2C_ADD_FLAG_PECERR I2C_ADD_STAT_PECERR /*!< PEC error */ -#define I2C_ADD_FLAG_TIMEOUT I2C_ADD_STAT_TIMEOUT /*!< timeout flag */ -#define I2C_ADD_FLAG_SMBALT I2C_ADD_STAT_SMBALT /*!< SMBus Alert */ -#define I2C_ADD_FLAG_I2CBSY I2C_ADD_STAT_I2CBSY /*!< busy flag */ -#define I2C_ADD_FLAG_TR I2C_ADD_STAT_TR /*!< whether the I2C is a transmitter or a receiver in slave mode */ - -/* function declarations */ -/* initialization functions */ -/* reset I2C */ -void i2c_add_deinit(uint32_t i2c_add_periph); -/* configure the timing parameters */ -void i2c_add_timing_config(uint32_t i2c_add_periph, uint32_t psc, uint32_t scl_dely, uint32_t sda_dely); -/* configure digital noise filter */ -void i2c_add_digital_noise_filter_config(uint32_t i2c_add_periph, uint32_t filter_length); -/* enable analog noise filter */ -void i2c_add_analog_noise_filter_enable(uint32_t i2c_add_periph); -/* disable analog noise filter */ -void i2c_add_analog_noise_filter_disable(uint32_t i2c_add_periph); -/* configure the SCL high and low period of clock in master mode */ -void i2c_add_master_clock_config(uint32_t i2c_add_periph, uint32_t sclh, uint32_t scll); -/* configure i2c slave address and transfer direction in master mode */ -void i2c_add_master_addressing(uint32_t i2c_add_periph, uint32_t address, uint32_t trans_direction); - -/* application function declarations */ -/* 10-bit address header executes read direction only in master receive mode */ -void i2c_add_address10_header_enable(uint32_t i2c_add_periph); -/* 10-bit address header executes complete sequence in master receive mode */ -void i2c_add_address10_header_disable(uint32_t i2c_add_periph); -/* enable 10-bit addressing mode in master mode */ -void i2c_add_address10_enable(uint32_t i2c_add_periph); -/* disable 10-bit addressing mode in master mode */ -void i2c_add_address10_disable(uint32_t i2c_add_periph); -/* enable I2C automatic end mode in master mode */ -void i2c_add_automatic_end_enable(uint32_t i2c_add_periph); -/* disable I2C automatic end mode in master mode */ -void i2c_add_automatic_end_disable(uint32_t i2c_add_periph); -/* enable the response to a general call */ -void i2c_add_slave_response_to_gcall_enable(uint32_t i2c_add_periph); -/* disable the response to a general call */ -void i2c_add_slave_response_to_gcall_disable(uint32_t i2c_add_periph); -/* enable to stretch SCL low when data is not ready in slave mode */ -void i2c_add_stretch_scl_low_enable(uint32_t i2c_add_periph); -/* disable to stretch SCL low when data is not ready in slave mode */ -void i2c_add_stretch_scl_low_disable(uint32_t i2c_add_periph); -/* configure i2c slave address */ -void i2c_add_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_format); -/* define which bits of ADDRESS[7:1] need to compare with the incoming address byte */ -void i2c_add_address_bit_compare_config(uint32_t i2c_add_periph, uint32_t compare_bits); -/* disable i2c address in slave mode */ -void i2c_add_address_disable(uint32_t i2c_add_periph); -/* configure i2c second slave address */ -void i2c_add_second_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_mask); -/* disable i2c second address in slave mode */ -void i2c_add_second_address_disable(uint32_t i2c_add_periph); -/* get received match address in slave mode */ -uint32_t i2c_add_recevied_address_get(uint32_t i2c_add_periph); -/* enable slave byte control */ -void i2c_add_slave_byte_control_enable(uint32_t i2c_add_periph); -/* disable slave byte control */ -void i2c_add_slave_byte_control_disable(uint32_t i2c_add_periph); -/* generate a NACK in slave mode */ -void i2c_add_nack_enable(uint32_t i2c_add_periph); -/* generate an ACK in slave mode */ -void i2c_add_nack_disable(uint32_t i2c_add_periph); -/* enable wakeup from deep-sleep mode */ -void i2c_add_wakeup_from_deepsleep_enable(uint32_t i2c_add_periph); -/* disable wakeup from deep-sleep mode */ -void i2c_add_wakeup_from_deepsleep_disable(uint32_t i2c_add_periph); -/* enable I2C */ -void i2c_add_enable(uint32_t i2c_add_periph); -/* disable I2C */ -void i2c_add_disable(uint32_t i2c_add_periph); -/* generate a START condition on I2C bus */ -void i2c_add_start_on_bus(uint32_t i2c_add_periph); -/* generate a STOP condition on I2C bus */ -void i2c_add_stop_on_bus(uint32_t i2c_add_periph); -/* I2C transmit data */ -void i2c_add_data_transmit(uint32_t i2c_add_periph, uint32_t data); -/* I2C receive data */ -uint32_t i2c_add_data_receive(uint32_t i2c_add_periph); -/* enable I2C reload mode */ -void i2c_add_reload_enable(uint32_t i2c_add_periph); -/* disable I2C reload mode */ -void i2c_add_reload_disable(uint32_t i2c_add_periph); -/* configure number of bytes to be transferred */ -void i2c_add_transfer_byte_number_config(uint32_t i2c_add_periph, uint32_t byte_number); -/* enable I2C DMA for transmission or reception */ -void i2c_add_dma_enable(uint32_t i2c_add_periph, uint8_t dma); -/* disable I2C DMA for transmission or reception */ -void i2c_add_dma_disable(uint32_t i2c_add_periph, uint8_t dma); -/* I2C transfers PEC value */ -void i2c_add_pec_transfer(uint32_t i2c_add_periph); -/* enable I2C PEC calculation */ -void i2c_add_pec_enable(uint32_t i2c_add_periph); -/* disable I2C PEC calculation */ -void i2c_add_pec_disable(uint32_t i2c_add_periph); -/* get packet error checking value */ -uint32_t i2c_add_pec_value_get(uint32_t i2c_add_periph); -/* enable SMBus alert */ -void i2c_add_smbus_alert_enable(uint32_t i2c_add_periph); -/* disable SMBus alert */ -void i2c_add_smbus_alert_disable(uint32_t i2c_add_periph); -/* enable SMBus device default address */ -void i2c_add_smbus_default_addr_enable(uint32_t i2c_add_periph); -/* disable SMBus device default address */ -void i2c_add_smbus_default_addr_disable(uint32_t i2c_add_periph); -/* enable SMBus host address */ -void i2c_add_smbus_host_addr_enable(uint32_t i2c_add_periph); -/* disable SMBus host address */ -void i2c_add_smbus_host_addr_disable(uint32_t i2c_add_periph); -/* enable extended clock timeout detection */ -void i2c_add_extented_clock_timeout_enable(uint32_t i2c_add_periph); -/* disable extended clock timeout detection */ -void i2c_add_extented_clock_timeout_disable(uint32_t i2c_add_periph); -/* enable clock timeout detection */ -void i2c_add_clock_timeout_enable(uint32_t i2c_add_periph); -/* disable clock timeout detection */ -void i2c_add_clock_timeout_disable(uint32_t i2c_add_periph); -/* configure bus timeout B */ -void i2c_add_bus_timeout_b_config(uint32_t i2c_add_periph, uint32_t timeout); -/* configure bus timeout A */ -void i2c_add_bus_timeout_a_config(uint32_t i2c_add_periph, uint32_t timeout); -/* configure idle clock timeout detection */ -void i2c_add_idle_clock_timeout_config(uint32_t i2c_add_periph, uint32_t timeout); - -/* interrupt & flag functions */ -/* get I2C flag status */ -FlagStatus i2c_add_flag_get(uint32_t i2c_add_periph, uint32_t flag); -/* clear I2C flag status */ -void i2c_add_flag_clear(uint32_t i2c_add_periph, uint32_t flag); -/* enable I2C interrupt */ -void i2c_add_interrupt_enable(uint32_t i2c_add_periph, uint32_t interrupt); -/* disable I2C interrupt */ -void i2c_add_interrupt_disable(uint32_t i2c_add_periph, uint32_t interrupt); -/* get I2C interrupt flag status */ -FlagStatus i2c_add_interrupt_flag_get(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag); -/* clear I2C interrupt flag status */ -void i2c_add_interrupt_flag_clear(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag); - -#endif /* GD32F5XX_I2C_ADD_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h deleted file mode 100644 index 0b0378a44bd..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_ipa.h +++ /dev/null @@ -1,378 +0,0 @@ -/*! - \file gd32f5xx_ipa.h - \brief definitions for the IPA - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_IPA_H -#define GD32F5XX_IPA_H - -#include "gd32f5xx.h" - -/* IPA definitions */ -#define IPA IPA_BASE /*!< IPA base address */ - -/* bits definitions */ -/* registers definitions */ -#define IPA_CTL REG32(IPA + 0x00000000U) /*!< IPA control register */ -#define IPA_INTF REG32(IPA + 0x00000004U) /*!< IPA interrupt flag register */ -#define IPA_INTC REG32(IPA + 0x00000008U) /*!< IPA interrupt flag clear register */ -#define IPA_FMADDR REG32(IPA + 0x0000000CU) /*!< IPA foreground memory base address register */ -#define IPA_FLOFF REG32(IPA + 0x00000010U) /*!< IPA foreground line offset register */ -#define IPA_BMADDR REG32(IPA + 0x00000014U) /*!< IPA background memory base address register */ -#define IPA_BLOFF REG32(IPA + 0x00000018U) /*!< IPA background line offset register */ -#define IPA_FPCTL REG32(IPA + 0x0000001CU) /*!< IPA foreground pixel control register */ -#define IPA_FPV REG32(IPA + 0x00000020U) /*!< IPA foreground pixel value register */ -#define IPA_BPCTL REG32(IPA + 0x00000024U) /*!< IPA background pixel control register */ -#define IPA_BPV REG32(IPA + 0x00000028U) /*!< IPA background pixel value register */ -#define IPA_FLMADDR REG32(IPA + 0x0000002CU) /*!< IPA foreground LUT memory base address register */ -#define IPA_BLMADDR REG32(IPA + 0x00000030U) /*!< IPA background LUT memory base address register */ -#define IPA_DPCTL REG32(IPA + 0x00000034U) /*!< IPA destination pixel control register */ -#define IPA_DPV REG32(IPA + 0x00000038U) /*!< IPA destination pixel value register */ -#define IPA_DMADDR REG32(IPA + 0x0000003CU) /*!< IPA destination memory base address register */ -#define IPA_DLOFF REG32(IPA + 0x00000040U) /*!< IPA destination line offset register */ -#define IPA_IMS REG32(IPA + 0x00000044U) /*!< IPA image size register */ -#define IPA_LM REG32(IPA + 0x00000048U) /*!< IPA line mark register */ -#define IPA_ITCTL REG32(IPA + 0x0000004CU) /*!< IPA inter-timer control register */ - -/* IPA_CTL */ -#define IPA_CTL_TEN BIT(0) /*!< transfer enable */ -#define IPA_CTL_THU BIT(1) /*!< transfer hang up */ -#define IPA_CTL_TST BIT(2) /*!< transfer stop */ -#define IPA_CTL_TAEIE BIT(8) /*!< enable bit for transfer access error interrupt */ -#define IPA_CTL_FTFIE BIT(9) /*!< enable bit for full transfer finish interrup */ -#define IPA_CTL_TLMIE BIT(10) /*!< enable bit for transfer line mark interrupt */ -#define IPA_CTL_LACIE BIT(11) /*!< enable bit for LUT access conflict interrupt */ -#define IPA_CTL_LLFIE BIT(12) /*!< enable bit for LUT loading finish interrupt */ -#define IPA_CTL_WCFIE BIT(13) /*!< enable bit for wrong configuration interrupt */ -#define IPA_CTL_PFCM BITS(16,17) /*!< pixel format convert mode */ - -/* IPA_INTF */ -#define IPA_INTF_TAEIF BIT(0) /*!< transfer access error interrupt flag */ -#define IPA_INTF_FTFIF BIT(1) /*!< full transfer finish interrupt flag */ -#define IPA_INTF_TLMIF BIT(2) /*!< transfer line mark interrupt flag */ -#define IPA_INTF_LACIF BIT(3) /*!< LUT access conflict interrupt flag */ -#define IPA_INTF_LLFIF BIT(4) /*!< LUT loading finish interrupt flag */ -#define IPA_INTF_WCFIF BIT(5) /*!< wrong configuration interrupt flag */ - -/* IPA_INTC */ -#define IPA_INTC_TAEIFC BIT(0) /*!< clear bit for transfer access error interrupt flag */ -#define IPA_INTC_FTFIFC BIT(1) /*!< clear bit for full transfer finish interrupt flag */ -#define IPA_INTC_TLMIFC BIT(2) /*!< clear bit for transfer line mark interrupt flag */ -#define IPA_INTC_LACIFC BIT(3) /*!< clear bit for LUT access conflict interrupt flag */ -#define IPA_INTC_LLFIFC BIT(4) /*!< clear bit for LUT loading finish interrupt flag */ -#define IPA_INTC_WCFIFC BIT(5) /*!< clear bit for wrong configuration interrupt flag */ - -/* IPA_FMADDR */ -#define IPA_FMADDR_FMADDR BITS(0,31) /*!< foreground memory base address */ - -/* IPA_FLOFF */ -#define IPA_FLOFF_FLOFF BITS(0,13) /*!< foreground line offset */ - -/* IPA_BMADDR */ -#define IPA_BMADDR_BMADDR BITS(0,31) /*!< background memory base address */ - -/* IPA_BLOFF */ -#define IPA_BLOFF_BLOFF BITS(0,13) /*!< background line offset */ - -/* IPA_FPCTL */ -#define IPA_FPCTL_FPF BITS(0,3) /*!< foreground pixel format */ -#define IPA_FPCTL_FLPF BIT(4) /*!< foreground LUT pixel format */ -#define IPA_FPCTL_FLLEN BIT(5) /*!< foreground LUT loading enable */ -#define IPA_FPCTL_FCNP BITS(8,15) /*!< foreground LUT number of pixel */ -#define IPA_FPCTL_FAVCA BITS(16,17) /*!< foreground alpha value calculation algorithm */ -#define IPA_FPCTL_FPDAV BITS(24,31) /*!< foreground pre- defined alpha value */ - -/* IPA_FPV */ -#define IPA_FPV_FPDBV BITS(0,7) /*!< foreground pre-defined red value */ -#define IPA_FPV_FPDGV BITS(8,15) /*!< foreground pre-defined green value */ -#define IPA_FPV_FPDRV BITS(16,23) /*!< foreground pre-defined red value */ - -/* IPA_BPCTL */ -#define IPA_BPCTL_BPF BITS(0,3) /*!< background pixel format */ -#define IPA_BPCTL_BLPF BIT(4) /*!< background LUT pixel format */ -#define IPA_BPCTL_BLLEN BIT(5) /*!< background LUT loading enable */ -#define IPA_BPCTL_BCNP BITS(8,15) /*!< background LUT number of pixel */ -#define IPA_BPCTL_BAVCA BITS(16,17) /*!< background alpha value calculation algorithm */ -#define IPA_BPCTL_BPDAV BITS(24,31) /*!< background pre- defined alpha value */ - -/* IPA_BPV */ -#define IPA_BPV_BPDBV BITS(0,7) /*!< background pre-defined blue value */ -#define IPA_BPV_BPDGV BITS(8,15) /*!< background pre-defined green value */ -#define IPA_BPV_BPDRV BITS(16,23) /*!< background pre-defined red value */ - -/* IPA_FLMADDR */ -#define IPA_FLMADDR_FLMADDR BITS(0,31) /*!< foreground LUT memory base address */ - -/* IPA_BLMADDR */ -#define IPA_BLMADDR_BLMADDR BITS(0,31) /*!< background LUT memory base address */ - -/* IPA_DPCTL */ -#define IPA_DPCTL_DPF BITS(0,2) /*!< destination pixel control register */ - -/* IPA_DPV */ -/* destination pixel format ARGB8888 */ -#define IPA_DPV_DPDBV_0 BITS(0,7) /*!< destination pre-defined blue value */ -#define IPA_DPV_DPDGV_0 BITS(8,15) /*!< destination pre-defined green value */ -#define IPA_DPV_DPDRV_0 BITS(16,23) /*!< destination pre-defined red value */ -#define IPA_DPV_DPDAV_0 BITS(24,31) /*!< destination pre-defined alpha value */ - -/* destination pixel format RGB8888 */ -#define IPA_DPV_DPDBV_1 BITS(0,7) /*!< destination pre-defined blue value */ -#define IPA_DPV_DPDGV_1 BITS(8,15) /*!< destination pre-defined green value */ -#define IPA_DPV_DPDRV_1 BITS(16,23) /*!< destination pre-defined red value */ - -/* destination pixel format RGB565 */ -#define IPA_DPV_DPDBV_2 BITS(0,4) /*!< destination pre-defined blue value */ -#define IPA_DPV_DPDGV_2 BITS(5,10) /*!< destination pre-defined green value */ -#define IPA_DPV_DPDRV_2 BITS(11,15) /*!< destination pre-defined red value */ - -/* destination pixel format ARGB1555 */ -#define IPA_DPV_DPDBV_3 BITS(0,4) /*!< destination pre-defined blue value */ -#define IPA_DPV_DPDGV_3 BITS(5,9) /*!< destination pre-defined green value */ -#define IPA_DPV_DPDRV_3 BITS(10,14) /*!< destination pre-defined red value */ -#define IPA_DPV_DPDAV_3 BIT(15) /*!< destination pre-defined alpha value */ - -/* destination pixel format ARGB4444 */ -#define IPA_DPV_DPDBV_4 BITS(0,3) /*!< destination pre-defined blue value */ -#define IPA_DPV_DPDGV_4 BITS(4,7) /*!< destination pre-defined green value */ -#define IPA_DPV_DPDRV_4 BITS(8,11) /*!< destination pre-defined red value */ -#define IPA_DPV_DPDAV_4 BITS(12,15) /*!< destination pre-defined alpha value */ - -/* IPA_DMADDR */ -#define IPA_DMADDR_DMADDR BITS(0,31) /*!< destination memory base address */ - -/* IPA_DLOFF */ -#define IPA_DLOFF_DLOFF BITS(0,13) /*!< destination line offset */ - -/* IPA_IMS */ -#define IPA_IMS_HEIGHT BITS(0,15) /*!< height of the image to be processed */ -#define IPA_IMS_WIDTH BITS(16,29) /*!< width of the image to be processed */ - -/* IPA_LM */ -#define IPA_LM_LM BITS(0,15) /*!< line mark */ - -/* IPA_ITCTL */ -#define IPA_ITCTL_ITEN BIT(0) /*!< inter-timer enable */ -#define IPA_ITCTL_NCCI BITS(8,15) /*!< number of clock cycles interval */ - - -/* constants definitions */ -/* IPA foreground parameter struct definitions */ -typedef struct { - uint32_t foreground_memaddr; /*!< foreground memory base address */ - uint32_t foreground_lineoff; /*!< foreground line offset */ - uint32_t foreground_prealpha; /*!< foreground pre-defined alpha value */ - uint32_t foreground_alpha_algorithm; /*!< foreground alpha value calculation algorithm */ - uint32_t foreground_pf; /*!< foreground pixel format */ - uint32_t foreground_prered; /*!< foreground pre-defined red value */ - uint32_t foreground_pregreen; /*!< foreground pre-defined green value */ - uint32_t foreground_preblue; /*!< foreground pre-defined blue value */ -} ipa_foreground_parameter_struct; - -/* IPA background parameter struct definitions */ -typedef struct { - uint32_t background_memaddr; /*!< background memory base address */ - uint32_t background_lineoff; /*!< background line offset */ - uint32_t background_prealpha; /*!< background pre-defined alpha value */ - uint32_t background_alpha_algorithm; /*!< background alpha value calculation algorithm */ - uint32_t background_pf; /*!< background pixel format */ - uint32_t background_prered; /*!< background pre-defined red value */ - uint32_t background_pregreen; /*!< background pre-defined green value */ - uint32_t background_preblue; /*!< background pre-defined blue value */ -} ipa_background_parameter_struct; - -/* IPA destination parameter struct definitions */ -typedef struct { - uint32_t destination_memaddr; /*!< destination memory base address */ - uint32_t destination_lineoff; /*!< destination line offset */ - uint32_t destination_prealpha; /*!< destination pre-defined alpha value */ - uint32_t destination_pf; /*!< destination pixel format */ - uint32_t destination_prered; /*!< destination pre-defined red value */ - uint32_t destination_pregreen; /*!< destination pre-defined green value */ - uint32_t destination_preblue; /*!< destination pre-defined blue value */ - uint32_t image_width; /*!< width of the image to be processed */ - uint32_t image_height; /*!< height of the image to be processed */ -} ipa_destination_parameter_struct; - -/* destination pixel format */ -typedef enum { - IPA_DPF_ARGB8888, /*!< destination pixel format ARGB8888 */ - IPA_DPF_RGB888, /*!< destination pixel format RGB888 */ - IPA_DPF_RGB565, /*!< destination pixel format RGB565 */ - IPA_DPF_ARGB1555, /*!< destination pixel format ARGB1555 */ - IPA_DPF_ARGB4444 /*!< destination pixel format ARGB4444 */ -} ipa_dpf_enum; - -/* LUT pixel format */ -#define IPA_LUT_PF_ARGB8888 ((uint8_t)0x00U) /*!< LUT pixel format ARGB8888 */ -#define IPA_LUT_PF_RGB888 ((uint8_t)0x01U) /*!< LUT pixel format RGB888 */ - -/* Inter-timer */ -#define IPA_INTER_TIMER_DISABLE ((uint8_t)0x00U) /*!< inter-timer disable */ -#define IPA_INTER_TIMER_ENABLE ((uint8_t)0x01U) /*!< inter-timer enable */ - -/* IPA pixel format convert mode */ -#define CTL_PFCM(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define IPA_FGTODE CTL_PFCM(0) /*!< foreground memory to destination memory without pixel format convert */ -#define IPA_FGTODE_PF_CONVERT CTL_PFCM(1) /*!< foreground memory to destination memory with pixel format convert */ -#define IPA_FGBGTODE CTL_PFCM(2) /*!< blending foreground and background memory to destination memory */ -#define IPA_FILL_UP_DE CTL_PFCM(3) /*!< fill up destination memory with specific color */ - -/* foreground alpha value calculation algorithm */ -#define FPCTL_FAVCA(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define IPA_FG_ALPHA_MODE_0 FPCTL_FAVCA(0) /*!< no effect */ -#define IPA_FG_ALPHA_MODE_1 FPCTL_FAVCA(1) /*!< FPDAV[7:0] is selected as the foreground alpha value */ -#define IPA_FG_ALPHA_MODE_2 FPCTL_FAVCA(2) /*!< FPDAV[7:0] multiplied by read alpha value */ - -/* background alpha value calculation algorithm */ -#define BPCTL_BAVCA(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define IPA_BG_ALPHA_MODE_0 BPCTL_BAVCA(0) /*!< no effect */ -#define IPA_BG_ALPHA_MODE_1 BPCTL_BAVCA(1) /*!< BPDAV[7:0] is selected as the background alpha value */ -#define IPA_BG_ALPHA_MODE_2 BPCTL_BAVCA(2) /*!< BPDAV[7:0] multiplied by read alpha value */ - -/* foreground pixel format */ -#define FPCTL_PPF(regval) (BITS(0,3) & ((uint32_t)(regval))) -#define FOREGROUND_PPF_ARGB8888 FPCTL_PPF(0) /*!< foreground pixel format ARGB8888 */ -#define FOREGROUND_PPF_RGB888 FPCTL_PPF(1) /*!< foreground pixel format RGB888 */ -#define FOREGROUND_PPF_RGB565 FPCTL_PPF(2) /*!< foreground pixel format RGB565 */ -#define FOREGROUND_PPF_ARG1555 FPCTL_PPF(3) /*!< foreground pixel format ARGB1555 */ -#define FOREGROUND_PPF_ARGB4444 FPCTL_PPF(4) /*!< foreground pixel format ARGB4444 */ -#define FOREGROUND_PPF_L8 FPCTL_PPF(5) /*!< foreground pixel format L8 */ -#define FOREGROUND_PPF_AL44 FPCTL_PPF(6) /*!< foreground pixel format AL44 */ -#define FOREGROUND_PPF_AL88 FPCTL_PPF(7) /*!< foreground pixel format AL88 */ -#define FOREGROUND_PPF_L4 FPCTL_PPF(8) /*!< foreground pixel format L4 */ -#define FOREGROUND_PPF_A8 FPCTL_PPF(9) /*!< foreground pixel format A8 */ -#define FOREGROUND_PPF_A4 FPCTL_PPF(10) /*!< foreground pixel format A4 */ - -/* background pixel format */ -#define BPCTL_PPF(regval) (BITS(0,3) & ((uint32_t)(regval))) -#define BACKGROUND_PPF_ARGB8888 BPCTL_PPF(0) /*!< background pixel format ARGB8888 */ -#define BACKGROUND_PPF_RGB888 BPCTL_PPF(1) /*!< background pixel format RGB888 */ -#define BACKGROUND_PPF_RGB565 BPCTL_PPF(2) /*!< background pixel format RGB565 */ -#define BACKGROUND_PPF_ARG1555 BPCTL_PPF(3) /*!< background pixel format ARGB1555 */ -#define BACKGROUND_PPF_ARGB4444 BPCTL_PPF(4) /*!< background pixel format ARGB4444 */ -#define BACKGROUND_PPF_L8 BPCTL_PPF(5) /*!< background pixel format L8 */ -#define BACKGROUND_PPF_AL44 BPCTL_PPF(6) /*!< background pixel format AL44 */ -#define BACKGROUND_PPF_AL88 BPCTL_PPF(7) /*!< background pixel format AL88 */ -#define BACKGROUND_PPF_L4 BPCTL_PPF(8) /*!< background pixel format L4 */ -#define BACKGROUND_PPF_A8 BPCTL_PPF(9) /*!< background pixel format A8 */ -#define BACKGROUND_PPF_A4 BPCTL_PPF(10) /*!< background pixel format A4 */ - -/* IPA flags */ -#define IPA_FLAG_TAE IPA_INTF_TAEIF /*!< transfer access error interrupt flag */ -#define IPA_FLAG_FTF IPA_INTF_FTFIF /*!< full transfer finish interrupt flag */ -#define IPA_FLAG_TLM IPA_INTF_TLMIF /*!< transfer line mark interrupt flag */ -#define IPA_FLAG_LAC IPA_INTF_LACIF /*!< LUT access conflict interrupt flag */ -#define IPA_FLAG_LLF IPA_INTF_LLFIF /*!< LUT loading finish interrupt flag */ -#define IPA_FLAG_WCF IPA_INTF_WCFIF /*!< wrong configuration interrupt flag */ - -/* IPA interrupt enable or disable */ -#define IPA_INT_TAE IPA_CTL_TAEIE /*!< transfer access error interrupt */ -#define IPA_INT_FTF IPA_CTL_FTFIE /*!< full transfer finish interrupt */ -#define IPA_INT_TLM IPA_CTL_TLMIE /*!< transfer line mark interrupt */ -#define IPA_INT_LAC IPA_CTL_LACIE /*!< LUT access conflict interrupt */ -#define IPA_INT_LLF IPA_CTL_LLFIE /*!< LUT loading finish interrupt */ -#define IPA_INT_WCF IPA_CTL_WCFIE /*!< wrong configuration interrupt */ - -/* IPA interrupt flags */ -#define IPA_INT_FLAG_TAE IPA_INTF_TAEIF /*!< transfer access error interrupt flag */ -#define IPA_INT_FLAG_FTF IPA_INTF_FTFIF /*!< full transfer finish interrupt flag */ -#define IPA_INT_FLAG_TLM IPA_INTF_TLMIF /*!< transfer line mark interrupt flag */ -#define IPA_INT_FLAG_LAC IPA_INTF_LACIF /*!< LUT access conflict interrupt flag */ -#define IPA_INT_FLAG_LLF IPA_INTF_LLFIF /*!< LUT loading finish interrupt flag */ -#define IPA_INT_FLAG_WCF IPA_INTF_WCFIF /*!< wrong configuration interrupt flag */ - -/* function declarations */ -/* functions enable or disable, pixel format convert mode set */ -/* deinitialize IPA */ -void ipa_deinit(void); -/* enable IPA transfer */ -void ipa_transfer_enable(void); -/* enable IPA transfer hang up */ -void ipa_transfer_hangup_enable(void); -/* disable IPA transfer hang up */ -void ipa_transfer_hangup_disable(void); -/* enable IPA transfer stop */ -void ipa_transfer_stop_enable(void); -/* disable IPA transfer stop */ -void ipa_transfer_stop_disable(void); -/* enable IPA foreground LUT loading */ -void ipa_foreground_lut_loading_enable(void); -/* enable IPA background LUT loading */ -void ipa_background_lut_loading_enable(void); -/* set pixel format convert mode, the function is invalid when the IPA transfer is enabled */ -void ipa_pixel_format_convert_mode_set(uint32_t pfcm); - -/* structure initialization, foreground, background, destination and LUT initialization */ -/* initialize the structure of IPA foreground parameter struct with the default values, it is - suggested that call this function after an ipa_foreground_parameter_struct structure is defined */ -void ipa_foreground_struct_para_init(ipa_foreground_parameter_struct *foreground_struct); -/* initialize foreground parameters */ -void ipa_foreground_init(ipa_foreground_parameter_struct *foreground_struct); -/* initialize the structure of IPA background parameter struct with the default values, it is - suggested that call this function after an ipa_background_parameter_struct structure is defined */ -void ipa_background_struct_para_init(ipa_background_parameter_struct *background_struct); -/* initialize background parameters */ -void ipa_background_init(ipa_background_parameter_struct *background_struct); -/* initialize the structure of IPA destination parameter struct with the default values, it is - suggested that call this function after an ipa_destination_parameter_struct structure is defined */ -void ipa_destination_struct_para_init(ipa_destination_parameter_struct *destination_struct); -/* initialize destination parameters */ -void ipa_destination_init(ipa_destination_parameter_struct *destination_struct); -/* initialize IPA foreground LUT parameters */ -void ipa_foreground_lut_init(uint8_t fg_lut_num, uint8_t fg_lut_pf, uint32_t fg_lut_addr); -/* initialize IPA background LUT parameters */ -void ipa_background_lut_init(uint8_t bg_lut_num, uint8_t bg_lut_pf, uint32_t bg_lut_addr); - -/* configuration functions */ -/* configure IPA line mark */ -void ipa_line_mark_config(uint16_t line_num); -/* inter-timer enable or disable */ -void ipa_inter_timer_config(uint8_t timer_cfg); -/* configure the number of clock cycles interval */ -void ipa_interval_clock_num_config(uint8_t clk_num); - -/* flag and interrupt functions */ -/* get IPA flag status in IPA_INTF register */ -FlagStatus ipa_flag_get(uint32_t flag); -/* clear IPA flag in IPA_INTF register */ -void ipa_flag_clear(uint32_t flag); -/* enable IPA interrupt */ -void ipa_interrupt_enable(uint32_t int_flag); -/* disable IPA interrupt */ -void ipa_interrupt_disable(uint32_t int_flag); -/* get IPA interrupt flag */ -FlagStatus ipa_interrupt_flag_get(uint32_t int_flag); -/* clear IPA interrupt flag */ -void ipa_interrupt_flag_clear(uint32_t int_flag); - -#endif /* GD32F5XX_IPA_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h deleted file mode 100644 index 43ae47d0ce3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_iref.h +++ /dev/null @@ -1,184 +0,0 @@ -/*! - \file gd32f5xx_iref.h - \brief definitions for the IREF - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_IREF_H -#define GD32F5XX_IREF_H - -#include "gd32f5xx.h" - -/* IREF definitions */ -#define IREF IREF_BASE /*!< IREF base address */ - -/* registers definitions */ -#define IREF_CTL REG32(IREF + 0x300U) /*!< IREF control register */ - -/* bits definitions */ -/* IREF_CTL */ -#define IREF_CTL_CSDT BITS(0,5) /*!< current step data */ -#define IREF_CTL_SCMOD BIT(7) /*!< sink current mode */ -#define IREF_CTL_CPT BITS(8,12) /*!< current precision trim */ -#define IREF_CTL_SSEL BIT(14) /*!< step selection */ -#define IREF_CTL_CREN BIT(15) /*!< current reference enable */ - -/* constants definitions */ -/* IREF current precision trim */ -#define CTL_CPT(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) -#define IREF_CUR_PRECISION_TRIM_0 CTL_CPT(0) /*!< IREF current precision trim 0 */ -#define IREF_CUR_PRECISION_TRIM_1 CTL_CPT(1) /*!< IREF current precision trim 1 */ -#define IREF_CUR_PRECISION_TRIM_2 CTL_CPT(2) /*!< IREF current precision trim 2 */ -#define IREF_CUR_PRECISION_TRIM_3 CTL_CPT(3) /*!< IREF current precision trim 3 */ -#define IREF_CUR_PRECISION_TRIM_4 CTL_CPT(4) /*!< IREF current precision trim 4 */ -#define IREF_CUR_PRECISION_TRIM_5 CTL_CPT(5) /*!< IREF current precision trim 5 */ -#define IREF_CUR_PRECISION_TRIM_6 CTL_CPT(6) /*!< IREF current precision trim 6 */ -#define IREF_CUR_PRECISION_TRIM_7 CTL_CPT(7) /*!< IREF current precision trim 7 */ -#define IREF_CUR_PRECISION_TRIM_8 CTL_CPT(8) /*!< IREF current precision trim 8 */ -#define IREF_CUR_PRECISION_TRIM_9 CTL_CPT(9) /*!< IREF current precision trim 9 */ -#define IREF_CUR_PRECISION_TRIM_10 CTL_CPT(10) /*!< IREF current precision trim 10 */ -#define IREF_CUR_PRECISION_TRIM_11 CTL_CPT(11) /*!< IREF current precision trim 11 */ -#define IREF_CUR_PRECISION_TRIM_12 CTL_CPT(12) /*!< IREF current precision trim 12 */ -#define IREF_CUR_PRECISION_TRIM_13 CTL_CPT(13) /*!< IREF current precision trim 13 */ -#define IREF_CUR_PRECISION_TRIM_14 CTL_CPT(14) /*!< IREF current precision trim 14 */ -#define IREF_CUR_PRECISION_TRIM_15 CTL_CPT(15) /*!< IREF current precision trim 15 */ -#define IREF_CUR_PRECISION_TRIM_16 CTL_CPT(16) /*!< IREF current precision trim 16 */ -#define IREF_CUR_PRECISION_TRIM_17 CTL_CPT(17) /*!< IREF current precision trim 17 */ -#define IREF_CUR_PRECISION_TRIM_18 CTL_CPT(18) /*!< IREF current precision trim 18 */ -#define IREF_CUR_PRECISION_TRIM_19 CTL_CPT(19) /*!< IREF current precision trim 19 */ -#define IREF_CUR_PRECISION_TRIM_20 CTL_CPT(20) /*!< IREF current precision trim 20 */ -#define IREF_CUR_PRECISION_TRIM_21 CTL_CPT(21) /*!< IREF current precision trim 21 */ -#define IREF_CUR_PRECISION_TRIM_22 CTL_CPT(22) /*!< IREF current precision trim 22 */ -#define IREF_CUR_PRECISION_TRIM_23 CTL_CPT(23) /*!< IREF current precision trim 23 */ -#define IREF_CUR_PRECISION_TRIM_24 CTL_CPT(24) /*!< IREF current precision trim 24 */ -#define IREF_CUR_PRECISION_TRIM_25 CTL_CPT(25) /*!< IREF current precision trim 25 */ -#define IREF_CUR_PRECISION_TRIM_26 CTL_CPT(26) /*!< IREF current precision trim 26 */ -#define IREF_CUR_PRECISION_TRIM_27 CTL_CPT(27) /*!< IREF current precision trim 27 */ -#define IREF_CUR_PRECISION_TRIM_28 CTL_CPT(28) /*!< IREF current precision trim 28 */ -#define IREF_CUR_PRECISION_TRIM_29 CTL_CPT(29) /*!< IREF current precision trim 29 */ -#define IREF_CUR_PRECISION_TRIM_30 CTL_CPT(30) /*!< IREF current precision trim 30 */ -#define IREF_CUR_PRECISION_TRIM_31 CTL_CPT(31) /*!< IREF current precision trim 31 */ - -/* IREF current step */ -#define CTL_CSDT(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) -#define IREF_CUR_STEP_DATA_0 CTL_CSDT(0) /*!< IREF current step data 0 */ -#define IREF_CUR_STEP_DATA_1 CTL_CSDT(1) /*!< IREF current step data 1 */ -#define IREF_CUR_STEP_DATA_2 CTL_CSDT(2) /*!< IREF current step data 2 */ -#define IREF_CUR_STEP_DATA_3 CTL_CSDT(3) /*!< IREF current step data 3 */ -#define IREF_CUR_STEP_DATA_4 CTL_CSDT(4) /*!< IREF current step data 4 */ -#define IREF_CUR_STEP_DATA_5 CTL_CSDT(5) /*!< IREF current step data 5 */ -#define IREF_CUR_STEP_DATA_6 CTL_CSDT(6) /*!< IREF current step data 6 */ -#define IREF_CUR_STEP_DATA_7 CTL_CSDT(7) /*!< IREF current step data 7 */ -#define IREF_CUR_STEP_DATA_8 CTL_CSDT(8) /*!< IREF current step data 8 */ -#define IREF_CUR_STEP_DATA_9 CTL_CSDT(9) /*!< IREF current step data 9 */ -#define IREF_CUR_STEP_DATA_10 CTL_CSDT(10) /*!< IREF current step data 10 */ -#define IREF_CUR_STEP_DATA_11 CTL_CSDT(11) /*!< IREF current step data 11 */ -#define IREF_CUR_STEP_DATA_12 CTL_CSDT(12) /*!< IREF current step data 12 */ -#define IREF_CUR_STEP_DATA_13 CTL_CSDT(13) /*!< IREF current step data 13 */ -#define IREF_CUR_STEP_DATA_14 CTL_CSDT(14) /*!< IREF current step data 14 */ -#define IREF_CUR_STEP_DATA_15 CTL_CSDT(15) /*!< IREF current step data 15 */ -#define IREF_CUR_STEP_DATA_16 CTL_CSDT(16) /*!< IREF current step data 16 */ -#define IREF_CUR_STEP_DATA_17 CTL_CSDT(17) /*!< IREF current step data 17 */ -#define IREF_CUR_STEP_DATA_18 CTL_CSDT(18) /*!< IREF current step data 18 */ -#define IREF_CUR_STEP_DATA_19 CTL_CSDT(19) /*!< IREF current step data 19 */ -#define IREF_CUR_STEP_DATA_20 CTL_CSDT(20) /*!< IREF current step data 20 */ -#define IREF_CUR_STEP_DATA_21 CTL_CSDT(21) /*!< IREF current step data 21 */ -#define IREF_CUR_STEP_DATA_22 CTL_CSDT(22) /*!< IREF current step data 22 */ -#define IREF_CUR_STEP_DATA_23 CTL_CSDT(23) /*!< IREF current step data 23 */ -#define IREF_CUR_STEP_DATA_24 CTL_CSDT(24) /*!< IREF current step data 24 */ -#define IREF_CUR_STEP_DATA_25 CTL_CSDT(25) /*!< IREF current step data 25 */ -#define IREF_CUR_STEP_DATA_26 CTL_CSDT(26) /*!< IREF current step data 26 */ -#define IREF_CUR_STEP_DATA_27 CTL_CSDT(27) /*!< IREF current step data 27 */ -#define IREF_CUR_STEP_DATA_28 CTL_CSDT(28) /*!< IREF current step data 28 */ -#define IREF_CUR_STEP_DATA_29 CTL_CSDT(29) /*!< IREF current step data 29 */ -#define IREF_CUR_STEP_DATA_30 CTL_CSDT(30) /*!< IREF current step data 30 */ -#define IREF_CUR_STEP_DATA_31 CTL_CSDT(31) /*!< IREF current step data 31 */ -#define IREF_CUR_STEP_DATA_32 CTL_CSDT(32) /*!< IREF current step data 32 */ -#define IREF_CUR_STEP_DATA_33 CTL_CSDT(33) /*!< IREF current step data 33 */ -#define IREF_CUR_STEP_DATA_34 CTL_CSDT(34) /*!< IREF current step data 34 */ -#define IREF_CUR_STEP_DATA_35 CTL_CSDT(35) /*!< IREF current step data 35 */ -#define IREF_CUR_STEP_DATA_36 CTL_CSDT(36) /*!< IREF current step data 36 */ -#define IREF_CUR_STEP_DATA_37 CTL_CSDT(37) /*!< IREF current step data 37 */ -#define IREF_CUR_STEP_DATA_38 CTL_CSDT(38) /*!< IREF current step data 38 */ -#define IREF_CUR_STEP_DATA_39 CTL_CSDT(39) /*!< IREF current step data 39 */ -#define IREF_CUR_STEP_DATA_40 CTL_CSDT(40) /*!< IREF current step data 40 */ -#define IREF_CUR_STEP_DATA_41 CTL_CSDT(41) /*!< IREF current step data 41 */ -#define IREF_CUR_STEP_DATA_42 CTL_CSDT(42) /*!< IREF current step data 42 */ -#define IREF_CUR_STEP_DATA_43 CTL_CSDT(43) /*!< IREF current step data 43 */ -#define IREF_CUR_STEP_DATA_44 CTL_CSDT(44) /*!< IREF current step data 44 */ -#define IREF_CUR_STEP_DATA_45 CTL_CSDT(45) /*!< IREF current step data 45 */ -#define IREF_CUR_STEP_DATA_46 CTL_CSDT(46) /*!< IREF current step data 46 */ -#define IREF_CUR_STEP_DATA_47 CTL_CSDT(47) /*!< IREF current step data 47 */ -#define IREF_CUR_STEP_DATA_48 CTL_CSDT(48) /*!< IREF current step data 48 */ -#define IREF_CUR_STEP_DATA_49 CTL_CSDT(49) /*!< IREF current step data 49 */ -#define IREF_CUR_STEP_DATA_50 CTL_CSDT(50) /*!< IREF current step data 50 */ -#define IREF_CUR_STEP_DATA_51 CTL_CSDT(51) /*!< IREF current step data 51 */ -#define IREF_CUR_STEP_DATA_52 CTL_CSDT(52) /*!< IREF current step data 52 */ -#define IREF_CUR_STEP_DATA_53 CTL_CSDT(53) /*!< IREF current step data 53 */ -#define IREF_CUR_STEP_DATA_54 CTL_CSDT(54) /*!< IREF current step data 54 */ -#define IREF_CUR_STEP_DATA_55 CTL_CSDT(55) /*!< IREF current step data 54 */ -#define IREF_CUR_STEP_DATA_56 CTL_CSDT(56) /*!< IREF current step data 54 */ -#define IREF_CUR_STEP_DATA_57 CTL_CSDT(57) /*!< IREF current step data 57 */ -#define IREF_CUR_STEP_DATA_58 CTL_CSDT(58) /*!< IREF current step data 58 */ -#define IREF_CUR_STEP_DATA_59 CTL_CSDT(59) /*!< IREF current step data 59 */ -#define IREF_CUR_STEP_DATA_60 CTL_CSDT(60) /*!< IREF current step data 60 */ -#define IREF_CUR_STEP_DATA_61 CTL_CSDT(61) /*!< IREF current step data 61 */ -#define IREF_CUR_STEP_DATA_62 CTL_CSDT(62) /*!< IREF current step data 62 */ -#define IREF_CUR_STEP_DATA_63 CTL_CSDT(63) /*!< IREF current step data 63 */ - -/* IREF mode selection */ -#define IREF_STEP(regval) (BIT(14) & ((uint32_t)(regval) << 14)) -#define IREF_MODE_LOW_POWER IREF_STEP(0) /*!< low power, 1uA step */ -#define IREF_MODE_HIGH_CURRENT IREF_STEP(1) /*!< high current, 8uA step */ - -/* IREF sink current mode*/ -#define IREF_CURRENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) -#define IREF_SOURCE_CURRENT IREF_CURRENT(0) /*!< IREF source current */ -#define IREF_SINK_CURRENT IREF_CURRENT(1) /*!< IREF sink current */ - -/* function declarations */ -/* deinitialize IREF */ -void iref_deinit(void); -/* enable IREF */ -void iref_enable(void); -/* disable IREF */ -void iref_disable(void); - -/* set IREF mode*/ -void iref_mode_set(uint32_t step); -/* set IREF current precision trim value */ -void iref_precision_trim_value_set(uint32_t precisiontrim); -/* set IREF sink current mode*/ -void iref_sink_set(uint32_t sinkmode); -/* set IREF step data*/ -void iref_step_data_config(uint32_t stepdata); - -#endif /* GD32F5XX_IREF_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h deleted file mode 100644 index 6acf43d21e4..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_misc.h +++ /dev/null @@ -1,93 +0,0 @@ -/*! - \file gd32f5xx_misc.h - \brief definitions for the MISC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_MISC_H -#define GD32F5XX_MISC_H - -#include "gd32f5xx.h" - -/* constants definitions */ -/* set the RAM and FLASH base address */ -#define NVIC_VECTTAB_RAM ((uint32_t)0x20000000) /*!< RAM base address */ -#define NVIC_VECTTAB_FLASH ((uint32_t)0x08000000) /*!< Flash base address */ - -/* set the NVIC vector table offset mask */ -#define NVIC_VECTTAB_OFFSET_MASK ((uint32_t)0x1FFFFF80) - -/* the register key mask, if you want to do the write operation, you should write 0x5FA to VECTKEY bits */ -#define NVIC_AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) - -/* priority group - define the pre-emption priority and the subpriority */ -#define NVIC_PRIGROUP_PRE0_SUB4 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority 4 bits for subpriority */ -#define NVIC_PRIGROUP_PRE1_SUB3 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority 3 bits for subpriority */ -#define NVIC_PRIGROUP_PRE2_SUB2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority 2 bits for subpriority */ -#define NVIC_PRIGROUP_PRE3_SUB1 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority 1 bits for subpriority */ -#define NVIC_PRIGROUP_PRE4_SUB0 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority 0 bits for subpriority */ - -/* choose the method to enter or exit the lowpower mode */ -#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< choose the the system whether enter low power mode by exiting from ISR */ -#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< choose the the system enter the DEEPSLEEP mode or SLEEP mode */ -#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< choose the interrupt source that can wake up the lowpower mode */ - -#define SCB_LPM_SLEEP_EXIT_ISR SCB_SCR_SLEEPONEXIT -#define SCB_LPM_DEEPSLEEP SCB_SCR_SLEEPDEEP -#define SCB_LPM_WAKE_BY_ALL_INT SCB_SCR_SEVONPEND - -/* choose the systick clock source */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 ((uint32_t)0xFFFFFFFBU) /*!< systick clock source is from HCLK/8 */ -#define SYSTICK_CLKSOURCE_HCLK ((uint32_t)0x00000004U) /*!< systick clock source is from HCLK */ - -/* function declarations */ -/* set the priority group */ -void nvic_priority_group_set(uint32_t nvic_prigroup); - -/* enable NVIC interrupt request */ -void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority); -/* disable NVIC interrupt request */ -void nvic_irq_disable(uint8_t nvic_irq); -/* initiates a system reset request to reset the MCU */ -void nvic_system_reset(void); - -/* set the NVIC vector table base address */ -void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset); - -/* set the state of the low power mode */ -void system_lowpower_set(uint8_t lowpower_mode); -/* reset the state of the low power mode */ -void system_lowpower_reset(uint8_t lowpower_mode); - -/* set the systick clock source */ -void systick_clksource_set(uint32_t systick_clksource); - -#endif /* GD32F5XX_MISC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h deleted file mode 100644 index 19bc45e495e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pkcau.h +++ /dev/null @@ -1,290 +0,0 @@ -/*! - \file gd32f5xx_pkcau.h - \brief definitions for the PKCAU - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_PKCAU_H -#define GD32F5XX_PKCAU_H - -#include "gd32f5xx.h" - -/* PKCAU definitions */ -#define PKCAU PKCAU_BASE /*!< PKCAU base address */ - -/* registers definitions */ -#define PKCAU_CTL REG32(PKCAU + 0x00000000U) /*!< PKCAU control register */ -#define PKCAU_STAT REG32(PKCAU + 0x00000004U) /*!< PKCAU status register */ -#define PKCAU_STATC REG32(PKCAU + 0x00000008U) /*!< PKCAU status clear register */ - -/* bits definitions */ -/* PKCAU_CTL */ -#define PKCAU_CTL_PKCAUEN BIT(0) /*!< PKCAU peripheral enable */ -#define PKCAU_CTL_START BIT(1) /*!< start operation */ -#define PKCAU_CTL_MODESEL BITS(8,13) /*!< operation mode selection */ -#define PKCAU_CTL_ENDIE BIT(17) /*!< end of operation interrupt enable */ -#define PKCAU_CTL_RAMERRIE BIT(19) /*!< RAM error interrupt enable */ -#define PKCAU_CTL_ADDRERRIE BIT(20) /*!< address error interrupt enable */ - -/* PKCAU_STAT */ -#define PKCAU_STAT_BUSY BIT(16) /*!< busy flag */ -#define PKCAU_STAT_ENDF BIT(17) /*!< end of PKCAU operation */ -#define PKCAU_STAT_RAMERR BIT(19) /*!< PKCAU RAM error */ -#define PKCAU_STAT_ADDRERR BIT(20) /*!< address error */ - -/* PKCAU_STATC */ -#define PKCAU_STATC_ENDFC BIT(17) /*!< end of PKCAU operation flag clear */ -#define PKCAU_STATC_RAMERRC BIT(19) /*!< PKCAU RAM error flag clear */ -#define PKCAU_STATC_ADDRERRC BIT(20) /*!< address error flag clear */ - -/* constants definitions */ -/* montgomery parameter structure */ -typedef struct{ - const uint8_t* modulus_n; /*!< modulus value n */ - uint32_t modulus_n_len; /*!< modulus length in byte */ -}pkcau_mont_parameter_struct; - -/* modular addition, modular subtraction, montgomery multiplication, modular inversion, modular reduction parameter structure */ -typedef struct{ - const uint8_t* oprd_a; /*!< operand A */ - uint32_t oprd_a_len; /*!< operand A length in byte */ - const uint8_t* oprd_b; /*!< operand B */ - uint32_t oprd_b_len; /*!< operand b length in byte */ - const uint8_t* modulus_n; /*!< modulus value n */ - uint32_t modulus_n_len; /*!< modulus length in byte */ -}pkcau_mod_parameter_struct; - -/* modular exponentiation parameter structure */ -typedef struct{ - const uint8_t* oprd_a; /*!< operand A */ - uint32_t oprd_a_len; /*!< operand A length in byte */ - const uint8_t* exp_e; /*!< exponent e */ - uint32_t e_len; /*!< exponent length in byte */ - const uint8_t* modulus_n; /*!< modulus n */ - uint32_t modulus_n_len; /*!< modulus length in byte */ - uint8_t* mont_para; /*!< montgomery parameter R2 mod n */ - uint32_t mont_para_len; /*!< montgomery parameter length in byte */ -}pkcau_mod_exp_parameter_struct; - -/* arithmetic addition, arithmetic subtraction, arithmetic multiplication and arithmetic comparison parameter structure */ -typedef struct{ - const uint8_t* oprd_a; /*!< operand A */ - uint32_t oprd_a_len; /*!< length of operand in byte */ - const uint8_t* oprd_b; /*!< operand B */ - uint32_t oprd_b_len; /*!< length of operand in byte */ -}pkcau_arithmetic_parameter_struct; - -/* CRT parameter structure */ -typedef struct{ - const uint8_t* oprd_a; /*!< operand A */ - uint32_t oprd_a_len; /*!< length of operand in byte */ - uint8_t* oprd_dp; /*!< operand dp */ - uint32_t oprd_dp_len; /*!< length of operand dp in byte */ - uint8_t* oprd_dq; /*!< operand dq */ - uint32_t oprd_dq_len; /*!< length of operand dq in byte */ - uint8_t* oprd_qinv; /*!< operand qinv */ - uint32_t oprd_qinv_len; /*!< length of operand qinv in byte */ - uint8_t* oprd_p; /*!< prime operand p */ - uint32_t oprd_p_len; /*!< length of operand p in byte */ - uint8_t* oprd_q; /*!< prime operand q */ - uint32_t oprd_q_len; /*!< length of operand q in byte */ -}pkcau_crt_parameter_struct; - -/* ECC curve parameter structure */ -typedef struct{ - uint8_t* modulus_p; /*!< curve modulus p */ - uint32_t modulus_p_len; /*!< curve modulus p length in byte */ - uint8_t* coff_a; /*!< curve coefficient a */ - uint32_t coff_a_len; /*!< curve coefficient a length in byte */ - uint8_t* coff_b; /*!< curve coefficient b */ - uint32_t coff_b_len; /*!< curve coefficient b length in byte */ - uint8_t* base_point_x; /*!< curve base point coordinate x */ - uint32_t base_point_x_len; /*!< curve base point coordinate x length in byte */ - uint8_t* base_point_y; /*!< curve base point coordinate y */ - uint32_t base_point_y_len; /*!< curve base point coordinate y length in byte */ - uint8_t* order_n; /*!< curve prime order n */ - uint32_t order_n_len; /*!< curve prime order n length in byte */ - uint32_t a_sign; /*!< curve coefficient a sign */ - - const uint8_t* multi_k; /*!< scalar multiplier k */ - uint32_t multi_k_len; /*!< scalar multiplier k length in byte */ - - const uint8_t* integer_k; /*!< integer k */ - uint32_t integer_k_len; /*!< integer k length in byte */ - const uint8_t* private_key_d; /*!< private key d */ - uint32_t private_key_d_len; /*!< private key d length in byte */ - uint8_t* mont_para; /*!< montgomery parameter R2 mod n */ - uint32_t mont_para_len; /*!< montgomery parameter R2 mod n length in byte */ -}pkcau_ec_group_parameter_struct; - -/* point structure */ -typedef struct{ - const uint8_t* point_x; /*!< point coordinate x */ - uint32_t point_x_len; /*!< point coordinate x length in byte > */ - const uint8_t* point_y; /*!< point coordinate y */ - uint32_t point_y_len; /*!< point coordinate y length in byte > */ -}pkcau_point_parameter_struct; - -/* signature structure */ -typedef struct{ - const uint8_t* sign_r; /*!< signature part r */ - uint32_t sign_r_len; /*!< signature part r lnegth in byte */ - const uint8_t* sign_s; /*!< signature part s */ - uint32_t sign_s_len; /*!< signature part s lnegth in byte */ -}pkcau_signature_parameter_struct; - -/* hash structure */ -typedef struct { - const uint8_t *hash_z; /*!< hash value z */ - uint32_t hash_z_len; /*!< hash value z length in byte */ -}pkcau_hash_parameter_struct; - - -/* ecdsa signature, ecc scalar multiplication output structure */ -typedef struct{ - uint32_t sign_extra; /*!< flag of extended ECDSA sign (extra outputs) */ - uint8_t* sign_r; /*!< pointer to signature part r */ - uint8_t* sign_s; /*!< pointer to signature part s */ - uint8_t* point_x; /*!< pointer to point kP coordinate x */ - uint8_t* point_y; /*!< pointer to point kP coordinate y */ -}pkcau_ecc_out_struct; - - -/* PKCAU operation code */ -#define CTL_MODE(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) -#define PKCAU_MODE_MOD_EXP CTL_MODE(0) /*!< montgomery parameter computation then modular exponentiation */ -#define PKCAU_MODE_MONT_PARAM CTL_MODE(1) /*!< montgomery parameter computation only */ -#define PKCAU_MODE_MOD_EXP_FAST CTL_MODE(2) /*!< modular exponentiation only */ -#define PKCAU_MODE_CRT_EXP CTL_MODE(7) /*!< RSA CRT exponentiation */ -#define PKCAU_MODE_MOD_INVERSION CTL_MODE(8) /*!< modular inversion */ -#define PKCAU_MODE_ARITHMETIC_ADD CTL_MODE(9) /*!< arithmetic addition */ -#define PKCAU_MODE_ARITHMETIC_SUB CTL_MODE(10) /*!< arithmetic subtraction */ -#define PKCAU_MODE_ARITHMETIC_MUL CTL_MODE(11) /*!< arithmetic multiplication */ -#define PKCAU_MODE_ARITHMETIC_COMP CTL_MODE(12) /*!< arithmetic comparison */ -#define PKCAU_MODE_MOD_REDUCTION CTL_MODE(13) /*!< modular reduction */ -#define PKCAU_MODE_MOD_ADD CTL_MODE(14) /*!< modular addition */ -#define PKCAU_MODE_MOD_SUB CTL_MODE(15) /*!< modular subtraction */ -#define PKCAU_MODE_MONT_MUL CTL_MODE(16) /*!< montgomery multiplication */ -#define PKCAU_MODE_ECC_SCALAR_MUL CTL_MODE(32) /*!< montgomery parameter computation then ECC scalar multiplication */ -#define PKCAU_MODE_ECC_SCALAR_MUL_FAST CTL_MODE(34) /*!< ECC scalar multiplication only */ -#define PKCAU_MODE_ECDSA_SIGN CTL_MODE(36) /*!< ECDSA sign */ -#define PKCAU_MODE_ECDSA_VERIFICATION CTL_MODE(38) /*!< ECDSA verification */ -#define PKCAU_MODE_POINT_CHECK CTL_MODE(40) /*!< point on elliptic curve Fp check */ - -/* PKCAU interrupt */ -#define PKCAU_INT_ADDRERR PKCAU_CTL_ADDRERRIE /*!< address error interrupt enable */ -#define PKCAU_INT_RAMERR PKCAU_CTL_RAMERRIE /*!< RAM error interrupt enable */ -#define PKCAU_INT_END PKCAU_CTL_ENDIE /*!< end of operation interrupt enable */ - -/* PKCAU flag definitions */ -#define PKCAU_FLAG_ADDRERR PKCAU_STAT_ADDRERR /*!< address error flag */ -#define PKCAU_FLAG_RAMERR PKCAU_STAT_RAMERR /*!< PKCAU RAM error flag */ -#define PKCAU_FLAG_END PKCAU_STAT_ENDF /*!< end of PKCAU operation flag */ -#define PKCAU_FLAG_BUSY PKCAU_STAT_BUSY /*!< busy flag */ - -/* PKCAU interrupt flag definitions */ -#define PKCAU_INT_FLAG_ADDRERR PKCAU_STAT_ADDRERR /*!< address error flag */ -#define PKCAU_INT_FLAG_RAMERR PKCAU_STAT_RAMERR /*!< PKCAU RAM error flag */ -#define PKCAU_INT_FLAG_ENDF PKCAU_STAT_ENDF /*!< end of PKCAU operation flag */ - -/* function declarations */ -/* initialization functions */ -/* reset pkcau */ -void pkcau_deinit(void); -/* initialize montgomery parameter structure with a default value */ -void pkcau_mont_struct_para_init(pkcau_mont_parameter_struct* init_para); -/* initialize modular parameter structure with a default value */ -void pkcau_mod_struct_para_init(pkcau_mod_parameter_struct* init_para); -/* initialize modular exponentiation parameter structure with a default value */ -void pkcau_mod_exp_struct_para_init(pkcau_mod_exp_parameter_struct* init_para); -/* initialize arithmetic parameter structure with a default value */ -void pkcau_arithmetic_struct_para_init(pkcau_arithmetic_parameter_struct* init_para); -/* initialize CRT parameter structure with a default value */ -void pkcau_crt_struct_para_init(pkcau_crt_parameter_struct* init_para); -/* initialize ECC curve parameter structure with a default value */ -void pkcau_ec_group_struct_para_init(pkcau_ec_group_parameter_struct* init_para); -/* initialize point parameter structure with a default value */ -void pkcau_point_struct_para_init(pkcau_point_parameter_struct* init_para); -/* initialize signature parameter structure with a default value */ -void pkcau_signature_struct_para_init(pkcau_signature_parameter_struct* init_para); -/* initialize hash parameter structure with a default value */ -void pkcau_hash_struct_para_init(pkcau_hash_parameter_struct* init_para); -/* initialize ecc output parameter structure with a default value */ -void pkcau_ecc_out_struct_para_init(pkcau_ecc_out_struct* init_para); - -/* application function declarations */ -/* enable PKCAU */ -void pkcau_enable(void); -/* disable PKCAU */ -void pkcau_disable(void); -/* start operation */ -void pkcau_start(void); -/* configure the PKCAU operation mode */ -void pkcau_mode_set(uint32_t mode); -/* execute montgomery parameter operation */ -void pkcau_mont_param_operation(pkcau_mont_parameter_struct* mont_para, uint8_t* results); -/* execute modular operation, include modular addition, modular subtraction and montgomery multiplication */ -void pkcau_mod_operation(pkcau_mod_parameter_struct* mod_para, uint32_t mode, uint8_t* results); -/* execute modular exponentiation operation */ -void pkcau_mod_exp_operation(pkcau_mod_exp_parameter_struct* mod_exp_para, uint32_t mode, uint8_t* results); -/* execute modular inversion operation */ -void pkcau_mod_inver_operation(pkcau_mod_parameter_struct* mod_inver_para, uint8_t* results); -/* execute modular reduction operation */ -void pkcau_mod_reduc_operation(pkcau_mod_parameter_struct* mod_reduc_para, uint8_t* results); -/* execute arithmetic addition operation */ -void pkcau_arithmetic_operation(pkcau_arithmetic_parameter_struct* arithmetic_para, uint32_t mode, uint8_t* results); -/* execute RSA CRT exponentiation operation */ -void pkcau_crt_exp_operation(pkcau_crt_parameter_struct* crt_para, uint8_t* results); -/* execute point check operation */ -uint8_t pkcau_point_check_operation(pkcau_point_parameter_struct* point_para, const pkcau_ec_group_parameter_struct* curve_group_para); -/* execute point multiplication operation */ -void pkcau_point_mul_operation(pkcau_point_parameter_struct* point_para, const pkcau_ec_group_parameter_struct* curve_group_para, uint32_t mode, pkcau_ecc_out_struct* result); -/* execute ECDSA sign operation */ -uint8_t pkcau_ecdsa_sign_operation(pkcau_hash_parameter_struct* hash_para, const pkcau_ec_group_parameter_struct* curve_group_para, pkcau_ecc_out_struct* result); -/* execute ECDSA verify operation */ -uint8_t pkcau_ecdsa_verification_operation(pkcau_point_parameter_struct* point_para, pkcau_hash_parameter_struct* hash_para, pkcau_signature_parameter_struct* signature_para, const pkcau_ec_group_parameter_struct* curve_group_para); - -/* interrupt & flag functions */ -/* get PKCAU flag status */ -FlagStatus pkcau_flag_get(uint32_t flag); -/* clear PKCAU flag status */ -void pkcau_flag_clear(uint32_t flag); -/* enable PKCAU interrupt */ -void pkcau_interrupt_enable(uint32_t interrupt); -/* disable PKCAU interrupt */ -void pkcau_interrupt_disable(uint32_t interrupt); -/* get PKCAU interrupt flag status */ -FlagStatus pkcau_interrupt_flag_get(uint32_t int_flag); -/* clear PKCAU interrupt flag status */ -void pkcau_interrupt_flag_clear(uint32_t int_flag); - -#endif /* GD32F5XX_PKCAU_H */ - diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h deleted file mode 100644 index 59ba1f8651e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_pmu.h +++ /dev/null @@ -1,203 +0,0 @@ -/*! - \file gd32f5xx_pmu.h - \brief definitions for the PMU - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#ifndef GD32F5XX_PMU_H -#define GD32F5XX_PMU_H - -#include "gd32f5xx.h" - -/* PMU definitions */ -#define PMU PMU_BASE /*!< PMU base address */ - -/* registers definitions */ -#define PMU_CTL REG32((PMU) + 0x00000000U) /*!< PMU control register */ -#define PMU_CS REG32((PMU) + 0x00000004U) /*!< PMU control and status register */ - -/* bits definitions */ -/* PMU_CTL */ -#define PMU_CTL_LDOLP BIT(0) /*!< LDO low power mode */ -#define PMU_CTL_STBMOD BIT(1) /*!< standby mode */ -#define PMU_CTL_WURST BIT(2) /*!< wakeup flag reset */ -#define PMU_CTL_STBRST BIT(3) /*!< standby flag reset */ -#define PMU_CTL_LVDEN BIT(4) /*!< low voltage detector enable */ -#define PMU_CTL_LVDT BITS(5,7) /*!< low voltage detector threshold */ -#define PMU_CTL_BKPWEN BIT(8) /*!< backup domain write enable */ -#define PMU_CTL_LDLP BIT(10) /*!< low-driver mode when use low power LDO */ -#define PMU_CTL_LDNP BIT(11) /*!< low-driver mode when use normal power LDO */ -#define PMU_CTL_LDOVS BITS(14,15) /*!< LDO output voltage select */ -#define PMU_CTL_HDEN BIT(16) /*!< high-driver mode enable */ -#define PMU_CTL_HDS BIT(17) /*!< high-driver mode switch */ -#define PMU_CTL_LDEN BITS(18,19) /*!< low-driver mode enable in deep-sleep mode */ - -/* PMU_CS */ -#define PMU_CS_WUF BIT(0) /*!< wakeup flag */ -#define PMU_CS_STBF BIT(1) /*!< standby flag */ -#define PMU_CS_LVDF BIT(2) /*!< low voltage detector status flag */ -#define PMU_CS_BLDORF BIT(3) /*!< backup SRAM LDO ready flag */ -#define PMU_CS_WUPEN BIT(8) /*!< wakeup pin enable */ -#define PMU_CS_BLDOON BIT(9) /*!< backup SRAM LDO on */ -#define PMU_CS_LDOVSRF BIT(14) /*!< LDO voltage select ready flag */ -#define PMU_CS_HDRF BIT(16) /*!< high-driver ready flag */ -#define PMU_CS_HDSRF BIT(17) /*!< high-driver switch ready flag */ -#define PMU_CS_LDRF BITS(18,19) /*!< low-driver mode ready flag */ - -/* constants definitions */ -/* PMU ldo definitions */ -#define PMU_LDO_NORMAL ((uint32_t)0x00000000U) /*!< LDO normal work when PMU enter deep-sleep mode */ -#define PMU_LDO_LOWPOWER PMU_CTL_LDOLP /*!< LDO work at low power status when PMU enter deep-sleep mode */ - -/* PMU low voltage detector threshold definitions */ -#define CTL_LVDT(regval) (BITS(5,7)&((uint32_t)(regval)<<5)) -#define PMU_LVDT_0 CTL_LVDT(0) /*!< voltage threshold is 2.1V */ -#define PMU_LVDT_1 CTL_LVDT(1) /*!< voltage threshold is 2.3V */ -#define PMU_LVDT_2 CTL_LVDT(2) /*!< voltage threshold is 2.4V */ -#define PMU_LVDT_3 CTL_LVDT(3) /*!< voltage threshold is 2.6V */ -#define PMU_LVDT_4 CTL_LVDT(4) /*!< voltage threshold is 2.7V */ -#define PMU_LVDT_5 CTL_LVDT(5) /*!< voltage threshold is 2.9V */ -#define PMU_LVDT_6 CTL_LVDT(6) /*!< voltage threshold is 3.0V */ -#define PMU_LVDT_7 CTL_LVDT(7) /*!< voltage threshold is 3.1V */ - -/* PMU low-driver mode when use low power LDO */ -#define CTL_LDLP(regval) (BIT(10)&((uint32_t)(regval)<<10)) -#define PMU_NORMALDR_LOWPWR CTL_LDLP(0) /*!< normal driver when use low power LDO */ -#define PMU_LOWDR_LOWPWR CTL_LDLP(1) /*!< low-driver mode enabled when LDEN is 11 and use low power LDO */ - -/* PMU low-driver mode when use normal power LDO */ -#define CTL_LDNP(regval) (BIT(11)&((uint32_t)(regval)<<11)) -#define PMU_NORMALDR_NORMALPWR CTL_LDNP(0) /*!< normal driver when use normal power LDO */ -#define PMU_LOWDR_NORMALPWR CTL_LDNP(1) /*!< low-driver mode enabled when LDEN is 11 and use normal power LDO */ - -/* PMU LDO output voltage select definitions */ -#define CTL_LDOVS(regval) (BITS(14,15)&((uint32_t)(regval)<<14)) -#define PMU_LDOVS_LOW CTL_LDOVS(1) /*!< LDO output voltage low mode */ -#define PMU_LDOVS_MID CTL_LDOVS(2) /*!< LDO output voltage mid mode */ -#define PMU_LDOVS_HIGH CTL_LDOVS(3) /*!< LDO output voltage high mode */ - - -/* PMU high-driver mode switch */ -#define CTL_HDS(regval) (BIT(17)&((uint32_t)(regval)<<17)) -#define PMU_HIGHDR_SWITCH_NONE CTL_HDS(0) /*!< no high-driver mode switch */ -#define PMU_HIGHDR_SWITCH_EN CTL_HDS(1) /*!< high-driver mode switch */ - -/* PMU low-driver mode enable in deep-sleep mode */ -#define CTL_LDEN(regval) (BITS(18,19)&((uint32_t)(regval)<<18)) -#define PMU_LOWDRIVER_DISABLE CTL_LDEN(0) /*!< low-driver mode disable in deep-sleep mode */ -#define PMU_LOWDRIVER_ENABLE CTL_LDEN(3) /*!< low-driver mode enable in deep-sleep mode */ - -/* PMU backup SRAM LDO on or off */ -#define CS_BLDOON(regval) (BIT(9)&((uint32_t)(regval)<<9)) -#define PMU_BLDOON_OFF CS_BLDOON(0) /*!< backup SRAM LDO off */ -#define PMU_BLDOON_ON CS_BLDOON(1) /*!< the backup SRAM LDO on */ - -/* PMU low power mode ready flag definitions */ -#define CS_LDRF(regval) (BITS(18,19)&((uint32_t)(regval)<<18)) -#define PMU_LDRF_NORMAL CS_LDRF(0) /*!< normal driver in deep-sleep mode */ -#define PMU_LDRF_LOWDRIVER CS_LDRF(3) /*!< low-driver mode in deep-sleep mode */ - -/* PMU flag definitions */ -#define PMU_FLAG_WAKEUP PMU_CS_WUF /*!< wakeup flag status */ -#define PMU_FLAG_STANDBY PMU_CS_STBF /*!< standby flag status */ -#define PMU_FLAG_LVD PMU_CS_LVDF /*!< lvd flag status */ -#define PMU_FLAG_BLDORF PMU_CS_BLDORF /*!< backup SRAM LDO ready flag */ -#define PMU_FLAG_LDOVSRF PMU_CS_LDOVSRF /*!< LDO voltage select ready flag */ -#define PMU_FLAG_HDRF PMU_CS_HDRF /*!< high-driver ready flag */ -#define PMU_FLAG_HDSRF PMU_CS_HDSRF /*!< high-driver switch ready flag */ -#define PMU_FLAG_LDRF PMU_CS_LDRF /*!< low-driver mode ready flag */ - -/* PMU flag reset definitions */ -#define PMU_FLAG_RESET_WAKEUP ((uint8_t)0x00U) /*!< wakeup flag reset */ -#define PMU_FLAG_RESET_STANDBY ((uint8_t)0x01U) /*!< standby flag reset */ - -/* PMU command constants definitions */ -#define WFI_CMD ((uint8_t)0x00U) /*!< use WFI command */ -#define WFE_CMD ((uint8_t)0x01U) /*!< use WFE command */ - -/* function declarations */ -/* reset PMU registers */ -void pmu_deinit(void); - -/* LVD functions */ -/* select low voltage detector threshold */ -void pmu_lvd_select(uint32_t lvdt_n); -/* disable PMU lvd */ -void pmu_lvd_disable(void); - -/* LDO functions */ -/* select LDO output voltage */ -void pmu_ldo_output_select(uint32_t ldo_output); - -/* functions of low-driver mode and high-driver mode */ -/* enable high-driver mode */ -void pmu_highdriver_mode_enable(void); -/* disable high-driver mode */ -void pmu_highdriver_mode_disable(void); -/* switch high-driver mode */ -void pmu_highdriver_switch_select(uint32_t highdr_switch); -/* enable low-driver mode in deep-sleep */ -void pmu_lowdriver_mode_enable(void); -/* disable low-driver mode in deep-sleep */ -void pmu_lowdriver_mode_disable(void); -/* in deep-sleep mode, driver mode when use low power LDO */ -void pmu_lowpower_driver_config(uint32_t mode); -/* in deep-sleep mode, driver mode when use normal power LDO */ -void pmu_normalpower_driver_config(uint32_t mode); - -/* set PMU mode */ -/* PMU work in sleep mode */ -void pmu_to_sleepmode(uint8_t sleepmodecmd); -/* PMU work in deepsleep mode */ -void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd); -/* PMU work in standby mode */ -void pmu_to_standbymode(void); -/* enable PMU wakeup pin */ -void pmu_wakeup_pin_enable(void); -/* disable PMU wakeup pin */ -void pmu_wakeup_pin_disable(void); - -/* backup related functions */ -/* backup SRAM LDO on */ -void pmu_backup_ldo_config(uint32_t bkp_ldo); -/* enable write access to the registers in backup domain */ -void pmu_backup_write_enable(void); -/* disable write access to the registers in backup domain */ -void pmu_backup_write_disable(void); - -/* flag functions */ -/* get flag state */ -FlagStatus pmu_flag_get(uint32_t flag); -/* clear flag bit */ -void pmu_flag_clear(uint32_t flag); - -#endif /* GD32F5XX_PMU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h deleted file mode 100644 index 2a7aa8860ae..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rcu.h +++ /dev/null @@ -1,1261 +0,0 @@ -/*! - \file gd32f5xx_rcu.h - \brief definitions for the RCU - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_RCU_H -#define GD32F5XX_RCU_H - -#include "gd32f5xx.h" - -/* RCU definitions */ -#define RCU RCU_BASE - -/* registers definitions */ -#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ -#define RCU_PLL REG32(RCU + 0x04U) /*!< PLL register */ -#define RCU_CFG0 REG32(RCU + 0x08U) /*!< clock configuration register 0 */ -#define RCU_INT REG32(RCU + 0x0CU) /*!< clock interrupt register */ -#define RCU_AHB1RST REG32(RCU + 0x10U) /*!< AHB1 reset register */ -#define RCU_AHB2RST REG32(RCU + 0x14U) /*!< AHB2 reset register */ -#define RCU_AHB3RST REG32(RCU + 0x18U) /*!< AHB3 reset register */ -#define RCU_APB1RST REG32(RCU + 0x20U) /*!< APB1 reset register */ -#define RCU_APB2RST REG32(RCU + 0x24U) /*!< APB2 reset register */ -#define RCU_AHB1EN REG32(RCU + 0x30U) /*!< AHB1 enable register */ -#define RCU_AHB2EN REG32(RCU + 0x34U) /*!< AHB2 enable register */ -#define RCU_AHB3EN REG32(RCU + 0x38U) /*!< AHB3 enable register */ -#define RCU_APB1EN REG32(RCU + 0x40U) /*!< APB1 enable register */ -#define RCU_APB2EN REG32(RCU + 0x44U) /*!< APB2 enable register */ -#define RCU_AHB1SPEN REG32(RCU + 0x50U) /*!< AHB1 sleep mode enable register */ -#define RCU_AHB2SPEN REG32(RCU + 0x54U) /*!< AHB2 sleep mode enable register */ -#define RCU_AHB3SPEN REG32(RCU + 0x58U) /*!< AHB3 sleep mode enable register */ -#define RCU_APB1SPEN REG32(RCU + 0x60U) /*!< APB1 sleep mode enable register */ -#define RCU_APB2SPEN REG32(RCU + 0x64U) /*!< APB2 sleep mode enable register */ -#define RCU_BDCTL REG32(RCU + 0x70U) /*!< backup domain control register */ -#define RCU_RSTSCK REG32(RCU + 0x74U) /*!< reset source / clock register */ -#define RCU_PLLSSCTL REG32(RCU + 0x80U) /*!< PLL clock spread spectrum control register */ -#define RCU_PLLI2S REG32(RCU + 0x84U) /*!< PLLI2S register */ -#define RCU_PLLSAI REG32(RCU + 0x88U) /*!< PLLSAI register */ -#define RCU_CFG1 REG32(RCU + 0x8CU) /*!< clock configuration register 1 */ -#define RCU_CFG2 REG32(RCU + 0x94U) /*!< clock configuration register 2 */ -#define RCU_ADDCTL REG32(RCU + 0xC0U) /*!< additional clock control register */ -#define RCU_ADDINT REG32(RCU + 0xCCU) /*!< additional clock interrupt register */ -#define RCU_ADDAPB1RST REG32(RCU + 0xE0U) /*!< APB1 additional reset register */ -#define RCU_ADDAPB1EN REG32(RCU + 0xE4U) /*!< APB1 additional enable register */ -#define RCU_ADDAPB1SPEN REG32(RCU + 0xE8U) /*!< APB1 additional sleep mode enable register */ -#define RCU_VKEY REG32(RCU + 0x100U) /*!< voltage key register */ -#define RCU_DSV REG32(RCU + 0x134U) /*!< deep-sleep mode voltage register */ - -/* bits definitions */ -/* RCU_CTL */ -#define RCU_CTL_IRC16MEN BIT(0) /*!< internal high speed oscillator enable */ -#define RCU_CTL_IRC16MSTB BIT(1) /*!< IRC16M high speed internal oscillator stabilization flag */ -#define RCU_CTL_IRC16MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ -#define RCU_CTL_IRC16MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ -#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ -#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ -#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ -#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ -#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ -#define RCU_CTL_PLLSTB BIT(25) /*!< PLL Clock Stabilization Flag */ -#define RCU_CTL_PLLI2SEN BIT(26) /*!< PLLI2S enable */ -#define RCU_CTL_PLLI2SSTB BIT(27) /*!< PLLI2S Clock Stabilization Flag */ -#define RCU_CTL_PLLSAIEN BIT(28) /*!< PLLSAI enable */ -#define RCU_CTL_PLLSAISTB BIT(29) /*!< PLLSAI Clock Stabilization Flag */ - -/* RCU_PLL */ -#define RCU_PLL_PLLPSC BITS(0,5) /*!< the PLL VCO source clock prescaler */ -#define RCU_PLL_PLLN BITS(6,14) /*!< the PLL VCO clock multi factor */ -#define RCU_PLL_PLLP BITS(16,17) /*!< the PLLP output frequency division factor from PLL VCO clock */ -#define RCU_PLL_PLLSEL BIT(22) /*!< PLL Clock Source Selection */ -#define RCU_PLL_PLLQ BITS(24,27) /*!< the PLL Q output frequency division factor from PLL VCO clock */ - -/* RCU_CFG0 */ -#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ -#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ -#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ -#define RCU_CFG0_APB1PSC BITS(10,12) /*!< APB1 prescaler selection */ -#define RCU_CFG0_APB2PSC BITS(13,15) /*!< APB2 prescaler selection */ -#define RCU_CFG0_RTCDIV BITS(16,20) /*!< RTC clock divider factor */ -#define RCU_CFG0_CKOUT0SEL BITS(21,22) /*!< CKOUT0 Clock Source Selection */ -#define RCU_CFG0_I2SSEL BIT(23) /*!< I2S Clock Source Selection */ -#define RCU_CFG0_CKOUT0DIV BITS(24,26) /*!< the CK_OUT0 divider which the CK_OUT0 frequency can be reduced */ -#define RCU_CFG0_CKOUT1DIV BITS(27,29) /*!< the CK_OUT1 divider which the CK_OUT1 frequency can be reduced */ -#define RCU_CFG0_CKOUT1SEL BITS(30,31) /*!< CKOUT1 Clock Source Selection */ - -/* RCU_INT */ -#define RCU_INT_IRC32KSTBIF BIT(0) /*!< IRC32K stabilization interrupt flag */ -#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ -#define RCU_INT_IRC16MSTBIF BIT(2) /*!< IRC16M stabilization interrupt flag */ -#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ -#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ -#define RCU_INT_PLLI2SSTBIF BIT(5) /*!< PLLI2S stabilization interrupt flag */ -#define RCU_INT_PLLSAISTBIF BIT(6) /*!< PLLSAI stabilization interrupt flag */ -#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ -#define RCU_INT_IRC32KSTBIE BIT(8) /*!< IRC32K stabilization interrupt enable */ -#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ -#define RCU_INT_IRC16MSTBIE BIT(10) /*!< IRC16M stabilization interrupt enable */ -#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ -#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ -#define RCU_INT_PLLI2SSTBIE BIT(13) /*!< PLLI2S Stabilization Interrupt Enable */ -#define RCU_INT_PLLSAISTBIE BIT(14) /*!< PLLSAI Stabilization Interrupt Enable */ -#define RCU_INT_IRC32KSTBIC BIT(16) /*!< IRC32K Stabilization Interrupt Clear */ -#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL Stabilization Interrupt Clear */ -#define RCU_INT_IRC16MSTBIC BIT(18) /*!< IRC16M Stabilization Interrupt Clear */ -#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL Stabilization Interrupt Clear */ -#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization Interrupt Clear */ -#define RCU_INT_PLLI2SSTBIC BIT(21) /*!< PLLI2S stabilization Interrupt Clear */ -#define RCU_INT_PLLSAISTBIC BIT(22) /*!< PLLSAI stabilization Interrupt Clear */ -#define RCU_INT_CKMIC BIT(23) /*!< HXTAL Clock Stuck Interrupt Clear */ - -/* RCU_AHB1RST */ -#define RCU_AHB1RST_PARST BIT(0) /*!< GPIO port A reset */ -#define RCU_AHB1RST_PBRST BIT(1) /*!< GPIO port B reset */ -#define RCU_AHB1RST_PCRST BIT(2) /*!< GPIO port C reset */ -#define RCU_AHB1RST_PDRST BIT(3) /*!< GPIO port D reset */ -#define RCU_AHB1RST_PERST BIT(4) /*!< GPIO port E reset */ -#define RCU_AHB1RST_PFRST BIT(5) /*!< GPIO port F reset */ -#define RCU_AHB1RST_PGRST BIT(6) /*!< GPIO port G reset */ -#define RCU_AHB1RST_PHRST BIT(7) /*!< GPIO port H reset */ -#define RCU_AHB1RST_PIRST BIT(8) /*!< GPIO port I reset */ -#define RCU_AHB1RST_CRCRST BIT(12) /*!< CRC reset */ -#define RCU_AHB1RST_DMA0RST BIT(21) /*!< DMA0 reset */ -#define RCU_AHB1RST_DMA1RST BIT(22) /*!< DMA1 reset */ -#define RCU_AHB1RST_IPARST BIT(23) /*!< IPA reset */ -#define RCU_AHB1RST_ENETRST BIT(25) /*!< ENET reset */ -#define RCU_AHB1RST_USBHSRST BIT(29) /*!< USBHS reset */ - -/* RCU_AHB2RST */ -#define RCU_AHB2RST_DCIRST BIT(0) /*!< DCI reset */ -#define RCU_AHB2RST_PKCAURST BIT(3) /*!< PKCAU reset */ -#define RCU_AHB2RST_CAURST BIT(4) /*!< CAU reset */ -#define RCU_AHB2RST_HAURST BIT(5) /*!< HAU reset */ -#define RCU_AHB2RST_TRNGRST BIT(6) /*!< TRNG reset */ -#define RCU_AHB2RST_USBFSRST BIT(7) /*!< USBFS reset */ - -/* RCU_AHB3RST */ -#define RCU_AHB3RST_EXMCRST BIT(0) /*!< EXMC reset */ - -/* RCU_APB1RST */ -#define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 reset */ -#define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 reset */ -#define RCU_APB1RST_TIMER3RST BIT(2) /*!< TIMER3 reset */ -#define RCU_APB1RST_TIMER4RST BIT(3) /*!< TIMER4 reset */ -#define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 reset */ -#define RCU_APB1RST_TIMER6RST BIT(5) /*!< TIMER6 reset */ -#define RCU_APB1RST_TIMER11RST BIT(6) /*!< TIMER11 reset */ -#define RCU_APB1RST_TIMER12RST BIT(7) /*!< TIMER12 reset */ -#define RCU_APB1RST_TIMER13RST BIT(8) /*!< TIMER13 reset */ -#define RCU_APB1RST_I2C3RST BIT(10) /*!< I2C3 reset */ -#define RCU_APB1RST_WWDGTRST BIT(11) /*!< WWDGT reset */ -#define RCU_APB1RST_I2C4RST BIT(12) /*!< I2C4 reset */ -#define RCU_APB1RST_I2C5RST BIT(13) /*!< I2C5 reset */ -#define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */ -#define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */ -#define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */ -#define RCU_APB1RST_USART2RST BIT(18) /*!< USART2 reset */ -#define RCU_APB1RST_UART3RST BIT(19) /*!< UART3 reset */ -#define RCU_APB1RST_UART4RST BIT(20) /*!< UART4 reset */ -#define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */ -#define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */ -#define RCU_APB1RST_I2C2RST BIT(23) /*!< I2C2 reset */ -#define RCU_APB1RST_CAN0RST BIT(25) /*!< CAN0 reset */ -#define RCU_APB1RST_CAN1RST BIT(26) /*!< CAN1 reset */ -#define RCU_APB1RST_PMURST BIT(28) /*!< PMU reset */ -#define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */ -#define RCU_APB1RST_UART6RST BIT(30) /*!< UART6 reset */ -#define RCU_APB1RST_UART7RST BIT(31) /*!< UART7 reset */ - -/* RCU_APB2RST */ -#define RCU_APB2RST_TIMER0RST BIT(0) /*!< TIMER0 reset */ -#define RCU_APB2RST_TIMER7RST BIT(1) /*!< TIMER7 reset */ -#define RCU_APB2RST_USART0RST BIT(4) /*!< USART0 reset */ -#define RCU_APB2RST_USART5RST BIT(5) /*!< USART5 reset */ -#define RCU_APB2RST_ADCRST BIT(8) /*!< ADC reset */ -#define RCU_APB2RST_SDIORST BIT(11) /*!< SDIO reset */ -#define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */ -#define RCU_APB2RST_SPI3RST BIT(13) /*!< SPI3 reset */ -#define RCU_APB2RST_SYSCFGRST BIT(14) /*!< SYSCFG reset */ -#define RCU_APB2RST_TIMER8RST BIT(16) /*!< TIMER8 reset */ -#define RCU_APB2RST_TIMER9RST BIT(17) /*!< TIMER9 reset */ -#define RCU_APB2RST_TIMER10RST BIT(18) /*!< TIMER10 reset */ -#define RCU_APB2RST_SPI4RST BIT(20) /*!< SPI4 reset */ -#define RCU_APB2RST_SPI5RST BIT(21) /*!< SPI5 reset */ -#define RCU_APB2RST_SAIRST BIT(22) /*!< SAI reset */ -#define RCU_APB2RST_TLIRST BIT(26) /*!< TLI reset */ - -/* RCU_AHB1EN */ -#define RCU_AHB1EN_PAEN BIT(0) /*!< GPIO port A clock enable */ -#define RCU_AHB1EN_PBEN BIT(1) /*!< GPIO port B clock enable */ -#define RCU_AHB1EN_PCEN BIT(2) /*!< GPIO port C clock enable */ -#define RCU_AHB1EN_PDEN BIT(3) /*!< GPIO port D clock enable */ -#define RCU_AHB1EN_PEEN BIT(4) /*!< GPIO port E clock enable */ -#define RCU_AHB1EN_PFEN BIT(5) /*!< GPIO port F clock enable */ -#define RCU_AHB1EN_PGEN BIT(6) /*!< GPIO port G clock enable */ -#define RCU_AHB1EN_PHEN BIT(7) /*!< GPIO port H clock enable */ -#define RCU_AHB1EN_PIEN BIT(8) /*!< GPIO port I clock enable */ -#define RCU_AHB1EN_CRCEN BIT(12) /*!< CRC clock enable */ -#define RCU_AHB1EN_BKPSRAMEN BIT(18) /*!< BKPSRAM clock enable */ -#define RCU_AHB1EN_TCMSRAMEN BIT(20) /*!< TCMSRAM clock enable */ -#define RCU_AHB1EN_DMA0EN BIT(21) /*!< DMA0 clock enable */ -#define RCU_AHB1EN_DMA1EN BIT(22) /*!< DMA1 clock enable */ -#define RCU_AHB1EN_IPAEN BIT(23) /*!< IPA clock enable */ -#define RCU_AHB1EN_ENETEN BIT(25) /*!< ENET clock enable */ -#define RCU_AHB1EN_ENETTXEN BIT(26) /*!< ethernet TX clock enable */ -#define RCU_AHB1EN_ENETRXEN BIT(27) /*!< ethernet RX clock enable */ -#define RCU_AHB1EN_ENETPTPEN BIT(28) /*!< ethernet PTP clock enable */ -#define RCU_AHB1EN_USBHSEN BIT(29) /*!< USBHS clock enable */ -#define RCU_AHB1EN_USBHSULPIEN BIT(30) /*!< USBHS ULPI clock enable */ - -/* RCU_AHB2EN */ -#define RCU_AHB2EN_DCIEN BIT(0) /*!< DCI clock enable */ -#define RCU_AHB2EN_PKCAU BIT(3) /*!< PKCAU clock enable */ -#define RCU_AHB2EN_CAU BIT(4) /*!< CAU clock enable */ -#define RCU_AHB2EN_HAU BIT(5) /*!< HAU clock enable */ -#define RCU_AHB2EN_TRNGEN BIT(6) /*!< TRNG clock enable */ -#define RCU_AHB2EN_USBFSEN BIT(7) /*!< USBFS clock enable */ - -/* RCU_AHB3EN */ -#define RCU_AHB3EN_EXMCEN BIT(0) /*!< EXMC clock enable */ - -/* RCU_APB1EN */ -#define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 clock enable */ -#define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 clock enable */ -#define RCU_APB1EN_TIMER3EN BIT(2) /*!< TIMER3 clock enable */ -#define RCU_APB1EN_TIMER4EN BIT(3) /*!< TIMER4 clock enable */ -#define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 clock enable */ -#define RCU_APB1EN_TIMER6EN BIT(5) /*!< TIMER6 clock enable */ -#define RCU_APB1EN_TIMER11EN BIT(6) /*!< TIMER11 clock enable */ -#define RCU_APB1EN_TIMER12EN BIT(7) /*!< TIMER12 clock enable */ -#define RCU_APB1EN_TIMER13EN BIT(8) /*!< TIMER13 clock enable */ -#define RCU_APB1EN_I2C3EN BIT(10) /*!< I2C3 clock enable */ -#define RCU_APB1EN_WWDGTEN BIT(11) /*!< WWDGT clock enable */ -#define RCU_APB1EN_I2C4EN BIT(12) /*!< I2C4 clock enable */ -#define RCU_APB1EN_I2C5EN BIT(13) /*!< I2C5 clock enable */ -#define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */ -#define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */ -#define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */ -#define RCU_APB1EN_USART2EN BIT(18) /*!< USART2 clock enable */ -#define RCU_APB1EN_UART3EN BIT(19) /*!< UART3 clock enable */ -#define RCU_APB1EN_UART4EN BIT(20) /*!< UART4 clock enable */ -#define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */ -#define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */ -#define RCU_APB1EN_I2C2EN BIT(23) /*!< I2C2 clock enable */ -#define RCU_APB1EN_CAN0EN BIT(25) /*!< CAN0 clock enable */ -#define RCU_APB1EN_CAN1EN BIT(26) /*!< CAN1 clock enable */ -#define RCU_APB1EN_PMUEN BIT(28) /*!< PMU clock enable */ -#define RCU_APB1EN_DACEN BIT(29) /*!< DAC clock enable */ -#define RCU_APB1EN_UART6EN BIT(30) /*!< UART6 clock enable */ -#define RCU_APB1EN_UART7EN BIT(31) /*!< UART7 clock enable */ - -/* RCU_APB2EN */ -#define RCU_APB2EN_TIMER0EN BIT(0) /*!< TIMER0 clock enable */ -#define RCU_APB2EN_TIMER7EN BIT(1) /*!< TIMER7 clock enable */ -#define RCU_APB2EN_USART0EN BIT(4) /*!< USART0 clock enable */ -#define RCU_APB2EN_USART5EN BIT(5) /*!< USART5 clock enable */ -#define RCU_APB2EN_ADC0EN BIT(8) /*!< ADC0 clock enable */ -#define RCU_APB2EN_ADC1EN BIT(9) /*!< ADC1 clock enable */ -#define RCU_APB2EN_ADC2EN BIT(10) /*!< ADC2 clock enable */ -#define RCU_APB2EN_SDIOEN BIT(11) /*!< SDIO clock enable */ -#define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */ -#define RCU_APB2EN_SPI3EN BIT(13) /*!< SPI3 clock enable */ -#define RCU_APB2EN_SYSCFGEN BIT(14) /*!< SYSCFG clock enable */ -#define RCU_APB2EN_TIMER8EN BIT(16) /*!< TIMER8 clock enable */ -#define RCU_APB2EN_TIMER9EN BIT(17) /*!< TIMER9 clock enable */ -#define RCU_APB2EN_TIMER10EN BIT(18) /*!< TIMER10 clock enable */ -#define RCU_APB2EN_SPI4EN BIT(20) /*!< SPI4 clock enable */ -#define RCU_APB2EN_SPI5EN BIT(21) /*!< SPI5 clock enable */ -#define RCU_APB2EN_SAIEN BIT(22) /*!< SAI clock enable */ -#define RCU_APB2EN_TLIEN BIT(26) /*!< TLI clock enable */ - -/* RCU_AHB1SPEN */ -#define RCU_AHB1SPEN_PASPEN BIT(0) /*!< GPIO port A clock enable when sleep mode */ -#define RCU_AHB1SPEN_PBSPEN BIT(1) /*!< GPIO port B clock enable when sleep mode */ -#define RCU_AHB1SPEN_PCSPEN BIT(2) /*!< GPIO port C clock enable when sleep mode */ -#define RCU_AHB1SPEN_PDSPEN BIT(3) /*!< GPIO port D clock enable when sleep mode */ -#define RCU_AHB1SPEN_PESPEN BIT(4) /*!< GPIO port E clock enable when sleep mode */ -#define RCU_AHB1SPEN_PFSPEN BIT(5) /*!< GPIO port F clock enable when sleep mode */ -#define RCU_AHB1SPEN_PGSPEN BIT(6) /*!< GPIO port G clock enable when sleep mode */ -#define RCU_AHB1SPEN_PHSPEN BIT(7) /*!< GPIO port H clock enable when sleep mode */ -#define RCU_AHB1SPEN_PISPEN BIT(8) /*!< GPIO port I clock enable when sleep mode */ -#define RCU_AHB1SPEN_CRCSPEN BIT(12) /*!< CRC clock enable when sleep mode */ -#define RCU_AHB1SPEN_FMCSPEN BIT(15) /*!< FMC clock enable when sleep mode */ -#define RCU_AHB1SPEN_SRAM0SPEN BIT(16) /*!< SRAM0 clock enable when sleep mode */ -#define RCU_AHB1SPEN_SRAM1SPEN BIT(17) /*!< SRAM1 clock enable when sleep mode */ -#define RCU_AHB1SPEN_BKPSRAMSPEN BIT(18) /*!< BKPSRAM clock enable when sleep mode */ -#define RCU_AHB1SPEN_SRAM2SPEN BIT(19) /*!< SRAM2 clock enable when sleep mode */ -#define RCU_AHB1SPEN_DMA0SPEN BIT(21) /*!< DMA0 clock when sleep mode enable */ -#define RCU_AHB1SPEN_DMA1SPEN BIT(22) /*!< DMA1 clock when sleep mode enable */ -#define RCU_AHB1SPEN_IPASPEN BIT(23) /*!< IPA clock enable when sleep mode */ -#define RCU_AHB1SPEN_ENETSPEN BIT(25) /*!< ENET clock enable when sleep mode */ -#define RCU_AHB1SPEN_ENETTXSPEN BIT(26) /*!< ethernet TX clock enable when sleep mode */ -#define RCU_AHB1SPEN_ENETRXSPEN BIT(27) /*!< ethernet RX clock enable when sleep mode */ -#define RCU_AHB1SPEN_ENETPTPSPEN BIT(28) /*!< ethernet PTP clock enable when sleep mode */ -#define RCU_AHB1SPEN_USBHSSPEN BIT(29) /*!< USBHS clock enable when sleep mode */ -#define RCU_AHB1SPEN_USBHSULPISPEN BIT(30) /*!< USBHS ULPI clock enable when sleep mode */ - -/* RCU_AHB2SPEN */ -#define RCU_AHB2SPEN_DCISPEN BIT(0) /*!< DCI clock enable when sleep mode */ -#define RCU_AHB2SPEN_PKCAUSPEN BIT(3) /*!< PKCAU clock enable when sleep mode */ -#define RCU_AHB2SPEN_CAUSPEN BIT(4) /*!< CAU clock enable when sleep mode */ -#define RCU_AHB2SPEN_HAUSPEN BIT(5) /*!< HAU clock enable when sleep mode */ -#define RCU_AHB2SPEN_TRNGSPEN BIT(6) /*!< TRNG clock enable when sleep mode */ -#define RCU_AHB2SPEN_USBFSSPEN BIT(7) /*!< USBFS clock enable when sleep mode */ - -/* RCU_AHB3SPEN */ -#define RCU_AHB3SPEN_EXMCSPEN BIT(0) /*!< EXMC clock enable when sleep mode */ - -/* RCU_APB1SPEN */ -#define RCU_APB1SPEN_TIMER1SPEN BIT(0) /*!< TIMER1 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER2SPEN BIT(1) /*!< TIMER2 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER3SPEN BIT(2) /*!< TIMER3 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER4SPEN BIT(3) /*!< TIMER4 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER5SPEN BIT(4) /*!< TIMER5 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER6SPEN BIT(5) /*!< TIMER6 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER11SPEN BIT(6) /*!< TIMER11 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER12SPEN BIT(7) /*!< TIMER12 clock enable when sleep mode */ -#define RCU_APB1SPEN_TIMER13SPEN BIT(8) /*!< TIMER13 clock enable when sleep mode */ -#define RCU_APB1SPEN_I2C3SPEN BIT(10) /*!< I2C3 clock enable when sleep mode */ -#define RCU_APB1SPEN_WWDGTSPEN BIT(11) /*!< WWDGT clock enable when sleep mode */ -#define RCU_APB1SPEN_I2C4SPEN BIT(12) /*!< I2C4 clock enable when sleep mode */ -#define RCU_APB1SPEN_I2C5SPEN BIT(13) /*!< I2C5 clock enable when sleep mode*/ -#define RCU_APB1SPEN_SPI1SPEN BIT(14) /*!< SPI1 clock enable when sleep mode */ -#define RCU_APB1SPEN_SPI2SPEN BIT(15) /*!< SPI2 clock enable when sleep mode */ -#define RCU_APB1SPEN_USART1SPEN BIT(17) /*!< USART1 clock enable when sleep mode*/ -#define RCU_APB1SPEN_USART2SPEN BIT(18) /*!< USART2 clock enable when sleep mode*/ -#define RCU_APB1SPEN_UART3SPEN BIT(19) /*!< UART3 clock enable when sleep mode*/ -#define RCU_APB1SPEN_UART4SPEN BIT(20) /*!< UART4 clock enable when sleep mode */ -#define RCU_APB1SPEN_I2C0SPEN BIT(21) /*!< I2C0 clock enable when sleep mode */ -#define RCU_APB1SPEN_I2C1SPEN BIT(22) /*!< I2C1 clock enable when sleep mode*/ -#define RCU_APB1SPEN_I2C2SPEN BIT(23) /*!< I2C2 clock enable when sleep mode */ -#define RCU_APB1SPEN_CAN0SPEN BIT(25) /*!< CAN0 clock enable when sleep mode*/ -#define RCU_APB1SPEN_CAN1SPEN BIT(26) /*!< CAN1 clock enable when sleep mode */ -#define RCU_APB1SPEN_PMUSPEN BIT(28) /*!< PMU clock enable when sleep mode */ -#define RCU_APB1SPEN_DACSPEN BIT(29) /*!< DAC clock enable when sleep mode */ -#define RCU_APB1SPEN_UART6SPEN BIT(30) /*!< UART6 clock enable when sleep mode */ -#define RCU_APB1SPEN_UART7SPEN BIT(31) /*!< UART7 clock enable when sleep mode */ - -/* RCU_APB2SPEN */ -#define RCU_APB2SPEN_TIMER0SPEN BIT(0) /*!< TIMER0 clock enable when sleep mode */ -#define RCU_APB2SPEN_TIMER7SPEN BIT(1) /*!< TIMER7 clock enable when sleep mode */ -#define RCU_APB2SPEN_USART0SPEN BIT(4) /*!< USART0 clock enable when sleep mode */ -#define RCU_APB2SPEN_USART5SPEN BIT(5) /*!< USART5 clock enable when sleep mode */ -#define RCU_APB2SPEN_ADC0SPEN BIT(8) /*!< ADC0 clock enable when sleep mode */ -#define RCU_APB2SPEN_ADC1SPEN BIT(9) /*!< ADC1 clock enable when sleep mode */ -#define RCU_APB2SPEN_ADC2SPEN BIT(10) /*!< ADC2 clock enable when sleep mode */ -#define RCU_APB2SPEN_SDIOSPEN BIT(11) /*!< SDIO clock enable when sleep mode */ -#define RCU_APB2SPEN_SPI0SPEN BIT(12) /*!< SPI0 clock enable when sleep mode */ -#define RCU_APB2SPEN_SPI3SPEN BIT(13) /*!< SPI3 clock enable when sleep mode */ -#define RCU_APB2SPEN_SYSCFGSPEN BIT(14) /*!< SYSCFG clock enable when sleep mode */ -#define RCU_APB2SPEN_TIMER8SPEN BIT(16) /*!< TIMER8 clock enable when sleep mode */ -#define RCU_APB2SPEN_TIMER9SPEN BIT(17) /*!< TIMER9 clock enable when sleep mode */ -#define RCU_APB2SPEN_TIMER10SPEN BIT(18) /*!< TIMER10 clock enable when sleep mode */ -#define RCU_APB2SPEN_SPI4SPEN BIT(20) /*!< SPI4 clock enable when sleep mode */ -#define RCU_APB2SPEN_SPI5SPEN BIT(21) /*!< SPI5 clock enable when sleep mode */ -#define RCU_APB2SPEN_SAISPEN BIT(22) /*!< SAI clock enable when sleep mode */ -#define RCU_APB2SPEN_TLISPEN BIT(26) /*!< TLI clock enable when sleep mode*/ - -/* RCU_BDCTL */ -#define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */ -#define RCU_BDCTL_LXTALSTB BIT(1) /*!< low speed crystal oscillator stabilization flag */ -#define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */ -#define RCU_BDCTL_LXTALDRI BIT(3) /*!< LXTAL drive capability */ -#define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */ -#define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */ -#define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */ - -/* RCU_RSTSCK */ -#define RCU_RSTSCK_IRC32KEN BIT(0) /*!< IRC32K enable */ -#define RCU_RSTSCK_IRC32KSTB BIT(1) /*!< IRC32K stabilization flag */ -#define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */ -#define RCU_RSTSCK_BORRSTF BIT(25) /*!< BOR reset flag */ -#define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */ -#define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */ -#define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */ -#define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */ -#define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */ -#define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */ - -/* RCU_PLLSSCTL */ -#define RCU_PLLSSCTL_MODCNT BITS(0,12) /*!< these bits configure PLL spread spectrum modulation - profile amplitude and frequency. the following criteria - must be met: MODSTEP*MODCNT=215-1 */ -#define RCU_PLLSSCTL_MODSTEP BITS(13,27) /*!< these bits configure PLL spread spectrum modulation - profile amplitude and frequency. the following criteria - must be met: MODSTEP*MODCNT=215-1 */ -#define RCU_PLLSSCTL_SS_TYPE BIT(30) /*!< PLL spread spectrum modulation type select */ -#define RCU_PLLSSCTL_SSCGON BIT(31) /*!< PLL spread spectrum modulation enable */ - -/* RCU_PLLI2S */ -#define RCU_PLLI2S_PLLI2SN BITS(6,14) /*!< the PLLI2S VCO clock multi factor */ -#define RCU_PLLI2S_PLLI2SQ BITS(24,27) /*!< the PLLI2S Q output frequency division factor from PLLI2S VCO clock */ -#define RCU_PLLI2S_PLLI2SR BITS(28,30) /*!< the PLLI2S R output frequency division factor from PLLI2S VCO clock */ - -/* RCU_PLLSAI */ -#define RCU_PLLSAI_PLLSAIN BITS(6,14) /*!< the PLLSAI VCO clock multi factor */ -#define RCU_PLLSAI_PLLSAIP BITS(16,17) /*!< the PLLSAI P output frequency division factor from PLLSAI VCO clock */ -#define RCU_PLLSAI_PLLSAIQ BITS(24,27) /*!< the PLLSAI Q output frequency division factor from PLLSAI VCO clock */ -#define RCU_PLLSAI_PLLSAIR BITS(28,30) /*!< the PLLSAI R output frequency division factor from PLLSAI VCO clock */ - -/* RCU_CFG1 */ -#define RCU_CFG1_PLLSAIRDIV BITS(16,17) /*!< the divider factor from PLLSAIR clock */ - -/* RCU_SAISEL */ -#define RCU_CFG1_SAISEL BITS(20,21) /*!< SAI clock selection */ -#define RCU_CFG1_TIMERSEL BIT(24) /*!< TIMER clock selection */ - -/* RCU_CFG2 */ -#define RCU_CFG2_I2C3SEL BITS(0,1) /*!< I2C3 clock source selection */ -#define RCU_CFG2_I2C4SEL BITS(2,3) /*!< I2C4 clock source selection */ -#define RCU_CFG2_I2C5SEL BITS(4,5) /*!< I2C5 clock source selection */ - -/* RCU_ADDCTL */ -#define RCU_ADDCTL_CK48MSEL BIT(0) /*!< 48MHz clock selection */ -#define RCU_ADDCTL_PLL48MSEL BIT(1) /*!< PLL48M clock selection */ -#define RCU_ADDCTL_IRC48MEN BIT(16) /*!< internal 48MHz RC oscillator enable */ -#define RCU_ADDCTL_IRC48MSTB BIT(17) /*!< internal 48MHz RC oscillator clock stabilization flag */ -#define RCU_ADDCTL_IRC48MCAL BITS(24,31) /*!< internal 48MHz RC oscillator calibration value register */ - -/* RCU_ADDINT */ -#define RCU_ADDINT_IRC48MSTBIF BIT(6) /*!< IRC48M stabilization interrupt flag */ -#define RCU_ADDINT_IRC48MSTBIE BIT(14) /*!< internal 48 MHz RC oscillator stabilization interrupt enable */ -#define RCU_ADDINT_IRC48MSTBIC BIT(22) /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ - -/* RCU_ADDAPB1RST */ -#define RCU_ADDAPB1RST_CTCRST BIT(27) /*!< CTC reset */ -#define RCU_ADDAPB1RST_IREFRST BIT(31) /*!< IREF reset */ - -/* RCU_ADDAPB1EN */ -#define RCU_ADDAPB1EN_CTCEN BIT(27) /*!< CTC clock enable */ -#define RCU_ADDAPB1EN_IREFEN BIT(31) /*!< IREF interface clock enable */ - -/* RCU_ADDAPB1SPEN */ -#define RCU_ADDAPB1SPEN_CTCSPEN BIT(27) /*!< CTC clock enable during sleep mode */ -#define RCU_ADDAPB1SPEN_IREFSPEN BIT(31) /*!< IREF interface clock enable during sleep mode */ - -/* RCU_VKEY */ -#define RCU_VKEY_KEY BITS(0,31) /*!< RCU_DSV key register */ - -/* RCU_DSV */ -#define RCU_DSV_DSLPVS BITS(0,2) /*!< deep-sleep mode voltage select */ - -/* constants definitions */ -/* define the peripheral clock enable bit position and its register index offset */ -#define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph) >> 6))) -#define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU) -/* define the voltage key unlock value */ -#define RCU_VKEY_UNLOCK ((uint32_t)0x1A2B3C4DU) - -/* register offset */ -/* peripherals enable */ -#define AHB1EN_REG_OFFSET 0x30U /*!< AHB1 enable register offset */ -#define AHB2EN_REG_OFFSET 0x34U /*!< AHB2 enable register offset */ -#define AHB3EN_REG_OFFSET 0x38U /*!< AHB3 enable register offset */ -#define APB1EN_REG_OFFSET 0x40U /*!< APB1 enable register offset */ -#define APB2EN_REG_OFFSET 0x44U /*!< APB2 enable register offset */ -#define AHB1SPEN_REG_OFFSET 0x50U /*!< AHB1 sleep mode enable register offset */ -#define AHB2SPEN_REG_OFFSET 0x54U /*!< AHB2 sleep mode enable register offset */ -#define AHB3SPEN_REG_OFFSET 0x58U /*!< AHB3 sleep mode enable register offset */ -#define APB1SPEN_REG_OFFSET 0x60U /*!< APB1 sleep mode enable register offset */ -#define APB2SPEN_REG_OFFSET 0x64U /*!< APB2 sleep mode enable register offset */ -#define ADD_APB1EN_REG_OFFSET 0xE4U /*!< APB1 additional enable register offset */ -#define ADD_APB1SPEN_REG_OFFSET 0xE8U /*!< APB1 additional sleep mode enable register offset */ - -/* peripherals reset */ -#define AHB1RST_REG_OFFSET 0x10U /*!< AHB1 reset register offset */ -#define AHB2RST_REG_OFFSET 0x14U /*!< AHB2 reset register offset */ -#define AHB3RST_REG_OFFSET 0x18U /*!< AHB3 reset register offset */ -#define APB1RST_REG_OFFSET 0x20U /*!< APB1 reset register offset */ -#define APB2RST_REG_OFFSET 0x24U /*!< APB2 reset register offset */ -#define ADD_APB1RST_REG_OFFSET 0xE0U /*!< APB1 additional reset register offset */ -#define RSTSCK_REG_OFFSET 0x74U /*!< reset source/clock register offset */ - -/* clock control */ -#define CTL_REG_OFFSET 0x00U /*!< control register offset */ -#define BDCTL_REG_OFFSET 0x70U /*!< backup domain control register offset */ -#define ADDCTL_REG_OFFSET 0xC0U /*!< additional clock control register offset */ - -/* clock stabilization and stuck interrupt */ -#define INT_REG_OFFSET 0x0CU /*!< clock interrupt register offset */ -#define ADDINT_REG_OFFSET 0xCCU /*!< additional clock interrupt register offset */ - -/* configuration register */ -#define PLL_REG_OFFSET 0x04U /*!< PLL register offset */ -#define CFG0_REG_OFFSET 0x08U /*!< clock configuration register 0 offset */ -#define PLLSSCTL_REG_OFFSET 0x80U /*!< PLL clock spread spectrum control register offset */ -#define PLLI2S_REG_OFFSET 0x84U /*!< PLLI2S register offset */ -#define PLLSAI_REG_OFFSET 0x88U /*!< PLLSAI register offset */ -#define CFG1_REG_OFFSET 0x8CU /*!< clock configuration register 1 offset */ - -/* peripheral clock enable */ -typedef enum -{ - /* AHB1 peripherals */ - RCU_GPIOA = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 0U), /*!< GPIOA clock */ - RCU_GPIOB = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 1U), /*!< GPIOB clock */ - RCU_GPIOC = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 2U), /*!< GPIOC clock */ - RCU_GPIOD = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 3U), /*!< GPIOD clock */ - RCU_GPIOE = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 4U), /*!< GPIOE clock */ - RCU_GPIOF = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 5U), /*!< GPIOF clock */ - RCU_GPIOG = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 6U), /*!< GPIOG clock */ - RCU_GPIOH = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 7U), /*!< GPIOH clock */ - RCU_GPIOI = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 8U), /*!< GPIOI clock */ - RCU_CRC = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 12U), /*!< CRC clock */ - RCU_BKPSRAM = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 18U), /*!< BKPSRAM clock */ - RCU_TCMSRAM = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 20U), /*!< TCMSRAM clock */ - RCU_DMA0 = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 21U), /*!< DMA0 clock */ - RCU_DMA1 = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 22U), /*!< DMA1 clock */ - RCU_IPA = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 23U), /*!< IPA clock */ - RCU_ENET = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 25U), /*!< ENET clock */ - RCU_ENETTX = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 26U), /*!< ENETTX clock */ - RCU_ENETRX = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 27U), /*!< ENETRX clock */ - RCU_ENETPTP = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 28U), /*!< ENETPTP clock */ - RCU_USBHS = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 29U), /*!< USBHS clock */ - RCU_USBHSULPI = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 30U), /*!< USBHSULPI clock */ - /* AHB2 peripherals */ - RCU_DCI = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 0U), /*!< DCI clock */ - RCU_PKCAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 3U), /*!< PKCAU clock */ - RCU_CAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 4U), /*!< CAU clock */ - RCU_HAU = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 5U), /*!< HAU clock */ - RCU_TRNG = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 6U), /*!< TRNG clock */ - RCU_USBFS = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 7U), /*!< USBFS clock */ - /* AHB3 peripherals */ - RCU_EXMC = RCU_REGIDX_BIT(AHB3EN_REG_OFFSET, 0U), /*!< EXMC clock */ - /* APB1 peripherals */ - RCU_TIMER1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U), /*!< TIMER1 clock */ - RCU_TIMER2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U), /*!< TIMER2 clock */ - RCU_TIMER3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U), /*!< TIMER3 clock */ - RCU_TIMER4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U), /*!< TIMER4 clock */ - RCU_TIMER5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U), /*!< TIMER5 clock */ - RCU_TIMER6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U), /*!< TIMER6 clock */ - RCU_TIMER11 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 6U), /*!< TIMER11 clock */ - RCU_TIMER12 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 7U), /*!< TIMER12 clock */ - RCU_TIMER13 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 8U), /*!< TIMER13 clock */ - RCU_I2C3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 10U), /*!< I2C3 clock */ - RCU_WWDGT = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U), /*!< WWDGT clock */ - RCU_I2C4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 12U), /*!< I2C4 clock */ - RCU_I2C5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 13U), /*!< I2C5 clock */ - RCU_SPI1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U), /*!< SPI1 clock */ - RCU_SPI2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U), /*!< SPI2 clock */ - RCU_USART1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U), /*!< USART1 clock */ - RCU_USART2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U), /*!< USART2 clock */ - RCU_UART3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U), /*!< UART3 clock */ - RCU_UART4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U), /*!< UART4 clock */ - RCU_I2C0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U), /*!< I2C0 clock */ - RCU_I2C1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U), /*!< I2C1 clock */ - RCU_I2C2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 23U), /*!< I2C2 clock */ - RCU_CAN0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U), /*!< CAN0 clock */ - RCU_CAN1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U), /*!< CAN1 clock */ - RCU_PMU = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U), /*!< PMU clock */ - RCU_DAC = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U), /*!< DAC clock */ - RCU_UART6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 30U), /*!< UART6 clock */ - RCU_UART7 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 31U), /*!< UART7 clock */ - RCU_RTC = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U), /*!< RTC clock */ - /* APB2 peripherals */ - RCU_TIMER0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U), /*!< TIMER0 clock */ - RCU_TIMER7 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 1U), /*!< TIMER7 clock */ - RCU_USART0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U), /*!< USART0 clock */ - RCU_USART5 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U), /*!< USART5 clock */ - RCU_ADC0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 8U), /*!< ADC0 clock */ - RCU_ADC1 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U), /*!< ADC1 clock */ - RCU_ADC2 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U), /*!< ADC2 clock */ - RCU_SDIO = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U), /*!< SDIO clock */ - RCU_SPI0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U), /*!< SPI0 clock */ - RCU_SPI3 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 13U), /*!< SPI3 clock */ - RCU_SYSCFG = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U), /*!< SYSCFG clock */ - RCU_TIMER8 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 16U), /*!< TIMER8 clock */ - RCU_TIMER9 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 17U), /*!< TIMER9 clock */ - RCU_TIMER10 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 18U), /*!< TIMER10 clock */ - RCU_SPI4 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 20U), /*!< SPI4 clock */ - RCU_SPI5 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 21U), /*!< SPI5 clock */ - RCU_SAI = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 22U), /*!< SAI clock */ - RCU_TLI = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 26U), /*!< TLI clock */ - /* APB1 additional peripherals */ - RCU_CTC = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 27U), /*!< CTC clock */ - RCU_IREF = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 31U), /*!< IREF clock */ -}rcu_periph_enum; - -/* peripheral clock enable when sleep mode*/ -typedef enum -{ - /* AHB1 peripherals */ - RCU_GPIOA_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 0U), /*!< GPIOA clock */ - RCU_GPIOB_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 1U), /*!< GPIOB clock */ - RCU_GPIOC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 2U), /*!< GPIOC clock */ - RCU_GPIOD_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 3U), /*!< GPIOD clock */ - RCU_GPIOE_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 4U), /*!< GPIOE clock */ - RCU_GPIOF_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 5U), /*!< GPIOF clock */ - RCU_GPIOG_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 6U), /*!< GPIOG clock */ - RCU_GPIOH_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 7U), /*!< GPIOH clock */ - RCU_GPIOI_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 8U), /*!< GPIOI clock */ - RCU_CRC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 12U), /*!< CRC clock */ - RCU_FMC_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 15U), /*!< FMC clock */ - RCU_SRAM0_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 16U), /*!< SRAM0 clock */ - RCU_SRAM1_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 17U), /*!< SRAM1 clock */ - RCU_BKPSRAM_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 18U), /*!< BKPSRAM clock */ - RCU_SRAM2_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 19U), /*!< SRAM2 clock */ - RCU_DMA0_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 21U), /*!< DMA0 clock */ - RCU_DMA1_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 22U), /*!< DMA1 clock */ - RCU_IPA_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 23U), /*!< IPA clock */ - RCU_ENET_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 25U), /*!< ENET clock */ - RCU_ENETTX_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 26U), /*!< ENETTX clock */ - RCU_ENETRX_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 27U), /*!< ENETRX clock */ - RCU_ENETPTP_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 28U), /*!< ENETPTP clock */ - RCU_USBHS_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 29U), /*!< USBHS clock */ - RCU_USBHSULPI_SLP = RCU_REGIDX_BIT(AHB1SPEN_REG_OFFSET, 30U), /*!< USBHSULPI clock */ - /* AHB2 peripherals */ - RCU_DCI_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 0U), /*!< DCI clock */ - RCU_PKCAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 3U), /*!< PKCAU clock */ - RCU_CAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 4U), /*!< CAU clock */ - RCU_HAU_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 5U), /*!< HAU clock */ - RCU_TRNG_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 6U), /*!< TRNG clock */ - RCU_USBFS_SLP = RCU_REGIDX_BIT(AHB2SPEN_REG_OFFSET, 7U), /*!< USBFS clock */ - /* AHB3 peripherals */ - RCU_EXMC_SLP = RCU_REGIDX_BIT(AHB3SPEN_REG_OFFSET, 0U), /*!< EXMC clock */ - /* APB1 peripherals */ - RCU_TIMER1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 0U), /*!< TIMER1 clock */ - RCU_TIMER2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 1U), /*!< TIMER2 clock */ - RCU_TIMER3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 2U), /*!< TIMER3 clock */ - RCU_TIMER4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 3U), /*!< TIMER4 clock */ - RCU_TIMER5_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 4U), /*!< TIMER5 clock */ - RCU_TIMER6_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 5U), /*!< TIMER6 clock */ - RCU_TIMER11_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 6U), /*!< TIMER11 clock */ - RCU_TIMER12_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 7U), /*!< TIMER12 clock */ - RCU_TIMER13_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 8U), /*!< TIMER13 clock */ - RCU_I2C3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 10U), /*!< I2C3 clock */ - RCU_WWDGT_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 11U), /*!< WWDGT clock */ - RCU_I2C4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 12U), /*!< I2C4 clock */ - RCU_I2C5_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 13U), /*!< I2C5 clock */ - RCU_SPI1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 14U), /*!< SPI1 clock */ - RCU_SPI2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 15U), /*!< SPI2 clock */ - RCU_USART1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 17U), /*!< USART1 clock */ - RCU_USART2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 18U), /*!< USART2 clock */ - RCU_UART3_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 19U), /*!< UART3 clock */ - RCU_UART4_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 20U), /*!< UART4 clock */ - RCU_I2C0_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 21U), /*!< I2C0 clock */ - RCU_I2C1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 22U), /*!< I2C1 clock */ - RCU_I2C2_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 23U), /*!< I2C2 clock */ - RCU_CAN0_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 25U), /*!< CAN0 clock */ - RCU_CAN1_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 26U), /*!< CAN1 clock */ - RCU_PMU_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 28U), /*!< PMU clock */ - RCU_DAC_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 29U), /*!< DAC clock */ - RCU_UART6_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 30U), /*!< UART6 clock */ - RCU_UART7_SLP = RCU_REGIDX_BIT(APB1SPEN_REG_OFFSET, 31U), /*!< UART7 clock */ - /* APB2 peripherals */ - RCU_TIMER0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 0U), /*!< TIMER0 clock */ - RCU_TIMER7_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 1U), /*!< TIMER7 clock */ - RCU_USART0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 4U), /*!< USART0 clock */ - RCU_USART5_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 5U), /*!< USART5 clock */ - RCU_ADC0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 8U), /*!< ADC0 clock */ - RCU_ADC1_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 9U), /*!< ADC1 clock */ - RCU_ADC2_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 10U), /*!< ADC2 clock */ - RCU_SDIO_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 11U), /*!< SDIO clock */ - RCU_SPI0_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 12U), /*!< SPI0 clock */ - RCU_SPI3_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 13U), /*!< SPI3 clock */ - RCU_SYSCFG_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 14U), /*!< SYSCFG clock */ - RCU_TIMER8_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 16U), /*!< TIMER8 clock */ - RCU_TIMER9_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 17U), /*!< TIMER9 clock */ - RCU_TIMER10_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 18U), /*!< TIMER10 clock */ - RCU_SPI4_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 20U), /*!< SPI4 clock */ - RCU_SPI5_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 21U), /*!< SPI5 clock */ - RCU_SAI_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 22U), /*!< SAI clock */ - RCU_TLI_SLP = RCU_REGIDX_BIT(APB2SPEN_REG_OFFSET, 26U), /*!< TLI clock */ - /* APB1 additional peripherals */ - RCU_CTC_SLP = RCU_REGIDX_BIT(ADD_APB1SPEN_REG_OFFSET, 27U), /*!< CTC clock */ - RCU_IREF_SLP = RCU_REGIDX_BIT(ADD_APB1SPEN_REG_OFFSET, 31U), /*!< IREF clock */ -}rcu_periph_sleep_enum; - -/* peripherals reset */ -typedef enum -{ - /* AHB1 peripherals */ - RCU_GPIOARST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 0U), /*!< GPIOA clock reset */ - RCU_GPIOBRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 1U), /*!< GPIOB clock reset */ - RCU_GPIOCRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 2U), /*!< GPIOC clock reset */ - RCU_GPIODRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 3U), /*!< GPIOD clock reset */ - RCU_GPIOERST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 4U), /*!< GPIOE clock reset */ - RCU_GPIOFRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 5U), /*!< GPIOF clock reset */ - RCU_GPIOGRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 6U), /*!< GPIOG clock reset */ - RCU_GPIOHRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 7U), /*!< GPIOH clock reset */ - RCU_GPIOIRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 8U), /*!< GPIOI clock reset */ - RCU_CRCRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 12U), /*!< CRC clock reset */ - RCU_DMA0RST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 21U), /*!< DMA0 clock reset */ - RCU_DMA1RST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 22U), /*!< DMA1 clock reset */ - RCU_IPARST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 23U), /*!< IPA clock reset */ - RCU_ENETRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 25U), /*!< ENET clock reset */ - RCU_USBHSRST = RCU_REGIDX_BIT(AHB1RST_REG_OFFSET, 29U), /*!< USBHS clock reset */ - /* AHB2 peripherals */ - RCU_DCIRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 0U), /*!< DCI clock reset */ - RCU_PKCAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 3U), /*!< PKCAU clock reset */ - RCU_CAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 4U), /*!< CAU clock reset */ - RCU_HAURST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 5U), /*!< HAU clock reset */ - RCU_TRNGRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 6U), /*!< TRNG clock reset */ - RCU_USBFSRST = RCU_REGIDX_BIT(AHB2RST_REG_OFFSET, 7U), /*!< USBFS clock reset */ - /* AHB3 peripherals */ - RCU_EXMCRST = RCU_REGIDX_BIT(AHB3RST_REG_OFFSET, 0U), /*!< EXMC clock reset */ - /* APB1 peripherals */ - RCU_TIMER1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 0U), /*!< TIMER1 clock reset */ - RCU_TIMER2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 1U), /*!< TIMER2 clock reset */ - RCU_TIMER3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 2U), /*!< TIMER3 clock reset */ - RCU_TIMER4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 3U), /*!< TIMER4 clock reset */ - RCU_TIMER5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 4U), /*!< TIMER5 clock reset */ - RCU_TIMER6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 5U), /*!< TIMER6 clock reset */ - RCU_TIMER11RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 6U), /*!< TIMER11 clock reset */ - RCU_TIMER12RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 7U), /*!< TIMER12 clock reset */ - RCU_TIMER13RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 8U), /*!< TIMER13 clock reset */ - RCU_I2C3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 10U), /*!< I2C3 clock reset */ - RCU_WWDGTRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 11U), /*!< WWDGT clock reset */ - RCU_I2C4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 12U), /*!< I2C4 clock reset */ - RCU_I2C5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 13U), /*!< I2C5 clock reset */ - RCU_SPI1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 14U), /*!< SPI1 clock reset */ - RCU_SPI2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 15U), /*!< SPI2 clock reset */ - RCU_USART1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 17U), /*!< USART1 clock reset */ - RCU_USART2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 18U), /*!< USART2 clock reset */ - RCU_UART3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 19U), /*!< UART3 clock reset */ - RCU_UART4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 20U), /*!< UART4 clock reset */ - RCU_I2C0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 21U), /*!< I2C0 clock reset */ - RCU_I2C1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 22U), /*!< I2C1 clock reset */ - RCU_I2C2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 23U), /*!< I2C2 clock reset */ - RCU_CAN0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 25U), /*!< CAN0 clock reset */ - RCU_CAN1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 26U), /*!< CAN1 clock reset */ - RCU_PMURST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 28U), /*!< PMU clock reset */ - RCU_DACRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 29U), /*!< DAC clock reset */ - RCU_UART6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 30U), /*!< UART6 clock reset */ - RCU_UART7RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 31U), /*!< UART7 clock reset */ - /* APB2 peripherals */ - RCU_TIMER0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 0U), /*!< TIMER0 clock reset */ - RCU_TIMER7RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 1U), /*!< TIMER7 clock reset */ - RCU_USART0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 4U), /*!< USART0 clock reset */ - RCU_USART5RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 5U), /*!< USART5 clock reset */ - RCU_ADCRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 8U), /*!< ADCs all clock reset */ - RCU_SDIORST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 11U), /*!< SDIO clock reset */ - RCU_SPI0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 12U), /*!< SPI0 clock reset */ - RCU_SPI3RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 13U), /*!< SPI3 clock reset */ - RCU_SYSCFGRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 14U), /*!< SYSCFG clock reset */ - RCU_TIMER8RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 16U), /*!< TIMER8 clock reset */ - RCU_TIMER9RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 17U), /*!< TIMER9 clock reset */ - RCU_TIMER10RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 18U), /*!< TIMER10 clock reset */ - RCU_SPI4RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 20U), /*!< SPI4 clock reset */ - RCU_SPI5RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 21U), /*!< SPI5 clock reset */ - RCU_SAIRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 22U), /*!< SAI clock reset */ - RCU_TLIRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 26U), /*!< TLI clock reset */ - /* APB1 additional peripherals */ - RCU_CTCRST = RCU_REGIDX_BIT(ADD_APB1RST_REG_OFFSET, 27U), /*!< CTC clock reset */ - RCU_IREFRST = RCU_REGIDX_BIT(ADD_APB1RST_REG_OFFSET, 31U) /*!< IREF clock reset */ -}rcu_periph_reset_enum; - -/* clock stabilization and peripheral reset flags */ -typedef enum -{ - /* clock stabilization flags */ - RCU_FLAG_IRC16MSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 1U), /*!< IRC16M stabilization flags */ - RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 17U), /*!< HXTAL stabilization flags */ - RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 25U), /*!< PLL stabilization flags */ - RCU_FLAG_PLLI2SSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 27U), /*!< PLLI2S stabilization flags */ - RCU_FLAG_PLLSAISTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 29U), /*!< PLLSAI stabilization flags */ - RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 1U), /*!< LXTAL stabilization flags */ - RCU_FLAG_IRC32KSTB = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 1U), /*!< IRC32K stabilization flags */ - RCU_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 17U), /*!< IRC48M stabilization flags */ - /* reset source flags */ - RCU_FLAG_BORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 25U), /*!< BOR reset flags */ - RCU_FLAG_EPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 26U), /*!< External PIN reset flags */ - RCU_FLAG_PORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 27U), /*!< power reset flags */ - RCU_FLAG_SWRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 28U), /*!< Software reset flags */ - RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 29U), /*!< FWDGT reset flags */ - RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 30U), /*!< WWDGT reset flags */ - RCU_FLAG_LPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 31U), /*!< Low-power reset flags */ -}rcu_flag_enum; - -/* clock stabilization and ckm interrupt flags */ -typedef enum -{ - RCU_INT_FLAG_IRC32KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 0U), /*!< IRC32K stabilization interrupt flag */ - RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 1U), /*!< LXTAL stabilization interrupt flag */ - RCU_INT_FLAG_IRC16MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 2U), /*!< IRC16M stabilization interrupt flag */ - RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 3U), /*!< HXTAL stabilization interrupt flag */ - RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 4U), /*!< PLL stabilization interrupt flag */ - RCU_INT_FLAG_PLLI2SSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 5U), /*!< PLLI2S stabilization interrupt flag */ - RCU_INT_FLAG_PLLSAISTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 6U), /*!< PLLSAI stabilization interrupt flag */ - RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(INT_REG_OFFSET, 7U), /*!< HXTAL clock stuck interrupt flag */ - RCU_INT_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 6U), /*!< IRC48M stabilization interrupt flag */ -}rcu_int_flag_enum; - -/* clock stabilization and stuck interrupt flags clear */ -typedef enum -{ - RCU_INT_FLAG_IRC32KSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 16U), /*!< IRC32K stabilization interrupt flags clear */ - RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 17U), /*!< LXTAL stabilization interrupt flags clear */ - RCU_INT_FLAG_IRC16MSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 18U), /*!< IRC16M stabilization interrupt flags clear */ - RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 19U), /*!< HXTAL stabilization interrupt flags clear */ - RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 20U), /*!< PLL stabilization interrupt flags clear */ - RCU_INT_FLAG_PLLI2SSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 21U), /*!< PLLI2S stabilization interrupt flags clear */ - RCU_INT_FLAG_PLLSAISTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 22U), /*!< PLLSAI stabilization interrupt flags clear */ - RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 23U), /*!< CKM interrupt flags clear */ - RCU_INT_FLAG_IRC48MSTB_CLR = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 22U), /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ -}rcu_int_flag_clear_enum; - -/* clock stabilization interrupt enable or disable */ -typedef enum -{ - RCU_INT_IRC32KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 8U), /*!< IRC32K stabilization interrupt */ - RCU_INT_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 9U), /*!< LXTAL stabilization interrupt */ - RCU_INT_IRC16MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 10U), /*!< IRC16M stabilization interrupt */ - RCU_INT_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 11U), /*!< HXTAL stabilization interrupt */ - RCU_INT_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 12U), /*!< PLL stabilization interrupt */ - RCU_INT_PLLI2SSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 13U), /*!< PLLI2S stabilization interrupt */ - RCU_INT_PLLSAISTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 14U), /*!< PLLSAI stabilization interrupt */ - RCU_INT_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 14U), /*!< internal 48 MHz RC oscillator stabilization interrupt */ -}rcu_int_enum; - -/* oscillator types */ -typedef enum -{ - RCU_HXTAL = RCU_REGIDX_BIT(CTL_REG_OFFSET, 16U), /*!< HXTAL */ - RCU_LXTAL = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 0U), /*!< LXTAL */ - RCU_IRC16M = RCU_REGIDX_BIT(CTL_REG_OFFSET, 0U), /*!< IRC16M */ - RCU_IRC48M = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 16U), /*!< IRC48M */ - RCU_IRC32K = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 0U), /*!< IRC32K */ - RCU_PLL_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 24U), /*!< PLL */ - RCU_PLLI2S_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 26U), /*!< PLLI2S */ - RCU_PLLSAI_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 28U), /*!< PLLSAI */ -}rcu_osci_type_enum; - -/* rcu clock frequency */ -typedef enum -{ - CK_SYS = 0, /*!< system clock */ - CK_AHB, /*!< AHB clock */ - CK_APB1, /*!< APB1 clock */ - CK_APB2, /*!< APB2 clock */ -}rcu_clock_freq_enum; - -typedef enum { - IDX_I2C3 = 0U, /*!< idnex of I2C3 */ - IDX_I2C4, /*!< idnex of I2C4 */ - IDX_I2C5 /*!< idnex of I2C5 */ -} i2c_idx_enum; - -/* RCU_CFG0 register bit define */ -/* system clock source select */ -#define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define RCU_CKSYSSRC_IRC16M CFG0_SCS(0) /*!< system clock source select IRC16M */ -#define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */ -#define RCU_CKSYSSRC_PLLP CFG0_SCS(2) /*!< system clock source select PLLP */ - -/* system clock source select status */ -#define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) -#define RCU_SCSS_IRC16M CFG0_SCSS(0) /*!< system clock source select IRC16M */ -#define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */ -#define RCU_SCSS_PLLP CFG0_SCSS(2) /*!< system clock source select PLLP */ - -/* AHB prescaler selection */ -#define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) -#define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */ -#define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */ -#define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */ -#define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */ -#define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */ -#define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */ -#define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */ -#define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */ -#define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */ - -/* APB1 prescaler selection */ -#define CFG0_APB1PSC(regval) (BITS(10,12) & ((uint32_t)(regval) << 10)) -#define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */ -#define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */ -#define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */ -#define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */ -#define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */ - -/* APB2 prescaler selection */ -#define CFG0_APB2PSC(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) -#define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */ -#define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */ -#define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */ -#define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */ -#define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */ - -/* RTC clock divider factor from HXTAL clock */ -#define CFG0_RTCDIV(regval) (BITS(16,20) & ((uint32_t)(regval) << 16)) -#define RCU_RTC_HXTAL_NONE CFG0_RTCDIV(0) /*!< no clock for RTC */ -#define RCU_RTC_HXTAL_DIV2 CFG0_RTCDIV(2) /*!< RTCDIV clock select CK_HXTAL/2 */ -#define RCU_RTC_HXTAL_DIV3 CFG0_RTCDIV(3) /*!< RTCDIV clock select CK_HXTAL/3 */ -#define RCU_RTC_HXTAL_DIV4 CFG0_RTCDIV(4) /*!< RTCDIV clock select CK_HXTAL/4 */ -#define RCU_RTC_HXTAL_DIV5 CFG0_RTCDIV(5) /*!< RTCDIV clock select CK_HXTAL/5 */ -#define RCU_RTC_HXTAL_DIV6 CFG0_RTCDIV(6) /*!< RTCDIV clock select CK_HXTAL/6 */ -#define RCU_RTC_HXTAL_DIV7 CFG0_RTCDIV(7) /*!< RTCDIV clock select CK_HXTAL/7 */ -#define RCU_RTC_HXTAL_DIV8 CFG0_RTCDIV(8) /*!< RTCDIV clock select CK_HXTAL/8 */ -#define RCU_RTC_HXTAL_DIV9 CFG0_RTCDIV(9) /*!< RTCDIV clock select CK_HXTAL/9 */ -#define RCU_RTC_HXTAL_DIV10 CFG0_RTCDIV(10) /*!< RTCDIV clock select CK_HXTAL/10 */ -#define RCU_RTC_HXTAL_DIV11 CFG0_RTCDIV(11) /*!< RTCDIV clock select CK_HXTAL/11 */ -#define RCU_RTC_HXTAL_DIV12 CFG0_RTCDIV(12) /*!< RTCDIV clock select CK_HXTAL/12 */ -#define RCU_RTC_HXTAL_DIV13 CFG0_RTCDIV(13) /*!< RTCDIV clock select CK_HXTAL/13 */ -#define RCU_RTC_HXTAL_DIV14 CFG0_RTCDIV(14) /*!< RTCDIV clock select CK_HXTAL/14 */ -#define RCU_RTC_HXTAL_DIV15 CFG0_RTCDIV(15) /*!< RTCDIV clock select CK_HXTAL/15 */ -#define RCU_RTC_HXTAL_DIV16 CFG0_RTCDIV(16) /*!< RTCDIV clock select CK_HXTAL/16 */ -#define RCU_RTC_HXTAL_DIV17 CFG0_RTCDIV(17) /*!< RTCDIV clock select CK_HXTAL/17 */ -#define RCU_RTC_HXTAL_DIV18 CFG0_RTCDIV(18) /*!< RTCDIV clock select CK_HXTAL/18 */ -#define RCU_RTC_HXTAL_DIV19 CFG0_RTCDIV(19) /*!< RTCDIV clock select CK_HXTAL/19 */ -#define RCU_RTC_HXTAL_DIV20 CFG0_RTCDIV(20) /*!< RTCDIV clock select CK_HXTAL/20 */ -#define RCU_RTC_HXTAL_DIV21 CFG0_RTCDIV(21) /*!< RTCDIV clock select CK_HXTAL/21 */ -#define RCU_RTC_HXTAL_DIV22 CFG0_RTCDIV(22) /*!< RTCDIV clock select CK_HXTAL/22 */ -#define RCU_RTC_HXTAL_DIV23 CFG0_RTCDIV(23) /*!< RTCDIV clock select CK_HXTAL/23 */ -#define RCU_RTC_HXTAL_DIV24 CFG0_RTCDIV(24) /*!< RTCDIV clock select CK_HXTAL/24 */ -#define RCU_RTC_HXTAL_DIV25 CFG0_RTCDIV(25) /*!< RTCDIV clock select CK_HXTAL/25 */ -#define RCU_RTC_HXTAL_DIV26 CFG0_RTCDIV(26) /*!< RTCDIV clock select CK_HXTAL/26 */ -#define RCU_RTC_HXTAL_DIV27 CFG0_RTCDIV(27) /*!< RTCDIV clock select CK_HXTAL/27 */ -#define RCU_RTC_HXTAL_DIV28 CFG0_RTCDIV(28) /*!< RTCDIV clock select CK_HXTAL/28 */ -#define RCU_RTC_HXTAL_DIV29 CFG0_RTCDIV(29) /*!< RTCDIV clock select CK_HXTAL/29 */ -#define RCU_RTC_HXTAL_DIV30 CFG0_RTCDIV(30) /*!< RTCDIV clock select CK_HXTAL/30 */ -#define RCU_RTC_HXTAL_DIV31 CFG0_RTCDIV(31) /*!< RTCDIV clock select CK_HXTAL/31 */ - -/* CKOUT0 Clock source selection */ -#define CFG0_CKOUT0SEL(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) -#define RCU_CKOUT0SRC_IRC16M CFG0_CKOUT0SEL(0) /*!< internal 16M RC oscillator clock selected */ -#define RCU_CKOUT0SRC_LXTAL CFG0_CKOUT0SEL(1) /*!< low speed crystal oscillator clock (LXTAL) selected */ -#define RCU_CKOUT0SRC_HXTAL CFG0_CKOUT0SEL(2) /*!< high speed crystal oscillator clock (HXTAL) selected */ -#define RCU_CKOUT0SRC_PLLP CFG0_CKOUT0SEL(3) /*!< CK_PLLP clock selected */ - -/* I2S Clock source selection */ -#define RCU_I2SSRC_PLLI2S ((uint32_t)0x00000000U) /*!< PLLI2S output clock selected as I2S source clock */ -#define RCU_I2SSRC_I2S_CKIN RCU_CFG0_I2SSEL /*!< external I2S_CKIN pin selected as I2S source clock */ - -/* I2Cx(x=3,4,5) clock source selection */ -#define CFG2_I2C3SEL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0U)) -#define RCU_I2CSRC_CKAPB1 CFG2_I2C3SEL(0) /*!< CK_I2C select CK_APB1 */ -#define RCU_I2CSRC_PLLSAIR CFG2_I2C3SEL(1) /*!< CK_I2C select CK_PLLSAIR */ -#define RCU_I2CSRC_IRC16M CFG2_I2C3SEL(2) /*!< CK_I2C select IRC16M */ - -/* The CK_OUT0 divider */ -#define CFG0_CKOUT0DIV(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) -#define RCU_CKOUT0_DIV1 CFG0_CKOUT0DIV(0) /*!< CK_OUT0 is divided by 1 */ -#define RCU_CKOUT0_DIV2 CFG0_CKOUT0DIV(4) /*!< CK_OUT0 is divided by 2 */ -#define RCU_CKOUT0_DIV3 CFG0_CKOUT0DIV(5) /*!< CK_OUT0 is divided by 3 */ -#define RCU_CKOUT0_DIV4 CFG0_CKOUT0DIV(6) /*!< CK_OUT0 is divided by 4 */ -#define RCU_CKOUT0_DIV5 CFG0_CKOUT0DIV(7) /*!< CK_OUT0 is divided by 5 */ - -/* The CK_OUT1 divider */ -#define CFG0_CKOUT1DIV(regval) (BITS(27,29) & ((uint32_t)(regval) << 27)) -#define RCU_CKOUT1_DIV1 CFG0_CKOUT1DIV(0) /*!< CK_OUT1 is divided by 1 */ -#define RCU_CKOUT1_DIV2 CFG0_CKOUT1DIV(4) /*!< CK_OUT1 is divided by 2 */ -#define RCU_CKOUT1_DIV3 CFG0_CKOUT1DIV(5) /*!< CK_OUT1 is divided by 3 */ -#define RCU_CKOUT1_DIV4 CFG0_CKOUT1DIV(6) /*!< CK_OUT1 is divided by 4 */ -#define RCU_CKOUT1_DIV5 CFG0_CKOUT1DIV(7) /*!< CK_OUT1 is divided by 5 */ - -/* CKOUT1 Clock source selection */ -#define CFG0_CKOUT1SEL(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) -#define RCU_CKOUT1SRC_SYSTEMCLOCK CFG0_CKOUT1SEL(0) /*!< system clock selected */ -#define RCU_CKOUT1SRC_PLLI2SR CFG0_CKOUT1SEL(1) /*!< CK_PLLI2SR clock selected */ -#define RCU_CKOUT1SRC_HXTAL CFG0_CKOUT1SEL(2) /*!< high speed crystal oscillator clock (HXTAL) selected */ -#define RCU_CKOUT1SRC_PLLP CFG0_CKOUT1SEL(3) /*!< CK_PLLP clock selected */ - -/* RCU_CFG1 register bit define */ -/* the divider factor from PLLI2SQ clock */ -#define CFG1_PLLI2SQDIV(regval) (BITS(0,4) & ((uint32_t)(regval) << 0)) -#define RCU_PLLI2SQ_DIV1 CFG1_PLLI2SQDIV(0) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/1 */ -#define RCU_PLLI2SQ_DIV2 CFG1_PLLI2SQDIV(1) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/2 */ -#define RCU_PLLI2SQ_DIV3 CFG1_PLLI2SQDIV(2) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/3 */ -#define RCU_PLLI2SQ_DIV4 CFG1_PLLI2SQDIV(3) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/4 */ -#define RCU_PLLI2SQ_DIV5 CFG1_PLLI2SQDIV(4) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/5 */ -#define RCU_PLLI2SQ_DIV6 CFG1_PLLI2SQDIV(5) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/6 */ -#define RCU_PLLI2SQ_DIV7 CFG1_PLLI2SQDIV(6) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/7 */ -#define RCU_PLLI2SQ_DIV8 CFG1_PLLI2SQDIV(7) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/8 */ -#define RCU_PLLI2SQ_DIV9 CFG1_PLLI2SQDIV(8) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/9 */ -#define RCU_PLLI2SQ_DIV10 CFG1_PLLI2SQDIV(9) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/10 */ -#define RCU_PLLI2SQ_DIV11 CFG1_PLLI2SQDIV(10) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/11 */ -#define RCU_PLLI2SQ_DIV12 CFG1_PLLI2SQDIV(11) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/12 */ -#define RCU_PLLI2SQ_DIV13 CFG1_PLLI2SQDIV(12) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/13 */ -#define RCU_PLLI2SQ_DIV14 CFG1_PLLI2SQDIV(13) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/14 */ -#define RCU_PLLI2SQ_DIV15 CFG1_PLLI2SQDIV(14) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/15 */ -#define RCU_PLLI2SQ_DIV16 CFG1_PLLI2SQDIV(15) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/16 */ -#define RCU_PLLI2SQ_DIV17 CFG1_PLLI2SQDIV(16) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/17 */ -#define RCU_PLLI2SQ_DIV18 CFG1_PLLI2SQDIV(17) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/18 */ -#define RCU_PLLI2SQ_DIV19 CFG1_PLLI2SQDIV(18) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/19 */ -#define RCU_PLLI2SQ_DIV20 CFG1_PLLI2SQDIV(19) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/20 */ -#define RCU_PLLI2SQ_DIV21 CFG1_PLLI2SQDIV(20) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/21 */ -#define RCU_PLLI2SQ_DIV22 CFG1_PLLI2SQDIV(21) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/22 */ -#define RCU_PLLI2SQ_DIV23 CFG1_PLLI2SQDIV(22) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/23 */ -#define RCU_PLLI2SQ_DIV24 CFG1_PLLI2SQDIV(23) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/24 */ -#define RCU_PLLI2SQ_DIV25 CFG1_PLLI2SQDIV(24) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/25 */ -#define RCU_PLLI2SQ_DIV26 CFG1_PLLI2SQDIV(25) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/26 */ -#define RCU_PLLI2SQ_DIV27 CFG1_PLLI2SQDIV(26) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/27 */ -#define RCU_PLLI2SQ_DIV28 CFG1_PLLI2SQDIV(27) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/28 */ -#define RCU_PLLI2SQ_DIV29 CFG1_PLLI2SQDIV(28) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/29 */ -#define RCU_PLLI2SQ_DIV30 CFG1_PLLI2SQDIV(29) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/30 */ -#define RCU_PLLI2SQ_DIV31 CFG1_PLLI2SQDIV(30) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/31 */ -#define RCU_PLLI2SQ_DIV32 CFG1_PLLI2SQDIV(31) /*!< CK_PLLI2SQDIV clock select CK_PLLI2SQ/32 */ - -/* SAI clock source selection */ -#define CFG1_SAISEL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20U)) -#define RCU_SAISRC_PLLSAIQ CFG1_SAISEL(0) /*!< CK_SAI select CK_PLLSAIQ */ -#define RCU_SAISRC_PLLI2SQ CFG1_SAISEL(1) /*!< CK_SAI select CK_PLLI2SQ */ -#define RCU_SAISRC_I2S_CKIN BIT(21) /*!< CK_SAI select I2S_CKIN */ - -/* the divider factor from PLLSAIR clock */ -#define CFG1_PLLSAIRDIV(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) -#define RCU_PLLSAIR_DIV2 CFG1_PLLSAIRDIV(0) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/2 */ -#define RCU_PLLSAIR_DIV4 CFG1_PLLSAIRDIV(1) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/4 */ -#define RCU_PLLSAIR_DIV8 CFG1_PLLSAIRDIV(2) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/8 */ -#define RCU_PLLSAIR_DIV16 CFG1_PLLSAIRDIV(3) /*!< CK_PLLSAIRDIV clock select CK_PLLSAIR/16 */ - -/* TIMER clock selection */ -#define RCU_TIMER_PSC_MUL2 ~RCU_CFG1_TIMERSEL /*!< if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB) - or 0b100(CK_APBx = CK_AHB/2), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). - or else, the TIMER clock is twice the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 2 x CK_APB1; - TIMER in APB2 domain: CK_TIMERx = 2 x CK_APB2) */ -#define RCU_TIMER_PSC_MUL4 RCU_CFG1_TIMERSEL /*!< if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB), - 0b100(CK_APBx = CK_AHB/2), or 0b101(CK_APBx = CK_AHB/4), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). - or else, the TIMER clock is four timers the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 4 x CK_APB1; - TIMER in APB2 domain: CK_TIMERx = 4 x CK_APB2) */ - -/* RCU_PLLSSCTL register bit define */ -/* PLL spread spectrum modulation type select */ -#define RCU_SS_TYPE_CENTER ((uint32_t)0x00000000U) /*!< center type is selected */ -#define RCU_SS_TYPE_DOWN RCU_PLLSSCTL_SS_TYPE /*!< down type is selected */ - -/* RCU_PLL register bit define */ -/* The PLL VCO source clock prescaler */ -#define RCU_PLLPSC_DIV_MIN ((uint32_t)2U) /*!< PLLPSC_DIV min value */ -#define RCU_PLLPSC_DIV_MAX ((uint32_t)63U) /*!< PLLPSC_DIV max value */ - -/* The PLL VCO clock multi factor */ -#define RCU_PLLN_MUL_MIN ((uint32_t)64U) /*!< PLLN_MUL min value */ -#define RCU_PLLN_MUL_MAX ((uint32_t)500U) /*!< PLLN_MUL max value */ -#define RCU_SS_MODULATION_CENTER_INC ((uint32_t)5U) /*!< minimum factor of PLLN in center mode */ -#define RCU_SS_MODULATION_DOWN_INC ((uint32_t)7U) /*!< minimum factor of PLLN in down mode */ - -/* The PLLP output frequency division factor from PLL VCO clock */ -#define RCU_PLLP_DIV_MIN ((uint32_t)2U) /*!< PLLP_DIV min value */ -#define RCU_PLLP_DIV_MAX ((uint32_t)8U) /*!< PLLP_DIV max value */ - -/* PLL Clock Source Selection */ -#define RCU_PLLSRC_IRC16M ((uint32_t)0x00000000U) /*!< IRC16M clock selected as source clock of PLL, PLLSAI, PLLI2S */ -#define RCU_PLLSRC_HXTAL RCU_PLL_PLLSEL /*!< HXTAL clock selected as source clock of PLL, PLLSAI, PLLI2S */ - -/* The PLL Q output frequency division factor from PLL VCO clock */ -#define RCU_PLLQ_DIV_MIN ((uint32_t)2U) /*!< PLLQ_DIV min value */ -#define RCU_PLLQ_DIV_MAX ((uint32_t)15U) /*!< PLLQ_DIV max value */ - -#define CHECK_PLL_PSC_VALID(val) (((val) >= RCU_PLLPSC_DIV_MIN)&&((val) <= RCU_PLLPSC_DIV_MAX)) -#define CHECK_PLL_N_VALID(val, inc) (((val) >= (RCU_PLLN_MUL_MIN + (inc)))&&((val) <= RCU_PLLN_MUL_MAX)) -#define CHECK_PLL_P_VALID(val) (((val) == 2U) || ((val) == 4U) || ((val) == 6U) || ((val) == 8U)) -#define CHECK_PLL_Q_VALID(val) (((val) >= RCU_PLLQ_DIV_MIN)&&((val) <= RCU_PLLQ_DIV_MAX)) - -/* RCU_BDCTL register bit define */ -/* LXTAL drive capability */ -#define RCU_LXTALDRI_LOWER_DRIVE ((uint32_t)0x00000000) /*!< LXTAL drive capability is selected lower */ -#define RCU_LXTALDRI_HIGHER_DRIVE RCU_BDCTL_LXTALDRI /*!< LXTAL drive capability is selected higher */ - -/* RTC clock entry selection */ -#define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) -#define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */ -#define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< RTC source clock select LXTAL */ -#define RCU_RTCSRC_IRC32K BDCTL_RTCSRC(2) /*!< RTC source clock select IRC32K */ -#define RCU_RTCSRC_HXTAL_DIV_RTCDIV BDCTL_RTCSRC(3) /*!< RTC source clock select HXTAL/RTCDIV */ - -/* RCU_PLLI2S register bit define */ -/* The PLLI2S VCO clock multi factor */ -#define RCU_PLLI2SN_MUL_MIN 50U -#define RCU_PLLI2SN_MUL_MAX 500U - -/* The PLLI2S Q output frequency division factor from PLLI2S VCO clock */ -#define RCU_PLLI2SQ_DIV_MIN 2U -#define RCU_PLLI2SQ_DIV_MAX 15U - -/* The PLLI2S R output frequency division factor from PLLI2S VCO clock */ -#define RCU_PLLI2SR_DIV_MIN 2U -#define RCU_PLLI2SR_DIV_MAX 7U - -/* RCU_PLLSAI register bit define */ -/* The PLLSAI VCO clock multi factor */ -#define RCU_PLLSAIN_MUL_MIN 50U -#define RCU_PLLSAIN_MUL_MAX 500U - -/* The PLLSAI P output frequency division factor from PLLSAI VCO clock */ -#define RCU_PLLSAIP_DIV_MIN 2U -#define RCU_PLLSAIP_DIV_MAX 8U - -/* The PLLSAI Q output frequency division factor from PLLSAI VCO clock */ -#define RCU_PLLSAIQ_DIV_MIN 2U -#define RCU_PLLSAIQ_DIV_MAX 15U - -/* The PLLSAI R output frequency division factor from PLLSAI VCO clock */ -#define RCU_PLLSAIR_DIV_MIN 2U -#define RCU_PLLSAIR_DIV_MAX 7U - -#define CHECK_PLLI2S_PSC_VALID(val) (((val) >= RCU_PLLI2SPSC_DIV_MIN)&&((val) <= RCU_PLLI2SPSC_DIV_MAX)) -#define CHECK_PLLI2S_N_VALID(val) (((val) >= RCU_PLLI2SN_MUL_MIN)&&((val) <= RCU_PLLI2SN_MUL_MAX)) -#define CHECK_PLLI2S_Q_VALID(val) (((val) >= RCU_PLLI2SQ_DIV_MIN)&&((val) <= RCU_PLLI2SQ_DIV_MAX)) -#define CHECK_PLLI2S_R_VALID(val) (((val) >= RCU_PLLI2SR_DIV_MIN)&&((val) <= RCU_PLLI2SR_DIV_MAX)) - -#define CHECK_PLLSAI_N_VALID(val) (((val) >= (RCU_PLLSAIN_MUL_MIN))&&((val) <= RCU_PLLSAIN_MUL_MAX)) -#define CHECK_PLLSAI_P_VALID(val) (((val) == 2U) || ((val) == 4U) || ((val) == 6U) || ((val) == 8U)) -#define CHECK_PLLSAI_Q_VALID(val) (((val) >= RCU_PLLSAIQ_DIV_MIN)&&((val) <= RCU_PLLSAIQ_DIV_MAX)) -#define CHECK_PLLSAI_R_VALID(val) (((val) >= RCU_PLLSAIR_DIV_MIN)&&((val) <= RCU_PLLSAIR_DIV_MAX)) - -/* RCU_ADDCTL register bit define */ -/* 48MHz clock selection */ -#define RCU_CK48MSRC_PLL48M ((uint32_t)0x00000000U) /*!< CK48M source clock select PLL48M */ -#define RCU_CK48MSRC_IRC48M RCU_ADDCTL_CK48MSEL /*!< CK48M source clock select IRC48M */ - -/* PLL48M clock selection */ -#define RCU_PLL48MSRC_PLLQ ((uint32_t)0x00000000U) /*!< PLL48M source clock select PLLQ */ -#define RCU_PLL48MSRC_PLLSAIP RCU_ADDCTL_PLL48MSEL /*!< PLL48M source clock select PLLSAIP */ - -/* Deep-sleep mode voltage */ -#define DSV_DSLPVS(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) -#define RCU_DEEPSLEEP_V_0 DSV_DSLPVS(0) /*!< core voltage is default value in deep-sleep mode */ -#define RCU_DEEPSLEEP_V_1 DSV_DSLPVS(1) /*!< core voltage is (default value-0.1)V in deep-sleep mode(customers are not recommended to use it)*/ -#define RCU_DEEPSLEEP_V_2 DSV_DSLPVS(2) /*!< core voltage is (default value-0.2)V in deep-sleep mode(customers are not recommended to use it)*/ -#define RCU_DEEPSLEEP_V_3 DSV_DSLPVS(3) /*!< core voltage is (default value-0.3)V in deep-sleep mode(customers are not recommended to use it)*/ - - -/* function declarations */ -/* peripherals clock configure functions */ -/* deinitialize the RCU */ -void rcu_deinit(void); -/* enable the peripherals clock */ -void rcu_periph_clock_enable(rcu_periph_enum periph); -/* disable the peripherals clock */ -void rcu_periph_clock_disable(rcu_periph_enum periph); -/* enable the peripherals clock when sleep mode */ -void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph); -/* disable the peripherals clock when sleep mode */ -void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph); -/* reset the peripherals */ -void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset); -/* disable reset the peripheral */ -void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset); -/* reset the BKP */ -void rcu_bkp_reset_enable(void); -/* disable the BKP reset */ -void rcu_bkp_reset_disable(void); - -/* system and peripherals clock source, system reset configure functions */ -/* configure the system clock source */ -void rcu_system_clock_source_config(uint32_t ck_sys); -/* get the system clock source */ -uint32_t rcu_system_clock_source_get(void); -/* configure the AHB prescaler selection */ -void rcu_ahb_clock_config(uint32_t ck_ahb); -/* configure the APB1 prescaler selection */ -void rcu_apb1_clock_config(uint32_t ck_apb1); -/* configure the APB2 prescaler selection */ -void rcu_apb2_clock_config(uint32_t ck_apb2); -/* configure the CK_OUT0 clock source and divider */ -void rcu_ckout0_config(uint32_t ckout0_src, uint32_t ckout0_div); -/* configure the CK_OUT1 clock source and divider */ -void rcu_ckout1_config(uint32_t ckout1_src, uint32_t ckout1_div); -/* configure the main PLL clock */ -ErrStatus rcu_pll_config(uint32_t pll_src, uint32_t pll_psc, uint32_t pll_n, uint32_t pll_p, uint32_t pll_q); -/* configure the PLLI2S_Q clock */ -ErrStatus rcu_plli2s_q_config(uint32_t plli2s_n, uint32_t plli2s_q); -/* configure the PLLI2S_R clock */ -ErrStatus rcu_plli2s_r_config(uint32_t plli2s_n, uint32_t plli2s_r); -/* configure the PLLSAI_P clock */ -ErrStatus rcu_pllsai_p_config(uint32_t pllsai_n, uint32_t pllsai_p); -/* configure the PLLSAI_Q clock */ -ErrStatus rcu_pllsai_q_config(uint32_t pllsai_n, uint32_t pllsai_q); -/* configure the PLLSAI_R clock */ -ErrStatus rcu_pllsai_r_config(uint32_t pllsai_n, uint32_t pllsai_r); -/* configure the RTC clock source selection */ -void rcu_rtc_clock_config(uint32_t rtc_clock_source); -/* cconfigure the frequency division of RTC clock when HXTAL was selected as its clock source */ -void rcu_rtc_div_config(uint32_t rtc_div); -/* configure the I2S clock source selection */ -void rcu_i2s_clock_config(uint32_t i2s_clock_source); -/* configure the I2Cx(x=3,4,5) clock source selection */ -void rcu_i2c_clock_config(i2c_idx_enum i2c_idx, uint32_t ck_i2c); -/* configure the SAI clock source selection */ -void rcu_sai_clock_config(uint32_t sai_clock_source); -/* configure the CK48M clock selection */ -void rcu_ck48m_clock_config(uint32_t ck48m_clock_source); -/* configure the PLL48M clock selection */ -void rcu_pll48m_clock_config(uint32_t pll48m_clock_source); -/* configure the TIMER clock prescaler selection */ -void rcu_timer_clock_prescaler_config(uint32_t timer_clock_prescaler); -/* configure the TLI clock division selection */ -void rcu_tli_clock_div_config(uint32_t pllsai_r_div); - -/* LXTAL, IRC8M, PLL and other oscillator configure functions */ -/* configure the LXTAL drive capability */ -void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap); -/* wait for oscillator stabilization flags is SET or oscillator startup is timeout */ -ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci); -/* turn on the oscillator */ -void rcu_osci_on(rcu_osci_type_enum osci); -/* turn off the oscillator */ -void rcu_osci_off(rcu_osci_type_enum osci); -/* enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ -void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci); -/* disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ -void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci); -/* set the IRC16M adjust value */ -void rcu_irc16m_adjust_value_set(uint32_t irc16m_adjval); -/* configure the spread spectrum modulation for the main PLL clock */ -void rcu_spread_spectrum_config(uint32_t spread_spectrum_type, uint32_t modstep, uint32_t modcnt); -/* enable the spread spectrum modulation for the main PLL clock */ -void rcu_spread_spectrum_enable(void); -/* disable the spread spectrum modulation for the main PLL clock */ -void rcu_spread_spectrum_disable(void); - -/* clock monitor configure functions */ -/* enable the HXTAL clock monitor */ -void rcu_hxtal_clock_monitor_enable(void); -/* disable the HXTAL clock monitor */ -void rcu_hxtal_clock_monitor_disable(void); - -/* voltage configure and clock frequency get functions */ -/* unlock the voltage key */ -void rcu_voltage_key_unlock(void); -/* set the deep sleep mode voltage */ -void rcu_deepsleep_voltage_set(uint32_t dsvol); -/* get the system clock, bus and peripheral clock frequency */ -uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock); - -/* flag & interrupt functions */ -/* get the clock stabilization and periphral reset flags */ -FlagStatus rcu_flag_get(rcu_flag_enum flag); -/* clear the reset flag */ -void rcu_all_reset_flag_clear(void); -/* get the clock stabilization interrupt and ckm flags */ -FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag); -/* clear the interrupt flags */ -void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag); -/* enable the stabilization interrupt */ -void rcu_interrupt_enable(rcu_int_enum interrupt); -/* disable the stabilization interrupt */ -void rcu_interrupt_disable(rcu_int_enum interrupt); - -#endif /* GD32F5XX_RCU_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h deleted file mode 100644 index 55d0da25bc1..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_rtc.h +++ /dev/null @@ -1,638 +0,0 @@ -/*! - \file gd32f5xx_rtc.c - \brief definitions for the RTC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#ifndef GD32F5XX_RTC_H -#define GD32F5XX_RTC_H - -#include "gd32f5xx.h" - -/* RTC definitions */ -#define RTC RTC_BASE - -/* registers definitions */ -#define RTC_TIME REG32((RTC) + 0x00U) /*!< RTC time of day register */ -#define RTC_DATE REG32((RTC) + 0x04U) /*!< RTC date register */ -#define RTC_CTL REG32((RTC) + 0x08U) /*!< RTC control register */ -#define RTC_STAT REG32((RTC) + 0x0CU) /*!< RTC status register */ -#define RTC_PSC REG32((RTC) + 0x10U) /*!< RTC time prescaler register */ -#define RTC_WUT REG32((RTC) + 0x14U) /*!< RTC wakeup timer register */ -#define RTC_COSC REG32((RTC) + 0x18U) /*!< RTC coarse calibration register */ -#define RTC_ALRM0TD REG32((RTC) + 0x1CU) /*!< RTC alarm 0 time and date register */ -#define RTC_ALRM1TD REG32((RTC) + 0x20U) /*!< RTC alarm 1 time and date register */ -#define RTC_WPK REG32((RTC) + 0x24U) /*!< RTC write protection key register */ -#define RTC_SS REG32((RTC) + 0x28U) /*!< RTC sub second register */ -#define RTC_SHIFTCTL REG32((RTC) + 0x2CU) /*!< RTC shift function control register */ -#define RTC_TTS REG32((RTC) + 0x30U) /*!< RTC time of timestamp register */ -#define RTC_DTS REG32((RTC) + 0x34U) /*!< RTC date of timestamp register */ -#define RTC_SSTS REG32((RTC) + 0x38U) /*!< RTC sub second of timestamp register */ -#define RTC_HRFC REG32((RTC) + 0x3CU) /*!< RTC high resolution frequency compensation register */ -#define RTC_TAMP REG32((RTC) + 0x40U) /*!< RTC tamper register */ -#define RTC_ALRM0SS REG32((RTC) + 0x44U) /*!< RTC alarm 0 sub second register */ -#define RTC_ALRM1SS REG32((RTC) + 0x48U) /*!< RTC alarm 1 sub second register */ -#define RTC_BKP0 REG32((RTC) + 0x50U) /*!< RTC backup register */ -#define RTC_BKP1 REG32((RTC) + 0x54U) /*!< RTC backup register */ -#define RTC_BKP2 REG32((RTC) + 0x58U) /*!< RTC backup register */ -#define RTC_BKP3 REG32((RTC) + 0x5CU) /*!< RTC backup register */ -#define RTC_BKP4 REG32((RTC) + 0x60U) /*!< RTC backup register */ -#define RTC_BKP5 REG32((RTC) + 0x64U) /*!< RTC backup register */ -#define RTC_BKP6 REG32((RTC) + 0x68U) /*!< RTC backup register */ -#define RTC_BKP7 REG32((RTC) + 0x6CU) /*!< RTC backup register */ -#define RTC_BKP8 REG32((RTC) + 0x70U) /*!< RTC backup register */ -#define RTC_BKP9 REG32((RTC) + 0x74U) /*!< RTC backup register */ -#define RTC_BKP10 REG32((RTC) + 0x78U) /*!< RTC backup register */ -#define RTC_BKP11 REG32((RTC) + 0x7CU) /*!< RTC backup register */ -#define RTC_BKP12 REG32((RTC) + 0x80U) /*!< RTC backup register */ -#define RTC_BKP13 REG32((RTC) + 0x84U) /*!< RTC backup register */ -#define RTC_BKP14 REG32((RTC) + 0x88U) /*!< RTC backup register */ -#define RTC_BKP15 REG32((RTC) + 0x8CU) /*!< RTC backup register */ -#define RTC_BKP16 REG32((RTC) + 0x90U) /*!< RTC backup register */ -#define RTC_BKP17 REG32((RTC) + 0x94U) /*!< RTC backup register */ -#define RTC_BKP18 REG32((RTC) + 0x98U) /*!< RTC backup register */ -#define RTC_BKP19 REG32((RTC) + 0x9CU) /*!< RTC backup register */ - -/* bits definitions */ -/* RTC_TIME */ -#define RTC_TIME_SCU BITS(0,3) /*!< second units in BCD code */ -#define RTC_TIME_SCT BITS(4,6) /*!< second tens in BCD code */ -#define RTC_TIME_MNU BITS(8,11) /*!< minute units in BCD code */ -#define RTC_TIME_MNT BITS(12,14) /*!< minute tens in BCD code */ -#define RTC_TIME_HRU BITS(16,19) /*!< hour units in BCD code */ -#define RTC_TIME_HRT BITS(20,21) /*!< hour tens in BCD code */ -#define RTC_TIME_PM BIT(22) /*!< AM/PM notation */ - -/* RTC_DATE */ -#define RTC_DATE_DAYU BITS(0,3) /*!< date units in BCD code */ -#define RTC_DATE_DAYT BITS(4,5) /*!< date tens in BCD code */ -#define RTC_DATE_MONU BITS(8,11) /*!< month units in BCD code */ -#define RTC_DATE_MONT BIT(12) /*!< month tens in BCD code */ -#define RTC_DATE_DOW BITS(13,15) /*!< day of week units */ -#define RTC_DATE_YRU BITS(16,19) /*!< year units in BCD code */ -#define RTC_DATE_YRT BITS(20,23) /*!< year tens in BCD code */ - -/* RTC_CTL */ -#define RTC_CTL_WTCS BITS(0,2) /*!< auto wakeup timer clock selection */ -#define RTC_CTL_TSEG BIT(3) /*!< valid event edge of time-stamp */ -#define RTC_CTL_REFEN BIT(4) /*!< reference clock detection function enable */ -#define RTC_CTL_BPSHAD BIT(5) /*!< shadow registers bypass control */ -#define RTC_CTL_CS BIT(6) /*!< display format of clock system */ -#define RTC_CTL_CCEN BIT(7) /*!< coarse calibration function enable */ -#define RTC_CTL_ALRM0EN BIT(8) /*!< alarm0 function enable */ -#define RTC_CTL_ALRM1EN BIT(9) /*!< alarm1 function enable */ -#define RTC_CTL_WTEN BIT(10) /*!< auto wakeup timer function enable */ -#define RTC_CTL_TSEN BIT(11) /*!< time-stamp function enable */ -#define RTC_CTL_ALRM0IE BIT(12) /*!< RTC alarm0 interrupt enable */ -#define RTC_CTL_ALRM1IE BIT(13) /*!< RTC alarm1 interrupt enable */ -#define RTC_CTL_WTIE BIT(14) /*!< auto wakeup timer interrupt enable */ -#define RTC_CTL_TSIE BIT(15) /*!< time-stamp interrupt enable */ -#define RTC_CTL_A1H BIT(16) /*!< add 1 hour(summer time change) */ -#define RTC_CTL_S1H BIT(17) /*!< subtract 1 hour(winter time change) */ -#define RTC_CTL_DSM BIT(18) /*!< daylight saving mark */ -#define RTC_CTL_COS BIT(19) /*!< calibration output selection */ -#define RTC_CTL_OPOL BIT(20) /*!< output polarity */ -#define RTC_CTL_OS BITS(21,22) /*!< output selection */ -#define RTC_CTL_COEN BIT(23) /*!< calibration output enable */ - -/* RTC_STAT */ -#define RTC_STAT_ALRM0WF BIT(0) /*!< alarm0 configuration can be write flag */ -#define RTC_STAT_ALRM1WF BIT(1) /*!< alarm1 configuration can be write flag */ -#define RTC_STAT_WTWF BIT(2) /*!< wakeup timer can be write flag */ -#define RTC_STAT_SOPF BIT(3) /*!< shift function operation pending flag */ -#define RTC_STAT_YCM BIT(4) /*!< year configuration mark status flag */ -#define RTC_STAT_RSYNF BIT(5) /*!< register synchronization flag */ -#define RTC_STAT_INITF BIT(6) /*!< initialization state flag */ -#define RTC_STAT_INITM BIT(7) /*!< enter initialization mode */ -#define RTC_STAT_ALRM0F BIT(8) /*!< alarm0 occurs flag */ -#define RTC_STAT_ALRM1F BIT(9) /*!< alarm1 occurs flag */ -#define RTC_STAT_WTF BIT(10) /*!< wakeup timer occurs flag */ -#define RTC_STAT_TSF BIT(11) /*!< time-stamp flag */ -#define RTC_STAT_TSOVRF BIT(12) /*!< time-stamp overflow flag */ -#define RTC_STAT_TP0F BIT(13) /*!< RTC tamper 0 detected flag */ -#define RTC_STAT_TP1F BIT(14) /*!< RTC tamper 1 detected flag */ -#define RTC_STAT_SCPF BIT(16) /*!< smooth calibration pending flag */ - -/* RTC_PSC */ -#define RTC_PSC_FACTOR_S BITS(0,14) /*!< synchronous prescaler factor */ -#define RTC_PSC_FACTOR_A BITS(16,22) /*!< asynchronous prescaler factor */ - -/* RTC_WUT */ -#define RTC_WUT_WTRV BITS(0,15) /*!< auto wakeup timer reloads value */ - -/* RTC_COSC */ -#define RTC_COSC_COSS BITS(0,4) /*!< coarse calibration step */ -#define RTC_COSC_COSD BIT(7) /*!< coarse calibration direction */ - -/* RTC_ALRMxTD */ -#define RTC_ALRMXTD_SCU BITS(0,3) /*!< second units in BCD code */ -#define RTC_ALRMXTD_SCT BITS(4,6) /*!< second tens in BCD code */ -#define RTC_ALRMXTD_MSKS BIT(7) /*!< alarm second mask bit */ -#define RTC_ALRMXTD_MNU BITS(8,11) /*!< minutes units in BCD code */ -#define RTC_ALRMXTD_MNT BITS(12,14) /*!< minutes tens in BCD code */ -#define RTC_ALRMXTD_MSKM BIT(15) /*!< alarm minutes mask bit */ -#define RTC_ALRMXTD_HRU BITS(16,19) /*!< hour units in BCD code */ -#define RTC_ALRMXTD_HRT BITS(20,21) /*!< hour units in BCD code */ -#define RTC_ALRMXTD_PM BIT(22) /*!< AM/PM flag */ -#define RTC_ALRMXTD_MSKH BIT(23) /*!< alarm hour mask bit */ -#define RTC_ALRMXTD_DAYU BITS(24,27) /*!< date units or week day in BCD code */ -#define RTC_ALRMXTD_DAYT BITS(28,29) /*!< date tens in BCD code */ -#define RTC_ALRMXTD_DOWS BIT(30) /*!< day of week selection */ -#define RTC_ALRMXTD_MSKD BIT(31) /*!< alarm date mask bit */ - -/* RTC_WPK */ -#define RTC_WPK_WPK BITS(0,7) /*!< key for write protection */ - -/* RTC_SS */ -#define RTC_SS_SSC BITS(0,15) /*!< sub second value */ - -/* RTC_SHIFTCTL */ -#define RTC_SHIFTCTL_SFS BITS(0,14) /*!< subtract a fraction of a second */ -#define RTC_SHIFTCTL_A1S BIT(31) /*!< one second add */ - -/* RTC_TTS */ -#define RTC_TTS_SCU BITS(0,3) /*!< second units in BCD code */ -#define RTC_TTS_SCT BITS(4,6) /*!< second units in BCD code */ -#define RTC_TTS_MNU BITS(8,11) /*!< minute units in BCD code */ -#define RTC_TTS_MNT BITS(12,14) /*!< minute tens in BCD code */ -#define RTC_TTS_HRU BITS(16,19) /*!< hour units in BCD code */ -#define RTC_TTS_HRT BITS(20,21) /*!< hour tens in BCD code */ -#define RTC_TTS_PM BIT(22) /*!< AM/PM notation */ - -/* RTC_DTS */ -#define RTC_DTS_DAYU BITS(0,3) /*!< date units in BCD code */ -#define RTC_DTS_DAYT BITS(4,5) /*!< date tens in BCD code */ -#define RTC_DTS_MONU BITS(8,11) /*!< month units in BCD code */ -#define RTC_DTS_MONT BIT(12) /*!< month tens in BCD code */ -#define RTC_DTS_DOW BITS(13,15) /*!< day of week units */ - -/* RTC_SSTS */ -#define RTC_SSTS_SSC BITS(0,15) /*!< timestamp sub second units */ - -/* RTC_HRFC */ -#define RTC_HRFC_CMSK BITS(0,8) /*!< calibration mask number */ -#define RTC_HRFC_CWND16 BIT(13) /*!< calibration window select 16 seconds */ -#define RTC_HRFC_CWND8 BIT(14) /*!< calibration window select 16 seconds */ -#define RTC_HRFC_FREQI BIT(15) /*!< increase RTC frequency by 488.5ppm */ - -/* RTC_TAMP */ -#define RTC_TAMP_TP0EN BIT(0) /*!< tamper 0 detection enable */ -#define RTC_TAMP_TP0EG BIT(1) /*!< tamper 0 event trigger edge for RTC tamp 0 input */ -#define RTC_TAMP_TPIE BIT(2) /*!< tamper detection interrupt enable */ -#define RTC_TAMP_TP1EN BIT(3) /*!< tamper 1 detection enable */ -#define RTC_TAMP_TP1EG BIT(4) /*!< Tamper 1 event trigger edge for RTC tamp 1 input */ -#define RTC_TAMP_TPTS BIT(7) /*!< make tamper function used for timestamp function */ -#define RTC_TAMP_FREQ BITS(8,10) /*!< sample frequency of tamper event detection */ -#define RTC_TAMP_FLT BITS(11,12) /*!< RTC tamp x filter count setting */ -#define RTC_TAMP_PRCH BITS(13,14) /*!< precharge duration time of RTC tamp x */ -#define RTC_TAMP_DISPU BIT(15) /*!< RTC tamp x pull up disable bit */ -#define RTC_TAMP_TP0SEL BIT(16) /*!< Tamper 0 function input mapping selection */ -#define RTC_TAMP_TSSEL BIT(17) /*!< Timestamp input mapping selection */ -#define RTC_TAMP_AOT BIT(18) /*!< RTC_ALARM output Type */ - -/* RTC_ALRM0SS */ -#define RTC_ALRM0SS_SSC BITS(0,14) /*!< alarm0 sub second value */ -#define RTC_ALRM0SS_MASKSSC BITS(24,27) /*!< mask control bit of SS */ - -/* RTC_ALRM1SS */ -#define RTC_ALRM1SS_SSC BITS(0,14) /*!< alarm1 sub second value */ -#define RTC_ALRM1SS_MASKSSC BITS(24,27) /*!< mask control bit of SS */ - -/* constants definitions */ -/* structure for initialization of the RTC */ -typedef struct -{ - uint8_t year; /*!< RTC year value: 0x0 - 0x99(BCD format) */ - uint8_t month; /*!< RTC month value */ - uint8_t date; /*!< RTC date value: 0x1 - 0x31(BCD format) */ - uint8_t day_of_week; /*!< RTC weekday value */ - uint8_t hour; /*!< RTC hour value */ - uint8_t minute; /*!< RTC minute value: 0x0 - 0x59(BCD format) */ - uint8_t second; /*!< RTC second value: 0x0 - 0x59(BCD format) */ - uint16_t factor_asyn; /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */ - uint16_t factor_syn; /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */ - uint32_t am_pm; /*!< RTC AM/PM value */ - uint32_t display_format; /*!< RTC time notation */ -}rtc_parameter_struct; - -/* structure for RTC alarm configuration */ -typedef struct -{ - uint32_t alarm_mask; /*!< RTC alarm mask */ - uint32_t weekday_or_date; /*!< specify RTC alarm is on date or weekday */ - uint8_t alarm_day; /*!< RTC alarm date or weekday value*/ - uint8_t alarm_hour; /*!< RTC alarm hour value */ - uint8_t alarm_minute; /*!< RTC alarm minute value: 0x0 - 0x59(BCD format) */ - uint8_t alarm_second; /*!< RTC alarm second value: 0x0 - 0x59(BCD format) */ - uint32_t am_pm; /*!< RTC alarm AM/PM value */ -}rtc_alarm_struct; - -/* structure for RTC time-stamp configuration */ -typedef struct -{ - uint8_t timestamp_month; /*!< RTC time-stamp month value */ - uint8_t timestamp_date; /*!< RTC time-stamp date value: 0x1 - 0x31(BCD format) */ - uint8_t timestamp_day; /*!< RTC time-stamp weekday value */ - uint8_t timestamp_hour; /*!< RTC time-stamp hour value */ - uint8_t timestamp_minute; /*!< RTC time-stamp minute value: 0x0 - 0x59(BCD format) */ - uint8_t timestamp_second; /*!< RTC time-stamp second value: 0x0 - 0x59(BCD format) */ - uint32_t am_pm; /*!< RTC time-stamp AM/PM value */ -}rtc_timestamp_struct; - -/* structure for RTC tamper configuration */ -typedef struct -{ - uint32_t tamper_source; /*!< RTC tamper source */ - uint32_t tamper_trigger; /*!< RTC tamper trigger */ - uint32_t tamper_filter; /*!< RTC tamper consecutive samples needed during a voltage level detection */ - uint32_t tamper_sample_frequency; /*!< RTC tamper sampling frequency during a voltage level detection */ - ControlStatus tamper_precharge_enable; /*!< RTC tamper precharge feature during a voltage level detection */ - uint32_t tamper_precharge_time; /*!< RTC tamper precharge duration if precharge feature is enabled */ - ControlStatus tamper_with_timestamp; /*!< RTC tamper time-stamp feature */ -}rtc_tamper_struct; - -/* time register value */ -#define TIME_SC(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_TIME_SC bit field */ -#define GET_TIME_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_TIME_SC bit field */ - -#define TIME_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TIME_MN bit field */ -#define GET_TIME_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_TIME_MN bit field */ - -#define TIME_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_TIME_HR bit field */ -#define GET_TIME_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_TIME_HR bit field */ - -#define RTC_AM ((uint32_t)0x00000000U) /*!< AM format */ -#define RTC_PM RTC_TIME_PM /*!< PM format */ - -/* date register value */ -#define DATE_DAY(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_DATE_DAY bit field */ -#define GET_DATE_DAY(regval) GET_BITS((regval),0,5) /*!< get value of RTC_DATE_DAY bit field */ - -#define DATE_MON(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_DATE_MON bit field */ -#define GET_DATE_MON(regval) GET_BITS((regval),8,12) /*!< get value of RTC_DATE_MON bit field */ -#define RTC_JAN ((uint8_t)0x01U) /*!< janurary */ -#define RTC_FEB ((uint8_t)0x02U) /*!< february */ -#define RTC_MAR ((uint8_t)0x03U) /*!< march */ -#define RTC_APR ((uint8_t)0x04U) /*!< april */ -#define RTC_MAY ((uint8_t)0x05U) /*!< may */ -#define RTC_JUN ((uint8_t)0x06U) /*!< june */ -#define RTC_JUL ((uint8_t)0x07U) /*!< july */ -#define RTC_AUG ((uint8_t)0x08U) /*!< august */ -#define RTC_SEP ((uint8_t)0x09U) /*!< september */ -#define RTC_OCT ((uint8_t)0x10U) /*!< october */ -#define RTC_NOV ((uint8_t)0x11U) /*!< november */ -#define RTC_DEC ((uint8_t)0x12U) /*!< december */ - -#define DATE_DOW(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_DATE_DOW bit field */ -#define GET_DATE_DOW(regval) GET_BITS((uint32_t)(regval),13,15) /*!< get value of RTC_DATE_DOW bit field */ -#define RTC_MONDAY ((uint8_t)0x01) /*!< monday */ -#define RTC_TUESDAY ((uint8_t)0x02) /*!< tuesday */ -#define RTC_WEDSDAY ((uint8_t)0x03) /*!< wednesday */ -#define RTC_THURSDAY ((uint8_t)0x04) /*!< thursday */ -#define RTC_FRIDAY ((uint8_t)0x05) /*!< friday */ -#define RTC_SATURDAY ((uint8_t)0x06) /*!< saturday */ -#define RTC_SUNDAY ((uint8_t)0x07) /*!< sunday */ - -#define DATE_YR(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_DATE_YR bit field */ -#define GET_DATE_YR(regval) GET_BITS((regval),16,23) /*!< get value of RTC_DATE_YR bit field */ - -/* ctl register value */ -#define CTL_OS(regval) (BITS(21,22) & ((uint32_t)(regval) << 21)) /*!< write value to RTC_CTL_OS bit field */ -#define RTC_OS_DISABLE CTL_OS(0) /*!< disable output RTC_ALARM */ -#define RTC_OS_ALARM0 CTL_OS(1) /*!< enable alarm0 flag output */ -#define RTC_OS_ALARM1 CTL_OS(2) /*!< enable alarm1 flag output */ -#define RTC_OS_WAKEUP CTL_OS(3) /*!< enable wakeup flag output */ - -#define RTC_CALIBRATION_512HZ RTC_CTL_COEN /*!< calibration output of 512Hz is enable */ -#define RTC_CALIBRATION_1HZ (RTC_CTL_COEN | RTC_CTL_COS) /*!< calibration output of 1Hz is enable */ -#define RTC_ALARM0_HIGH RTC_OS_ALARM0 /*!< enable alarm0 flag output with high level */ -#define RTC_ALARM0_LOW (RTC_OS_ALARM0 | RTC_CTL_OPOL) /*!< enable alarm0 flag output with low level*/ -#define RTC_ALARM1_HIGH RTC_OS_ALARM1 /*!< enable alarm1 flag output with high level */ -#define RTC_ALARM1_LOW (RTC_OS_ALARM1 | RTC_CTL_OPOL) /*!< enable alarm1 flag output with low level*/ -#define RTC_WAKEUP_HIGH RTC_OS_WAKEUP /*!< enable wakeup flag output with high level */ -#define RTC_WAKEUP_LOW (RTC_OS_WAKEUP | RTC_CTL_OPOL) /*!< enable wakeup flag output with low level*/ - -#define RTC_24HOUR ((uint32_t)0x00000000U) /*!< 24-hour format */ -#define RTC_12HOUR RTC_CTL_CS /*!< 12-hour format */ - -#define RTC_TIMESTAMP_RISING_EDGE ((uint32_t)0x00000000U) /*!< rising edge is valid event edge for time-stamp event */ -#define RTC_TIMESTAMP_FALLING_EDGE RTC_CTL_TSEG /*!< falling edge is valid event edge for time-stamp event */ - -/* psc register value */ -#define PSC_FACTOR_S(regval) (BITS(0,14) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_PSC_FACTOR_S bit field */ -#define GET_PSC_FACTOR_S(regval) GET_BITS((regval),0,14) /*!< get value of RTC_PSC_FACTOR_S bit field */ - -#define PSC_FACTOR_A(regval) (BITS(16,22) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_PSC_FACTOR_A bit field */ -#define GET_PSC_FACTOR_A(regval) GET_BITS((regval),16,22) /*!< get value of RTC_PSC_FACTOR_A bit field */ - -/* alrmtd register value */ -#define ALRMTD_SC(regval) (BITS(0,6) & ((uint32_t)(regval)<< 0)) /*!< write value to RTC_ALRMTD_SC bit field */ -#define GET_ALRMTD_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_ALRMTD_SC bit field */ - -#define ALRMTD_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_ALRMTD_MN bit field */ -#define GET_ALRMTD_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_ALRMTD_MN bit field */ - -#define ALRMTD_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_ALRMTD_HR bit field */ -#define GET_ALRMTD_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_ALRMTD_HR bit field */ - -#define ALRMTD_DAY(regval) (BITS(24,29) & ((uint32_t)(regval) << 24)) /*!< write value to RTC_ALRMTD_DAY bit field */ -#define GET_ALRMTD_DAY(regval) GET_BITS((regval),24,29) /*!< get value of RTC_ALRMTD_DAY bit field */ - -#define RTC_ALARM_NONE_MASK ((uint32_t)0x00000000U) /*!< alarm none mask */ -#define RTC_ALARM_DATE_MASK RTC_ALRMXTD_MSKD /*!< alarm date mask */ -#define RTC_ALARM_HOUR_MASK RTC_ALRMXTD_MSKH /*!< alarm hour mask */ -#define RTC_ALARM_MINUTE_MASK RTC_ALRMXTD_MSKM /*!< alarm minute mask */ -#define RTC_ALARM_SECOND_MASK RTC_ALRMXTD_MSKS /*!< alarm second mask */ -#define RTC_ALARM_ALL_MASK (RTC_ALRMXTD_MSKD|RTC_ALRMXTD_MSKH|RTC_ALRMXTD_MSKM|RTC_ALRMXTD_MSKS) /*!< alarm all mask */ - -#define RTC_ALARM_DATE_SELECTED ((uint32_t)0x00000000U) /*!< alarm date format selected */ -#define RTC_ALARM_WEEKDAY_SELECTED RTC_ALRMXTD_DOWS /*!< alarm weekday format selected */ - -/* wpk register value */ -#define WPK_WPK(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_WPK_WPK bit field */ - -/* ss register value */ -#define SS_SSC(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SS_SSC bit field */ - -/* shiftctl register value */ -#define SHIFTCTL_SFS(regval) (BITS(0,14) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SHIFTCTL_SFS bit field */ - -#define RTC_SHIFT_ADD1S_RESET ((uint32_t)0x00000000U) /*!< not add 1 second */ -#define RTC_SHIFT_ADD1S_SET RTC_SHIFTCTL_A1S /*!< add one second to the clock */ - -/* tts register value */ -#define TTS_SC(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_TTS_SC bit field */ -#define GET_TTS_SC(regval) GET_BITS((regval),0,6) /*!< get value of RTC_TTS_SC bit field */ - -#define TTS_MN(regval) (BITS(8,14) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TTS_MN bit field */ -#define GET_TTS_MN(regval) GET_BITS((regval),8,14) /*!< get value of RTC_TTS_MN bit field */ - -#define TTS_HR(regval) (BITS(16,21) & ((uint32_t)(regval) << 16)) /*!< write value to RTC_TTS_HR bit field */ -#define GET_TTS_HR(regval) GET_BITS((regval),16,21) /*!< get value of RTC_TTS_HR bit field */ - -/* dts register value */ -#define DTS_DAY(regval) (BITS(0,5) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_DTS_DAY bit field */ -#define GET_DTS_DAY(regval) GET_BITS((regval),0,5) /*!< get value of RTC_DTS_DAY bit field */ - -#define DTS_MON(regval) (BITS(8,12) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_DTS_MON bit field */ -#define GET_DTS_MON(regval) GET_BITS((regval),8,12) /*!< get value of RTC_DTS_MON bit field */ - -#define DTS_DOW(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_DTS_DOW bit field */ -#define GET_DTS_DOW(regval) GET_BITS((regval),13,15) /*!< get value of RTC_DTS_DOW bit field */ - -/* ssts register value */ -#define SSTS_SSC(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_SSTS_SSC bit field */ - -/* hrfc register value */ -#define HRFC_CMSK(regval) (BITS(0,8) & ((uint32_t)(regval) << 0)) /*!< write value to RTC_HRFC_CMSK bit field */ - -#define RTC_CALIBRATION_WINDOW_32S ((uint32_t)0x00000000U) /*!< 2exp20 RTCCLK cycles, 32s if RTCCLK = 32768 Hz */ -#define RTC_CALIBRATION_WINDOW_16S RTC_HRFC_CWND16 /*!< 2exp19 RTCCLK cycles, 16s if RTCCLK = 32768 Hz */ -#define RTC_CALIBRATION_WINDOW_8S RTC_HRFC_CWND8 /*!< 2exp18 RTCCLK cycles, 8s if RTCCLK = 32768 Hz */ - -#define RTC_CALIBRATION_PLUS_SET RTC_HRFC_FREQI /*!< increase RTC frequency by 488.5ppm */ -#define RTC_CALIBRATION_PLUS_RESET ((uint32_t)0x00000000U) /*!< no effect */ - -/* tamp register value */ -#define TAMP_FREQ(regval) (BITS(8,10) & ((uint32_t)(regval) << 8)) /*!< write value to RTC_TAMP_FREQ bit field */ -#define RTC_FREQ_DIV32768 TAMP_FREQ(0) /*!< sample once every 32768 RTCCLK(1Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV16384 TAMP_FREQ(1) /*!< sample once every 16384 RTCCLK(2Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV8192 TAMP_FREQ(2) /*!< sample once every 8192 RTCCLK(4Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV4096 TAMP_FREQ(3) /*!< sample once every 4096 RTCCLK(8Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV2048 TAMP_FREQ(4) /*!< sample once every 2048 RTCCLK(16Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV1024 TAMP_FREQ(5) /*!< sample once every 1024 RTCCLK(32Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV512 TAMP_FREQ(6) /*!< sample once every 512 RTCCLK(64Hz if RTCCLK=32.768KHz) */ -#define RTC_FREQ_DIV256 TAMP_FREQ(7) /*!< sample once every 256 RTCCLK(128Hz if RTCCLK=32.768KHz) */ - -#define TAMP_FLT(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) /*!< write value to RTC_TAMP_FLT bit field */ -#define RTC_FLT_EDGE TAMP_FLT(0) /*!< detecting tamper event using edge mode. precharge duration is disabled automatically */ -#define RTC_FLT_2S TAMP_FLT(1) /*!< detecting tamper event using level mode.2 consecutive valid level samples will make a effective tamper event */ -#define RTC_FLT_4S TAMP_FLT(2) /*!< detecting tamper event using level mode.4 consecutive valid level samples will make an effective tamper event */ -#define RTC_FLT_8S TAMP_FLT(3) /*!< detecting tamper event using level mode.8 consecutive valid level samples will make a effective tamper event */ - -#define TAMP_PRCH(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) /*!< write value to RTC_TAMP_PRCH bit field */ -#define RTC_PRCH_1C TAMP_PRCH(0) /*!< 1 RTC clock prechagre time before each sampling */ -#define RTC_PRCH_2C TAMP_PRCH(1) /*!< 2 RTC clock prechagre time before each sampling */ -#define RTC_PRCH_4C TAMP_PRCH(2) /*!< 4 RTC clock prechagre time before each sampling */ -#define RTC_PRCH_8C TAMP_PRCH(3) /*!< 8 RTC clock prechagre time before each sampling */ - -#define RTC_TAMPER0 RTC_TAMP_TP0EN /*!< tamper 0 detection enable */ -#define RTC_TAMPER1 RTC_TAMP_TP1EN /*!< tamper 1 detection enable */ - -#define RTC_TAMPER_TRIGGER_EDGE_RISING ((uint32_t)0x00000000U) /*!< tamper detection is in rising edge mode */ -#define RTC_TAMPER_TRIGGER_EDGE_FALLING RTC_TAMP_TP0EG /*!< tamper detection is in falling edge mode */ -#define RTC_TAMPER_TRIGGER_LEVEL_LOW ((uint32_t)0x00000000U) /*!< tamper detection is in low level mode */ -#define RTC_TAMPER_TRIGGER_LEVEL_HIGH RTC_TAMP_TP0EG /*!< tamper detection is in high level mode */ - -#define RTC_TAMPER_TRIGGER_POS ((uint32_t)0x00000001U) /* shift position of trigger relative to source */ - -#define RTC_ALARM_OUTPUT_OD ((uint32_t)0x00000000U) /*!< RTC alarm output open-drain mode */ -#define RTC_ALARM_OUTPUT_PP RTC_TAMP_AOT /*!< RTC alarm output push-pull mode */ - -/* ALRMXSS register value */ -#define ALRMXSS_SSC(regval) (BITS(0,14) & ((uint32_t)(regval)<< 0)) /*!< write value to RTC_ALRMXSS_SSC bit field */ - -#define ALRMXSS_MASKSSC(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) /*!< write value to RTC_ALRMXSS_MASKSSC bit field */ -#define RTC_MASKSSC_0_14 ALRMXSS_MASKSSC(0) /*!< mask alarm subsecond configuration */ -#define RTC_MASKSSC_1_14 ALRMXSS_MASKSSC(1) /*!< mask RTC_ALRMXSS_SSC[14:1], and RTC_ALRMXSS_SSC[0] is to be compared */ -#define RTC_MASKSSC_2_14 ALRMXSS_MASKSSC(2) /*!< mask RTC_ALRMXSS_SSC[14:2], and RTC_ALRMXSS_SSC[1:0] is to be compared */ -#define RTC_MASKSSC_3_14 ALRMXSS_MASKSSC(3) /*!< mask RTC_ALRMXSS_SSC[14:3], and RTC_ALRMXSS_SSC[2:0] is to be compared */ -#define RTC_MASKSSC_4_14 ALRMXSS_MASKSSC(4) /*!< mask RTC_ALRMXSS_SSC[14:4]], and RTC_ALRMXSS_SSC[3:0] is to be compared */ -#define RTC_MASKSSC_5_14 ALRMXSS_MASKSSC(5) /*!< mask RTC_ALRMXSS_SSC[14:5], and RTC_ALRMXSS_SSC[4:0] is to be compared */ -#define RTC_MASKSSC_6_14 ALRMXSS_MASKSSC(6) /*!< mask RTC_ALRMXSS_SSC[14:6], and RTC_ALRMXSS_SSC[5:0] is to be compared */ -#define RTC_MASKSSC_7_14 ALRMXSS_MASKSSC(7) /*!< mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared */ -#define RTC_MASKSSC_8_14 ALRMXSS_MASKSSC(8) /*!< mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared */ -#define RTC_MASKSSC_9_14 ALRMXSS_MASKSSC(9) /*!< mask RTC_ALRMXSS_SSC[14:9], and RTC_ALRMXSS_SSC[8:0] is to be compared */ -#define RTC_MASKSSC_10_14 ALRMXSS_MASKSSC(10) /*!< mask RTC_ALRMXSS_SSC[14:10], and RTC_ALRMXSS_SSC[9:0] is to be compared */ -#define RTC_MASKSSC_11_14 ALRMXSS_MASKSSC(11) /*!< mask RTC_ALRMXSS_SSC[14:11], and RTC_ALRMXSS_SSC[10:0] is to be compared */ -#define RTC_MASKSSC_12_14 ALRMXSS_MASKSSC(12) /*!< mask RTC_ALRMXSS_SSC[14:12], and RTC_ALRMXSS_SSC[11:0] is to be compared */ -#define RTC_MASKSSC_13_14 ALRMXSS_MASKSSC(13) /*!< mask RTC_ALRMXSS_SSC[14:13], and RTC_ALRMXSS_SSC[12:0] is to be compared */ -#define RTC_MASKSSC_14 ALRMXSS_MASKSSC(14) /*!< mask RTC_ALRMXSS_SSC[14], and RTC_ALRMXSS_SSC[13:0] is to be compared */ -#define RTC_MASKSSC_NONE ALRMXSS_MASKSSC(15) /*!< mask none, and RTC_ALRMXSS_SSC[14:0] is to be compared */ - -/* RTC interrupt source */ -#define RTC_INT_TIMESTAMP RTC_CTL_TSIE /*!< time-stamp interrupt enable */ -#define RTC_INT_ALARM0 RTC_CTL_ALRM0IE /*!< RTC alarm0 interrupt enable */ -#define RTC_INT_ALARM1 RTC_CTL_ALRM1IE /*!< RTC alarm1 interrupt enable */ -#define RTC_INT_TAMP RTC_TAMP_TPIE /*!< tamper detection interrupt enable */ -#define RTC_INT_WAKEUP RTC_CTL_WTIE /*!< RTC wakeup timer interrupt enable */ - -/* write protect key */ -#define RTC_UNLOCK_KEY1 ((uint8_t)0xCAU) /*!< RTC unlock key1 */ -#define RTC_UNLOCK_KEY2 ((uint8_t)0x53U) /*!< RTC unlock key2 */ -#define RTC_LOCK_KEY ((uint8_t)0xFFU) /*!< RTC lock key */ - -/* registers reset value */ -#define RTC_REGISTER_RESET ((uint32_t)0x00000000U) /*!< RTC common register reset value */ -#define RTC_DATE_RESET ((uint32_t)0x00002101U) /*!< RTC_DATE register reset value */ -#define RTC_STAT_RESET ((uint32_t)0x00000000U) /*!< RTC_STAT register reset value */ -#define RTC_PSC_RESET ((uint32_t)0x007F00FFU) /*!< RTC_PSC register reset value */ -#define RTC_WUT_RESET ((uint32_t)0x0000FFFFU) /*!< RTC_WUT register reset value */ - -/* RTC alarm */ -#define RTC_ALARM0 ((uint8_t)0x01U) /*!< RTC alarm 0 */ -#define RTC_ALARM1 ((uint8_t)0x02U) /*!< RTC alarm 1 */ - -/* RTC coarse calibration direction */ -#define CALIB_INCREASE ((uint8_t)0x01U) /*!< RTC coarse calibration increase */ -#define CALIB_DECREASE ((uint8_t)0x02U) /*!< RTC coarse calibration decrease */ - -/* RTC wakeup timer clock */ -#define CTL_WTCS(regval) (BITS(0,2) & ((regval)<< 0)) -#define WAKEUP_RTCCK_DIV16 CTL_WTCS(0) /*!< wakeup timer clock is RTC clock divided by 16 */ -#define WAKEUP_RTCCK_DIV8 CTL_WTCS(1) /*!< wakeup timer clock is RTC clock divided by 8 */ -#define WAKEUP_RTCCK_DIV4 CTL_WTCS(2) /*!< wakeup timer clock is RTC clock divided by 4 */ -#define WAKEUP_RTCCK_DIV2 CTL_WTCS(3) /*!< wakeup timer clock is RTC clock divided by 2 */ -#define WAKEUP_CKSPRE CTL_WTCS(4) /*!< wakeup timer clock is ckspre */ -#define WAKEUP_CKSPRE_2EXP16 CTL_WTCS(6) /*!< wakeup timer clock is ckspre and wakeup timer add 2exp16 */ - -/* RTC_AF pin */ -#define RTC_AF0_TIMESTAMP ((uint32_t)0x00000000) /*!< RTC_AF0 use for timestamp */ -#define RTC_AF1_TIMESTAMP RTC_TAMP_TSSEL /*!< RTC_AF1 use for timestamp */ -#define RTC_AF0_TAMPER0 ((uint32_t)0x00000000) /*!< RTC_AF0 use for tamper0 */ -#define RTC_AF1_TAMPER0 RTC_TAMP_TP0SEL /*!< RTC_AF1 use for tamper0 */ - -/* RTC flags */ -#define RTC_FLAG_ALRM0W RTC_STAT_ALRM0WF /*!< alarm0 configuration can be write flag */ -#define RTC_FLAG_ALRM1W RTC_STAT_ALRM1WF /*!< alarm1 configuration can be write flag */ -#define RTC_FLAG_WTW RTC_STAT_WTWF /*!< wakeup timer can be write flag */ -#define RTC_FLAG_SOP RTC_STAT_SOPF /*!< shift function operation pending flag */ -#define RTC_FLAG_YCM RTC_STAT_YCM /*!< year configuration mark status flag */ -#define RTC_FLAG_RSYN RTC_STAT_RSYNF /*!< register synchronization flag */ -#define RTC_FLAG_INIT RTC_STAT_INITF /*!< initialization state flag */ -#define RTC_FLAG_ALRM0 RTC_STAT_ALRM0F /*!< alarm0 occurs flag */ -#define RTC_FLAG_ALRM1 RTC_STAT_ALRM1F /*!< alarm1 occurs flag */ -#define RTC_FLAG_WT RTC_STAT_WTF /*!< wakeup timer occurs flag */ -#define RTC_FLAG_TS RTC_STAT_TSF /*!< time-stamp flag */ -#define RTC_FLAG_TSOVR RTC_STAT_TSOVRF /*!< time-stamp overflow flag */ -#define RTC_FLAG_TP0 RTC_STAT_TP0F /*!< RTC tamper 0 detected flag */ -#define RTC_FLAG_TP1 RTC_STAT_TP1F /*!< RTC tamper 1 detected flag */ -#define RTC_STAT_SCP RTC_STAT_SCPF /*!< smooth calibration pending flag */ - -/* function declarations */ -/* reset most of the RTC registers */ -ErrStatus rtc_deinit(void); -/* initialize RTC registers */ -ErrStatus rtc_init(rtc_parameter_struct* rtc_initpara_struct); -/* enter RTC init mode */ -ErrStatus rtc_init_mode_enter(void); -/* exit RTC init mode */ -void rtc_init_mode_exit(void); -/* wait until RTC_TIME and RTC_DATE registers are synchronized with APB clock, and the shadow registers are updated */ -ErrStatus rtc_register_sync_wait(void); - -/* get current time and date */ -void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct); -/* get current subsecond value */ -uint32_t rtc_subsecond_get(void); - -/* configure RTC alarm */ -void rtc_alarm_config(uint8_t rtc_alarm, rtc_alarm_struct* rtc_alarm_time); -/* configure subsecond of RTC alarm */ -void rtc_alarm_subsecond_config(uint8_t rtc_alarm, uint32_t mask_subsecond, uint32_t subsecond); -/* get RTC alarm */ -void rtc_alarm_get(uint8_t rtc_alarm,rtc_alarm_struct* rtc_alarm_time); -/* get RTC alarm subsecond */ -uint32_t rtc_alarm_subsecond_get(uint8_t rtc_alarm); -/* enable RTC alarm */ -void rtc_alarm_enable(uint8_t rtc_alarm); -/* disable RTC alarm */ -ErrStatus rtc_alarm_disable(uint8_t rtc_alarm); - -/* enable RTC time-stamp */ -void rtc_timestamp_enable(uint32_t edge); -/* disable RTC time-stamp */ -void rtc_timestamp_disable(void); -/* get RTC timestamp time and date */ -void rtc_timestamp_get(rtc_timestamp_struct* rtc_timestamp); -/* get RTC time-stamp subsecond */ -uint32_t rtc_timestamp_subsecond_get(void); -/* RTC time-stamp pin map */ -void rtc_timestamp_pin_map(uint32_t rtc_af); - -/* enable RTC tamper */ -void rtc_tamper_enable(rtc_tamper_struct* rtc_tamper); -/* disable RTC tamper */ -void rtc_tamper_disable(uint32_t source); -/* RTC tamper0 pin map */ -void rtc_tamper0_pin_map(uint32_t rtc_af); - -/* enable specified RTC interrupt */ -void rtc_interrupt_enable(uint32_t interrupt); -/* disable specified RTC interrupt */ -void rtc_interrupt_disable(uint32_t interrupt); -/* check specified flag */ -FlagStatus rtc_flag_get(uint32_t flag); -/* clear specified flag */ -void rtc_flag_clear(uint32_t flag); - -/* configure RTC alarm output source */ -void rtc_alarm_output_config(uint32_t source, uint32_t mode); -/* configure RTC calibration output source */ -void rtc_calibration_output_config(uint32_t source); - -/* adjust the daylight saving time by adding or substracting one hour from the current time */ -void rtc_hour_adjust(uint32_t operation); -/* adjust RTC second or subsecond value of current time */ -ErrStatus rtc_second_adjust(uint32_t add, uint32_t minus); - -/* enable RTC bypass shadow registers function */ -void rtc_bypass_shadow_enable(void); -/* disable RTC bypass shadow registers function */ -void rtc_bypass_shadow_disable(void); - -/* enable RTC reference clock detection function */ -ErrStatus rtc_refclock_detection_enable(void); -/* disable RTC reference clock detection function */ -ErrStatus rtc_refclock_detection_disable(void); - -/* enable RTC wakeup timer */ -void rtc_wakeup_enable(void); -/* disable RTC wakeup timer */ -ErrStatus rtc_wakeup_disable(void); -/* set auto wakeup timer clock */ -ErrStatus rtc_wakeup_clock_set(uint8_t wakeup_clock); -/* set auto wakeup timer value */ -ErrStatus rtc_wakeup_timer_set(uint16_t wakeup_timer); -/* get auto wakeup timer value */ -uint16_t rtc_wakeup_timer_get(void); - -/* configure RTC smooth calibration */ -ErrStatus rtc_smooth_calibration_config(uint32_t window, uint32_t plus, uint32_t minus); -/* enable RTC coarse calibration */ -ErrStatus rtc_coarse_calibration_enable(void); -/* disable RTC coarse calibration */ -ErrStatus rtc_coarse_calibration_disable(void); -/* configure RTC coarse calibration direction and step */ -ErrStatus rtc_coarse_calibration_config(uint8_t direction, uint8_t step); - -#endif /* GD32F5XX_RTC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h deleted file mode 100644 index fcbbfe2ae9f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sai.h +++ /dev/null @@ -1,473 +0,0 @@ -/*! - \file gd32f5xx_sai.h - \brief definitions for the SAI - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_SAI_H -#define GD32F5XX_SAI_H - -#include "gd32f5xx.h" - -/* SAI definitions */ -#define SAI SAI_BASE /*!< SAI base address */ - -/* registers definitions */ -#define SAI_SYNCFG REG32((SAI) + 0x00000000U) /*!< SAI synchronize configuration register */ -#define SAI_B0CFG0 REG32((SAI) + 0x00000004U) /*!< SAI block 0 configuration register0 */ -#define SAI_B0CFG1 REG32((SAI) + 0x00000008U) /*!< SAI block 0 configuration register1 */ -#define SAI_B0FCFG REG32((SAI) + 0x0000000CU) /*!< SAI block 0 frame configuration register */ -#define SAI_B0SCFG REG32((SAI) + 0x00000010U) /*!< SAI block 0 slot configuration register */ -#define SAI_B0INTEN REG32((SAI) + 0x00000014U) /*!< SAI block 0 interrupt enable register */ -#define SAI_B0STAT REG32((SAI) + 0x00000018U) /*!< SAI block 0 status register */ -#define SAI_B0INTC REG32((SAI) + 0x0000001CU) /*!< SAI block 0 interrupt flag clear register */ -#define SAI_B0DATA REG32((SAI) + 0x00000020U) /*!< SAI block 0 data register */ -#define SAI_B1CFG0 REG32((SAI) + 0x00000024U) /*!< SAI block 1 configuration register0 */ -#define SAI_B1CFG1 REG32((SAI) + 0x00000028U) /*!< SAI block 1 configuration register1 */ -#define SAI_B1FCFG REG32((SAI) + 0x0000002CU) /*!< SAI block 1 frame configuration register */ -#define SAI_B1SCFG REG32((SAI) + 0x00000030U) /*!< SAI block 1 slot configuration register */ -#define SAI_B1INTEN REG32((SAI) + 0x00000034U) /*!< SAI block 1 interrupt enable register */ -#define SAI_B1STAT REG32((SAI) + 0x00000038U) /*!< SAI block 1 status register */ -#define SAI_B1INTC REG32((SAI) + 0x0000003CU) /*!< SAI block 1 interrupt flag clear register */ -#define SAI_B1DATA REG32((SAI) + 0x00000040U) /*!< SAI block 1 data register */ - -#define SAI_CFG0(blocky) REG32(((SAI) + 0x00000004U) + 0x20U*(blocky)) /*!< SAI block configuration register0 */ -#define SAI_CFG1(blocky) REG32(((SAI) + 0x00000008U) + 0x20U*(blocky)) /*!< SAI block configuration register1 */ -#define SAI_FCFG(blocky) REG32(((SAI) + 0x0000000CU) + 0x20U*(blocky)) /*!< SAI block frame configuration register */ -#define SAI_SCFG(blocky) REG32(((SAI) + 0x00000010U) + 0x20U*(blocky)) /*!< SAI block slot configuration register */ -#define SAI_INTEN(blocky) REG32(((SAI) + 0x00000014U) + 0x20U*(blocky)) /*!< SAI block interrupt enable register */ -#define SAI_STAT(blocky) REG32(((SAI) + 0x00000018U) + 0x20U*(blocky)) /*!< SAI block status register */ -#define SAI_INTC(blocky) REG32(((SAI) + 0x0000001CU) + 0x20U*(blocky)) /*!< SAI block interrupt flag clear register */ -#define SAI_DATA(blocky) REG32(((SAI) + 0x00000020U) + 0x20U*(blocky)) /*!< SAI block data register */ - -/* bits definitions */ -/* SAI_SYNCFG */ -#define SAI_SYNCFG_SYNI BITS(0,1) /*!< synchronization inputs */ -#define SAI_SYNCFG_SYNO BITS(4,5) /*!< synchronization outputs */ - -/* SAI_CFG0 */ -#define SAI_CFG0_OPTMOD BITS(0,1) /*!< operating mode */ -#define SAI_CFG0_PROT BITS(2,3) /*!< protocol selection */ -#define SAI_CFG0_DATAWD BITS(5,7) /*!< data width */ -#define SAI_CFG0_SHIFTDIR BIT(8) /*!< shift direction */ -#define SAI_CFG0_SAMPEDGE BIT(9) /*!< sampling clock edge */ -#define SAI_CFG0_SYNCMOD BITS(10,11) /*!< synchronization mode */ -#define SAI_CFG0_MONO BIT(12) /*!< stereo and mono mode selection */ -#define SAI_CFG0_ODRIV BIT(13) /*!< output drive */ -#define SAI_CFG0_SAIEN BIT(16) /*!< sai sub-block enable */ -#define SAI_CFG0_DMAEN BIT(17) /*!< DMA enable */ -#define SAI_CFG0_BYPASS BIT(19) /*!< clock divider logic bypass */ -#define SAI_CFG0_MDIV BITS(20,25) /*!< master clock divider ratio */ -#define SAI_CFG0_MOSPR BIT(26) /*!< the master clock oversampling rate */ -#define SAI_CFG0_MCLKEN BIT(27) /*!< the master clock enable */ - -/* SAI_CFG1 */ -#define SAI_CFG1_FFTH BITS(0,2) /*!< FIFO threshold */ -#define SAI_CFG1_FLUSH BIT(3) /*!< FIFO flush */ -#define SAI_CFG1_SDOM BIT(4) /*!< serial data output management */ -#define SAI_CFG1_MT BIT(5) /*!< mute mode on */ -#define SAI_CFG1_MTVAL BIT(6) /*!< mute value */ -#define SAI_CFG1_MTFCNT BITS(7,12) /*!< mute frame count */ -#define SAI_CFG1_CPLMOD BIT(13) /*!< complement mode */ -#define SAI_CFG1_CPAMOD BITS(14,15) /*!< compander mode */ - -/* SAI_FCFG */ -#define SAI_FCFG_FWD BITS(0,7) /*!< frame width */ -#define SAI_FCFG_FSAWD BITS(8,14) /*!< frame synchronization active width */ -#define SAI_FCFG_FSFUNC BIT(16) /*!< frame synchronization function */ -#define SAI_FCFG_FSPL BIT(17) /*!< Frame synchronization active polarity */ -#define SAI_FCFG_FSOST BIT(18) /*!< frame synchronization offset */ - -/* SAI_SCFG */ -#define SAI_SCFG_DATAOST BITS(0,4) /*!< data offset */ -#define SAI_SCFG_SLOTWD BITS(6,7) /*!< slot width */ -#define SAI_SCFG_SLOTNUM BITS(8,11) /*!< slot number within frame */ -#define SAI_SCFG_SLOTAV BITS(16,31) /*!< slot activation vector */ - -/* SAI_INTEN */ -#define SAI_INTEN_OUERRIE BIT(0) /*!< FIFO overrun or underrun interrupt enable */ -#define SAI_INTEN_MTDETIE BIT(1) /*!< mute detection interrupt enable */ -#define SAI_INTEN_ERRCKIE BIT(2) /*!< error clock interrupt enable */ -#define SAI_INTEN_FFREQIE BIT(3) /*!< FIFO request interrupt enable */ -#define SAI_INTEN_ACNRDYIE BIT(4) /*!< audio codec not ready interrupt enable */ -#define SAI_INTEN_FSADETIE BIT(5) /*!< frame synchronization advanced detection interrupt enable */ -#define SAI_INTEN_FSPDETIE BIT(6) /*!< frame synchronization postpone detection interrupt enable */ - -/* SAI_STAT */ -#define SAI_STAT_OUERR BIT(0) /*!< FIFO overrun or underrun */ -#define SAI_STAT_MTDET BIT(1) /*!< mute detection */ -#define SAI_STAT_ERRCK BIT(2) /*!< error clock */ -#define SAI_STAT_FFREQ BIT(3) /*!< FIFO request */ -#define SAI_STAT_ACNRDY BIT(4) /*!< audio codec not ready */ -#define SAI_STAT_FSADET BIT(5) /*!< frame synchronization advanced detection */ -#define SAI_STAT_FSPDET BIT(6) /*!< frame synchronization postpone detection */ -#define SAI_STAT_FFSTAT BITS(16,18) /*!< FIFO status */ - -/* SAI_INTC */ -#define SAI_INTC_OUERRC BIT(0) /*!< FIFO overrun or underrun interrupt clear */ -#define SAI_INTC_MTDETC BIT(1) /*!< mute detection interrupt clear */ -#define SAI_INTC_ERRCKC BIT(2) /*!< error clock interrupt clear */ -#define SAI_INTC_ACNRDYC BIT(4) /*!< audio codec not ready interrupt clear */ -#define SAI_INTC_FSADETC BIT(5) /*!< frame synchronization advanced detection interrupt clear */ -#define SAI_INTC_FSPDETC BIT(6) /*!< frame synchronization postpone detection interrupt clear */ - -/* SAI_DATA */ -#define SAI_DATA_DATA BITS(0,31) /*!< transfer data or receive data */ - -/* constants definitions */ -/* SAI initialize parameter struct definitions */ -typedef struct { - uint32_t operating_mode; /*!< operating mode */ - uint32_t protocol; /*!< protocol selection */ - uint32_t data_width; /*!< data width */ - uint32_t shift_dir; /*!< shift direction */ - uint32_t sample_edge; /*!< sampling clock edge */ - uint32_t sync_mode; /*!< synchronization mode */ - uint32_t output_drive; /*!< output drive */ - uint32_t clk_div_bypass; /*!< clock divider logic bypass */ - uint32_t mclk_div; /*!< master clock divider ratio */ - uint32_t mclk_oversampling; /*!< the master clock oversampling rate */ - uint32_t mclk_enable; /*!< the master clock enable */ - uint32_t fifo_threshold; /*!< FIFO threshold */ -} sai_parameter_struct; - -/* SAI frame initialize parameter struct definitions */ -typedef struct { - uint32_t frame_width; /*!< frame width */ - uint32_t frame_sync_width; /*!< frame synchronization active width */ - uint32_t frame_sync_function; /*!< frame synchronization function */ - uint32_t frame_sync_polarity; /*!< frame synchronization active polarity */ - uint32_t frame_sync_offset; /*!< frame synchronization offset */ -} sai_frame_parameter_struct; - -/* SAI slot initialize parameter struct definitions */ -typedef struct { - uint32_t slot_number; /*!< slot number */ - uint32_t slot_width; /*!< slot width */ - uint32_t data_offset; /*!< data offset */ - uint32_t slot_active; /*!< slot activation vector */ -} sai_slot_parameter_struct; - -/* SAI FIFO status */ -typedef enum { - FIFO_EMPTY = 0U, /*!< empty */ - FIFO_EMPTY_TO_1_4_FULL, /*!< empty < fifo_level <= 1/4_full. */ - FIFO_1_4_FULL_TO_1_2_FULL, /*!< 1/4_full < fifo_level <= 1/2_full. */ - FIFO_1_2_FULL_TO_3_4_FULL, /*!< 1/2_full < fifo_level <= 3/4_full. */ - FIFO_3_4_FULL_TO_FULL, /*!< 3/4_full < fifo_level < full */ - FIFO_FULL /*!< full */ -} sai_fifo_state_enum; -/* SAI master clock enable */ -#define SAI_MCLK_DISABLE ((uint32_t)0x00000000U) /*!< the master clock is enable when SAI enable */ -#define SAI_MCLK_ENABLE SAI_CFG0_MCLKEN /*!< the master clock is enable now */ - -/* SAI master clock oversampling rate */ -#define SAI_MCLK_OVERSAMP_256 ((uint32_t)0x00000000U) /*!< MCLK = 256 * Ffs */ -#define SAI_MCLK_OVERSAMP_512 SAI_CFG0_MOSPR /*!< MCLK = 512 * Ffs */ - -/* SAI master clock divider ratio definitions */ -#define CFG0_MDIV(regval) (BITS(20,25)&((uint32_t)(regval) << 20U)) -#define SAI_MCLKDIV_1 CFG0_MDIV(0) /*!< primary frequency divider logic bypass */ -#define SAI_MCLKDIV_2 CFG0_MDIV(2) /*!< SAI clock is divided by 2 */ -#define SAI_MCLKDIV_3 CFG0_MDIV(3) /*!< SAI clock is divided by 3 */ -#define SAI_MCLKDIV_4 CFG0_MDIV(4) /*!< SAI clock is divided by 4 */ -#define SAI_MCLKDIV_5 CFG0_MDIV(5) /*!< SAI clock is divided by 5 */ -#define SAI_MCLKDIV_6 CFG0_MDIV(6) /*!< SAI clock is divided by 6 */ -#define SAI_MCLKDIV_7 CFG0_MDIV(7) /*!< SAI clock is divided by 7 */ -#define SAI_MCLKDIV_8 CFG0_MDIV(8) /*!< SAI clock is divided by 8 */ -#define SAI_MCLKDIV_9 CFG0_MDIV(9) /*!< SAI clock is divided by 9 */ -#define SAI_MCLKDIV_10 CFG0_MDIV(10) /*!< SAI clock is divided by 10 */ -#define SAI_MCLKDIV_11 CFG0_MDIV(11) /*!< SAI clock is divided by 11 */ -#define SAI_MCLKDIV_12 CFG0_MDIV(12) /*!< SAI clock is divided by 12 */ -#define SAI_MCLKDIV_13 CFG0_MDIV(13) /*!< SAI clock is divided by 13 */ -#define SAI_MCLKDIV_14 CFG0_MDIV(14) /*!< SAI clock is divided by 14 */ -#define SAI_MCLKDIV_15 CFG0_MDIV(15) /*!< SAI clock is divided by 15 */ -#define SAI_MCLKDIV_16 CFG0_MDIV(16) /*!< SAI clock is divided by 16 */ -#define SAI_MCLKDIV_17 CFG0_MDIV(17) /*!< SAI clock is divided by 17 */ -#define SAI_MCLKDIV_18 CFG0_MDIV(18) /*!< SAI clock is divided by 18 */ -#define SAI_MCLKDIV_19 CFG0_MDIV(19) /*!< SAI clock is divided by 19 */ -#define SAI_MCLKDIV_20 CFG0_MDIV(20) /*!< SAI clock is divided by 20 */ -#define SAI_MCLKDIV_21 CFG0_MDIV(21) /*!< SAI clock is divided by 21 */ -#define SAI_MCLKDIV_22 CFG0_MDIV(22) /*!< SAI clock is divided by 22 */ -#define SAI_MCLKDIV_23 CFG0_MDIV(23) /*!< SAI clock is divided by 23 */ -#define SAI_MCLKDIV_24 CFG0_MDIV(24) /*!< SAI clock is divided by 24 */ -#define SAI_MCLKDIV_25 CFG0_MDIV(25) /*!< SAI clock is divided by 25 */ -#define SAI_MCLKDIV_26 CFG0_MDIV(26) /*!< SAI clock is divided by 26 */ -#define SAI_MCLKDIV_27 CFG0_MDIV(27) /*!< SAI clock is divided by 27 */ -#define SAI_MCLKDIV_28 CFG0_MDIV(28) /*!< SAI clock is divided by 28 */ -#define SAI_MCLKDIV_29 CFG0_MDIV(29) /*!< SAI clock is divided by 29 */ -#define SAI_MCLKDIV_30 CFG0_MDIV(30) /*!< SAI clock is divided by 30 */ -#define SAI_MCLKDIV_31 CFG0_MDIV(31) /*!< SAI clock is divided by 31 */ -#define SAI_MCLKDIV_32 CFG0_MDIV(32) /*!< SAI clock is divided by 32 */ -#define SAI_MCLKDIV_33 CFG0_MDIV(33) /*!< SAI clock is divided by 33 */ -#define SAI_MCLKDIV_34 CFG0_MDIV(34) /*!< SAI clock is divided by 34 */ -#define SAI_MCLKDIV_35 CFG0_MDIV(35) /*!< SAI clock is divided by 35 */ -#define SAI_MCLKDIV_36 CFG0_MDIV(36) /*!< SAI clock is divided by 36 */ -#define SAI_MCLKDIV_37 CFG0_MDIV(37) /*!< SAI clock is divided by 37 */ -#define SAI_MCLKDIV_38 CFG0_MDIV(38) /*!< SAI clock is divided by 38 */ -#define SAI_MCLKDIV_39 CFG0_MDIV(39) /*!< SAI clock is divided by 39 */ -#define SAI_MCLKDIV_40 CFG0_MDIV(40) /*!< SAI clock is divided by 40 */ -#define SAI_MCLKDIV_41 CFG0_MDIV(41) /*!< SAI clock is divided by 41 */ -#define SAI_MCLKDIV_42 CFG0_MDIV(42) /*!< SAI clock is divided by 42 */ -#define SAI_MCLKDIV_43 CFG0_MDIV(43) /*!< SAI clock is divided by 43 */ -#define SAI_MCLKDIV_44 CFG0_MDIV(44) /*!< SAI clock is divided by 44 */ -#define SAI_MCLKDIV_45 CFG0_MDIV(45) /*!< SAI clock is divided by 45 */ -#define SAI_MCLKDIV_46 CFG0_MDIV(46) /*!< SAI clock is divided by 46 */ -#define SAI_MCLKDIV_47 CFG0_MDIV(47) /*!< SAI clock is divided by 47 */ -#define SAI_MCLKDIV_48 CFG0_MDIV(48) /*!< SAI clock is divided by 48 */ -#define SAI_MCLKDIV_49 CFG0_MDIV(49) /*!< SAI clock is divided by 49 */ -#define SAI_MCLKDIV_50 CFG0_MDIV(50) /*!< SAI clock is divided by 50 */ -#define SAI_MCLKDIV_51 CFG0_MDIV(51) /*!< SAI clock is divided by 51 */ -#define SAI_MCLKDIV_52 CFG0_MDIV(52) /*!< SAI clock is divided by 52 */ -#define SAI_MCLKDIV_53 CFG0_MDIV(53) /*!< SAI clock is divided by 53 */ -#define SAI_MCLKDIV_54 CFG0_MDIV(54) /*!< SAI clock is divided by 54 */ -#define SAI_MCLKDIV_55 CFG0_MDIV(55) /*!< SAI clock is divided by 55 */ -#define SAI_MCLKDIV_56 CFG0_MDIV(56) /*!< SAI clock is divided by 56 */ -#define SAI_MCLKDIV_57 CFG0_MDIV(57) /*!< SAI clock is divided by 57 */ -#define SAI_MCLKDIV_58 CFG0_MDIV(58) /*!< SAI clock is divided by 58 */ -#define SAI_MCLKDIV_59 CFG0_MDIV(59) /*!< SAI clock is divided by 59 */ -#define SAI_MCLKDIV_60 CFG0_MDIV(60) /*!< SAI clock is divided by 60 */ -#define SAI_MCLKDIV_61 CFG0_MDIV(61) /*!< SAI clock is divided by 61 */ -#define SAI_MCLKDIV_62 CFG0_MDIV(62) /*!< SAI clock is divided by 62 */ -#define SAI_MCLKDIV_63 CFG0_MDIV(63) /*!< SAI clock is divided by 63 */ - -/* SAI clock divider logic bypass */ -#define SAI_CLKDIV_BYPASS_OFF ((uint32_t)0x00000000U) /*!< clock divider ratio is applied to both primary and secondary divider logic */ -#define SAI_CLKDIV_BYPASS_ON SAI_CFG0_BYPASS /*!< clock divider logic is bypassed */ - -/* SAI output drive */ -#define SAI_OUTPUT_WITH_SAIEN ((uint32_t)0x00000000U) /*!< SAI sub-block output driven only when SAIEN is set */ -#define SAI_OUTPUT_NOW SAI_CFG0_ODRIV /*!< SAI sub-block output driven according to ODRIV setting */ - -/* SAI stereo and mono mode selection */ -#define SAI_STEREO_MODE ((uint32_t)0x00000000U) /*!< stereo mode */ -#define SAI_MONO_MODE SAI_CFG0_MONO /*!< mono mode */ - -/* SAI synchronization mode definitions */ -#define CFG0_SYNCMOD(regval) (BITS(10,11)&((uint32_t)(regval) << 10U)) -#define SAI_SYNCMODE_ASYNC CFG0_SYNCMOD(0) /*!< asynchronous with the other sub-block */ -#define SAI_SYNCMODE_OTHERBLOCK CFG0_SYNCMOD(1) /*!< synchronous with the other sub-block */ - -/* SAI sampling clock edge */ -#define SAI_SAMPEDGE_FALLING ((uint32_t)0x00000000U) /*!< data sampled on SCK falling edge */ -#define SAI_SAMPEDGE_RISING SAI_CFG0_SAMPEDGE /*!< data sampled on SCK rising edge */ - -/* SAI Shift direction */ -#define SAI_SHIFT_MSB ((uint32_t)0x00000000U) /*!< data is shifted with MSB first */ -#define SAI_SHIFT_LSB SAI_CFG0_SHIFTDIR /*!< data is shifted with LSB first */ - -/* SAI data width definitions */ -#define CFG0_DW(regval) (BITS(5,7)&((uint32_t)(regval) << 5U)) -#define SAI_DATAWIDTH_8BIT CFG0_DW(2) /*!< SAI data width 8 bit */ -#define SAI_DATAWIDTH_10BIT CFG0_DW(3) /*!< SAI data width 10 bit */ -#define SAI_DATAWIDTH_16BIT CFG0_DW(4) /*!< SAI data width 16 bit */ -#define SAI_DATAWIDTH_20BIT CFG0_DW(5) /*!< SAI data width 20 bit */ -#define SAI_DATAWIDTH_24BIT CFG0_DW(6) /*!< SAI data width 24 bit */ -#define SAI_DATAWIDTH_32BIT CFG0_DW(7) /*!< SAI data width 32 bit */ - -/* SAI protocol selection */ -#define CFG0_PROTOCOL(regval) (BITS(2,3)&((uint32_t)(regval) << 2U)) -#define SAI_PROTOCOL_POLYMORPHIC CFG0_PROTOCOL(0) /*!< polymorphic */ -#define SAI_PROTOCOL_SPDIF CFG0_PROTOCOL(1) /*!< SPDIF */ -#define SAI_PROTOCOL_AC97 CFG0_PROTOCOL(2) /*!< AC97 */ - -/* SAI operating mode */ -#define CFG0_OPERATING(regval) (BITS(0,1)&((uint32_t)(regval) << 0U)) -#define SAI_MASTER_TRANSMITTER CFG0_OPERATING(0) /*!< master transmitter */ -#define SAI_MASTER_RECEIVER CFG0_OPERATING(1) /*!< master receiver */ -#define SAI_SLAVE_TRANSMITTER CFG0_OPERATING(2) /*!< slave transmitter */ -#define SAI_SLAVE_RECEIVER CFG0_OPERATING(3) /*!< slave receiver */ - -/* SAI compander mode */ -#define CFG1_COMPANDER(regval) (BITS(14,15)&((uint32_t)(regval) << 14U)) -#define SAI_COMPANDER_OFF CFG1_COMPANDER(0) /*!< no compansion applies */ -#define SAI_COMPANDER_ULAW CFG1_COMPANDER(2) /*!< u-law algorithm */ -#define SAI_COMPANDER_ALAW CFG1_COMPANDER(3) /*!< A-law algorithm */ - -/* SAI complement mode */ -#define SAI_COMPLEMENT_1S ((uint32_t)0x00000000U) /*!< data represented in 1's complement form */ -#define SAI_COMPLEMENT_2S SAI_CFG1_CPLMOD /*!< data represented in 2's complement form */ - -/* SAI mute value */ -#define SAI_MUTESENT_0 ((uint32_t)0x00000000U) /*!< 0 is sent via the serial data line when mute is on */ -#define SAI_MUTESENT_LASTFREAM SAI_CFG1_MTVAL /*!< if SLOTNB is less or equals to two, last frame is sent via the serial data line */ - -/* SAI mute on */ -#define SAI_MUTE_OFF ((uint32_t)0x00000000U) /*!< mute mode off */ -#define SAI_MUTE_ON SAI_CFG1_MT /*!< mute mode on */ - -/* SAI serial data line output management */ -#define SAI_SDLINE_DRIVE ((uint32_t)0x00000000U) /*!< SD line output is driven entirely during the audio frame */ -#define SAI_SDLINE_RELEASE SAI_CFG1_SDOM /*!< SD line output is released near inactive slots */ - -/* SAI FIFO threshold */ -#define CFG1_FFTH(regval) (BITS(0,2)&((uint32_t)(regval) << 0U)) -#define SAI_FIFOTH_EMPTY CFG1_FFTH(0) /*!< FIFO threshold empty */ -#define SAI_FIFOTH_QUARTER CFG1_FFTH(1) /*!< FIFO threshold quarter full */ -#define SAI_FIFOTH_HALF CFG1_FFTH(2) /*!< FIFO threshold half full */ -#define SAI_FIFOTH_THREE_QUARTER CFG1_FFTH(3) /*!< FIFO threshold three quarter full */ -#define SAI_FIFOTH_FULL CFG1_FFTH(4) /*!< FIFO threshold full */ - -/* SAI frame synchronization offset */ -#define SAI_FS_OFFSET_BEGINNING ((uint32_t)0x00000000U) /*!< FS active edge asserted at the beginning of the first bit of the first slot */ -#define SAI_FS_OFFSET_ONEBITBEFORE SAI_FCFG_FSOST /*!< FS active edge asserted one bit cycle before normal FS when FSOST is 0 */ - -/* SAI frame synchronization active polarity */ -#define SAI_FS_POLARITY_LOW ((uint32_t)0x00000000U) /*!< FS low active polarity */ -#define SAI_FS_POLARITY_HIGH SAI_FCFG_FSPL /*!< FS high active polarity */ - -/* SAI frame synchronization function */ -#define SAI_FS_FUNC_START ((uint32_t)0x00000000U) /*!< FS only defines frame start */ -#define SAI_FS_FUNC_START_CHANNEL SAI_FCFG_FSFUNC /*!< FS define both frame start and channel number */ - -/* SAI slot active */ -#define SAI_SLOT_ACTIVE_NONE ((uint32_t)0x00000000U) /*!< all slot inactive */ -#define SAI_SLOT_ACTIVE_0 BIT(16) /*!< slot 0 active */ -#define SAI_SLOT_ACTIVE_1 BIT(17) /*!< slot 1 active */ -#define SAI_SLOT_ACTIVE_2 BIT(18) /*!< slot 2 active */ -#define SAI_SLOT_ACTIVE_3 BIT(19) /*!< slot 3 active */ -#define SAI_SLOT_ACTIVE_4 BIT(20) /*!< slot 4 active */ -#define SAI_SLOT_ACTIVE_5 BIT(21) /*!< slot 5 active */ -#define SAI_SLOT_ACTIVE_6 BIT(22) /*!< slot 6 active */ -#define SAI_SLOT_ACTIVE_7 BIT(23) /*!< slot 7 active */ -#define SAI_SLOT_ACTIVE_8 BIT(24) /*!< slot 8 active */ -#define SAI_SLOT_ACTIVE_9 BIT(25) /*!< slot 9 active */ -#define SAI_SLOT_ACTIVE_10 BIT(26) /*!< slot 10 active */ -#define SAI_SLOT_ACTIVE_11 BIT(27) /*!< slot 11 active */ -#define SAI_SLOT_ACTIVE_12 BIT(28) /*!< slot 12 active */ -#define SAI_SLOT_ACTIVE_13 BIT(29) /*!< slot 13 active */ -#define SAI_SLOT_ACTIVE_14 BIT(30) /*!< slot 14 active */ -#define SAI_SLOT_ACTIVE_15 BIT(31) /*!< slot 15 active */ -#define SAI_SLOT_ACTIVE_ALL BITS(16,31) /*!< slot all active */ - -/* SAI slot width definitions */ -#define SCFG_SW(regval) (BITS(6,7)&((uint32_t)(regval) << 6U)) -#define SAI_SLOT_WIDTH_DATA SCFG_SW(0) /*!< slot width equals data width */ -#define SAI_SLOT_WIDTH_16BIT SCFG_SW(1) /*!< slot width of 16-bits */ -#define SAI_SLOT_WIDTH_32BIT SCFG_SW(2) /*!< slot width of 32-bits */ - -/* SAI interrupt enable or disable */ -#define SAI_INT_OUERR SAI_INTEN_OUERRIE /*!< FIFO overrun or underrun interrupt enable */ -#define SAI_INT_MTDET SAI_INTEN_MTDETIE /*!< mute detection interrupt enable */ -#define SAI_INT_ERRCK SAI_INTEN_ERRCKIE /*!< error clock interrupt enable */ -#define SAI_INT_FFREQ SAI_INTEN_FFREQIE /*!< FIFO request interrupt enable */ -#define SAI_INT_ACNRDY SAI_INTEN_ACNRDYIE /*!< audio codec not ready interrupt enable */ -#define SAI_INT_FSADET SAI_INTEN_FSADETIE /*!< frame synchronization advanced detection interrupt enable */ -#define SAI_INT_FSPDET SAI_INTEN_FSPDETIE /*!< frame synchronization postpone detection interrupt enable */ - -/* SAI flags */ -#define SAI_FLAG_OUERR SAI_STAT_OUERR /*!< FIFO overrun or underrun flag */ -#define SAI_FLAG_MTDET SAI_STAT_MTDET /*!< mute detection flag */ -#define SAI_FLAG_ERRCK SAI_STAT_ERRCK /*!< error clock flag */ -#define SAI_FLAG_FFREQ SAI_STAT_FFREQ /*!< FIFO request flag */ -#define SAI_FLAG_ACNRDY SAI_STAT_ACNRDY /*!< audio codec not ready flag */ -#define SAI_FLAG_FSADET SAI_STAT_FSADET /*!< frame synchronization advanced detection flag */ -#define SAI_FLAG_FSPDET SAI_STAT_FSPDET /*!< frame synchronization postpone detection flag */ - -/* SAI FIFO status */ -#define STAT_FFSTAT(regval) (BITS(16,18)&((uint32_t)(regval) << 16U)) -#define SAI_FIFO_STAT_EMPTY STAT_FFSTAT(0) /*!< FIFO status empty */ -#define SAI_FIFO_STAT_QUARTER STAT_FFSTAT(1) /*!< receiver: empty < FIFO <= 1/4, transmitter: empty < FIFO < 1/4 */ -#define SAI_FIFO_STAT_HALF STAT_FFSTAT(2) /*!< receiver: 1/4 < FIFO <= 1/2, transmitter: 1/4 <= FIFO < 1/2 */ -#define SAI_FIFO_STAT_THREE_QUARTER STAT_FFSTAT(3) /*!< receiver: 1/2 < FIFO <= 3/4, transmitter: 1/2 <= FIFO < 3/4 */ -#define SAI_FIFO_STAT_NEARFULL STAT_FFSTAT(4) /*!< receiver: 3/4 < FIFO < full, transmitter: 3/4 <= FIFO < full */ -#define SAI_FIFO_STAT_FULL STAT_FFSTAT(5) /*!< FIFO status full */ - -#define SAI_BLOCK0 ((uint32_t)0x00000000U) /*!< Block 0 */ -#define SAI_BLOCK1 ((uint32_t)0x00000001U) /*!< Block 1 */ - -/* function declarations */ -/* SAI deinitialization and initialization functions */ -/* reset SAI */ -void sai_deinit(void); - -/* initialize SAI parameter struct with the default values */ -void sai_struct_para_init(sai_parameter_struct *sai_init_stuct); -/* initialize SAI frame parameter struct with the default values */ -void sai_frame_struct_para_init(sai_frame_parameter_struct *sai_frame_init_struct); -/* initialize SAI slot parameter struct with the default values */ -void sai_slot_struct_para_init(sai_slot_parameter_struct *sai_slot_init_struct); - -/* initialize SAI */ -void sai_init(uint32_t block, sai_parameter_struct *sai_struct); -/* initialize SAI frame */ -void sai_frame_init(uint32_t block, sai_frame_parameter_struct *sai_frame_struct); -/* initialize SAI slot */ -void sai_slot_init(uint32_t block, sai_slot_parameter_struct *sai_slot_struct); - -/* sai enable*/ -void sai_enable(uint32_t block); -/* sai disable*/ -void sai_disable(uint32_t block); - -/* SAI configuration functions */ -/* SAI serial data near inactive slot output management */ -void sai_sdoutput_config(uint32_t block, uint32_t sdout); -/* configure SAI mono mode */ -void sai_monomode_config(uint32_t block, uint32_t mono); -/* configure SAI companding mode */ -void sai_companding_config(uint32_t block, uint32_t compander, uint32_t complement); -/* enable SAI mute detected or mute send */ -void sai_mute_enable(uint32_t block); -/* disable SAI mute detected or mute send */ -void sai_mute_disable(uint32_t block); -/* configure SAI mute value */ -void sai_mute_value_config(uint32_t block, uint32_t value); -/* configure SAI mute frame count */ -void sai_mute_count_config(uint32_t block, uint32_t count); -/* SAI transmit data */ -void sai_data_transmit(uint32_t block, uint32_t data); -/* SAI receive data */ -uint32_t sai_data_receive(uint32_t block); -/* get SAI fifo status */ -sai_fifo_state_enum sai_fifo_status_get(uint32_t block); -/* SAI fifo flush */ -void sai_fifo_flush(uint32_t block); - -/* SAI DMA functions */ -/* enable SAI dma */ -void sai_dma_enable(uint32_t block); -/* disable SAI dma */ -void sai_dma_disable(uint32_t block); - -/* flag and interrupt functions */ -/* enable the SAI interrupt */ -void sai_interrupt_enable(uint32_t block, uint32_t interrupt); -/* disable the SAI interrupt */ -void sai_interrupt_disable(uint32_t block, uint32_t interrupt); -/* get SAI interrupt flag */ -FlagStatus sai_interrupt_flag_get(uint32_t block, uint32_t interrupt); -/* clear SAI interrupt flag */ -void sai_interrupt_flag_clear(uint32_t block, uint32_t interrupt); -/* get SAI flag */ -FlagStatus sai_flag_get(uint32_t block, uint32_t flag); -/* clear SAI flag */ -void sai_flag_clear(uint32_t block, uint32_t flag); - -#endif /* GD32F5XX_SAI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h deleted file mode 100644 index e174c3c60a2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_sdio.h +++ /dev/null @@ -1,431 +0,0 @@ -/*! - \file gd32f5xx_sdio.h - \brief definitions for the SDIO - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_SDIO_H -#define GD32F5XX_SDIO_H - -#include "gd32f5xx.h" - -/* SDIO definitions */ -#define SDIO SDIO_BASE - -/* registers definitions */ -#define SDIO_PWRCTL REG32(SDIO + 0x00000000U) /*!< SDIO power control register */ -#define SDIO_CLKCTL REG32(SDIO + 0x00000004U) /*!< SDIO clock control register */ -#define SDIO_CMDAGMT REG32(SDIO + 0x00000008U) /*!< SDIO command argument register */ -#define SDIO_CMDCTL REG32(SDIO + 0x0000000CU) /*!< SDIO command control register */ -#define SDIO_RSPCMDIDX REG32(SDIO + 0x00000010U) /*!< SDIO command index response register */ -#define SDIO_RESP0 REG32(SDIO + 0x00000014U) /*!< SDIO response register 0 */ -#define SDIO_RESP1 REG32(SDIO + 0x00000018U) /*!< SDIO response register 1 */ -#define SDIO_RESP2 REG32(SDIO + 0x0000001CU) /*!< SDIO response register 2 */ -#define SDIO_RESP3 REG32(SDIO + 0x00000020U) /*!< SDIO response register 3 */ -#define SDIO_DATATO REG32(SDIO + 0x00000024U) /*!< SDIO data timeout register */ -#define SDIO_DATALEN REG32(SDIO + 0x00000028U) /*!< SDIO data length register */ -#define SDIO_DATACTL REG32(SDIO + 0x0000002CU) /*!< SDIO data control register */ -#define SDIO_DATACNT REG32(SDIO + 0x00000030U) /*!< SDIO data counter register */ -#define SDIO_STAT REG32(SDIO + 0x00000034U) /*!< SDIO status register */ -#define SDIO_INTC REG32(SDIO + 0x00000038U) /*!< SDIO interrupt clear register */ -#define SDIO_INTEN REG32(SDIO + 0x0000003CU) /*!< SDIO interrupt enable register */ -#define SDIO_FIFOCNT REG32(SDIO + 0x00000048U) /*!< SDIO FIFO counter register */ -#define SDIO_FIFO REG32(SDIO + 0x00000080U) /*!< SDIO FIFO data register */ - -/* bits definitions */ -/* SDIO_PWRCTL */ -#define SDIO_PWRCTL_PWRCTL BITS(0,1) /*!< SDIO power control bits */ - -/* SDIO_CLKCTL */ -#define SDIO_CLKCTL_DIV BITS(0,7) /*!< clock division */ -#define SDIO_CLKCTL_CLKEN BIT(8) /*!< SDIO_CLK clock output enable bit */ -#define SDIO_CLKCTL_CLKPWRSAV BIT(9) /*!< SDIO_CLK clock dynamic switch on/off for power saving */ -#define SDIO_CLKCTL_CLKBYP BIT(10) /*!< clock bypass enable bit */ -#define SDIO_CLKCTL_BUSMODE BITS(11,12) /*!< SDIO card bus mode control bit */ -#define SDIO_CLKCTL_CLKEDGE BIT(13) /*!< SDIO_CLK clock edge selection bit */ -#define SDIO_CLKCTL_HWCLKEN BIT(14) /*!< hardware clock control enable bit */ -#define SDIO_CLKCTL_DIV8 BIT(31) /*!< MSB of clock division */ - -/* SDIO_CMDAGMT */ -#define SDIO_CMDAGMT_CMDAGMT BITS(0,31) /*!< SDIO card command argument */ - -/* SDIO_CMDCTL */ -#define SDIO_CMDCTL_CMDIDX BITS(0,5) /*!< command index */ -#define SDIO_CMDCTL_CMDRESP BITS(6,7) /*!< command response type bits */ -#define SDIO_CMDCTL_INTWAIT BIT(8) /*!< interrupt wait instead of timeout */ -#define SDIO_CMDCTL_WAITDEND BIT(9) /*!< wait for ends of data transfer */ -#define SDIO_CMDCTL_CSMEN BIT(10) /*!< command state machine(CSM) enable bit */ -#define SDIO_CMDCTL_SUSPEND BIT(11) /*!< SD I/O suspend command(SD I/O only) */ -#define SDIO_CMDCTL_ENCMDC BIT(12) /*!< CMD completion signal enabled (CE-ATA only) */ -#define SDIO_CMDCTL_NINTEN BIT(13) /*!< no CE-ATA interrupt (CE-ATA only) */ -#define SDIO_CMDCTL_ATAEN BIT(14) /*!< CE-ATA command enable(CE-ATA only) */ - -/* SDIO_DATATO */ -#define SDIO_DATATO_DATATO BITS(0,31) /*!< data timeout period */ - -/* SDIO_DATALEN */ -#define SDIO_DATALEN_DATALEN BITS(0,24) /*!< data transfer length */ - -/* SDIO_DATACTL */ -#define SDIO_DATACTL_DATAEN BIT(0) /*!< data transfer enabled bit */ -#define SDIO_DATACTL_DATADIR BIT(1) /*!< data transfer direction */ -#define SDIO_DATACTL_TRANSMOD BIT(2) /*!< data transfer mode */ -#define SDIO_DATACTL_DMAEN BIT(3) /*!< DMA enable bit */ -#define SDIO_DATACTL_BLKSZ BITS(4,7) /*!< data block size */ -#define SDIO_DATACTL_RWEN BIT(8) /*!< read wait mode enabled(SD I/O only) */ -#define SDIO_DATACTL_RWSTOP BIT(9) /*!< read wait stop(SD I/O only) */ -#define SDIO_DATACTL_RWTYPE BIT(10) /*!< read wait type(SD I/O only) */ -#define SDIO_DATACTL_IOEN BIT(11) /*!< SD I/O specific function enable(SD I/O only) */ - -/* SDIO_STAT */ -#define SDIO_STAT_CCRCERR BIT(0) /*!< command response received (CRC check failed) */ -#define SDIO_STAT_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) */ -#define SDIO_STAT_CMDTMOUT BIT(2) /*!< command response timeout */ -#define SDIO_STAT_DTTMOUT BIT(3) /*!< data timeout */ -#define SDIO_STAT_TXURE BIT(4) /*!< transmit FIFO underrun error occurs */ -#define SDIO_STAT_RXORE BIT(5) /*!< received FIFO overrun error occurs */ -#define SDIO_STAT_CMDRECV BIT(6) /*!< command response received (CRC check passed) */ -#define SDIO_STAT_CMDSEND BIT(7) /*!< command sent (no response required) */ -#define SDIO_STAT_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) */ -#define SDIO_STAT_STBITE BIT(9) /*!< start bit error in the bus */ -#define SDIO_STAT_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) */ -#define SDIO_STAT_CMDRUN BIT(11) /*!< command transmission in progress */ -#define SDIO_STAT_TXRUN BIT(12) /*!< data transmission in progress */ -#define SDIO_STAT_RXRUN BIT(13) /*!< data reception in progress */ -#define SDIO_STAT_TFH BIT(14) /*!< transmit FIFO is half empty: at least 8 words can be written into the FIFO */ -#define SDIO_STAT_RFH BIT(15) /*!< receive FIFO is half full: at least 8 words can be read in the FIFO */ -#define SDIO_STAT_TFF BIT(16) /*!< transmit FIFO is full */ -#define SDIO_STAT_RFF BIT(17) /*!< receive FIFO is full */ -#define SDIO_STAT_TFE BIT(18) /*!< transmit FIFO is empty */ -#define SDIO_STAT_RFE BIT(19) /*!< receive FIFO is empty */ -#define SDIO_STAT_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO */ -#define SDIO_STAT_RXDTVAL BIT(21) /*!< data is valid in receive FIFO */ -#define SDIO_STAT_SDIOINT BIT(22) /*!< SD I/O interrupt received */ -#define SDIO_STAT_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) */ - -/* SDIO_INTC */ -#define SDIO_INTC_CCRCERRC BIT(0) /*!< CCRCERR flag clear bit */ -#define SDIO_INTC_DTCRCERRC BIT(1) /*!< DTCRCERR flag clear bit */ -#define SDIO_INTC_CMDTMOUTC BIT(2) /*!< CMDTMOUT flag clear bit */ -#define SDIO_INTC_DTTMOUTC BIT(3) /*!< DTTMOUT flag clear bit */ -#define SDIO_INTC_TXUREC BIT(4) /*!< TXURE flag clear bit */ -#define SDIO_INTC_RXOREC BIT(5) /*!< RXORE flag clear bit */ -#define SDIO_INTC_CMDRECVC BIT(6) /*!< CMDRECV flag clear bit */ -#define SDIO_INTC_CMDSENDC BIT(7) /*!< CMDSEND flag clear bit */ -#define SDIO_INTC_DTENDC BIT(8) /*!< DTEND flag clear bit */ -#define SDIO_INTC_STBITEC BIT(9) /*!< STBITE flag clear bit */ -#define SDIO_INTC_DTBLKENDC BIT(10) /*!< DTBLKEND flag clear bit */ -#define SDIO_INTC_SDIOINTC BIT(22) /*!< SDIOINT flag clear bit */ -#define SDIO_INTC_ATAENDC BIT(23) /*!< ATAEND flag clear bit */ - -/* SDIO_INTEN */ -#define SDIO_INTEN_CCRCERRIE BIT(0) /*!< command response CRC fail interrupt enable */ -#define SDIO_INTEN_DTCRCERRIE BIT(1) /*!< data CRC fail interrupt enable */ -#define SDIO_INTEN_CMDTMOUTIE BIT(2) /*!< command response timeout interrupt enable */ -#define SDIO_INTEN_DTTMOUTIE BIT(3) /*!< data timeout interrupt enable */ -#define SDIO_INTEN_TXUREIE BIT(4) /*!< transmit FIFO underrun error interrupt enable */ -#define SDIO_INTEN_RXOREIE BIT(5) /*!< received FIFO overrun error interrupt enable */ -#define SDIO_INTEN_CMDRECVIE BIT(6) /*!< command response received interrupt enable */ -#define SDIO_INTEN_CMDSENDIE BIT(7) /*!< command sent interrupt enable */ -#define SDIO_INTEN_DTENDIE BIT(8) /*!< data end interrupt enable */ -#define SDIO_INTEN_STBITEIE BIT(9) /*!< start bit error interrupt enable */ -#define SDIO_INTEN_DTBLKENDIE BIT(10) /*!< data block end interrupt enable */ -#define SDIO_INTEN_CMDRUNIE BIT(11) /*!< command transmission interrupt enable */ -#define SDIO_INTEN_TXRUNIE BIT(12) /*!< data transmission interrupt enable */ -#define SDIO_INTEN_RXRUNIE BIT(13) /*!< data reception interrupt enable */ -#define SDIO_INTEN_TFHIE BIT(14) /*!< transmit FIFO half empty interrupt enable */ -#define SDIO_INTEN_RFHIE BIT(15) /*!< receive FIFO half full interrupt enable */ -#define SDIO_INTEN_TFFIE BIT(16) /*!< transmit FIFO full interrupt enable */ -#define SDIO_INTEN_RFFIE BIT(17) /*!< receive FIFO full interrupt enable */ -#define SDIO_INTEN_TFEIE BIT(18) /*!< transmit FIFO empty interrupt enable */ -#define SDIO_INTEN_RFEIE BIT(19) /*!< receive FIFO empty interrupt enable */ -#define SDIO_INTEN_TXDTVALIE BIT(20) /*!< data valid in transmit FIFO interrupt enable */ -#define SDIO_INTEN_RXDTVALIE BIT(21) /*!< data valid in receive FIFO interrupt enable */ -#define SDIO_INTEN_SDIOINTIE BIT(22) /*!< SD I/O interrupt received interrupt enable */ -#define SDIO_INTEN_ATAENDIE BIT(23) /*!< CE-ATA command completion signal received interrupt enable */ - -/* SDIO_FIFO */ -#define SDIO_FIFO_FIFODT BITS(0,31) /*!< receive FIFO data or transmit FIFO data */ - -/* constants definitions */ -/* SDIO flags */ -#define SDIO_FLAG_CCRCERR BIT(0) /*!< command response received (CRC check failed) flag */ -#define SDIO_FLAG_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) flag */ -#define SDIO_FLAG_CMDTMOUT BIT(2) /*!< command response timeout flag */ -#define SDIO_FLAG_DTTMOUT BIT(3) /*!< data timeout flag */ -#define SDIO_FLAG_TXURE BIT(4) /*!< transmit FIFO underrun error occurs flag */ -#define SDIO_FLAG_RXORE BIT(5) /*!< received FIFO overrun error occurs flag */ -#define SDIO_FLAG_CMDRECV BIT(6) /*!< command response received (CRC check passed) flag */ -#define SDIO_FLAG_CMDSEND BIT(7) /*!< command sent (no response required) flag */ -#define SDIO_FLAG_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) flag */ -#define SDIO_FLAG_STBITE BIT(9) /*!< start bit error in the bus flag */ -#define SDIO_FLAG_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) flag */ -#define SDIO_FLAG_CMDRUN BIT(11) /*!< command transmission in progress flag */ -#define SDIO_FLAG_TXRUN BIT(12) /*!< data transmission in progress flag */ -#define SDIO_FLAG_RXRUN BIT(13) /*!< data reception in progress flag */ -#define SDIO_FLAG_TFH BIT(14) /*!< transmit FIFO is half empty flag: at least 8 words can be written into the FIFO */ -#define SDIO_FLAG_RFH BIT(15) /*!< receive FIFO is half full flag: at least 8 words can be read in the FIFO */ -#define SDIO_FLAG_TFF BIT(16) /*!< transmit FIFO is full flag */ -#define SDIO_FLAG_RFF BIT(17) /*!< receive FIFO is full flag */ -#define SDIO_FLAG_TFE BIT(18) /*!< transmit FIFO is empty flag */ -#define SDIO_FLAG_RFE BIT(19) /*!< receive FIFO is empty flag */ -#define SDIO_FLAG_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO flag */ -#define SDIO_FLAG_RXDTVAL BIT(21) /*!< data is valid in receive FIFO flag */ -#define SDIO_FLAG_SDIOINT BIT(22) /*!< SD I/O interrupt received flag */ -#define SDIO_FLAG_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) flag */ - -/* SDIO interrupt enable or disable */ -#define SDIO_INT_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt */ -#define SDIO_INT_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt */ -#define SDIO_INT_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt */ -#define SDIO_INT_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt */ -#define SDIO_INT_TXURE BIT(4) /*!< SDIO TXURE interrupt */ -#define SDIO_INT_RXORE BIT(5) /*!< SDIO RXORE interrupt */ -#define SDIO_INT_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt */ -#define SDIO_INT_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt */ -#define SDIO_INT_DTEND BIT(8) /*!< SDIO DTEND interrupt */ -#define SDIO_INT_STBITE BIT(9) /*!< SDIO STBITE interrupt */ -#define SDIO_INT_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt */ -#define SDIO_INT_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt */ -#define SDIO_INT_TXRUN BIT(12) /*!< SDIO TXRUN interrupt */ -#define SDIO_INT_RXRUN BIT(13) /*!< SDIO RXRUN interrupt */ -#define SDIO_INT_TFH BIT(14) /*!< SDIO TFH interrupt */ -#define SDIO_INT_RFH BIT(15) /*!< SDIO RFH interrupt */ -#define SDIO_INT_TFF BIT(16) /*!< SDIO TFF interrupt */ -#define SDIO_INT_RFF BIT(17) /*!< SDIO RFF interrupt */ -#define SDIO_INT_TFE BIT(18) /*!< SDIO TFE interrupt */ -#define SDIO_INT_RFE BIT(19) /*!< SDIO RFE interrupt */ -#define SDIO_INT_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt */ -#define SDIO_INT_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt */ -#define SDIO_INT_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt */ -#define SDIO_INT_ATAEND BIT(23) /*!< SDIO ATAEND interrupt */ - -/* SDIO interrupt flags */ -#define SDIO_INT_FLAG_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt flag */ -#define SDIO_INT_FLAG_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt flag */ -#define SDIO_INT_FLAG_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt flag */ -#define SDIO_INT_FLAG_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt flag */ -#define SDIO_INT_FLAG_TXURE BIT(4) /*!< SDIO TXURE interrupt flag */ -#define SDIO_INT_FLAG_RXORE BIT(5) /*!< SDIO RXORE interrupt flag */ -#define SDIO_INT_FLAG_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt flag */ -#define SDIO_INT_FLAG_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt flag */ -#define SDIO_INT_FLAG_DTEND BIT(8) /*!< SDIO DTEND interrupt flag */ -#define SDIO_INT_FLAG_STBITE BIT(9) /*!< SDIO STBITE interrupt flag */ -#define SDIO_INT_FLAG_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt flag */ -#define SDIO_INT_FLAG_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt flag */ -#define SDIO_INT_FLAG_TXRUN BIT(12) /*!< SDIO TXRUN interrupt flag */ -#define SDIO_INT_FLAG_RXRUN BIT(13) /*!< SDIO RXRUN interrupt flag */ -#define SDIO_INT_FLAG_TFH BIT(14) /*!< SDIO TFH interrupt flag */ -#define SDIO_INT_FLAG_RFH BIT(15) /*!< SDIO RFH interrupt flag */ -#define SDIO_INT_FLAG_TFF BIT(16) /*!< SDIO TFF interrupt flag */ -#define SDIO_INT_FLAG_RFF BIT(17) /*!< SDIO RFF interrupt flag */ -#define SDIO_INT_FLAG_TFE BIT(18) /*!< SDIO TFE interrupt flag */ -#define SDIO_INT_FLAG_RFE BIT(19) /*!< SDIO RFE interrupt flag */ -#define SDIO_INT_FLAG_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt flag */ -#define SDIO_INT_FLAG_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt flag */ -#define SDIO_INT_FLAG_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt flag */ -#define SDIO_INT_FLAG_ATAEND BIT(23) /*!< SDIO ATAEND interrupt flag */ - -/* SDIO power control */ -#define PWRCTL_PWRCTL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) -#define SDIO_POWER_OFF PWRCTL_PWRCTL(0) /*!< SDIO power off */ -#define SDIO_POWER_ON PWRCTL_PWRCTL(3) /*!< SDIO power on */ - -/* SDIO card bus mode control */ -#define CLKCTL_BUSMODE(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) -#define SDIO_BUSMODE_1BIT CLKCTL_BUSMODE(0) /*!< 1-bit SDIO card bus mode */ -#define SDIO_BUSMODE_4BIT CLKCTL_BUSMODE(1) /*!< 4-bit SDIO card bus mode */ -#define SDIO_BUSMODE_8BIT CLKCTL_BUSMODE(2) /*!< 8-bit SDIO card bus mode */ - -/* SDIO_CLK clock edge selection */ -#define SDIO_SDIOCLKEDGE_RISING (uint32_t)0x00000000U /*!< select the rising edge of the SDIOCLK to generate SDIO_CLK */ -#define SDIO_SDIOCLKEDGE_FALLING SDIO_CLKCTL_CLKEDGE /*!< select the falling edge of the SDIOCLK to generate SDIO_CLK */ - -/* clock bypass enable or disable */ -#define SDIO_CLOCKBYPASS_DISABLE (uint32_t)0x00000000U /*!< no bypass */ -#define SDIO_CLOCKBYPASS_ENABLE SDIO_CLKCTL_CLKBYP /*!< clock bypass */ - -/* SDIO_CLK clock dynamic switch on/off for power saving */ -#define SDIO_CLOCKPWRSAVE_DISABLE (uint32_t)0x00000000U /*!< SDIO_CLK clock is always on */ -#define SDIO_CLOCKPWRSAVE_ENABLE SDIO_CLKCTL_CLKPWRSAV /*!< SDIO_CLK closed when bus is idle */ - -/* SDIO command response type */ -#define CMDCTL_CMDRESP(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) -#define SDIO_RESPONSETYPE_NO CMDCTL_CMDRESP(0) /*!< no response */ -#define SDIO_RESPONSETYPE_SHORT CMDCTL_CMDRESP(1) /*!< short response */ -#define SDIO_RESPONSETYPE_LONG CMDCTL_CMDRESP(3) /*!< long response */ - -/* command state machine wait type */ -#define SDIO_WAITTYPE_NO (uint32_t)0x00000000U /*!< not wait interrupt */ -#define SDIO_WAITTYPE_INTERRUPT SDIO_CMDCTL_INTWAIT /*!< wait interrupt */ -#define SDIO_WAITTYPE_DATAEND SDIO_CMDCTL_WAITDEND /*!< wait the end of data transfer */ - -#define SDIO_RESPONSE0 (uint32_t)0x00000000U /*!< card response[31:0]/card response[127:96] */ -#define SDIO_RESPONSE1 (uint32_t)0x00000001U /*!< card response[95:64] */ -#define SDIO_RESPONSE2 (uint32_t)0x00000002U /*!< card response[63:32] */ -#define SDIO_RESPONSE3 (uint32_t)0x00000003U /*!< card response[31:1], plus bit 0 */ - -/* SDIO data block size */ -#define DATACTL_BLKSZ(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) -#define SDIO_DATABLOCKSIZE_1BYTE DATACTL_BLKSZ(0) /*!< block size = 1 byte */ -#define SDIO_DATABLOCKSIZE_2BYTES DATACTL_BLKSZ(1) /*!< block size = 2 bytes */ -#define SDIO_DATABLOCKSIZE_4BYTES DATACTL_BLKSZ(2) /*!< block size = 4 bytes */ -#define SDIO_DATABLOCKSIZE_8BYTES DATACTL_BLKSZ(3) /*!< block size = 8 bytes */ -#define SDIO_DATABLOCKSIZE_16BYTES DATACTL_BLKSZ(4) /*!< block size = 16 bytes */ -#define SDIO_DATABLOCKSIZE_32BYTES DATACTL_BLKSZ(5) /*!< block size = 32 bytes */ -#define SDIO_DATABLOCKSIZE_64BYTES DATACTL_BLKSZ(6) /*!< block size = 64 bytes */ -#define SDIO_DATABLOCKSIZE_128BYTES DATACTL_BLKSZ(7) /*!< block size = 128 bytes */ -#define SDIO_DATABLOCKSIZE_256BYTES DATACTL_BLKSZ(8) /*!< block size = 256 bytes */ -#define SDIO_DATABLOCKSIZE_512BYTES DATACTL_BLKSZ(9) /*!< block size = 512 bytes */ -#define SDIO_DATABLOCKSIZE_1024BYTES DATACTL_BLKSZ(10) /*!< block size = 1024 bytes */ -#define SDIO_DATABLOCKSIZE_2048BYTES DATACTL_BLKSZ(11) /*!< block size = 2048 bytes */ -#define SDIO_DATABLOCKSIZE_4096BYTES DATACTL_BLKSZ(12) /*!< block size = 4096 bytes */ -#define SDIO_DATABLOCKSIZE_8192BYTES DATACTL_BLKSZ(13) /*!< block size = 8192 bytes */ -#define SDIO_DATABLOCKSIZE_16384BYTES DATACTL_BLKSZ(14) /*!< block size = 16384 bytes */ - -/* SDIO data transfer mode */ -#define SDIO_TRANSMODE_BLOCK (uint32_t)0x00000000U /*!< block transfer */ -#define SDIO_TRANSMODE_STREAM SDIO_DATACTL_TRANSMOD /*!< stream transfer or SDIO multibyte transfer */ - -/* SDIO data transfer direction */ -#define SDIO_TRANSDIRECTION_TOCARD (uint32_t)0x00000000U /*!< write data to card */ -#define SDIO_TRANSDIRECTION_TOSDIO SDIO_DATACTL_DATADIR /*!< read data from card */ - -/* SDIO read wait type */ -#define SDIO_READWAITTYPE_DAT2 (uint32_t)0x00000000U /*!< read wait control using SDIO_DAT[2] */ -#define SDIO_READWAITTYPE_CLK SDIO_DATACTL_RWTYPE /*!< read wait control by stopping SDIO_CLK */ - -/* function declarations */ -/* de/initialization functions, hardware clock, bus mode, power_state and SDIO clock configuration */ -/* deinitialize the SDIO */ -void sdio_deinit(void); -/* configure the SDIO clock */ -void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division); -/* enable hardware clock control */ -void sdio_hardware_clock_enable(void); -/* disable hardware clock control */ -void sdio_hardware_clock_disable(void); -/* set different SDIO card bus mode */ -void sdio_bus_mode_set(uint32_t bus_mode); -/* set the SDIO power state */ -void sdio_power_state_set(uint32_t power_state); -/* get the SDIO power state */ -uint32_t sdio_power_state_get(void); -/* enable SDIO_CLK clock output */ -void sdio_clock_enable(void); -/* disable SDIO_CLK clock output */ -void sdio_clock_disable(void); - -/* configure the command index, argument, response type, wait type and CSM to send command functions */ -/* configure the command and response */ -void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type); -/* set the command state machine wait type */ -void sdio_wait_type_set(uint32_t wait_type); -/* enable the CSM(command state machine) */ -void sdio_csm_enable(void); -/* disable the CSM(command state machine) */ -void sdio_csm_disable(void); -/* get the last response command index */ -uint8_t sdio_command_index_get(void); -/* get the response for the last received command */ -uint32_t sdio_response_get(uint32_t sdio_responsex); - -/* configure the data timeout, length, block size, transfer mode, direction and DSM for data transfer functions */ -/* configure the data timeout, data length and data block size */ -void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize); -/* configure the data transfer mode and direction */ -void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction); -/* enable the DSM(data state machine) for data transfer */ -void sdio_dsm_enable(void); -/* disable the DSM(data state machine) */ -void sdio_dsm_disable(void); -/* write data(one word) to the transmit FIFO */ -void sdio_data_write(uint32_t data); -/* read data(one word) from the receive FIFO */ -uint32_t sdio_data_read(void); -/* get the number of remaining data bytes to be transferred to card */ -uint32_t sdio_data_counter_get(void); -/* get the number of words remaining to be written or read from FIFO */ -uint32_t sdio_fifo_counter_get(void); -/* enable the DMA request for SDIO */ -void sdio_dma_enable(void); -/* disable the DMA request for SDIO */ -void sdio_dma_disable(void); - -/* flag and interrupt functions */ -/* get the flags state of SDIO */ -FlagStatus sdio_flag_get(uint32_t flag); -/* clear the pending flags of SDIO */ -void sdio_flag_clear(uint32_t flag); -/* enable the SDIO interrupt */ -void sdio_interrupt_enable(uint32_t int_flag); -/* disable the SDIO interrupt */ -void sdio_interrupt_disable(uint32_t int_flag); -/* get the interrupt flags state of SDIO */ -FlagStatus sdio_interrupt_flag_get(uint32_t int_flag); -/* clear the interrupt pending flags of SDIO */ -void sdio_interrupt_flag_clear(uint32_t int_flag); - -/* SD I/O card functions */ -/* enable the read wait mode(SD I/O only) */ -void sdio_readwait_enable(void); -/* disable the read wait mode(SD I/O only) */ -void sdio_readwait_disable(void); -/* enable the function that stop the read wait process(SD I/O only) */ -void sdio_stop_readwait_enable(void); -/* disable the function that stop the read wait process(SD I/O only) */ -void sdio_stop_readwait_disable(void); -/* set the read wait type(SD I/O only) */ -void sdio_readwait_type_set(uint32_t readwait_type); -/* enable the SD I/O mode specific operation(SD I/O only) */ -void sdio_operation_enable(void); -/* disable the SD I/O mode specific operation(SD I/O only) */ -void sdio_operation_disable(void); -/* enable the SD I/O suspend operation(SD I/O only) */ -void sdio_suspend_enable(void); -/* disable the SD I/O suspend operation(SD I/O only) */ -void sdio_suspend_disable(void); - -/* CE-ATA functions */ -/* enable the CE-ATA command(CE-ATA only) */ -void sdio_ceata_command_enable(void); -/* disable the CE-ATA command(CE-ATA only) */ -void sdio_ceata_command_disable(void); -/* enable the CE-ATA interrupt(CE-ATA only) */ -void sdio_ceata_interrupt_enable(void); -/* disable the CE-ATA interrupt(CE-ATA only) */ -void sdio_ceata_interrupt_disable(void); -/* enable the CE-ATA command completion signal(CE-ATA only) */ -void sdio_ceata_command_completion_enable(void); -/* disable the CE-ATA command completion signal(CE-ATA only) */ -void sdio_ceata_command_completion_disable(void); - -#endif /* GD32F5XX_SDIO_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h deleted file mode 100644 index 7b42cae8d55..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_spi.h +++ /dev/null @@ -1,376 +0,0 @@ -/*! - \file gd32f5xx_spi.h - \brief definitions for the SPI - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#ifndef GD32F5XX_SPI_H -#define GD32F5XX_SPI_H - -#include "gd32f5xx.h" - -/* SPIx(x=0,1,2,3,4,5) definitions */ -#define SPI0 (SPI_BASE + 0x0000F800U) -#define SPI1 SPI_BASE -#define SPI2 (SPI_BASE + 0x00000400U) -#define SPI3 (SPI_BASE + 0x0000FC00U) -#define SPI4 (SPI_BASE + 0x00011800U) -#define SPI5 (SPI_BASE + 0x00011C00U) - -/* I2Sx_ADD(x=1,2) definitions */ -#define I2S1_ADD I2S_ADD_BASE -#define I2S2_ADD (I2S_ADD_BASE + 0x00000C00U) - -/* SPI registers definitions */ -#define SPI_CTL0(spix) REG32((spix) + 0x00U) /*!< SPI control register 0 */ -#define SPI_CTL1(spix) REG32((spix) + 0x04U) /*!< SPI control register 1*/ -#define SPI_STAT(spix) REG32((spix) + 0x08U) /*!< SPI status register */ -#define SPI_DATA(spix) REG32((spix) + 0x0CU) /*!< SPI data register */ -#define SPI_CRCPOLY(spix) REG32((spix) + 0x10U) /*!< SPI CRC polynomial register */ -#define SPI_RCRC(spix) REG32((spix) + 0x14U) /*!< SPI receive CRC register */ -#define SPI_TCRC(spix) REG32((spix) + 0x18U) /*!< SPI transmit CRC register */ -#define SPI_I2SCTL(spix) REG32((spix) + 0x1CU) /*!< SPI I2S control register */ -#define SPI_I2SPSC(spix) REG32((spix) + 0x20U) /*!< SPI I2S clock prescaler register */ -#define SPI_QCTL(spix) REG32((spix) + 0x80U) /*!< SPI quad mode control register */ - -/* I2S_ADD registers definitions */ -#define I2S_ADD_CTL0(i2sx_add) REG32((i2sx_add) + 0x00U) /*!< I2S_ADD control register 0 */ -#define I2S_ADD_CTL1(i2sx_add) REG32((i2sx_add) + 0x04U) /*!< I2S_ADD control register 1*/ -#define I2S_ADD_STAT(i2sx_add) REG32((i2sx_add) + 0x08U) /*!< I2S_ADD status register */ -#define I2S_ADD_DATA(i2sx_add) REG32((i2sx_add) + 0x0CU) /*!< I2S_ADD data register */ -#define I2S_ADD_CRCPOLY(i2sx_add) REG32((i2sx_add) + 0x10U) /*!< I2S_ADD CRC polynomial register */ -#define I2S_ADD_RCRC(i2sx_add) REG32((i2sx_add) + 0x14U) /*!< I2S_ADD receive CRC register */ -#define I2S_ADD_TCRC(i2sx_add) REG32((i2sx_add) + 0x18U) /*!< I2S_ADD transmit CRC register */ -#define I2S_ADD_I2SCTL(i2sx_add) REG32((i2sx_add) + 0x1CU) /*!< I2S_ADD I2S control register */ -#define I2S_ADD_I2SPSC(i2sx_add) REG32((i2sx_add) + 0x20U) /*!< I2S_ADD I2S clock prescaler register */ - -/* bits definitions */ -/* SPI_CTL0 */ -#define SPI_CTL0_CKPH BIT(0) /*!< clock phase selection*/ -#define SPI_CTL0_CKPL BIT(1) /*!< clock polarity selection */ -#define SPI_CTL0_MSTMOD BIT(2) /*!< master mode enable */ -#define SPI_CTL0_PSC BITS(3,5) /*!< master clock prescaler selection */ -#define SPI_CTL0_SPIEN BIT(6) /*!< SPI enable*/ -#define SPI_CTL0_LF BIT(7) /*!< lsb first mode */ -#define SPI_CTL0_SWNSS BIT(8) /*!< nss pin selection in nss software mode */ -#define SPI_CTL0_SWNSSEN BIT(9) /*!< nss software mode selection */ -#define SPI_CTL0_RO BIT(10) /*!< receive only */ -#define SPI_CTL0_FF16 BIT(11) /*!< data frame size */ -#define SPI_CTL0_CRCNT BIT(12) /*!< CRC next transfer */ -#define SPI_CTL0_CRCEN BIT(13) /*!< CRC calculation enable */ -#define SPI_CTL0_BDOEN BIT(14) /*!< bidirectional transmit output enable*/ -#define SPI_CTL0_BDEN BIT(15) /*!< bidirectional enable */ - -/* SPI_CTL1 */ -#define SPI_CTL1_DMAREN BIT(0) /*!< receive buffer dma enable */ -#define SPI_CTL1_DMATEN BIT(1) /*!< transmit buffer dma enable */ -#define SPI_CTL1_NSSDRV BIT(2) /*!< drive nss output */ -#define SPI_CTL1_TMOD BIT(4) /*!< SPI TI mode enable */ -#define SPI_CTL1_ERRIE BIT(5) /*!< errors interrupt enable */ -#define SPI_CTL1_RBNEIE BIT(6) /*!< receive buffer not empty interrupt enable */ -#define SPI_CTL1_TBEIE BIT(7) /*!< transmit buffer empty interrupt enable */ - -/* SPI_STAT */ -#define SPI_STAT_RBNE BIT(0) /*!< receive buffer not empty */ -#define SPI_STAT_TBE BIT(1) /*!< transmit buffer empty */ -#define SPI_STAT_I2SCH BIT(2) /*!< I2S channel side */ -#define SPI_STAT_TXURERR BIT(3) /*!< I2S transmission underrun error bit */ -#define SPI_STAT_CRCERR BIT(4) /*!< SPI CRC error bit */ -#define SPI_STAT_CONFERR BIT(5) /*!< SPI configuration error bit */ -#define SPI_STAT_RXORERR BIT(6) /*!< SPI reception overrun error bit */ -#define SPI_STAT_TRANS BIT(7) /*!< transmitting on-going bit */ -#define SPI_STAT_FERR BIT(8) /*!< format error bit */ - -/* SPI_DATA */ -#define SPI_DATA_DATA BITS(0,15) /*!< data transfer register */ - -/* SPI_CRCPOLY */ -#define SPI_CRCPOLY_CPR BITS(0,15) /*!< CRC polynomial register */ - -/* SPI_RCRC */ -#define SPI_RCRC_RCR BITS(0,15) /*!< RX CRC register */ - -/* SPI_TCRC */ -#define SPI_TCRC_TCR BITS(0,15) /*!< TX CRC register */ - -/* SPI_I2SCTL */ -#define SPI_I2SCTL_CHLEN BIT(0) /*!< channel length */ -#define SPI_I2SCTL_DTLEN BITS(1,2) /*!< data length */ -#define SPI_I2SCTL_CKPL BIT(3) /*!< idle state clock polarity */ -#define SPI_I2SCTL_I2SSTD BITS(4,5) /*!< I2S standard selection */ -#define SPI_I2SCTL_PCMSMOD BIT(7) /*!< PCM frame synchronization mode */ -#define SPI_I2SCTL_I2SOPMOD BITS(8,9) /*!< I2S operation mode */ -#define SPI_I2SCTL_I2SEN BIT(10) /*!< I2S enable */ -#define SPI_I2SCTL_I2SSEL BIT(11) /*!< I2S mode selection */ - -/* SPI_I2S_PSC */ -#define SPI_I2SPSC_DIV BITS(0,7) /*!< dividing factor for the prescaler */ -#define SPI_I2SPSC_OF BIT(8) /*!< odd factor for the prescaler */ -#define SPI_I2SPSC_MCKOEN BIT(9) /*!< I2S MCK output enable */ - -/* SPI_SPI_QCTL(only SPI5) */ -#define SPI_QCTL_QMOD BIT(0) /*!< quad-SPI mode enable */ -#define SPI_QCTL_QRD BIT(1) /*!< quad-SPI mode read select */ -#define SPI_QCTL_IO23_DRV BIT(2) /*!< drive SPI_IO2 and SPI_IO3 enable */ - -/* constants definitions */ -/* SPI and I2S parameter struct definitions */ -typedef struct { - uint32_t device_mode; /*!< SPI master or slave */ - uint32_t trans_mode; /*!< SPI transtype */ - uint32_t frame_size; /*!< SPI frame size */ - uint32_t nss; /*!< SPI nss control by handware or software */ - uint32_t endian; /*!< SPI big endian or little endian */ - uint32_t clock_polarity_phase; /*!< SPI clock phase and polarity */ - uint32_t prescale; /*!< SPI prescale factor */ -} spi_parameter_struct; - -/* SPI mode definitions */ -#define SPI_MASTER (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS) /*!< SPI as master */ -#define SPI_SLAVE ((uint32_t)0x00000000U) /*!< SPI as slave */ - -/* SPI bidirectional transfer direction */ -#define SPI_BIDIRECTIONAL_TRANSMIT SPI_CTL0_BDOEN /*!< SPI work in transmit-only mode */ -#define SPI_BIDIRECTIONAL_RECEIVE (~SPI_CTL0_BDOEN) /*!< SPI work in receive-only mode */ - -/* SPI transmit type */ -#define SPI_TRANSMODE_FULLDUPLEX ((uint32_t)0x00000000U) /*!< SPI receive and send data at fullduplex communication */ -#define SPI_TRANSMODE_RECEIVEONLY SPI_CTL0_RO /*!< SPI only receive data */ -#define SPI_TRANSMODE_BDRECEIVE SPI_CTL0_BDEN /*!< bidirectional receive data */ -#define SPI_TRANSMODE_BDTRANSMIT (SPI_CTL0_BDEN | SPI_CTL0_BDOEN) /*!< bidirectional transmit data*/ - -/* SPI frame size */ -#define SPI_FRAMESIZE_16BIT SPI_CTL0_FF16 /*!< SPI frame size is 16 bits */ -#define SPI_FRAMESIZE_8BIT ((uint32_t)0x00000000U) /*!< SPI frame size is 8 bits */ - -/* SPI NSS control mode */ -#define SPI_NSS_SOFT SPI_CTL0_SWNSSEN /*!< SPI nss control by sofrware */ -#define SPI_NSS_HARD ((uint32_t)0x00000000U) /*!< SPI nss control by hardware */ - -/* SPI transmit way */ -#define SPI_ENDIAN_MSB ((uint32_t)0x00000000U) /*!< SPI transmit way is big endian: transmit MSB first */ -#define SPI_ENDIAN_LSB SPI_CTL0_LF /*!< SPI transmit way is little endian: transmit LSB first */ - -/* SPI clock polarity and phase */ -#define SPI_CK_PL_LOW_PH_1EDGE ((uint32_t)0x00000000U) /*!< SPI clock polarity is low level and phase is first edge */ -#define SPI_CK_PL_HIGH_PH_1EDGE SPI_CTL0_CKPL /*!< SPI clock polarity is high level and phase is first edge */ -#define SPI_CK_PL_LOW_PH_2EDGE SPI_CTL0_CKPH /*!< SPI clock polarity is low level and phase is second edge */ -#define SPI_CK_PL_HIGH_PH_2EDGE (SPI_CTL0_CKPL|SPI_CTL0_CKPH) /*!< SPI clock polarity is high level and phase is second edge */ - -/* SPI clock prescale factor */ -#define CTL0_PSC(regval) (BITS(3,5)&((uint32_t)(regval)<<3)) -#define SPI_PSC_2 CTL0_PSC(0) /*!< SPI clock prescale factor is 2 */ -#define SPI_PSC_4 CTL0_PSC(1) /*!< SPI clock prescale factor is 4 */ -#define SPI_PSC_8 CTL0_PSC(2) /*!< SPI clock prescale factor is 8 */ -#define SPI_PSC_16 CTL0_PSC(3) /*!< SPI clock prescale factor is 16 */ -#define SPI_PSC_32 CTL0_PSC(4) /*!< SPI clock prescale factor is 32 */ -#define SPI_PSC_64 CTL0_PSC(5) /*!< SPI clock prescale factor is 64 */ -#define SPI_PSC_128 CTL0_PSC(6) /*!< SPI clock prescale factor is 128 */ -#define SPI_PSC_256 CTL0_PSC(7) /*!< SPI clock prescale factor is 256 */ - -/* I2S audio sample rate */ -#define I2S_AUDIOSAMPLE_8K ((uint32_t)8000U) /*!< I2S audio sample rate is 8KHz */ -#define I2S_AUDIOSAMPLE_11K ((uint32_t)11025U) /*!< I2S audio sample rate is 11KHz */ -#define I2S_AUDIOSAMPLE_16K ((uint32_t)16000U) /*!< I2S audio sample rate is 16KHz */ -#define I2S_AUDIOSAMPLE_22K ((uint32_t)22050U) /*!< I2S audio sample rate is 22KHz */ -#define I2S_AUDIOSAMPLE_32K ((uint32_t)32000U) /*!< I2S audio sample rate is 32KHz */ -#define I2S_AUDIOSAMPLE_44K ((uint32_t)44100U) /*!< I2S audio sample rate is 44KHz */ -#define I2S_AUDIOSAMPLE_48K ((uint32_t)48000U) /*!< I2S audio sample rate is 48KHz */ -#define I2S_AUDIOSAMPLE_96K ((uint32_t)96000U) /*!< I2S audio sample rate is 96KHz */ -#define I2S_AUDIOSAMPLE_192K ((uint32_t)192000U) /*!< I2S audio sample rate is 192KHz */ - -/* I2S frame format */ -#define I2SCTL_DTLEN(regval) (BITS(1,2)&((uint32_t)(regval)<<1)) -#define I2S_FRAMEFORMAT_DT16B_CH16B I2SCTL_DTLEN(0) /*!< I2S data length is 16 bit and channel length is 16 bit */ -#define I2S_FRAMEFORMAT_DT16B_CH32B (I2SCTL_DTLEN(0)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 16 bit and channel length is 32 bit */ -#define I2S_FRAMEFORMAT_DT24B_CH32B (I2SCTL_DTLEN(1)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 24 bit and channel length is 32 bit */ -#define I2S_FRAMEFORMAT_DT32B_CH32B (I2SCTL_DTLEN(2)|SPI_I2SCTL_CHLEN) /*!< I2S data length is 32 bit and channel length is 32 bit */ - -/* I2S master clock output */ -#define I2S_MCKOUT_DISABLE ((uint32_t)0x00000000U) /*!< I2S master clock output disable */ -#define I2S_MCKOUT_ENABLE SPI_I2SPSC_MCKOEN /*!< I2S master clock output enable */ - -/* I2S operation mode */ -#define I2SCTL_I2SOPMOD(regval) (BITS(8,9)&((uint32_t)(regval)<<8)) -#define I2S_MODE_SLAVETX I2SCTL_I2SOPMOD(0) /*!< I2S slave transmit mode */ -#define I2S_MODE_SLAVERX I2SCTL_I2SOPMOD(1) /*!< I2S slave receive mode */ -#define I2S_MODE_MASTERTX I2SCTL_I2SOPMOD(2) /*!< I2S master transmit mode */ -#define I2S_MODE_MASTERRX I2SCTL_I2SOPMOD(3) /*!< I2S master receive mode */ - -/* I2S standard */ -#define I2SCTL_I2SSTD(regval) (BITS(4,5)&((uint32_t)(regval)<<4)) -#define I2S_STD_PHILIPS I2SCTL_I2SSTD(0) /*!< I2S philips standard */ -#define I2S_STD_MSB I2SCTL_I2SSTD(1) /*!< I2S MSB standard */ -#define I2S_STD_LSB I2SCTL_I2SSTD(2) /*!< I2S LSB standard */ -#define I2S_STD_PCMSHORT I2SCTL_I2SSTD(3) /*!< I2S PCM short standard */ -#define I2S_STD_PCMLONG (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */ - -/* I2S clock polarity */ -#define I2S_CKPL_LOW ((uint32_t)0x00000000U) /*!< I2S clock polarity low level */ -#define I2S_CKPL_HIGH SPI_I2SCTL_CKPL /*!< I2S clock polarity high level */ - -/* SPI DMA constants definitions */ -#define SPI_DMA_TRANSMIT ((uint8_t)0x00U) /*!< SPI transmit data use DMA */ -#define SPI_DMA_RECEIVE ((uint8_t)0x01U) /*!< SPI receive data use DMA */ - -/* SPI CRC constants definitions */ -#define SPI_CRC_TX ((uint8_t)0x00U) /*!< SPI transmit CRC value */ -#define SPI_CRC_RX ((uint8_t)0x01U) /*!< SPI receive CRC value */ - -/* SPI/I2S interrupt enable/disable constants definitions */ -#define SPI_I2S_INT_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt */ -#define SPI_I2S_INT_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt */ -#define SPI_I2S_INT_ERR ((uint8_t)0x02U) /*!< error interrupt */ - -/* SPI/I2S interrupt flag constants definitions */ -#define SPI_I2S_INT_FLAG_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt flag */ -#define SPI_I2S_INT_FLAG_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt flag */ -#define SPI_I2S_INT_FLAG_RXORERR ((uint8_t)0x02U) /*!< overrun interrupt flag */ -#define SPI_INT_FLAG_CONFERR ((uint8_t)0x03U) /*!< config error interrupt flag */ -#define SPI_INT_FLAG_CRCERR ((uint8_t)0x04U) /*!< CRC error interrupt flag */ -#define I2S_INT_FLAG_TXURERR ((uint8_t)0x05U) /*!< underrun error interrupt flag */ -#define SPI_I2S_INT_FLAG_FERR ((uint8_t)0x06U) /*!< format error interrupt flag */ - -/* SPI/I2S flag definitions */ -#define SPI_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ -#define SPI_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ -#define SPI_FLAG_CRCERR SPI_STAT_CRCERR /*!< CRC error flag */ -#define SPI_FLAG_CONFERR SPI_STAT_CONFERR /*!< mode config error flag */ -#define SPI_FLAG_RXORERR SPI_STAT_RXORERR /*!< receive overrun error flag */ -#define SPI_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ -#define SPI_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ -#define I2S_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ -#define I2S_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ -#define I2S_FLAG_CH SPI_STAT_I2SCH /*!< channel side flag */ -#define I2S_FLAG_TXURERR SPI_STAT_TXURERR /*!< underrun error flag */ -#define I2S_FLAG_RXORERR SPI_STAT_RXORERR /*!< overrun error flag */ -#define I2S_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ -#define I2S_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ - -/* function declarations */ -/* initialization functions */ -/* deinitialize SPI and I2S */ -void spi_i2s_deinit(uint32_t spi_periph); -/* initialize the parameters of SPI struct with default values */ -void spi_struct_para_init(spi_parameter_struct *spi_struct); -/* initialize SPI parameter */ -void spi_init(uint32_t spi_periph, spi_parameter_struct *spi_struct); -/* enable SPI */ -void spi_enable(uint32_t spi_periph); -/* disable SPI */ -void spi_disable(uint32_t spi_periph); - -/* initialize I2S parameter */ -void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl); -/* configure I2S prescale */ -void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout); -/* enable I2S */ -void i2s_enable(uint32_t spi_periph); -/* disable I2S */ -void i2s_disable(uint32_t spi_periph); - -/* NSS functions */ -/* enable SPI nss output */ -void spi_nss_output_enable(uint32_t spi_periph); -/* disable SPI nss output */ -void spi_nss_output_disable(uint32_t spi_periph); -/* SPI nss pin high level in software mode */ -void spi_nss_internal_high(uint32_t spi_periph); -/* SPI nss pin low level in software mode */ -void spi_nss_internal_low(uint32_t spi_periph); - -/* SPI DMA functions */ -/* enable SPI DMA send or receive */ -void spi_dma_enable(uint32_t spi_periph, uint8_t spi_dma); -/* diable SPI DMA send or receive */ -void spi_dma_disable(uint32_t spi_periph, uint8_t spi_dma); - -/* SPI/I2S transfer configure functions */ -/* configure SPI/I2S data frame format */ -void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format); -/* SPI transmit data */ -void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data); -/* SPI receive data */ -uint16_t spi_i2s_data_receive(uint32_t spi_periph); -/* configure SPI bidirectional transfer direction */ -void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction); - -/* SPI CRC functions */ -/* set SPI CRC polynomial */ -void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly); -/* get SPI CRC polynomial */ -uint16_t spi_crc_polynomial_get(uint32_t spi_periph); -/* turn on SPI CRC function */ -void spi_crc_on(uint32_t spi_periph); -/* turn off SPI CRC function */ -void spi_crc_off(uint32_t spi_periph); -/* SPI next data is CRC value */ -void spi_crc_next(uint32_t spi_periph); -/* get SPI CRC send value or receive value */ -uint16_t spi_crc_get(uint32_t spi_periph, uint8_t spi_crc); - -/* SPI TI mode functions */ -/* enable SPI TI mode */ -void spi_ti_mode_enable(uint32_t spi_periph); -/* disable SPI TI mode */ -void spi_ti_mode_disable(uint32_t spi_periph); - -/* configure i2s full duplex mode */ -void i2s_full_duplex_mode_config(uint32_t i2s_add_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl, uint32_t i2s_frameformat); - -/* quad wire SPI functions */ -/* enable quad wire SPI */ -void spi_quad_enable(uint32_t spi_periph); -/* disable quad wire SPI */ -void spi_quad_disable(uint32_t spi_periph); -/* enable quad wire SPI write */ -void spi_quad_write_enable(uint32_t spi_periph); -/* enable quad wire SPI read */ -void spi_quad_read_enable(uint32_t spi_periph); -/* enable SPI_IO2 and SPI_IO3 pin output */ -void spi_quad_io23_output_enable(uint32_t spi_periph); -/* disable SPI_IO2 and SPI_IO3 pin output */ -void spi_quad_io23_output_disable(uint32_t spi_periph); - -/* flag & interrupt functions */ -/* enable SPI and I2S interrupt */ -void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t spi_i2s_int); -/* disable SPI and I2S interrupt */ -void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t spi_i2s_int); -/* get SPI and I2S interrupt status*/ -FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t spi_i2s_int); -/* get SPI and I2S flag status */ -FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t spi_i2s_flag); -/* clear SPI CRC error flag status */ -void spi_crc_error_clear(uint32_t spi_periph); - -#endif /* GD32F5XX_SPI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h deleted file mode 100644 index 857b1da0f3f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_syscfg.h +++ /dev/null @@ -1,358 +0,0 @@ -/*! - \file gd32f5xx_syscfg.h - \brief definitions for the SYSCFG - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_SYSCFG_H -#define GD32F5XX_SYSCFG_H - -#include "gd32f5xx.h" - -/* SYSCFG definitions */ -#define SYSCFG SYSCFG_BASE - -/* registers definitions */ -#define SYSCFG_CFG0 REG32(SYSCFG + 0x00U) /*!< system configuration register 0 */ -#define SYSCFG_CFG1 REG32(SYSCFG + 0x04U) /*!< system configuration register 1 */ -#define SYSCFG_EXTISS0 REG32(SYSCFG + 0x08U) /*!< EXTI sources selection register 0 */ -#define SYSCFG_EXTISS1 REG32(SYSCFG + 0x0CU) /*!< EXTI sources selection register 1 */ -#define SYSCFG_EXTISS2 REG32(SYSCFG + 0x10U) /*!< EXTI sources selection register 2 */ -#define SYSCFG_EXTISS3 REG32(SYSCFG + 0x14U) /*!< EXTI sources selection register 3 */ -#define SYSCFG_CPSCTL REG32(SYSCFG + 0x20U) /*!< system I/O compensation control register */ -#define SYSCFG_STAT REG32(SYSCFG + 0x24U) /*!< system status register 0 */ -#define SYSCFG_SRAM0ECC REG32(SYSCFG + 0x28U) /*!< SRAM0 ECC status register */ -#define SYSCFG_SRAM1ECC REG32(SYSCFG + 0x2CU) /*!< SRAM1 ECC status register */ -#define SYSCFG_SRAM2ECC REG32(SYSCFG + 0x30U) /*!< SRAM2 ECC status register */ -#define SYSCFG_ADDSRAMECC REG32(SYSCFG + 0x34U) /*!< ADDSRAM ECC status register */ -#define SYSCFG_TCMSRAMECC REG32(SYSCFG + 0x38U) /*!< TCMSRAM ECC status register */ -#define SYSCFG_BKPSRAMECC REG32(SYSCFG + 0x3CU) /*!< BKPSRAM ECC status register */ -#define SYSCFG_FLASHECC_ADDR REG32(SYSCFG + 0x40U) /*!< FLASH ECC address register */ -#define SYSCFG_FLASHECC REG32(SYSCFG + 0x44U) /*!< FLASH ECC register */ -#define USER_CFG REG32(SYSCFG + 0x300U) /*!< user configuration register */ - -/* SYSCFG_CFG0 bits definitions */ -#define SYSCFG_CFG0_BOOT_MODE BITS(0,2) /*!< SYSCFG memory remap config */ -#define SYSCFG_CFG0_FMC_SWP BIT(8) /*!< FMC memory swap config */ -#define SYSCFG_CFG0_EXMC_SWP BITS(10,11) /*!< EXMC memory swap config */ - -/* SYSCFG_CFG1 bits definitions */ -#define SYSCFG_CFG1_I2C3FMP BIT(0) /*!< enable fast mode+ on I2C3 */ -#define SYSCFG_CFG1_I2C4FMP BIT(1) /*!< enable fast mode+ on I2C4 */ -#define SYSCFG_CFG1_I2C5FMP BIT(2) /*!< enable fast mode+ on I2C5 */ -#define SYSCFG_CFG1_ENET_PHY_SEL BIT(23) /*!< Ethernet PHY selection config */ - -/* SYSCFG_EXTISS0 bits definitions */ -#define SYSCFG_EXTISS0_EXTI0_SS BITS(0,3) /*!< EXTI 0 configuration */ -#define SYSCFG_EXTISS0_EXTI1_SS BITS(4,7) /*!< EXTI 1 configuration */ -#define SYSCFG_EXTISS0_EXTI2_SS BITS(8,11) /*!< EXTI 2 configuration */ -#define SYSCFG_EXTISS0_EXTI3_SS BITS(12,15) /*!< EXTI 3 configuration */ - -/* SYSCFG_EXTISS1 bits definitions */ -#define SYSCFG_EXTISS1_EXTI4_SS BITS(0,3) /*!< EXTI 4 configuration */ -#define SYSCFG_EXTISS1_EXTI5_SS BITS(4,7) /*!< EXTI 5 configuration */ -#define SYSCFG_EXTISS1_EXTI6_SS BITS(8,11) /*!< EXTI 6 configuration */ -#define SYSCFG_EXTISS1_EXTI7_SS BITS(12,15) /*!< EXTI 7 configuration */ - -/* SYSCFG_EXTISS2 bits definitions */ -#define SYSCFG_EXTISS2_EXTI8_SS BITS(0,3) /*!< EXTI 8 configuration */ -#define SYSCFG_EXTISS2_EXTI9_SS BITS(4,7) /*!< EXTI 9 configuration */ -#define SYSCFG_EXTISS2_EXTI10_SS BITS(8,11) /*!< EXTI 10 configuration */ -#define SYSCFG_EXTISS2_EXTI11_SS BITS(12,15) /*!< EXTI 11 configuration */ - -/* SYSCFG_EXTISS3 bits definitions */ -#define SYSCFG_EXTISS3_EXTI12_SS BITS(0,3) /*!< EXTI 12 configuration */ -#define SYSCFG_EXTISS3_EXTI13_SS BITS(4,7) /*!< EXTI 13 configuration */ -#define SYSCFG_EXTISS3_EXTI14_SS BITS(8,11) /*!< EXTI 14 configuration */ -#define SYSCFG_EXTISS3_EXTI15_SS BITS(12,15) /*!< EXTI 15 configuration */ - -/* SYSCFG_CPSCTL bits definitions */ -#define SYSCFG_CPSCTL_CPS_EN BIT(0) /*!< I/O compensation cell enable */ -#define SYSCFG_CPSCTL_CPS_RDY BIT(8) /*!< I/O compensation cell is ready or not */ - -/* SYSCFG_STAT bits definitions */ -#define SYSCFG_STAT_ECCMEIF0 BIT(0) /*!< SRAM0 two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF0 BIT(1) /*!< SRAM0 single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF1 BIT(2) /*!< SRAM1 two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF1 BIT(3) /*!< SRAM1 single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF2 BIT(4) /*!< SRAM2 two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF2 BIT(5) /*!< SRAM2 single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF3 BIT(6) /*!< ADDSRAM two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF3 BIT(7) /*!< ADDSRAM single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF4 BIT(8) /*!< TCMSRAM two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF4 BIT(9) /*!< TCMSRAM single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF5 BIT(10) /*!< BKPSRAM two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF5 BIT(11) /*!< BKPSRAM single bit correction event flag */ -#define SYSCFG_STAT_ECCMEIF6 BIT(12) /*!< FLASH two bits no-correction event flag */ -#define SYSCFG_STAT_ECCSEIF6 BIT(13) /*!< FLASH single bit correction event flag */ -#define SYSCFG_STAT_CKMNMIIF BIT(14) /*!< HXTAL clock moniotor NMI interrupt flag */ - -/* SYSCFG_SRAM0ECC bits definitions */ -#define SYSCFG_SRAM0ECC_ECCMEIE0 BIT(0) /*!< SRAM0 two bits non-correction interrupt enable */ -#define SYSCFG_SRAM0ECC_ECCSEIE0 BIT(1) /*!< SRAM0 single bit correction interrupt enable */ -#define SYSCFG_SRAM0ECC_CKMNMIIE BIT(2) /*!< HXTAL clock moniotor NMI interrupt enable */ -#define SYSCFG_SRAM0ECC_ECCSERRBITS0 BITS(10,15) /*!< indicates the error bit */ -#define SYSCFG_SRAM0ECC_ECCEADDR0 BITS(16,31) /*!< indicates the last address ECC event on SRAM0 occurred */ - -/* SYSCFG_SRAM1ECC bits definitions */ -#define SYSCFG_SRAM1ECC_ECCMEIE1 BIT(0) /*!< SRAM1 two bits non-correction interrupt enable */ -#define SYSCFG_SRAM1ECC_ECCSEIE1 BIT(1) /*!< SRAM1 single bit correction interrupt enable */ -#define SYSCFG_SRAM1ECC_ECCSERRBITS1 BITS(12,17) /*!< indicates the error bit */ -#define SYSCFG_SRAM1ECC_ECCEADDR1 BITS(18,31) /*!< indicates the last address ECC event on SRAM1 occurred */ - -/* SYSCFG_SRAM2ECC bits definitions */ -#define SYSCFG_SRAM2ECC_ECCMEIE2 BIT(0) /*!< SRAM2 two bits non-correction interrupt enable */ -#define SYSCFG_SRAM2ECC_ECCSEIE2 BIT(1) /*!< SRAM2 single bit correction interrupt enable */ -#define SYSCFG_SRAM2ECC_ECCSERRBITS2 BITS(10,15) /*!< indicates the error bit */ -#define SYSCFG_SRAM2ECC_ECCEADDR2 BITS(16,31) /*!< indicates the last address ECC event on SRAM2 occurred */ - -/* SYSCFG_ADDSRAMECC bits definitions */ -#define SYSCFG_ADDSRAMECC_ECCMEIE3 BIT(0) /*!< ADDSRAM two bits non-correction interrupt enable */ -#define SYSCFG_ADDSRAMECC_ECCSEIE3 BIT(1) /*!< ADDSRAM single bit correction interrupt enable */ -#define SYSCFG_ADDSRAMECC_ECCSERRBITS3 BITS(8,13) /*!< indicates the error bit */ -#define SYSCFG_ADDSRAMECC_ECCEADDR3 BITS(14,31) /*!< indicates the last address ECC event on ADDSRAM occurred */ - -/* SYSCFG_TCMSRAMECC bits definitions */ -#define SYSCFG_TCMSRAMECC_ECCMEIE4 BIT(0) /*!< TCMSRAM two bits non-correction interrupt enable */ -#define SYSCFG_TCMSRAMECC_ECCSEIE4 BIT(1) /*!< TCMSRAM single bit correction interrupt enable */ -#define SYSCFG_TCMSRAMECC_ECCSERRBITS4 BITS(12,17) /*!< indicates the error bit */ -#define SYSCFG_TCMSRAMECC_ECCEADDR4 BITS(18,31) /*!< indicates the last address ECC event on TCMSRAM occurred */ - -/* SYSCFG_BKPSRAMECC bits definitions */ -#define SYSCFG_BKPSRAMECC_ECCMEIE5 BIT(0) /*!< BKPSRAM two bits non-correction interrupt enable */ -#define SYSCFG_BKPSRAMECC_ECCSEIE5 BIT(1) /*!< BKPSRAM single bit correction interrupt enable */ -#define SYSCFG_BKPSRAMECC_ECCSERRBITS5 BITS(16,21) /*!< indicates the error bit */ -#define SYSCFG_BKPSRAMECC_ECCEADDR5 BITS(22,31) /*!< indicates the last address ECC event on BKPSRAM occurred */ - -/* SYSCFG_FLASHECC_ADDR */ -#define SYSCFG_FLASHECC_ADDR_ECCEADDR6 BITS(0,31) /*!< indicates the last address of ECC event on FLASH occurred */ - -/* SYSCFG_FLASHECC bits definitions */ -#define SYSCFG_FLASHECC_ECCMEIE6 BIT(0) /*!< FLASH two bits non-correction interrupt enable */ -#define SYSCFG_FLASHECC_ECCSEIE6 BIT(1) /*!< FLASH single bit correction interrupt enable */ -#define SYSCFG_FLASHECC_ECCSERRBITS6 BITS(2,7) /*!< indicates the error bit */ - -/* USER_CFG bits definitions */ -#define USER_CFG_ANA_VERSION BITS(24,31) /*!< analog version information */ - -/* constants definitions */ -/* boot mode definitions */ -#define SYSCFG_BOOTMODE_FLASH ((uint8_t)0x00U) /*!< main flash memory remap */ -#define SYSCFG_BOOTMODE_BOOTLOADER ((uint8_t)0x01U) /*!< boot loader remap */ -#define SYSCFG_BOOTMODE_SRAM ((uint8_t)0x03U) /*!< SRAM0 of on-chip SRAM remap */ -#define SYSCFG_BOOTMODE_OTP ((uint8_t)0x05U) /*!< OTP remap */ - -/* FMC swap definitions */ -#define SYSCFG_FMC_SWP_BANK0 ((uint32_t)0x00000000U) /*!< main flash Bank 0 is mapped at address 0x08000000 */ -#define SYSCFG_FMC_SWP_BANK1 ((uint32_t)0x00000100U) /*!< main flash Bank 1 is mapped at address 0x08000000 */ - -/* EXMC swap enable/disable */ -#define SYSCFG_EXMC_SWP_ENABLE ((uint32_t)0x00000400U) /*!< SDRAM bank 0 and bank 1 are swapped with NAND bank 1 and PC card */ -#define SYSCFG_EXMC_SWP_DISABLE ((uint32_t)0x00000000U) /*!< no memory mapping swap */ - -/* EXTI source select definition */ -#define EXTISS0 ((uint8_t)0x00U) /*!< EXTI source select GPIOx pin 0~3 */ -#define EXTISS1 ((uint8_t)0x01U) /*!< EXTI source select GPIOx pin 4~7 */ -#define EXTISS2 ((uint8_t)0x02U) /*!< EXTI source select GPIOx pin 8~11 */ -#define EXTISS3 ((uint8_t)0x03U) /*!< EXTI source select GPIOx pin 12~15 */ - -/* EXTI source select mask bits definition */ -#define EXTI_SS_MASK BITS(0,3) /*!< EXTI source select mask */ - -/* EXTI source select jumping step definition */ -#define EXTI_SS_JSTEP ((uint8_t)(0x04U)) /*!< EXTI source select jumping step */ - -/* EXTI source select moving step definition */ -#define EXTI_SS_MSTEP(pin) (EXTI_SS_JSTEP*((pin)%EXTI_SS_JSTEP)) /*!< EXTI source select moving step */ - -/* EXTI source port definitions */ -#define EXTI_SOURCE_GPIOA ((uint8_t)0x00U) /*!< EXTI GPIOA configuration */ -#define EXTI_SOURCE_GPIOB ((uint8_t)0x01U) /*!< EXTI GPIOB configuration */ -#define EXTI_SOURCE_GPIOC ((uint8_t)0x02U) /*!< EXTI GPIOC configuration */ -#define EXTI_SOURCE_GPIOD ((uint8_t)0x03U) /*!< EXTI GPIOD configuration */ -#define EXTI_SOURCE_GPIOE ((uint8_t)0x04U) /*!< EXTI GPIOE configuration */ -#define EXTI_SOURCE_GPIOF ((uint8_t)0x05U) /*!< EXTI GPIOF configuration */ -#define EXTI_SOURCE_GPIOG ((uint8_t)0x06U) /*!< EXTI GPIOG configuration */ -#define EXTI_SOURCE_GPIOH ((uint8_t)0x07U) /*!< EXTI GPIOH configuration */ -#define EXTI_SOURCE_GPIOI ((uint8_t)0x08U) /*!< EXTI GPIOI configuration */ - -/* EXTI source pin definitions */ -#define EXTI_SOURCE_PIN0 ((uint8_t)0x00U) /*!< EXTI GPIO pin0 configuration */ -#define EXTI_SOURCE_PIN1 ((uint8_t)0x01U) /*!< EXTI GPIO pin1 configuration */ -#define EXTI_SOURCE_PIN2 ((uint8_t)0x02U) /*!< EXTI GPIO pin2 configuration */ -#define EXTI_SOURCE_PIN3 ((uint8_t)0x03U) /*!< EXTI GPIO pin3 configuration */ -#define EXTI_SOURCE_PIN4 ((uint8_t)0x04U) /*!< EXTI GPIO pin4 configuration */ -#define EXTI_SOURCE_PIN5 ((uint8_t)0x05U) /*!< EXTI GPIO pin5 configuration */ -#define EXTI_SOURCE_PIN6 ((uint8_t)0x06U) /*!< EXTI GPIO pin6 configuration */ -#define EXTI_SOURCE_PIN7 ((uint8_t)0x07U) /*!< EXTI GPIO pin7 configuration */ -#define EXTI_SOURCE_PIN8 ((uint8_t)0x08U) /*!< EXTI GPIO pin8 configuration */ -#define EXTI_SOURCE_PIN9 ((uint8_t)0x09U) /*!< EXTI GPIO pin9 configuration */ -#define EXTI_SOURCE_PIN10 ((uint8_t)0x0AU) /*!< EXTI GPIO pin10 configuration */ -#define EXTI_SOURCE_PIN11 ((uint8_t)0x0BU) /*!< EXTI GPIO pin11 configuration */ -#define EXTI_SOURCE_PIN12 ((uint8_t)0x0CU) /*!< EXTI GPIO pin12 configuration */ -#define EXTI_SOURCE_PIN13 ((uint8_t)0x0DU) /*!< EXTI GPIO pin13 configuration */ -#define EXTI_SOURCE_PIN14 ((uint8_t)0x0EU) /*!< EXTI GPIO pin14 configuration */ -#define EXTI_SOURCE_PIN15 ((uint8_t)0x0FU) /*!< EXTI GPIO pin15 configuration */ - -/* ethernet PHY selection */ -#define SYSCFG_ENET_PHY_MII ((uint32_t)0x00000000U) /*!< MII is selected for the Ethernet MAC */ -#define SYSCFG_ENET_PHY_RMII ((uint32_t)0x00800000U) /*!< RMII is selected for the Ethernet MAC */ - -/* I/O compensation cell enable/disable */ -#define SYSCFG_COMPENSATION_ENABLE ((uint32_t)0x00000001U) /*!< I/O compensation cell enable */ -#define SYSCFG_COMPENSATION_DISABLE ((uint32_t)0x00000000U) /*!< I/O compensation cell disable */ - -/* define ECC type */ -typedef enum -{ - SYSCFG_SRAM0_ECC = 0, /*!< SRAM0 ECC event */ - SYSCFG_SRAM1_ECC, /*!< SRAM1 ECC event */ - SYSCFG_SRAM2_ECC, /*!< SRAM2 ECC event */ - SYSCFG_ADDSRAM_ECC, /*!< ADDSRAM ECC event */ - SYSCFG_TCMSRAM_ECC, /*!< TCMSRAM ECC event */ - SYSCFG_BKPSRAM_ECC, /*!< BKPSRAM ECC event */ - SYSCFG_FLASH_ECC /*!< FLASH ECC event */ -} syscfg_ecc_enum; - -/* define the EXTI bit position and its register group index offset */ -#define SYSCFG_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6U) | (uint32_t)(bitpos)) -#define SYSCFG_REG_VAL(offset) (REG32(SYSCFG + ((uint32_t)(offset) >> 6U))) -#define SYSCFG_BIT_POS(val) ((uint32_t)(val) & 0x0000001FU) - -/* register offset */ -#define SRAM0ECC_REG_OFFSET ((uint32_t)0x00000028U) /*!< SRAM0ECC register offset */ -#define SRAM1ECC_REG_OFFSET ((uint32_t)0x0000002CU) /*!< SRAM1ECC register offset */ -#define SRAM2ECC_REG_OFFSET ((uint32_t)0x00000030U) /*!< SRAM2ECC register offset */ -#define ADDSRAMECC_REG_OFFSET ((uint32_t)0x00000034U) /*!< ADDSRAMECC register offset */ -#define TCMSRAMECC_REG_OFFSET ((uint32_t)0x00000038U) /*!< TCMSRAMECC register offset */ -#define BKPSRAMECC_REG_OFFSET ((uint32_t)0x0000003CU) /*!< BKPSRAMECC register offset */ -#define FLASHECC_REG_OFFSET ((uint32_t)0x00000044U) /*!< FLASHECC register offset */ - -/* SYSCFG interrupt enable or disable */ -typedef enum -{ - SYSCFG_INT_ECCME0 = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 0U), /*!< SRAM0 two bits non-correction interrupt */ - SYSCFG_INT_ECCSE0 = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 1U), /*!< SRAM0 single bit correction interrupt */ - SYSCFG_INT_CKMNMI = SYSCFG_REGIDX_BIT(SRAM0ECC_REG_OFFSET, 2U), /*!< HXTAL clock moniotor NMI interrupt */ - SYSCFG_INT_ECCME1 = SYSCFG_REGIDX_BIT(SRAM1ECC_REG_OFFSET, 0U), /*!< SRAM1 two bits non-correction interrupt */ - SYSCFG_INT_ECCSE1 = SYSCFG_REGIDX_BIT(SRAM1ECC_REG_OFFSET, 1U), /*!< SRAM1 single bit correction interrupt */ - SYSCFG_INT_ECCME2 = SYSCFG_REGIDX_BIT(SRAM2ECC_REG_OFFSET, 0U), /*!< SRAM2 two bits non-correction interrupt */ - SYSCFG_INT_ECCSE2 = SYSCFG_REGIDX_BIT(SRAM2ECC_REG_OFFSET, 1U), /*!< SRAM2 single bit correction interrupt */ - SYSCFG_INT_ECCME3 = SYSCFG_REGIDX_BIT(ADDSRAMECC_REG_OFFSET, 0U), /*!< ADDSRAM two bits non-correction interrupt */ - SYSCFG_INT_ECCSE3 = SYSCFG_REGIDX_BIT(ADDSRAMECC_REG_OFFSET, 1U), /*!< ADDSRAM single bit correction interrupt */ - SYSCFG_INT_ECCME4 = SYSCFG_REGIDX_BIT(TCMSRAMECC_REG_OFFSET, 0U), /*!< TCMSRAM two bits non-correction interrupt */ - SYSCFG_INT_ECCSE4 = SYSCFG_REGIDX_BIT(TCMSRAMECC_REG_OFFSET, 1U), /*!< TCMSRAM single bit correction interrupt */ - SYSCFG_INT_ECCME5 = SYSCFG_REGIDX_BIT(BKPSRAMECC_REG_OFFSET, 0U), /*!< BKPSRAM two bits non-correction interrupt */ - SYSCFG_INT_ECCSE5 = SYSCFG_REGIDX_BIT(BKPSRAMECC_REG_OFFSET, 1U), /*!< BKPSRAM single bit correction interrupt */ - SYSCFG_INT_ECCME6 = SYSCFG_REGIDX_BIT(FLASHECC_REG_OFFSET, 0U), /*!< FLASH two bits non-correction interrupt */ - SYSCFG_INT_ECCSE6 = SYSCFG_REGIDX_BIT(FLASHECC_REG_OFFSET, 1U) /*!< FLASH single bit correction interrupt */ -} syscfg_interrupt_enum; - -/* SYSCFG flags */ -typedef enum -{ - SYSCFG_FLAG_ECCME0 = SYSCFG_STAT_ECCMEIF0, /*!< SRAM0 two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE0 = SYSCFG_STAT_ECCSEIF0, /*!< SRAM0 single bit correction event flag */ - SYSCFG_FLAG_ECCME1 = SYSCFG_STAT_ECCMEIF1, /*!< SRAM1 two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE1 = SYSCFG_STAT_ECCSEIF1, /*!< SRAM1 single bit correction event flag */ - SYSCFG_FLAG_ECCME2 = SYSCFG_STAT_ECCMEIF2, /*!< SRAM2 two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE2 = SYSCFG_STAT_ECCSEIF2, /*!< SRAM2 single bit correction event flag */ - SYSCFG_FLAG_ECCME3 = SYSCFG_STAT_ECCMEIF3, /*!< ADDSRAM two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE3 = SYSCFG_STAT_ECCSEIF3, /*!< ADDSRAM single bit correction event flag */ - SYSCFG_FLAG_ECCME4 = SYSCFG_STAT_ECCMEIF4, /*!< TCMSRAM two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE4 = SYSCFG_STAT_ECCSEIF4, /*!< TCMSRAM single bit correction event flag */ - SYSCFG_FLAG_ECCME5 = SYSCFG_STAT_ECCMEIF5, /*!< BKPSRAM two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE5 = SYSCFG_STAT_ECCSEIF5, /*!< BKPSRAM single bit correction event flag */ - SYSCFG_FLAG_ECCME6 = SYSCFG_STAT_ECCMEIF6, /*!< FLASH two bits non-correction event flag */ - SYSCFG_FLAG_ECCSE6 = SYSCFG_STAT_ECCSEIF6, /*!< FLASH single bit correction event flag */ - SYSCFG_FLAG_CKMNMI = SYSCFG_STAT_CKMNMIIF /*!< HXTAL clock moniotor NMI flag */ -} syscfg_flag_enum; - -/* SYSCFG interrupt flags */ -typedef enum -{ - SYSCFG_INT_FLAG_ECCME0 = SYSCFG_STAT_ECCMEIF0, /*!< SRAM0 two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE0 = SYSCFG_STAT_ECCSEIF0, /*!< SRAM0 single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME1 = SYSCFG_STAT_ECCMEIF1, /*!< SRAM1 two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE1 = SYSCFG_STAT_ECCSEIF1, /*!< SRAM1 single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME2 = SYSCFG_STAT_ECCMEIF2, /*!< SRAM2 two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE2 = SYSCFG_STAT_ECCSEIF2, /*!< SRAM2 single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME3 = SYSCFG_STAT_ECCMEIF3, /*!< ADDSRAM two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE3 = SYSCFG_STAT_ECCSEIF3, /*!< ADDSRAM single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME4 = SYSCFG_STAT_ECCMEIF4, /*!< TCMSRAM two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE4 = SYSCFG_STAT_ECCSEIF4, /*!< TCMSRAM single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME5 = SYSCFG_STAT_ECCMEIF5, /*!< BKPSRAM two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE5 = SYSCFG_STAT_ECCSEIF5, /*!< BKPSRAM single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCME6 = SYSCFG_STAT_ECCMEIF6, /*!< FLASH two bits non-correction event interrupt flag */ - SYSCFG_INT_FLAG_ECCSE6 = SYSCFG_STAT_ECCSEIF6, /*!< FLASH single bit correction event interrupt flag */ - SYSCFG_INT_FLAG_CKMNMI = SYSCFG_STAT_CKMNMIIF /*!< HXTAL clock moniotor NMI interrupt flag */ -} syscfg_interrupt_flag_enum; - -/* function declarations */ -/* initialization functions */ -/* deinit syscfg module */ -void syscfg_deinit(void); - -/* function configuration */ -/* configure the boot mode */ -void syscfg_bootmode_config(uint8_t syscfg_bootmode); -/* configure FMC memory mapping swap */ -void syscfg_fmc_swap_config(uint32_t syscfg_fmc_swap); -/* configure the EXMC swap */ -void syscfg_exmc_swap_config(uint32_t syscfg_exmc_swap); -/* configure the GPIO pin as EXTI Line */ -void syscfg_exti_line_config(uint8_t exti_port, uint8_t exti_pin); -/* configure the PHY interface for the ethernet MAC */ -void syscfg_enet_phy_interface_config(uint32_t syscfg_enet_phy_interface); -/* configure the I/O compensation cell */ -void syscfg_compensation_config(uint32_t syscfg_compensation); -/* get Compensation cell ready flag */ -FlagStatus syscfg_cps_cell_ready_get(void); -/* get ecc err bits */ -uint32_t syscfg_ecc_err_bits_get(syscfg_ecc_enum ecc_type); -/* get ecc address */ -uint32_t syscfg_ecc_address_get(syscfg_ecc_enum ecc_type); - -/* interrupt & flag functions */ -/* get SYSCFG flag state */ -FlagStatus syscfg_flag_get(syscfg_flag_enum flag); -/* clear SYSCFG flag state */ -void syscfg_flag_clear(syscfg_flag_enum flag); -/* enable SYSCFG interrupt */ -void syscfg_interrupt_enable(syscfg_interrupt_enum interrupt); -/* disable SYSCFG interrupt */ -void syscfg_interrupt_disable(syscfg_interrupt_enum interrupt); -/* get SYSCFG interrupt flag state */ -FlagStatus syscfg_interrupt_flag_get(syscfg_interrupt_flag_enum flag); -/* clear SYSCFG interrupt flag state */ -void syscfg_interrupt_flag_clear(syscfg_interrupt_flag_enum flag); - -#endif /* GD32F5XX_SYSCFG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h deleted file mode 100644 index 47b8879dc35..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_timer.h +++ /dev/null @@ -1,869 +0,0 @@ -/*! - \file gd32f5xx_timer.h - \brief definitions for the TIMER - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_TIMER_H -#define GD32F5XX_TIMER_H - -#include "gd32f5xx.h" - -/* TIMERx(x=0..13) definitions */ -#define TIMER0 (TIMER_BASE + 0x00010000U) -#define TIMER1 (TIMER_BASE + 0x00000000U) -#define TIMER2 (TIMER_BASE + 0x00000400U) -#define TIMER3 (TIMER_BASE + 0x00000800U) -#define TIMER4 (TIMER_BASE + 0x00000C00U) -#define TIMER5 (TIMER_BASE + 0x00001000U) -#define TIMER6 (TIMER_BASE + 0x00001400U) -#define TIMER7 (TIMER_BASE + 0x00010400U) -#define TIMER8 (TIMER_BASE + 0x00014000U) -#define TIMER9 (TIMER_BASE + 0x00014400U) -#define TIMER10 (TIMER_BASE + 0x00014800U) -#define TIMER11 (TIMER_BASE + 0x00001800U) -#define TIMER12 (TIMER_BASE + 0x00001C00U) -#define TIMER13 (TIMER_BASE + 0x00002000U) - -/* registers definitions */ -#define TIMER_CTL0(timerx) REG32((timerx) + 0x00000000U) /*!< TIMER control register 0 */ -#define TIMER_CTL1(timerx) REG32((timerx) + 0x00000004U) /*!< TIMER control register 1 */ -#define TIMER_SMCFG(timerx) REG32((timerx) + 0x00000008U) /*!< TIMER slave mode configuration register */ -#define TIMER_DMAINTEN(timerx) REG32((timerx) + 0x0000000CU) /*!< TIMER DMA and interrupt enable register */ -#define TIMER_INTF(timerx) REG32((timerx) + 0x00000010U) /*!< TIMER interrupt flag register */ -#define TIMER_SWEVG(timerx) REG32((timerx) + 0x00000014U) /*!< TIMER software event generation register */ -#define TIMER_CHCTL0(timerx) REG32((timerx) + 0x00000018U) /*!< TIMER channel control register 0 */ -#define TIMER_CHCTL1(timerx) REG32((timerx) + 0x0000001CU) /*!< TIMER channel control register 1 */ -#define TIMER_CHCTL2(timerx) REG32((timerx) + 0x00000020U) /*!< TIMER channel control register 2 */ -#define TIMER_CNT(timerx) REG32((timerx) + 0x00000024U) /*!< TIMER counter register */ -#define TIMER_PSC(timerx) REG32((timerx) + 0x00000028U) /*!< TIMER prescaler register */ -#define TIMER_CAR(timerx) REG32((timerx) + 0x0000002CU) /*!< TIMER counter auto reload register */ -#define TIMER_CREP(timerx) REG32((timerx) + 0x00000030U) /*!< TIMER counter repetition register */ -#define TIMER_CH0CV(timerx) REG32((timerx) + 0x00000034U) /*!< TIMER channel 0 capture/compare value register */ -#define TIMER_CH1CV(timerx) REG32((timerx) + 0x00000038U) /*!< TIMER channel 1 capture/compare value register */ -#define TIMER_CH2CV(timerx) REG32((timerx) + 0x0000003CU) /*!< TIMER channel 2 capture/compare value register */ -#define TIMER_CH3CV(timerx) REG32((timerx) + 0x00000040U) /*!< TIMER channel 3 capture/compare value register */ -#define TIMER_CCHP(timerx) REG32((timerx) + 0x00000044U) /*!< TIMER complementary channel protection register */ -#define TIMER_DMACFG(timerx) REG32((timerx) + 0x00000048U) /*!< TIMER DMA configuration register */ -#define TIMER_DMATB(timerx) REG32((timerx) + 0x0000004CU) /*!< TIMER DMA transfer buffer register */ -#define TIMER_IRMP(timerx) REG32((timerx) + 0x00000050U) /*!< TIMER channel input remap register */ -#define TIMER_CH0COMV_ADD(timerx) REG32((timerx) + 0x00000064U) /*!< TIMER channel 0 additional compare value register */ -#define TIMER_CH1COMV_ADD(timerx) REG32((timerx) + 0x00000068U) /*!< TIMER channel 1 additional compare value register */ -#define TIMER_CH2COMV_ADD(timerx) REG32((timerx) + 0x0000006CU) /*!< TIMER channel 2 additional compare value register */ -#define TIMER_CH3COMV_ADD(timerx) REG32((timerx) + 0x00000070U) /*!< TIMER channel 3 additional compare value register */ -#define TIMER_CTL2(timerx) REG32((timerx) + 0x00000074U) /*!< TIMER control register 2 */ - -#define TIMER_CFG(timerx) REG32((timerx) + 0x000000FCU) /*!< TIMER configuration register */ - -/* bits definitions */ -/* TIMER_CTL0 */ -#define TIMER_CTL0_CEN BIT(0) /*!< TIMER counter enable */ -#define TIMER_CTL0_UPDIS BIT(1) /*!< update disable */ -#define TIMER_CTL0_UPS BIT(2) /*!< update source */ -#define TIMER_CTL0_SPM BIT(3) /*!< single pulse mode */ -#define TIMER_CTL0_DIR BIT(4) /*!< timer counter direction */ -#define TIMER_CTL0_CAM BITS(5,6) /*!< center-aligned mode selection */ -#define TIMER_CTL0_ARSE BIT(7) /*!< auto-reload shadow enable */ -#define TIMER_CTL0_CKDIV BITS(8,9) /*!< clock division */ - -/* TIMER_CTL1 */ -#define TIMER_CTL1_CCSE BIT(0) /*!< commutation control shadow enable */ -#define TIMER_CTL1_CCUC BIT(2) /*!< commutation control shadow register update control */ -#define TIMER_CTL1_DMAS BIT(3) /*!< DMA request source selection */ -#define TIMER_CTL1_MMC BITS(4,6) /*!< master mode control */ -#define TIMER_CTL1_TI0S BIT(7) /*!< channel 0 trigger input selection(hall mode selection) */ -#define TIMER_CTL1_ISO0 BIT(8) /*!< idle state of channel 0 output */ -#define TIMER_CTL1_ISO0N BIT(9) /*!< idle state of channel 0 complementary output */ -#define TIMER_CTL1_ISO1 BIT(10) /*!< idle state of channel 1 output */ -#define TIMER_CTL1_ISO1N BIT(11) /*!< idle state of channel 1 complementary output */ -#define TIMER_CTL1_ISO2 BIT(12) /*!< idle state of channel 2 output */ -#define TIMER_CTL1_ISO2N BIT(13) /*!< idle state of channel 2 complementary output */ -#define TIMER_CTL1_ISO3 BIT(14) /*!< idle state of channel 3 output */ -#define TIMER_CTL1_ISO3N BIT(15) /*!< idle state of channel 3 complementary output */ - -/* TIMER_SMCFG */ -#define TIMER_SMCFG_SMC BITS(0,2) /*!< slave mode control */ -#define TIMER_SMCFG_TRGS BITS(4,6) /*!< trigger selection */ -#define TIMER_SMCFG_MSM BIT(7) /*!< master-slave mode */ -#define TIMER_SMCFG_ETFC BITS(8,11) /*!< external trigger filter control */ -#define TIMER_SMCFG_ETPSC BITS(12,13) /*!< external trigger prescaler */ -#define TIMER_SMCFG_SMC1 BIT(14) /*!< part of SMC for enable external clock mode 1 */ -#define TIMER_SMCFG_ETP BIT(15) /*!< external trigger polarity */ - -/* TIMER_DMAINTEN */ -#define TIMER_DMAINTEN_UPIE BIT(0) /*!< update interrupt enable */ -#define TIMER_DMAINTEN_CH0IE BIT(1) /*!< channel 0 capture/compare interrupt enable */ -#define TIMER_DMAINTEN_CH1IE BIT(2) /*!< channel 1 capture/compare interrupt enable */ -#define TIMER_DMAINTEN_CH2IE BIT(3) /*!< channel 2 capture/compare interrupt enable */ -#define TIMER_DMAINTEN_CH3IE BIT(4) /*!< channel 3 capture/compare interrupt enable */ -#define TIMER_DMAINTEN_CMTIE BIT(5) /*!< commutation interrupt request enable */ -#define TIMER_DMAINTEN_TRGIE BIT(6) /*!< trigger interrupt enable */ -#define TIMER_DMAINTEN_BRKIE BIT(7) /*!< break interrupt enable */ -#define TIMER_DMAINTEN_UPDEN BIT(8) /*!< update DMA request enable */ -#define TIMER_DMAINTEN_CH0DEN BIT(9) /*!< channel 0 DMA request enable */ -#define TIMER_DMAINTEN_CH1DEN BIT(10) /*!< channel 1 DMA request enable */ -#define TIMER_DMAINTEN_CH2DEN BIT(11) /*!< channel 2 DMA request enable */ -#define TIMER_DMAINTEN_CH3DEN BIT(12) /*!< channel 3 DMA request enable */ -#define TIMER_DMAINTEN_CMTDEN BIT(13) /*!< commutation DMA request enable */ -#define TIMER_DMAINTEN_TRGDEN BIT(14) /*!< trigger DMA request enable */ -#define TIMER_DMAINTEN_CH0COMADDIE BIT(28) /*!< channel 0 additional compare interrupt enable */ -#define TIMER_DMAINTEN_CH1COMADDIE BIT(29) /*!< channel 1 additional compare interrupt enable */ -#define TIMER_DMAINTEN_CH2COMADDIE BIT(30) /*!< channel 2 additional compare interrupt enable */ -#define TIMER_DMAINTEN_CH3COMADDIE BIT(31) /*!< channel 3 additional compare interrupt enable */ - -/* TIMER_INTF */ -#define TIMER_INTF_UPIF BIT(0) /*!< update interrupt flag */ -#define TIMER_INTF_CH0IF BIT(1) /*!< channel 0 capture/compare interrupt flag */ -#define TIMER_INTF_CH1IF BIT(2) /*!< channel 1 capture/compare interrupt flag */ -#define TIMER_INTF_CH2IF BIT(3) /*!< channel 2 capture/compare interrupt flag */ -#define TIMER_INTF_CH3IF BIT(4) /*!< channel 3 capture/compare interrupt flag */ -#define TIMER_INTF_CMTIF BIT(5) /*!< channel commutation interrupt flag */ -#define TIMER_INTF_TRGIF BIT(6) /*!< trigger interrupt flag */ -#define TIMER_INTF_BRKIF BIT(7) /*!< break interrupt flag */ -#define TIMER_INTF_CH0OF BIT(9) /*!< channel 0 overcapture flag */ -#define TIMER_INTF_CH1OF BIT(10) /*!< channel 1 overcapture flag */ -#define TIMER_INTF_CH2OF BIT(11) /*!< channel 2 overcapture flag */ -#define TIMER_INTF_CH3OF BIT(12) /*!< channel 3 overcapture flag */ -#define TIMER_INTF_CH0COMADDIF BIT(28) /*!< channel 0 additional compare interrupt flag */ -#define TIMER_INTF_CH1COMADDIF BIT(29) /*!< channel 1 additional compare interrupt flag */ -#define TIMER_INTF_CH2COMADDIF BIT(30) /*!< channel 2 additional compare interrupt flag */ -#define TIMER_INTF_CH3COMADDIF BIT(31) /*!< channel 3 additional compare interrupt flag */ - -/* TIMER_SWEVG */ -#define TIMER_SWEVG_UPG BIT(0) /*!< update event generate */ -#define TIMER_SWEVG_CH0G BIT(1) /*!< channel 0 capture or compare event generation */ -#define TIMER_SWEVG_CH1G BIT(2) /*!< channel 1 capture or compare event generation */ -#define TIMER_SWEVG_CH2G BIT(3) /*!< channel 2 capture or compare event generation */ -#define TIMER_SWEVG_CH3G BIT(4) /*!< channel 3 capture or compare event generation */ -#define TIMER_SWEVG_CMTG BIT(5) /*!< channel commutation event generation */ -#define TIMER_SWEVG_TRGG BIT(6) /*!< trigger event generation */ -#define TIMER_SWEVG_BRKG BIT(7) /*!< break event generation */ -#define TIMER_SWEVG_CH0COMADDG BIT(28) /*!< channel 0 additional compare event generation */ -#define TIMER_SWEVG_CH1COMADDG BIT(29) /*!< channel 1 additional compare event generation */ -#define TIMER_SWEVG_CH2COMADDG BIT(30) /*!< channel 2 additional compare event generation */ -#define TIMER_SWEVG_CH3COMADDG BIT(31) /*!< channel 3 additional compare event generation */ - -/* TIMER_CHCTL0 */ -/* output compare mode */ -#define TIMER_CHCTL0_CH0MS BITS(0,1) /*!< channel 0 mode selection */ -#define TIMER_CHCTL0_CH0COMFEN BIT(2) /*!< channel 0 output compare fast enable */ -#define TIMER_CHCTL0_CH0COMSEN BIT(3) /*!< channel 0 output compare shadow enable */ -#define TIMER_CHCTL0_CH0COMCTL BITS(4,6) /*!< channel 0 output compare mode */ -#define TIMER_CHCTL0_CH0COMCEN BIT(7) /*!< channel 0 output compare clear enable */ -#define TIMER_CHCTL0_CH1MS BITS(8,9) /*!< channel 1 mode selection */ -#define TIMER_CHCTL0_CH1COMFEN BIT(10) /*!< channel 1 output compare fast enable */ -#define TIMER_CHCTL0_CH1COMSEN BIT(11) /*!< channel 1 output compare shadow enable */ -#define TIMER_CHCTL0_CH1COMCTL BITS(12,14) /*!< channel 1 output compare mode */ -#define TIMER_CHCTL0_CH1COMCEN BIT(15) /*!< channel 1 output compare clear enable */ -#define TIMER_CHCTL0_CH0COMADDSEN BIT(28) /*!< channel 0 additional compare output shadow enable */ -#define TIMER_CHCTL0_CH1COMADDSEN BIT(29) /*!< channel 1 additional compare output shadow enable */ -/* input capture mode */ -#define TIMER_CHCTL0_CH0CAPPSC BITS(2,3) /*!< channel 0 input capture prescaler */ -#define TIMER_CHCTL0_CH0CAPFLT BITS(4,7) /*!< channel 0 input capture filter control */ -#define TIMER_CHCTL0_CH1CAPPSC BITS(10,11) /*!< channel 1 input capture prescaler */ -#define TIMER_CHCTL0_CH1CAPFLT BITS(12,15) /*!< channel 1 input capture filter control */ - -/* TIMER_CHCTL1 */ -/* output compare mode */ -#define TIMER_CHCTL1_CH2MS BITS(0,1) /*!< channel 2 mode selection */ -#define TIMER_CHCTL1_CH2COMFEN BIT(2) /*!< channel 2 output compare fast enable */ -#define TIMER_CHCTL1_CH2COMSEN BIT(3) /*!< channel 2 output compare shadow enable */ -#define TIMER_CHCTL1_CH2COMCTL BITS(4,6) /*!< channel 2 output compare mode */ -#define TIMER_CHCTL1_CH2COMCEN BIT(7) /*!< channel 2 output compare clear enable */ -#define TIMER_CHCTL1_CH3MS BITS(8,9) /*!< channel 3 mode selection */ -#define TIMER_CHCTL1_CH3COMFEN BIT(10) /*!< channel 3 output compare fast enable */ -#define TIMER_CHCTL1_CH3COMSEN BIT(11) /*!< channel 3 output compare shadow enable */ -#define TIMER_CHCTL1_CH3COMCTL BITS(12,14) /*!< channel 3 output compare mode */ -#define TIMER_CHCTL1_CH3COMCEN BIT(15) /*!< channel 3 output compare clear enable */ -#define TIMER_CHCTL1_CH2COMADDSEN BIT(28) /*!< channel 2 additional compare output shadow enable */ -#define TIMER_CHCTL1_CH3COMADDSEN BIT(29) /*!< channel 3 additional compare output shadow enable */ -/* input capture mode */ -#define TIMER_CHCTL1_CH2CAPPSC BITS(2,3) /*!< channel 2 input capture prescaler */ -#define TIMER_CHCTL1_CH2CAPFLT BITS(4,7) /*!< channel 2 input capture filter control */ -#define TIMER_CHCTL1_CH3CAPPSC BITS(10,11) /*!< channel 3 input capture prescaler */ -#define TIMER_CHCTL1_CH3CAPFLT BITS(12,15) /*!< channel 3 input capture filter control */ - -/* TIMER_CHCTL2 */ -#define TIMER_CHCTL2_CH0EN BIT(0) /*!< channel 0 capture/compare function enable */ -#define TIMER_CHCTL2_CH0P BIT(1) /*!< channel 0 capture/compare function polarity */ -#define TIMER_CHCTL2_CH0NEN BIT(2) /*!< channel 0 complementary output enable */ -#define TIMER_CHCTL2_CH0NP BIT(3) /*!< channel 0 complementary output polarity */ -#define TIMER_CHCTL2_CH1EN BIT(4) /*!< channel 1 capture/compare function enable */ -#define TIMER_CHCTL2_CH1P BIT(5) /*!< channel 1 capture/compare function polarity */ -#define TIMER_CHCTL2_CH1NEN BIT(6) /*!< channel 1 complementary output enable */ -#define TIMER_CHCTL2_CH1NP BIT(7) /*!< channel 1 complementary output polarity */ -#define TIMER_CHCTL2_CH2EN BIT(8) /*!< channel 2 capture/compare function enable */ -#define TIMER_CHCTL2_CH2P BIT(9) /*!< channel 2 capture/compare function polarity */ -#define TIMER_CHCTL2_CH2NEN BIT(10) /*!< channel 2 complementary output enable */ -#define TIMER_CHCTL2_CH2NP BIT(11) /*!< channel 2 complementary output polarity */ -#define TIMER_CHCTL2_CH3EN BIT(12) /*!< channel 3 capture/compare function enable */ -#define TIMER_CHCTL2_CH3P BIT(13) /*!< channel 3 capture/compare function polarity */ -#define TIMER_CHCTL2_CH3NEN BIT(14) /*!< channel 3 complementary output enable */ -#define TIMER_CHCTL2_CH3NP BIT(15) /*!< channel 3 complementary output polarity */ - -/* TIMER_CNT */ -#define TIMER_CNT_CNT16 BITS(0,15) /*!< 16 bit timer counter */ -#define TIMER_CNT_CNT32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) timer counter */ - -/* TIMER_PSC */ -#define TIMER_PSC_PSC BITS(0,15) /*!< prescaler value of the counter clock */ - -/* TIMER_CAR */ -#define TIMER_CAR_CARL16 BITS(0,15) /*!< 16 bit counter auto reload value */ -#define TIMER_CAR_CARL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) counter auto reload value */ - -/* TIMER_CREP */ -#define TIMER_CREP_CREP BITS(0,7) /*!< counter repetition value */ - -/* TIMER_CH0CV */ -#define TIMER_CH0CV_CH0VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 0 */ -#define TIMER_CH0CV_CH0VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 0 */ - -/* TIMER_CH1CV */ -#define TIMER_CH1CV_CH1VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 1 */ -#define TIMER_CH1CV_CH1VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 1 */ - -/* TIMER_CH2CV */ -#define TIMER_CH2CV_CH2VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 2 */ -#define TIMER_CH2CV_CH2VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 2 */ - -/* TIMER_CH3CV */ -#define TIMER_CH3CV_CH3VAL16 BITS(0,15) /*!< 16 bit capture/compare value of channel 3 */ -#define TIMER_CH3CV_CH3VAL32 BITS(0,31) /*!< 32 bit(TIMER1,TIMER4) capture/compare value of channel 3 */ - -/* TIMER_CCHP */ -#define TIMER_CCHP_DTCFG BITS(0,7) /*!< dead time configure */ -#define TIMER_CCHP_PROT BITS(8,9) /*!< complementary register protect control */ -#define TIMER_CCHP_IOS BIT(10) /*!< idle mode off-state configure */ -#define TIMER_CCHP_ROS BIT(11) /*!< run mode off-state configure */ -#define TIMER_CCHP_BRKEN BIT(12) /*!< break enable */ -#define TIMER_CCHP_BRKP BIT(13) /*!< break polarity */ -#define TIMER_CCHP_OAEN BIT(14) /*!< output automatic enable */ -#define TIMER_CCHP_POEN BIT(15) /*!< primary output enable */ - -/* TIMER_DMACFG */ -#define TIMER_DMACFG_DMATA BITS(0,4) /*!< DMA transfer access start address */ -#define TIMER_DMACFG_DMATC BITS(8,12) /*!< DMA transfer count */ - -/* TIMER_DMATB */ -#define TIMER_DMATB_DMATB BITS(0,15) /*!< DMA transfer buffer address */ - -/* TIMER_IRMP */ -#define TIMER1_IRMP_ITI1_RMP BITS(10,11) /*!< TIMER1 internal trigger input 1 remap */ -#define TIMER4_IRMP_CI3_RMP BITS(6,7) /*!< TIMER4 channel 3 input remap */ -#define TIMER10_IRMP_ITI1_RMP BITS(0,1) /*!< TIMER10 internal trigger input 1 remap */ - -/* TIMER_CFG */ -#define TIMER_CFG_OUTSEL BIT(0) /*!< the output value selection */ -#define TIMER_CFG_CHVSEL BIT(1) /*!< write CHxVAL register selection */ - -/* TIMER_CH0COMV_ADD */ -#define TIMER_CH0COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 0 */ - -/* TIMER_CH1COMV_ADD */ -#define TIMER_CH1COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 1 */ - -/* TIMER_CH2COMV_ADD */ -#define TIMER_CH2COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 2 */ - -/* TIMER_CH3COMV_ADD */ -#define TIMER_CH3COMV_ADD_CH0COMVAL BITS(0,15) /*!< Additional compare value of channel 3 */ - -/* TIMER_CTL2 */ -#define TIMER_CTL2_CH0CPWMEN BIT(28) /*!< Channel 0 composite PWM mode enable */ -#define TIMER_CTL2_CH1CPWMEN BIT(29) /*!< Channel 1 composite PWM mode enable */ -#define TIMER_CTL2_CH2CPWMEN BIT(30) /*!< Channel 2 composite PWM mode enable */ -#define TIMER_CTL2_CH3CPWMEN BIT(31) /*!< Channel 3 composite PWM mode enable */ - -/* constants definitions */ -/* TIMER init parameter struct definitions*/ -typedef struct { - uint16_t prescaler; /*!< prescaler value */ - uint16_t alignedmode; /*!< aligned mode */ - uint16_t counterdirection; /*!< counter direction */ - uint16_t clockdivision; /*!< clock division value */ - uint32_t period; /*!< period value */ - uint8_t repetitioncounter; /*!< the counter repetition value */ -} timer_parameter_struct; - -/* break parameter struct definitions*/ -typedef struct { - uint16_t runoffstate; /*!< run mode off-state */ - uint16_t ideloffstate; /*!< idle mode off-state */ - uint16_t deadtime; /*!< dead time */ - uint16_t breakpolarity; /*!< break polarity */ - uint16_t outputautostate; /*!< output automatic enable */ - uint16_t protectmode; /*!< complementary register protect control */ - uint16_t breakstate; /*!< break enable */ -} timer_break_parameter_struct; - -/* channel output parameter struct definitions */ -typedef struct { - uint16_t outputstate; /*!< channel output state */ - uint16_t outputnstate; /*!< channel complementary output state */ - uint16_t ocpolarity; /*!< channel output polarity */ - uint16_t ocnpolarity; /*!< channel complementary output polarity */ - uint16_t ocidlestate; /*!< idle state of channel output */ - uint16_t ocnidlestate; /*!< idle state of channel complementary output */ -} timer_oc_parameter_struct; - -/* channel input parameter struct definitions */ -typedef struct { - uint16_t icpolarity; /*!< channel input polarity */ - uint16_t icselection; /*!< channel input mode selection */ - uint16_t icprescaler; /*!< channel input capture prescaler */ - uint16_t icfilter; /*!< channel input capture filter control */ -} timer_ic_parameter_struct; - -/* TIMER interrupt enable or disable */ -#define TIMER_INT_UP TIMER_DMAINTEN_UPIE /*!< update interrupt */ -#define TIMER_INT_CH0 TIMER_DMAINTEN_CH0IE /*!< channel 0 interrupt */ -#define TIMER_INT_CH1 TIMER_DMAINTEN_CH1IE /*!< channel 1 interrupt */ -#define TIMER_INT_CH2 TIMER_DMAINTEN_CH2IE /*!< channel 2 interrupt */ -#define TIMER_INT_CH3 TIMER_DMAINTEN_CH3IE /*!< channel 3 interrupt */ -#define TIMER_INT_CMT TIMER_DMAINTEN_CMTIE /*!< channel commutation interrupt flag */ -#define TIMER_INT_TRG TIMER_DMAINTEN_TRGIE /*!< trigger interrupt */ -#define TIMER_INT_BRK TIMER_DMAINTEN_BRKIE /*!< break interrupt */ -#define TIMER_INT_CH0COMADD TIMER_DMAINTEN_CH0COMADDIE /*!< Channel 0 additional compare interrupt */ -#define TIMER_INT_CH1COMADD TIMER_DMAINTEN_CH1COMADDIE /*!< Channel 1 additional compare interrupt */ -#define TIMER_INT_CH2COMADD TIMER_DMAINTEN_CH2COMADDIE /*!< Channel 2 additional compare interrupt */ -#define TIMER_INT_CH3COMADD TIMER_DMAINTEN_CH3COMADDIE /*!< Channel 3 additional compare interrupt */ - -/* TIMER flag */ -#define TIMER_FLAG_UP TIMER_INTF_UPIF /*!< update flag */ -#define TIMER_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 flag */ -#define TIMER_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 flag */ -#define TIMER_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 flag */ -#define TIMER_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 flag */ -#define TIMER_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation flag */ -#define TIMER_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger flag */ -#define TIMER_FLAG_BRK TIMER_INTF_BRKIF /*!< break flag */ -#define TIMER_FLAG_CH0O TIMER_INTF_CH0OF /*!< channel 0 overcapture flag */ -#define TIMER_FLAG_CH1O TIMER_INTF_CH1OF /*!< channel 1 overcapture flag */ -#define TIMER_FLAG_CH2O TIMER_INTF_CH2OF /*!< channel 2 overcapture flag */ -#define TIMER_FLAG_CH3O TIMER_INTF_CH3OF /*!< channel 3 overcapture flag */ -#define TIMER_FLAG_CH0COMADD TIMER_INTF_CH0COMADDIF /*!< Channel 0 additional compare interrupt flag */ -#define TIMER_FLAG_CH1COMADD TIMER_INTF_CH1COMADDIF /*!< Channel 1 additional compare interrupt flag */ -#define TIMER_FLAG_CH2COMADD TIMER_INTF_CH2COMADDIF /*!< Channel 2 additional compare interrupt flag */ -#define TIMER_FLAG_CH3COMADD TIMER_INTF_CH3COMADDIF /*!< Channel 3 additional compare interrupt flag */ - -/* TIMER interrupt flag */ -#define TIMER_INT_FLAG_UP TIMER_INTF_UPIF /*!< update interrupt flag */ -#define TIMER_INT_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 interrupt flag */ -#define TIMER_INT_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 interrupt flag */ -#define TIMER_INT_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 interrupt flag */ -#define TIMER_INT_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 interrupt flag */ -#define TIMER_INT_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation interrupt flag */ -#define TIMER_INT_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger interrupt flag */ -#define TIMER_INT_FLAG_BRK TIMER_INTF_BRKIF /*!< break interrupt */ -#define TIMER_INT_FLAG_CH0COMADD TIMER_INT_CH0COMADD /*!< Channel 0 additional compare interrupt */ -#define TIMER_INT_FLAG_CH1COMADD TIMER_INT_CH1COMADD /*!< Channel 1 additional compare interrupt */ -#define TIMER_INT_FLAG_CH2COMADD TIMER_INT_CH2COMADD /*!< Channel 2 additional compare interrupt */ -#define TIMER_INT_FLAG_CH3COMADD TIMER_INT_CH3COMADD /*!< Channel 3 additional compare interrupt */ - -/* TIMER DMA source enable */ -#define TIMER_DMA_UPD ((uint16_t)TIMER_DMAINTEN_UPDEN) /*!< update DMA enable */ -#define TIMER_DMA_CH0D ((uint16_t)TIMER_DMAINTEN_CH0DEN) /*!< channel 0 DMA enable */ -#define TIMER_DMA_CH1D ((uint16_t)TIMER_DMAINTEN_CH1DEN) /*!< channel 1 DMA enable */ -#define TIMER_DMA_CH2D ((uint16_t)TIMER_DMAINTEN_CH2DEN) /*!< channel 2 DMA enable */ -#define TIMER_DMA_CH3D ((uint16_t)TIMER_DMAINTEN_CH3DEN) /*!< channel 3 DMA enable */ -#define TIMER_DMA_CMTD ((uint16_t)TIMER_DMAINTEN_CMTDEN) /*!< commutation DMA request enable */ -#define TIMER_DMA_TRGD ((uint16_t)TIMER_DMAINTEN_TRGDEN) /*!< trigger DMA enable */ - -/* channel DMA request source selection */ -#define TIMER_DMAREQUEST_UPDATEEVENT ((uint8_t)0x00U) /*!< DMA request of channel y is sent when update event occurs */ -#define TIMER_DMAREQUEST_CHANNELEVENT ((uint8_t)0x01U) /*!< DMA request of channel y is sent when channel y event occurs */ - -/* DMA access base address */ -#define DMACFG_DMATA(regval) (BITS(0, 4) & ((uint32_t)(regval) << 0U)) -#define TIMER_DMACFG_DMATA_CTL0 DMACFG_DMATA(0) /*!< DMA transfer address is TIMER_CTL0 */ -#define TIMER_DMACFG_DMATA_CTL1 DMACFG_DMATA(1) /*!< DMA transfer address is TIMER_CTL1 */ -#define TIMER_DMACFG_DMATA_SMCFG DMACFG_DMATA(2) /*!< DMA transfer address is TIMER_SMCFG */ -#define TIMER_DMACFG_DMATA_DMAINTEN DMACFG_DMATA(3) /*!< DMA transfer address is TIMER_DMAINTEN */ -#define TIMER_DMACFG_DMATA_INTF DMACFG_DMATA(4) /*!< DMA transfer address is TIMER_INTF */ -#define TIMER_DMACFG_DMATA_SWEVG DMACFG_DMATA(5) /*!< DMA transfer address is TIMER_SWEVG */ -#define TIMER_DMACFG_DMATA_CHCTL0 DMACFG_DMATA(6) /*!< DMA transfer address is TIMER_CHCTL0 */ -#define TIMER_DMACFG_DMATA_CHCTL1 DMACFG_DMATA(7) /*!< DMA transfer address is TIMER_CHCTL1 */ -#define TIMER_DMACFG_DMATA_CHCTL2 DMACFG_DMATA(8) /*!< DMA transfer address is TIMER_CHCTL2 */ -#define TIMER_DMACFG_DMATA_CNT DMACFG_DMATA(9) /*!< DMA transfer address is TIMER_CNT */ -#define TIMER_DMACFG_DMATA_PSC DMACFG_DMATA(10) /*!< DMA transfer address is TIMER_PSC */ -#define TIMER_DMACFG_DMATA_CAR DMACFG_DMATA(11) /*!< DMA transfer address is TIMER_CAR */ -#define TIMER_DMACFG_DMATA_CREP DMACFG_DMATA(12) /*!< DMA transfer address is TIMER_CREP */ -#define TIMER_DMACFG_DMATA_CH0CV DMACFG_DMATA(13) /*!< DMA transfer address is TIMER_CH0CV */ -#define TIMER_DMACFG_DMATA_CH1CV DMACFG_DMATA(14) /*!< DMA transfer address is TIMER_CH1CV */ -#define TIMER_DMACFG_DMATA_CH2CV DMACFG_DMATA(15) /*!< DMA transfer address is TIMER_CH2CV */ -#define TIMER_DMACFG_DMATA_CH3CV DMACFG_DMATA(16) /*!< DMA transfer address is TIMER_CH3CV */ -#define TIMER_DMACFG_DMATA_CCHP DMACFG_DMATA(17) /*!< DMA transfer address is TIMER_CCHP */ -#define TIMER_DMACFG_DMATA_DMACFG DMACFG_DMATA(18) /*!< DMA transfer address is TIMER_DMACFG */ -#define TIMER_DMACFG_DMATA_DMATB DMACFG_DMATA(19) /*!< DMA transfer address is TIMER_DMATB */ - -/* DMA access burst length */ -#define DMACFG_DMATC(regval) (BITS(8, 12) & ((uint32_t)(regval) << 8U)) -#define TIMER_DMACFG_DMATC_1TRANSFER DMACFG_DMATC(0) /*!< DMA transfer 1 time */ -#define TIMER_DMACFG_DMATC_2TRANSFER DMACFG_DMATC(1) /*!< DMA transfer 2 times */ -#define TIMER_DMACFG_DMATC_3TRANSFER DMACFG_DMATC(2) /*!< DMA transfer 3 times */ -#define TIMER_DMACFG_DMATC_4TRANSFER DMACFG_DMATC(3) /*!< DMA transfer 4 times */ -#define TIMER_DMACFG_DMATC_5TRANSFER DMACFG_DMATC(4) /*!< DMA transfer 5 times */ -#define TIMER_DMACFG_DMATC_6TRANSFER DMACFG_DMATC(5) /*!< DMA transfer 6 times */ -#define TIMER_DMACFG_DMATC_7TRANSFER DMACFG_DMATC(6) /*!< DMA transfer 7 times */ -#define TIMER_DMACFG_DMATC_8TRANSFER DMACFG_DMATC(7) /*!< DMA transfer 8 times */ -#define TIMER_DMACFG_DMATC_9TRANSFER DMACFG_DMATC(8) /*!< DMA transfer 9 times */ -#define TIMER_DMACFG_DMATC_10TRANSFER DMACFG_DMATC(9) /*!< DMA transfer 10 times */ -#define TIMER_DMACFG_DMATC_11TRANSFER DMACFG_DMATC(10) /*!< DMA transfer 11 times */ -#define TIMER_DMACFG_DMATC_12TRANSFER DMACFG_DMATC(11) /*!< DMA transfer 12 times */ -#define TIMER_DMACFG_DMATC_13TRANSFER DMACFG_DMATC(12) /*!< DMA transfer 13 times */ -#define TIMER_DMACFG_DMATC_14TRANSFER DMACFG_DMATC(13) /*!< DMA transfer 14 times */ -#define TIMER_DMACFG_DMATC_15TRANSFER DMACFG_DMATC(14) /*!< DMA transfer 15 times */ -#define TIMER_DMACFG_DMATC_16TRANSFER DMACFG_DMATC(15) /*!< DMA transfer 16 times */ -#define TIMER_DMACFG_DMATC_17TRANSFER DMACFG_DMATC(16) /*!< DMA transfer 17 times */ -#define TIMER_DMACFG_DMATC_18TRANSFER DMACFG_DMATC(17) /*!< DMA transfer 18 times */ - -/* TIMER software event generation source */ -#define TIMER_EVENT_SRC_UPG TIMER_SWEVG_UPG /*!< update event generation */ -#define TIMER_EVENT_SRC_CH0G TIMER_SWEVG_CH0G /*!< channel 0 capture or compare event generation */ -#define TIMER_EVENT_SRC_CH1G TIMER_SWEVG_CH1G /*!< channel 1 capture or compare event generation */ -#define TIMER_EVENT_SRC_CH2G TIMER_SWEVG_CH2G /*!< channel 2 capture or compare event generation */ -#define TIMER_EVENT_SRC_CH3G TIMER_SWEVG_CH3G /*!< channel 3 capture or compare event generation */ -#define TIMER_EVENT_SRC_CMTG TIMER_SWEVG_CMTG /*!< channel commutation event generation */ -#define TIMER_EVENT_SRC_TRGG TIMER_SWEVG_TRGG /*!< trigger event generation */ -#define TIMER_EVENT_SRC_BRKG ((uint16_t)0x0080U) /*!< break event generation */ -#define TIMER_EVENT_SRC_CH0COMADDG TIMER_SWEVG_CH0COMADDG /*!< Channel 0 additional compare event generation */ -#define TIMER_EVENT_SRC_CH1COMADDG TIMER_SWEVG_CH1COMADDG /*!< Channel 1 additional compare event generation */ -#define TIMER_EVENT_SRC_CH2COMADDG TIMER_SWEVG_CH2COMADDG /*!< Channel 2 additional compare event generation */ -#define TIMER_EVENT_SRC_CH3COMADDG TIMER_SWEVG_CH3COMADDG /*!< Channel 3 additional compare event generation */ - -/* center-aligned mode selection */ -#define CTL0_CAM(regval) ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U))) -#define TIMER_COUNTER_EDGE CTL0_CAM(0) /*!< edge-aligned mode */ -#define TIMER_COUNTER_CENTER_DOWN CTL0_CAM(1) /*!< center-aligned and counting down assert mode */ -#define TIMER_COUNTER_CENTER_UP CTL0_CAM(2) /*!< center-aligned and counting up assert mode */ -#define TIMER_COUNTER_CENTER_BOTH CTL0_CAM(3) /*!< center-aligned and counting up/down assert mode */ - -/* TIMER prescaler reload mode */ -#define TIMER_PSC_RELOAD_NOW ((uint32_t)0x00000000U) /*!< the prescaler is loaded right now */ -#define TIMER_PSC_RELOAD_UPDATE ((uint32_t)0x00000001U) /*!< the prescaler is loaded at the next update event */ - -/* count direction */ -#define TIMER_COUNTER_UP ((uint16_t)0x0000U) /*!< counter up direction */ -#define TIMER_COUNTER_DOWN ((uint16_t)TIMER_CTL0_DIR) /*!< counter down direction */ - -/* specify division ratio between TIMER clock and dead-time and sampling clock */ -#define CTL0_CKDIV(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) -#define TIMER_CKDIV_DIV1 CTL0_CKDIV(0) /*!< clock division value is 1,fDTS=fTIMER_CK */ -#define TIMER_CKDIV_DIV2 CTL0_CKDIV(1) /*!< clock division value is 2,fDTS= fTIMER_CK/2 */ -#define TIMER_CKDIV_DIV4 CTL0_CKDIV(2) /*!< clock division value is 4, fDTS= fTIMER_CK/4 */ - -/* single pulse mode */ -#define TIMER_SP_MODE_SINGLE ((uint32_t)0x00000000U) /*!< single pulse mode */ -#define TIMER_SP_MODE_REPETITIVE ((uint32_t)0x00000001U) /*!< repetitive pulse mode */ - -/* update source */ -#define TIMER_UPDATE_SRC_REGULAR ((uint32_t)0x00000000U) /*!< update generate only by counter overflow/underflow */ -#define TIMER_UPDATE_SRC_GLOBAL ((uint32_t)0x00000001U) /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */ - -/* run mode off-state configure */ -#define TIMER_ROS_STATE_ENABLE ((uint16_t)TIMER_CCHP_ROS) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ -#define TIMER_ROS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are disabled */ - -/* idle mode off-state configure */ -#define TIMER_IOS_STATE_ENABLE ((uint16_t)TIMER_CCHP_IOS) /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ -#define TIMER_IOS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are disabled */ - -/* break input polarity */ -#define TIMER_BREAK_POLARITY_LOW ((uint16_t)0x0000U) /*!< break input polarity is low */ -#define TIMER_BREAK_POLARITY_HIGH ((uint16_t)TIMER_CCHP_BRKP) /*!< break input polarity is high */ - -/* output automatic enable */ -#define TIMER_OUTAUTO_ENABLE ((uint16_t)TIMER_CCHP_OAEN) /*!< output automatic enable */ -#define TIMER_OUTAUTO_DISABLE ((uint16_t)0x0000U) /*!< output automatic disable */ - -/* complementary register protect control */ -#define CCHP_PROT(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) -#define TIMER_CCHP_PROT_OFF CCHP_PROT(0) /*!< protect disable */ -#define TIMER_CCHP_PROT_0 CCHP_PROT(1) /*!< PROT mode 0 */ -#define TIMER_CCHP_PROT_1 CCHP_PROT(2) /*!< PROT mode 1 */ -#define TIMER_CCHP_PROT_2 CCHP_PROT(3) /*!< PROT mode 2 */ - -/* break input enable */ -#define TIMER_BREAK_ENABLE ((uint16_t)TIMER_CCHP_BRKEN) /*!< break input enable */ -#define TIMER_BREAK_DISABLE ((uint16_t)0x0000U) /*!< break input disable */ - -/* TIMER channel n(n=0,1,2,3) */ -#define TIMER_CH_0 ((uint16_t)0x0000U) /*!< TIMER channel 0(TIMERx(x=0..4,7..13)) */ -#define TIMER_CH_1 ((uint16_t)0x0001U) /*!< TIMER channel 1(TIMERx(x=0..4,7,8,11)) */ -#define TIMER_CH_2 ((uint16_t)0x0002U) /*!< TIMER channel 2(TIMERx(x=0..4,7)) */ -#define TIMER_CH_3 ((uint16_t)0x0003U) /*!< TIMER channel 3(TIMERx(x=0..4,7)) */ - -/* channel enable state*/ -#define TIMER_CCX_ENABLE ((uint32_t)0x00000001U) /*!< channel enable */ -#define TIMER_CCX_DISABLE ((uint32_t)0x00000000U) /*!< channel disable */ - -/* channel complementary output enable state*/ -#define TIMER_CCXN_ENABLE ((uint16_t)0x0004U) /*!< channel complementary enable */ -#define TIMER_CCXN_DISABLE ((uint16_t)0x0000U) /*!< channel complementary disable */ - -/* channel output polarity */ -#define TIMER_OC_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel output polarity is high */ -#define TIMER_OC_POLARITY_LOW ((uint16_t)0x0002U) /*!< channel output polarity is low */ - -/* channel complementary output polarity */ -#define TIMER_OCN_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel complementary output polarity is high */ -#define TIMER_OCN_POLARITY_LOW ((uint16_t)0x0008U) /*!< channel complementary output polarity is low */ - -/* idle state of channel output */ -#define TIMER_OC_IDLE_STATE_HIGH ((uint16_t)0x0100) /*!< idle state of channel output is high */ -#define TIMER_OC_IDLE_STATE_LOW ((uint16_t)0x0000) /*!< idle state of channel output is low */ - -/* idle state of channel complementary output */ -#define TIMER_OCN_IDLE_STATE_HIGH ((uint16_t)0x0200U) /*!< idle state of channel complementary output is high */ -#define TIMER_OCN_IDLE_STATE_LOW ((uint16_t)0x0000U) /*!< idle state of channel complementary output is low */ - -/* channel output compare mode */ -#define TIMER_OC_MODE_TIMING ((uint16_t)0x0000U) /*!< timing mode */ -#define TIMER_OC_MODE_ACTIVE ((uint16_t)0x0010U) /*!< active mode */ -#define TIMER_OC_MODE_INACTIVE ((uint16_t)0x0020U) /*!< inactive mode */ -#define TIMER_OC_MODE_TOGGLE ((uint16_t)0x0030U) /*!< toggle mode */ -#define TIMER_OC_MODE_LOW ((uint16_t)0x0040U) /*!< force low mode */ -#define TIMER_OC_MODE_HIGH ((uint16_t)0x0050U) /*!< force high mode */ -#define TIMER_OC_MODE_PWM0 ((uint16_t)0x0060U) /*!< PWM0 mode */ -#define TIMER_OC_MODE_PWM1 ((uint16_t)0x0070U) /*!< PWM1 mode*/ - -/* channel output compare shadow enable */ -#define TIMER_OC_SHADOW_ENABLE ((uint16_t)0x0008U) /*!< channel output shadow state enable */ -#define TIMER_OC_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel output shadow state disable */ - -/* channel output compare fast enable */ -#define TIMER_OC_FAST_ENABLE ((uint16_t)0x0004) /*!< channel output fast function enable */ -#define TIMER_OC_FAST_DISABLE ((uint16_t)0x0000) /*!< channel output fast function disable */ - -/* channel output compare clear enable */ -#define TIMER_OC_CLEAR_ENABLE ((uint16_t)0x0080U) /*!< channel output clear function enable */ -#define TIMER_OC_CLEAR_DISABLE ((uint16_t)0x0000U) /*!< channel output clear function disable */ - -/* channel control shadow register update control */ -#define TIMER_UPDATECTL_CCU ((uint32_t)0x00000000U) /*!< the shadow registers are updated when CMTG bit is set */ -#define TIMER_UPDATECTL_CCUTRI ((uint32_t)0x00000001U) /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */ - -/* channel input capture polarity */ -#define TIMER_IC_POLARITY_RISING ((uint16_t)0x0000U) /*!< input capture rising edge */ -#define TIMER_IC_POLARITY_FALLING ((uint16_t)0x0002U) /*!< input capture falling edge */ -#define TIMER_IC_POLARITY_BOTH_EDGE ((uint16_t)0x000AU) /*!< input capture both edge */ - -/* TIMER input capture selection */ -#define TIMER_IC_SELECTION_DIRECTTI ((uint16_t)0x0001U) /*!< channel y is configured as input and icy is mapped on CIy */ -#define TIMER_IC_SELECTION_INDIRECTTI ((uint16_t)0x0002U) /*!< channel y is configured as input and icy is mapped on opposite input */ -#define TIMER_IC_SELECTION_ITS ((uint16_t)0x0003U) /*!< channel y is configured as input and icy is mapped on ITS */ - -/* channel input capture prescaler */ -#define TIMER_IC_PSC_DIV1 ((uint16_t)0x0000U) /*!< no prescaler */ -#define TIMER_IC_PSC_DIV2 ((uint16_t)0x0004U) /*!< divided by 2 */ -#define TIMER_IC_PSC_DIV4 ((uint16_t)0x0008U) /*!< divided by 4*/ -#define TIMER_IC_PSC_DIV8 ((uint16_t)0x000CU) /*!< divided by 8 */ - -/* trigger selection */ -#define SMCFG_TRGSEL(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) -#define TIMER_SMCFG_TRGSEL_ITI0 SMCFG_TRGSEL(0) /*!< internal trigger 0 */ -#define TIMER_SMCFG_TRGSEL_ITI1 SMCFG_TRGSEL(1) /*!< internal trigger 1 */ -#define TIMER_SMCFG_TRGSEL_ITI2 SMCFG_TRGSEL(2) /*!< internal trigger 2 */ -#define TIMER_SMCFG_TRGSEL_ITI3 SMCFG_TRGSEL(3) /*!< internal trigger 3 */ -#define TIMER_SMCFG_TRGSEL_CI0F_ED SMCFG_TRGSEL(4) /*!< TI0 Edge Detector */ -#define TIMER_SMCFG_TRGSEL_CI0FE0 SMCFG_TRGSEL(5) /*!< filtered TIMER input 0 */ -#define TIMER_SMCFG_TRGSEL_CI1FE1 SMCFG_TRGSEL(6) /*!< filtered TIMER input 1 */ -#define TIMER_SMCFG_TRGSEL_ETIFP SMCFG_TRGSEL(7) /*!< external trigger */ - -/* master mode control */ -#define CTL1_MMC(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) -#define TIMER_TRI_OUT_SRC_RESET CTL1_MMC(0) /*!< the UPG bit as trigger output */ -#define TIMER_TRI_OUT_SRC_ENABLE CTL1_MMC(1) /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */ -#define TIMER_TRI_OUT_SRC_UPDATE CTL1_MMC(2) /*!< update event as trigger output */ -#define TIMER_TRI_OUT_SRC_CH0 CTL1_MMC(3) /*!< a capture or a compare match occurred in channal0 as trigger output TRGO */ -#define TIMER_TRI_OUT_SRC_O0CPRE CTL1_MMC(4) /*!< O0CPRE as trigger output */ -#define TIMER_TRI_OUT_SRC_O1CPRE CTL1_MMC(5) /*!< O1CPRE as trigger output */ -#define TIMER_TRI_OUT_SRC_O2CPRE CTL1_MMC(6) /*!< O2CPRE as trigger output */ -#define TIMER_TRI_OUT_SRC_O3CPRE CTL1_MMC(7) /*!< O3CPRE as trigger output */ - -/* slave mode control */ -#define SMCFG_SMC(regval) (BITS(0, 2) & ((uint32_t)(regval) << 0U)) -#define TIMER_SLAVE_MODE_DISABLE SMCFG_SMC(0) /*!< slave mode disable */ -#define TIMER_ENCODER_MODE0 SMCFG_SMC(1) /*!< encoder mode 0 */ -#define TIMER_ENCODER_MODE1 SMCFG_SMC(2) /*!< encoder mode 1 */ -#define TIMER_ENCODER_MODE2 SMCFG_SMC(3) /*!< encoder mode 2 */ -#define TIMER_SLAVE_MODE_RESTART SMCFG_SMC(4) /*!< restart mode */ -#define TIMER_SLAVE_MODE_PAUSE SMCFG_SMC(5) /*!< pause mode */ -#define TIMER_SLAVE_MODE_EVENT SMCFG_SMC(6) /*!< event mode */ -#define TIMER_SLAVE_MODE_EXTERNAL0 SMCFG_SMC(7) /*!< external clock mode 0 */ - -/* master slave mode selection */ -#define TIMER_MASTER_SLAVE_MODE_ENABLE ((uint32_t)0x00000000U) /*!< master slave mode enable */ -#define TIMER_MASTER_SLAVE_MODE_DISABLE ((uint32_t)0x00000001U) /*!< master slave mode disable */ - -/* external trigger prescaler */ -#define SMCFG_ETPSC(regval) (BITS(12, 13) & ((uint32_t)(regval) << 12U)) -#define TIMER_EXT_TRI_PSC_OFF SMCFG_ETPSC(0) /*!< no divided */ -#define TIMER_EXT_TRI_PSC_DIV2 SMCFG_ETPSC(1) /*!< divided by 2 */ -#define TIMER_EXT_TRI_PSC_DIV4 SMCFG_ETPSC(2) /*!< divided by 4 */ -#define TIMER_EXT_TRI_PSC_DIV8 SMCFG_ETPSC(3) /*!< divided by 8 */ - -/* external trigger polarity */ -#define TIMER_ETP_FALLING TIMER_SMCFG_ETP /*!< active low or falling edge active */ -#define TIMER_ETP_RISING ((uint32_t)0x00000000U) /*!< active high or rising edge active */ - -/* channel 0 trigger input selection */ -#define TIMER_HALLINTERFACE_ENABLE ((uint32_t)0x00000000U) /*!< TIMER hall sensor mode enable */ -#define TIMER_HALLINTERFACE_DISABLE ((uint32_t)0x00000001U) /*!< TIMER hall sensor mode disable */ - -/* timer1 internal trigger input1 remap */ -#define TIMER1_IRMP(regval) (BITS(10, 11) & ((uint32_t)(regval) << 10U)) -#define TIMER1_ITI1_RMP_TIMER7_TRGO TIMER1_IRMP(0) /*!< timer1 internal trigger input 1 remap to TIMER7_TRGO */ -#define TIMER1_ITI1_RMP_ETHERNET_PTP TIMER1_IRMP(1) /*!< timer1 internal trigger input 1 remap to ethernet PTP */ -#define TIMER1_ITI1_RMP_USB_FS_SOF TIMER1_IRMP(2) /*!< timer1 internal trigger input 1 remap to USB FS SOF */ -#define TIMER1_ITI1_RMP_USB_HS_SOF TIMER1_IRMP(3) /*!< timer1 internal trigger input 1 remap to USB HS SOF */ - -/* timer4 channel 3 input remap */ -#define TIMER4_IRMP(regval) (BITS(6, 7) & ((uint32_t)(regval) << 6U)) -#define TIMER4_CI3_RMP_GPIO TIMER4_IRMP(0) /*!< timer4 channel 3 input remap to GPIO pin */ -#define TIMER4_CI3_RMP_IRC32K TIMER4_IRMP(1) /*!< timer4 channel 3 input remap to IRC32K */ -#define TIMER4_CI3_RMP_LXTAL TIMER4_IRMP(2) /*!< timer4 channel 3 input remap to LXTAL */ -#define TIMER4_CI3_RMP_RTC_WAKEUP_INT TIMER4_IRMP(3) /*!< timer4 channel 3 input remap to RTC wakeup interrupt */ - -/* timer10 internal trigger input1 remap */ -#define TIMER10_IRMP(regval) (BITS(0, 1) & ((uint32_t)(regval) << 0U)) -#define TIMER10_ITI1_RMP_GPIO TIMER10_IRMP(0) /*!< timer10 internal trigger input1 remap based on GPIO setting */ -#define TIMER10_ITI1_RMP_RTC_HXTAL_DIV TIMER10_IRMP(2) /*!< timer10 internal trigger input1 remap HXTAL _DIV(clock used for RTC which is HXTAL clock divided by RTCDIV bits in RCU_CFG0 register) */ - -/* timerx(x=0,1,2,13,14,15,16) write cc register selection */ -#define TIMER_CHVSEL_ENABLE ((uint16_t)TIMER_CFG_CHVSEL) /*!< write CHxVAL register selection enable */ -#define TIMER_CHVSEL_DISABLE ((uint16_t)0x0000U) /*!< write CHxVAL register selection disable */ - -/* TIMER output value selection enable */ -#define TIMER_OUTSEL_ENABLE ((uint16_t)TIMER_CFG_OUTSEL) /*!< output value selection enable */ -#define TIMER_OUTSEL_DISABLE ((uint16_t)0x0000U) /*!< output value selection disable */ - -/* channel additional output compare shadow enable */ -#define TIMER_CH0_ADD_SHADOW_ENABLE ((uint32_t)0x10000000U) /*!< channel 0 additional output shadow state enable */ -#define TIMER_CH1_ADD_SHADOW_ENABLE ((uint32_t)0x20000000U) /*!< channel 1 additional output shadow state enable */ -#define TIMER_CH2_ADD_SHADOW_ENABLE ((uint32_t)0x10000000U) /*!< channel 2 additional output shadow state enable */ -#define TIMER_CH3_ADD_SHADOW_ENABLE ((uint32_t)0x20000000U) /*!< channel 3 additional output shadow state enable */ - -/* channel additional output compare shadow enable */ -#define TIMER_ADD_SHADOW_ENABLE ((uint16_t)0x0001U) /*!< channel additional output shadow state enable */ -#define TIMER_ADD_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel additional output shadow state disable */ - -/* function declarations */ -/* TIMER timebase */ -/* deinit a TIMER */ -void timer_deinit(uint32_t timer_periph); -/* initialize TIMER init parameter struct */ -void timer_struct_para_init(timer_parameter_struct *initpara); -/* initialize TIMER counter */ -void timer_init(uint32_t timer_periph, timer_parameter_struct *initpara); -/* enable a TIMER */ -void timer_enable(uint32_t timer_periph); -/* disable a TIMER */ -void timer_disable(uint32_t timer_periph); -/* enable the auto reload shadow function */ -void timer_auto_reload_shadow_enable(uint32_t timer_periph); -/* disable the auto reload shadow function */ -void timer_auto_reload_shadow_disable(uint32_t timer_periph); -/* enable the update event */ -void timer_update_event_enable(uint32_t timer_periph); -/* disable the update event */ -void timer_update_event_disable(uint32_t timer_periph); -/* set TIMER counter alignment mode */ -void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned); -/* set TIMER counter up direction */ -void timer_counter_up_direction(uint32_t timer_periph); -/* set TIMER counter down direction */ -void timer_counter_down_direction(uint32_t timer_periph); -/* configure TIMER prescaler */ -void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload); -/* configure TIMER repetition register value */ -void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition); -/* configure TIMER autoreload register value */ -void timer_autoreload_value_config(uint32_t timer_periph, uint32_t autoreload); -/* configure TIMER counter register value */ -void timer_counter_value_config(uint32_t timer_periph, uint32_t counter); -/* read TIMER counter value */ -uint32_t timer_counter_read(uint32_t timer_periph); -/* read TIMER prescaler value */ -uint16_t timer_prescaler_read(uint32_t timer_periph); -/* configure TIMER single pulse mode */ -void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode); -/* configure TIMER update source */ -void timer_update_source_config(uint32_t timer_periph, uint32_t update); - -/* TIMER DMA and event */ -/* enable the TIMER DMA */ -void timer_dma_enable(uint32_t timer_periph, uint16_t dma); -/* disable the TIMER DMA */ -void timer_dma_disable(uint32_t timer_periph, uint16_t dma); -/* channel DMA request source selection */ -void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request); -/* configure the TIMER DMA transfer */ -void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth); -/* software generate events */ -void timer_event_software_generate(uint32_t timer_periph, uint16_t event); - -/* TIMER channel complementary protection */ -/* initialize TIMER break parameter struct */ -void timer_break_struct_para_init(timer_break_parameter_struct *breakpara); -/* configure TIMER break function */ -void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct *breakpara); -/* enable TIMER break function */ -void timer_break_enable(uint32_t timer_periph); -/* disable TIMER break function */ -void timer_break_disable(uint32_t timer_periph); -/* enable TIMER output automatic function */ -void timer_automatic_output_enable(uint32_t timer_periph); -/* disable TIMER output automatic function */ -void timer_automatic_output_disable(uint32_t timer_periph); -/* enable or disable TIMER primary output function */ -void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue); -/* enable or disable channel capture/compare control shadow register */ -void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue); -/* configure TIMER channel control shadow register update control */ -void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl); - -/* TIMER channel output */ -/* initialize TIMER channel output parameter struct */ -void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara); -/* configure TIMER channel output function */ -void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, - timer_oc_parameter_struct *ocpara); -/* configure TIMER channel output compare mode */ -void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode); -/* configure TIMER channel output pulse value */ -void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, - uint32_t pulse); -/* configure TIMER channel output shadow function */ -void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow); -/* configure TIMER channel output fast function */ -void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast); -/* configure TIMER channel output clear function */ -void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear); -/* configure TIMER channel output polarity */ -void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocpolarity); -/* configure TIMER channel complementary output polarity */ -void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocnpolarity); -/* configure TIMER channel enable state */ -void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state); -/* configure TIMER channel complementary output enable state */ -void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocnstate); - -/* TIMER channel input */ -/* initialize TIMER channel input parameter struct */ -void timer_channel_input_struct_para_init(timer_ic_parameter_struct *icpara); -/* configure TIMER input capture parameter */ -void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, - timer_ic_parameter_struct *icpara); -/* configure TIMER channel input capture prescaler value */ -void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, - uint16_t prescaler); -/* read TIMER channel capture compare register value */ -uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel); -/* configure TIMER input pwm capture function */ -void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, - timer_ic_parameter_struct *icpwm); -/* configure TIMER hall sensor mode */ -void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode); - -/* TIMER master and slave */ -/* select TIMER input trigger source */ -void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger); -/* select TIMER master mode output trigger source */ -void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger); -/* select TIMER slave mode */ -void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode); -/* configure TIMER master slave mode */ -void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave); -/* configure TIMER external trigger input */ -void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter); -/* configure TIMER quadrature decoder mode */ -void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, - uint16_t ic0polarity, uint16_t ic1polarity); -/* configure TIMER internal clock mode */ -void timer_internal_clock_config(uint32_t timer_periph); -/* configure TIMER the internal trigger as external clock input */ -void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger); -/* configure TIMER the external trigger as external clock input */ -void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, - uint16_t extpolarity, uint32_t extfilter); -/* configure TIMER the external clock mode 0 */ -void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter); -/* configure TIMER the external clock mode 1 */ -void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter); -/* disable TIMER the external clock mode 1 */ -void timer_external_clock_mode1_disable(uint32_t timer_periph); -/* configure TIMER channel remap function */ -void timer_channel_remap_config(uint32_t timer_periph, uint32_t remap); - -/* TIMER configure */ -/* configure TIMER write CHxVAL register selection */ -void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel); -/* configure TIMER output value selection */ -void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel); - -/* TIMER composite pwm */ -/* enable the TIMER composite pwm */ -void timer_channel_composite_pwm_enable(uint32_t timer_periph, uint32_t channel); -/* disable the TIMER composite pwm */ -void timer_channel_composite_pwm_disable(uint32_t timer_periph, uint32_t channel); - -/* configure TIMER channel additional compare value */ -void timer_channel_additional_compare_value_config(uint32_t timer_periph, uint16_t channel, - uint32_t value); -/* configure TIMER channel additional output shadow function */ -void timer_channel_additional_output_shadow_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocshadow); -/* get TIMER channel additional compare value */ -uint32_t timer_channel_additional_compare_value_read(uint32_t timer_periph, uint16_t channel); - -/* TIMER interrupt and flag*/ -/* get TIMER flags */ -FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag); -/* clear TIMER flags */ -void timer_flag_clear(uint32_t timer_periph, uint32_t flag); -/* enable the TIMER interrupt */ -void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt); -/* disable the TIMER interrupt */ -void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt); -/* get TIMER interrupt flag */ -FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt); -/* clear TIMER interrupt flag */ -void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt); - -#endif /* GD32F5XX_TIMER_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h deleted file mode 100644 index b31b7c0256c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_tli.h +++ /dev/null @@ -1,370 +0,0 @@ -/*! - \file gd32f5xx_tli.h - \brief definitions for the TLI - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_TLI_H -#define GD32F5XX_TLI_H - -#include "gd32f5xx.h" - -/* TLI definitions */ -#define TLI TLI_BASE /*!< TLI base address */ -/* TLI layer definitions */ -#define LAYER0 TLI_BASE /*!< TLI layer0 base address */ -#define LAYER1 (TLI_BASE + 0x00000080U) /*!< TLI layer1 base address */ - -/* registers definitions */ -#define TLI_SPSZ REG32(TLI + 0x00000008U) /*!< TLI synchronous pulse size register */ -#define TLI_BPSZ REG32(TLI + 0x0000000CU) /*!< TLI back-porch size register */ -#define TLI_ASZ REG32(TLI + 0x00000010U) /*!< TLI active size register */ -#define TLI_TSZ REG32(TLI + 0x00000014U) /*!< TLI total size register */ -#define TLI_CTL REG32(TLI + 0x00000018U) /*!< TLI control register */ -#define TLI_RL REG32(TLI + 0x00000024U) /*!< TLI reload Layer register */ -#define TLI_BGC REG32(TLI + 0x0000002CU) /*!< TLI background color register */ -#define TLI_INTEN REG32(TLI + 0x00000034U) /*!< TLI interrupt enable register */ -#define TLI_INTF REG32(TLI + 0x00000038U) /*!< TLI interrupt flag register */ -#define TLI_INTC REG32(TLI + 0x0000003CU) /*!< TLI interrupt flag clear register */ -#define TLI_LM REG32(TLI + 0x00000040U) /*!< TLI line mark register */ -#define TLI_CPPOS REG32(TLI + 0x00000044U) /*!< TLI current pixel position register */ -#define TLI_STAT REG32(TLI + 0x00000048U) /*!< TLI status register */ -#define TLI_LxCTL(layerx) REG32((layerx) + 0x00000084U) /*!< TLI layer x control register */ -#define TLI_LxHPOS(layerx) REG32((layerx) + 0x00000088U) /*!< TLI layer x horizontal position parameters register */ -#define TLI_LxVPOS(layerx) REG32((layerx) + 0x0000008CU) /*!< TLI layer x vertical position parameters register */ -#define TLI_LxCKEY(layerx) REG32((layerx) + 0x00000090U) /*!< TLI layer x color key register */ -#define TLI_LxPPF(layerx) REG32((layerx) + 0x00000094U) /*!< TLI layer x packeted pixel format register */ -#define TLI_LxSA(layerx) REG32((layerx) + 0x00000098U) /*!< TLI layer x specified alpha register */ -#define TLI_LxDC(layerx) REG32((layerx) + 0x0000009CU) /*!< TLI layer x default color register */ -#define TLI_LxBLEND(layerx) REG32((layerx) + 0x000000A0U) /*!< TLI layer x blending register */ -#define TLI_LxFBADDR(layerx) REG32((layerx) + 0x000000ACU) /*!< TLI layer x frame base address register */ -#define TLI_LxFLLEN(layerx) REG32((layerx) + 0x000000B0U) /*!< TLI layer x frame line length register */ -#define TLI_LxFTLN(layerx) REG32((layerx) + 0x000000B4U) /*!< TLI layer x frame total line number register */ -#define TLI_LxLUT(layerx) REG32((layerx) + 0x000000C4U) /*!< TLI layer x look up table register */ - -/* bits definitions */ -/* TLI_SPSZ */ -#define TLI_SPSZ_VPSZ BITS(0,11) /*!< size of the vertical synchronous pulse */ -#define TLI_SPSZ_HPSZ BITS(16,27) /*!< size of the horizontal synchronous pulse */ - -/* TLI_BPSZ */ -#define TLI_BPSZ_VBPSZ BITS(0,11) /*!< size of the vertical back porch plus synchronous pulse */ -#define TLI_BPSZ_HBPSZ BITS(16,27) /*!< size of the horizontal back porch plus synchronous pulse */ - -/* TLI_ASZ */ -#define TLI_ASZ_VASZ BITS(0,11) /*!< size of the vertical active area width plus back porch and synchronous pulse */ -#define TLI_ASZ_HASZ BITS(16,27) /*!< size of the horizontal active area width plus back porch and synchronous pulse */ - -/* TLI_SPSZ */ -#define TLI_TSZ_VTSZ BITS(0,11) /*!< vertical total size of the display, including active area, back porch, synchronous pulse and front porch */ -#define TLI_TSZ_HTSZ BITS(16,27) /*!< horizontal total size of the display, including active area, back porch, synchronous pulse and front porch */ - -/* TLI_CTL */ -#define TLI_CTL_TLIEN BIT(0) /*!< TLI enable bit */ -#define TLI_CTL_BDB BITS(4,6) /*!< blue channel dither bits number */ -#define TLI_CTL_GDB BITS(8,10) /*!< green channel dither bits number */ -#define TLI_CTL_RDB BITS(12,14) /*!< red channel dither bits number */ -#define TLI_CTL_DFEN BIT(16) /*!< dither function enable */ -#define TLI_CTL_CLKPS BIT(28) /*!< pixel clock polarity selection */ -#define TLI_CTL_DEPS BIT(29) /*!< data enable polarity selection */ -#define TLI_CTL_VPPS BIT(30) /*!< vertical pulse polarity selection */ -#define TLI_CTL_HPPS BIT(31) /*!< horizontal pulse polarity selection */ - -/* TLI_RL */ -#define TLI_RL_RQR BIT(0) /*!< request reload */ -#define TLI_RL_FBR BIT(1) /*!< frame blank reload */ - -/* TLI_BGC */ -#define TLI_BGC_BVB BITS(0,7) /*!< background value blue */ -#define TLI_BGC_BVG BITS(8,15) /*!< background value green */ -#define TLI_BGC_BVR BITS(16,23) /*!< background value red */ - -/* TLI_INTEN */ -#define TLI_INTEN_LMIE BIT(0) /*!< line mark interrupt enable */ -#define TLI_INTEN_FEIE BIT(1) /*!< FIFO error interrupt enable */ -#define TLI_INTEN_TEIE BIT(2) /*!< transaction error interrupt enable */ -#define TLI_INTEN_LCRIE BIT(3) /*!< layer configuration reloaded interrupt enable */ - -/* TLI_INTF */ -#define TLI_INTF_LMF BIT(0) /*!< line mark flag */ -#define TLI_INTF_FEF BIT(1) /*!< FIFO error flag */ -#define TLI_INTF_TEF BIT(2) /*!< transaction error flag */ -#define TLI_INTF_LCRF BIT(3) /*!< layer configuration reloaded flag */ - -/* TLI_INTC */ -#define TLI_INTC_LMC BIT(0) /*!< line mark flag clear */ -#define TLI_INTC_FEC BIT(1) /*!< FIFO error flag clear */ -#define TLI_INTC_TEC BIT(2) /*!< transaction error flag clear */ -#define TLI_INTC_LCRC BIT(3) /*!< layer configuration reloaded flag clear */ - -/* TLI_LM */ -#define TLI_LM_LM BITS(0,10) /*!< line mark value */ - -/* TLI_CPPOS */ -#define TLI_CPPOS_VPOS BITS(0,15) /*!< vertical position */ -#define TLI_CPPOS_HPOS BITS(16,31) /*!< horizontal position */ - -/* TLI_STAT */ -#define TLI_STAT_VDE BIT(0) /*!< current VDE status */ -#define TLI_STAT_HDE BIT(1) /*!< current HDE status */ -#define TLI_STAT_VS BIT(2) /*!< current VS status of the TLI */ -#define TLI_STAT_HS BIT(3) /*!< current HS status of the TLI */ - -/* TLI_LxCTL */ -#define TLI_LxCTL_LEN BIT(0) /*!< layer enable */ -#define TLI_LxCTL_CKEYEN BIT(1) /*!< color keying enable */ -#define TLI_LxCTL_LUTEN BIT(4) /*!< LUT enable */ - -/* TLI_LxHPOS */ -#define TLI_LxHPOS_WLP BITS(0,11) /*!< window left position */ -#define TLI_LxHPOS_WRP BITS(16,27) /*!< window right position */ - -/* TLI_LxVPOS */ -#define TLI_LxVPOS_WTP BITS(0,11) /*!< window top position */ -#define TLI_LxVPOS_WBP BITS(16,27) /*!< window bottom position */ - -/* TLI_LxCKEY */ -#define TLI_LxCKEY_CKEYB BITS(0,7) /*!< color key blue */ -#define TLI_LxCKEY_CKEYG BITS(8,15) /*!< color key green */ -#define TLI_LxCKEY_CKEYR BITS(16,23) /*!< color key red */ - -/* TLI_LxPPF */ -#define TLI_LxPPF_PPF BITS(0,2) /*!< packeted pixel format */ - -/* TLI_LxSA */ -#define TLI_LxSA_SA BITS(0,7) /*!< specified alpha */ - -/* TLI_LxDC */ -#define TLI_LxDC_DCB BITS(0,7) /*!< the default color blue */ -#define TLI_LxDC_DCG BITS(8,15) /*!< the default color green */ -#define TLI_LxDC_DCR BITS(16,23) /*!< the default color red */ -#define TLI_LxDC_DCA BITS(24,31) /*!< the default color alpha */ - -/* TLI_LxBLEND */ -#define TLI_LxBLEND_ACF2 BITS(0,2) /*!< alpha calculation factor 2 of blending method */ -#define TLI_LxBLEND_ACF1 BITS(8,10) /*!< alpha calculation factor 1 of blending method */ - -/* TLI_LxFBADDR */ -#define TLI_LxFBADDR_FBADD BITS(0,31) /*!< frame buffer base address */ - -/* TLI_LxFLLEN */ -#define TLI_LxFLLEN_FLL BITS(0,13) /*!< frame line length */ -#define TLI_LxFLLEN_STDOFF BITS(16,29) /*!< frame buffer stride offset */ - -/* TLI_LxFTLN */ -#define TLI_LxFTLN_FTLN BITS(0,10) /*!< frame total line number */ - -/* TLI_LxLUT */ -#define TLI_LxLUT_TB BITS(0,7) /*!< blue channel of a LUT entry */ -#define TLI_LxLUT_TG BITS(8,15) /*!< green channel of a LUT entry */ -#define TLI_LxLUT_TR BITS(16,23) /*!< red channel of a LUT entry */ -#define TLI_LxLUT_TADD BITS(24,31) /*!< look up table write address */ - -/* constants definitions */ -/* TLI parameter struct definitions */ -typedef struct { - uint16_t synpsz_vpsz; /*!< size of the vertical synchronous pulse */ - uint16_t synpsz_hpsz; /*!< size of the horizontal synchronous pulse */ - uint16_t backpsz_vbpsz; /*!< size of the vertical back porch plus synchronous pulse */ - uint16_t backpsz_hbpsz; /*!< size of the horizontal back porch plus synchronous pulse */ - uint32_t activesz_vasz; /*!< size of the vertical active area width plus back porch and synchronous pulse */ - uint32_t activesz_hasz; /*!< size of the horizontal active area width plus back porch and synchronous pulse */ - uint32_t totalsz_vtsz; /*!< vertical total size of the display */ - uint32_t totalsz_htsz; /*!< horizontal total size of the display */ - uint32_t backcolor_red; /*!< background value red */ - uint32_t backcolor_green; /*!< background value green */ - uint32_t backcolor_blue; /*!< background value blue */ - uint32_t signalpolarity_hs; /*!< horizontal pulse polarity selection */ - uint32_t signalpolarity_vs; /*!< vertical pulse polarity selection */ - uint32_t signalpolarity_de; /*!< data enable polarity selection */ - uint32_t signalpolarity_pixelck; /*!< pixel clock polarity selection */ -} tli_parameter_struct; - -/* TLI layer parameter struct definitions */ -typedef struct { - uint16_t layer_window_rightpos; /*!< window right position */ - uint16_t layer_window_leftpos; /*!< window left position */ - uint16_t layer_window_bottompos; /*!< window bottom position */ - uint16_t layer_window_toppos; /*!< window top position */ - uint32_t layer_ppf; /*!< packeted pixel format */ - uint8_t layer_sa; /*!< specified alpha */ - uint8_t layer_default_alpha; /*!< the default color alpha */ - uint8_t layer_default_red; /*!< the default color red */ - uint8_t layer_default_green; /*!< the default color green */ - uint8_t layer_default_blue; /*!< the default color blue */ - uint32_t layer_acf1; /*!< alpha calculation factor 1 of blending method */ - uint32_t layer_acf2; /*!< alpha calculation factor 2 of blending method */ - uint32_t layer_frame_bufaddr; /*!< frame buffer base address */ - uint16_t layer_frame_buf_stride_offset; /*!< frame buffer stride offset */ - uint16_t layer_frame_line_length; /*!< frame line length */ - uint16_t layer_frame_total_line_number; /*!< frame total line number */ -} tli_layer_parameter_struct; - -/* TLI layer LUT parameter struct definitions */ -typedef struct { - uint32_t layer_table_addr; /*!< look up table write address */ - uint8_t layer_lut_channel_red; /*!< red channel of a LUT entry */ - uint8_t layer_lut_channel_green; /*!< green channel of a LUT entry */ - uint8_t layer_lut_channel_blue; /*!< blue channel of a LUT entry */ -} tli_layer_lut_parameter_struct; - -/* packeted pixel format */ -typedef enum { - LAYER_PPF_ARGB8888, /*!< layerx pixel format ARGB8888 */ - LAYER_PPF_RGB888, /*!< layerx pixel format RGB888 */ - LAYER_PPF_RGB565, /*!< layerx pixel format RGB565 */ - LAYER_PPF_ARGB1555, /*!< layerx pixel format ARGB1555 */ - LAYER_PPF_ARGB4444, /*!< layerx pixel format ARGB4444 */ - LAYER_PPF_L8, /*!< layerx pixel format L8 */ - LAYER_PPF_AL44, /*!< layerx pixel format AL44 */ - LAYER_PPF_AL88 /*!< layerx pixel format AL88 */ -} tli_layer_ppf_enum; - -/* TLI flags */ -#define TLI_FLAG_VDE TLI_STAT_VDE /*!< current VDE status */ -#define TLI_FLAG_HDE TLI_STAT_HDE /*!< current HDE status */ -#define TLI_FLAG_VS TLI_STAT_VS /*!< current VS status of the TLI */ -#define TLI_FLAG_HS TLI_STAT_HS /*!< current HS status of the TLI */ -#define TLI_FLAG_LM BIT(0) | BIT(31) /*!< line mark interrupt flag */ -#define TLI_FLAG_FE BIT(1) | BIT(31) /*!< FIFO error interrupt flag */ -#define TLI_FLAG_TE BIT(2) | BIT(31) /*!< transaction error interrupt flag */ -#define TLI_FLAG_LCR BIT(3) | BIT(31) /*!< layer configuration reloaded interrupt flag */ - -/* TLI interrupt enable or disable */ -#define TLI_INT_LM BIT(0) /*!< line mark interrupt */ -#define TLI_INT_FE BIT(1) /*!< FIFO error interrupt */ -#define TLI_INT_TE BIT(2) /*!< transaction error interrupt */ -#define TLI_INT_LCR BIT(3) /*!< layer configuration reloaded interrupt */ - -/* TLI interrupt flag */ -#define TLI_INT_FLAG_LM BIT(0) /*!< line mark interrupt flag */ -#define TLI_INT_FLAG_FE BIT(1) /*!< FIFO error interrupt flag */ -#define TLI_INT_FLAG_TE BIT(2) /*!< transaction error interrupt flag */ -#define TLI_INT_FLAG_LCR BIT(3) /*!< layer configuration reloaded interrupt flag */ - -/* layer reload configure */ -#define TLI_FRAME_BLANK_RELOAD_EN ((uint8_t)0x00U) /*!< the layer configuration will be reloaded at frame blank */ -#define TLI_REQUEST_RELOAD_EN ((uint8_t)0x01U) /*!< the layer configuration will be reloaded after this bit sets */ - -/* dither function */ -#define TLI_DITHER_DISABLE ((uint8_t)0x00U) /*!< dither function disable */ -#define TLI_DITHER_ENABLE ((uint8_t)0x01U) /*!< dither function enable */ - -/* horizontal pulse polarity selection */ -#define TLI_HSYN_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< horizontal synchronous pulse active low */ -#define TLI_HSYN_ACTLIVE_HIGHT TLI_CTL_HPPS /*!< horizontal synchronous pulse active high */ - -/* vertical pulse polarity selection */ -#define TLI_VSYN_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< vertical synchronous pulse active low */ -#define TLI_VSYN_ACTLIVE_HIGHT TLI_CTL_VPPS /*!< vertical synchronous pulse active high */ - -/* pixel clock polarity selection */ -#define TLI_PIXEL_CLOCK_TLI ((uint32_t)0x00000000U) /*!< pixel clock is TLI clock */ -#define TLI_PIXEL_CLOCK_INVERTEDTLI TLI_CTL_CLKPS /*!< pixel clock is inverted TLI clock */ - -/* data enable polarity selection */ -#define TLI_DE_ACTLIVE_LOW ((uint32_t)0x00000000U) /*!< data enable active low */ -#define TLI_DE_ACTLIVE_HIGHT TLI_CTL_DEPS /*!< data enable active high */ - -/* alpha calculation factor 1 of blending method */ -#define LxBLEND_ACF1(regval) (BITS(8,10) & ((uint32_t)(regval)<<8)) -#define LAYER_ACF1_SA LxBLEND_ACF1(4) /*!< normalization specified alpha */ -#define LAYER_ACF1_PASA LxBLEND_ACF1(6) /*!< normalization pixel alpha * normalization specified alpha */ - -/* alpha calculation factor 2 of blending method */ -#define LxBLEND_ACF2(regval) (BITS(0,2) & ((uint32_t)(regval))) -#define LAYER_ACF2_SA LxBLEND_ACF2(5) /*!< normalization specified alpha */ -#define LAYER_ACF2_PASA LxBLEND_ACF2(7) /*!< normalization pixel alpha * normalization specified alpha */ - -/* function declarations */ -/* initialization functions, TLI enable or disable, TLI reload mode configuration */ -/* deinitialize TLI registers */ -void tli_deinit(void); -/* initialize the parameters of TLI parameter structure with the default values, it is suggested - that call this function after a tli_parameter_struct structure is defined */ -void tli_struct_para_init(tli_parameter_struct *tli_struct); -/* initialize TLI */ -void tli_init(tli_parameter_struct *tli_struct); -/* configure TLI dither function */ -void tli_dither_config(uint8_t dither_stat); -/* enable TLI */ -void tli_enable(void); -/* disable TLI */ -void tli_disable(void); -/* configurate TLI reload mode */ -void tli_reload_config(uint8_t reload_mod); - -/* TLI layer configuration functions */ -/* initialize the parameters of TLI layer structure with the default values, it is suggested - that call this function after a tli_layer_parameter_struct structure is defined */ -void tli_layer_struct_para_init(tli_layer_parameter_struct *layer_struct); -/* initialize TLI layer */ -void tli_layer_init(uint32_t layerx, tli_layer_parameter_struct *layer_struct); -/* reconfigure window position */ -void tli_layer_window_offset_modify(uint32_t layerx, uint16_t offset_x, uint16_t offset_y); -/* initialize the parameters of TLI layer LUT structure with the default values, it is suggested - that call this function after a tli_layer_lut_parameter_struct structure is defined */ -void tli_lut_struct_para_init(tli_layer_lut_parameter_struct *lut_struct); -/* initialize TLI layer LUT */ -void tli_lut_init(uint32_t layerx, tli_layer_lut_parameter_struct *lut_struct); -/* initialize TLI layer color key */ -void tli_color_key_init(uint32_t layerx, uint8_t redkey, uint8_t greenkey, uint8_t bluekey); -/* enable TLI layer */ -void tli_layer_enable(uint32_t layerx); -/* disable TLI layer */ -void tli_layer_disable(uint32_t layerx); -/* enable TLI layer color keying */ -void tli_color_key_enable(uint32_t layerx); -/* disable TLI layer color keying */ -void tli_color_key_disable(uint32_t layerx); -/* enable TLI layer LUT */ -void tli_lut_enable(uint32_t layerx); -/* disable TLI layer LUT */ -void tli_lut_disable(uint32_t layerx); - -/* set line mark value */ -void tli_line_mark_set(uint16_t line_num); -/* get current displayed position */ -uint32_t tli_current_pos_get(void); - -/* flag and interrupt functions */ -/* enable TLI interrupt */ -void tli_interrupt_enable(uint32_t int_flag); -/* disable TLI interrupt */ -void tli_interrupt_disable(uint32_t int_flag); -/* get TLI interrupt flag */ -FlagStatus tli_interrupt_flag_get(uint32_t int_flag); -/* clear TLI interrupt flag */ -void tli_interrupt_flag_clear(uint32_t int_flag); -/* get TLI flag or state in TLI_INTF register or TLI_STAT register */ -FlagStatus tli_flag_get(uint32_t flag); - -#endif /* GD32F5XX_TLI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h deleted file mode 100644 index 029cbbd1784..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_trng.h +++ /dev/null @@ -1,100 +0,0 @@ -/*! - \file gd32f5xx_trng.h - \brief definitions for the TRNG - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_TRNG_H -#define GD32F5XX_TRNG_H - -#include "gd32f5xx.h" - -/* TRNG definitions */ -#define TRNG TRNG_BASE - -/* registers definitions */ -#define TRNG_CTL REG32(TRNG + 0x00000000U) /*!< control register */ -#define TRNG_STAT REG32(TRNG + 0x00000004U) /*!< status register */ -#define TRNG_DATA REG32(TRNG + 0x00000008U) /*!< data register */ - -/* bits definitions */ -/* TRNG_CTL */ -#define TRNG_CTL_TRNGEN BIT(2) /*!< TRNG enable bit */ -#define TRNG_CTL_TRNGIE BIT(3) /*!< interrupt enable bit */ - -/* TRNG_STAT */ -#define TRNG_STAT_DRDY BIT(0) /*!< random data ready status bit */ -#define TRNG_STAT_CECS BIT(1) /*!< clock error current status */ -#define TRNG_STAT_SECS BIT(2) /*!< seed error current status */ -#define TRNG_STAT_CEIF BIT(5) /*!< clock error interrupt flag */ -#define TRNG_STAT_SEIF BIT(6) /*!< seed error interrupt flag */ - -/* TRNG_DATA */ -#define TRNG_DATA_TRNGDATA BITS(0,31) /*!< 32-Bit Random data */ - -/* constants definitions */ -/* TRNG status flag */ -typedef enum { - TRNG_FLAG_DRDY = TRNG_STAT_DRDY, /*!< random Data ready status */ - TRNG_FLAG_CECS = TRNG_STAT_CECS, /*!< clock error current status */ - TRNG_FLAG_SECS = TRNG_STAT_SECS /*!< seed error current status */ -} trng_flag_enum; - -/* TRNG inerrupt flag */ -typedef enum { - TRNG_INT_FLAG_CEIF = TRNG_STAT_CEIF, /*!< clock error interrupt flag */ - TRNG_INT_FLAG_SEIF = TRNG_STAT_SEIF /*!< seed error interrupt flag */ -} trng_int_flag_enum; - -/* function declarations */ -/* initialization functions */ -/* reset TRNG */ -void trng_deinit(void); -/* enable TRNG */ -void trng_enable(void); -/* disable TRNG */ -void trng_disable(void); -/* get the true random data */ -uint32_t trng_get_true_random_data(void); - -/* interrupt & flag functions */ -/* get TRNG flag status */ -FlagStatus trng_flag_get(trng_flag_enum flag); -/* enable TRNG interrupt */ -void trng_interrupt_enable(void); -/* disable TRNG interrupt */ -void trng_interrupt_disable(void); -/* get TRNG interrupt flag status */ -FlagStatus trng_interrupt_flag_get(trng_int_flag_enum int_flag); -/* clear TRNG interrupt flag status */ -void trng_interrupt_flag_clear(trng_int_flag_enum int_flag); - -#endif /* GD32F5XX_TRNG_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h deleted file mode 100644 index 4047fd78f02..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_usart.h +++ /dev/null @@ -1,489 +0,0 @@ -/*! - \file gd32f5xx_usart.h - \brief definitions for the USART - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_USART_H -#define GD32F5XX_USART_H - -#include "gd32f5xx.h" - -/* USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) definitions */ -#define USART1 USART_BASE /*!< USART1 base address */ -#define USART2 (USART_BASE+0x00000400U) /*!< USART2 base address */ -#define UART3 (USART_BASE+0x00000800U) /*!< UART3 base address */ -#define UART4 (USART_BASE+0x00000C00U) /*!< UART4 base address */ -#define UART6 (USART_BASE+0x00003400U) /*!< UART6 base address */ -#define UART7 (USART_BASE+0x00003800U) /*!< UART7 base address */ -#define USART0 (USART_BASE+0x0000CC00U) /*!< USART0 base address */ -#define USART5 (USART_BASE+0x0000D000U) /*!< USART5 base address */ - -/* registers definitions */ -#define USART_STAT0(usartx) REG32((usartx) + 0x00U) /*!< USART status register 0 */ -#define USART_DATA(usartx) REG32((usartx) + 0x04U) /*!< USART data register */ -#define USART_BAUD(usartx) REG32((usartx) + 0x08U) /*!< USART baud rate register */ -#define USART_CTL0(usartx) REG32((usartx) + 0x0CU) /*!< USART control register 0 */ -#define USART_CTL1(usartx) REG32((usartx) + 0x10U) /*!< USART control register 1 */ -#define USART_CTL2(usartx) REG32((usartx) + 0x14U) /*!< USART control register 2 */ -#define USART_GP(usartx) REG32((usartx) + 0x18U) /*!< USART guard time and prescaler register */ -#define USART_CTL3(usartx) REG32((usartx) + 0x80U) /*!< USART control register 3 */ -#define USART_RT(usartx) REG32((usartx) + 0x84U) /*!< USART receiver timeout register */ -#define USART_STAT1(usartx) REG32((usartx) + 0x88U) /*!< USART status register 1 */ -#define USART_CHC(usartx) REG32((usartx) + 0xC0U) /*!< USART coherence control register */ - -/* bits definitions */ -/* USARTx_STAT0 */ -#define USART_STAT0_PERR BIT(0) /*!< parity error flag */ -#define USART_STAT0_FERR BIT(1) /*!< frame error flag */ -#define USART_STAT0_NERR BIT(2) /*!< noise error flag */ -#define USART_STAT0_ORERR BIT(3) /*!< overrun error */ -#define USART_STAT0_IDLEF BIT(4) /*!< IDLE frame detected flag */ -#define USART_STAT0_RBNE BIT(5) /*!< read data buffer not empty */ -#define USART_STAT0_TC BIT(6) /*!< transmission complete */ -#define USART_STAT0_TBE BIT(7) /*!< transmit data buffer empty */ -#define USART_STAT0_LBDF BIT(8) /*!< LIN break detected flag */ -#define USART_STAT0_CTSF BIT(9) /*!< CTS change flag */ - -/* USARTx_DATA */ -#define USART_DATA_DATA BITS(0,8) /*!< transmit or read data value */ - -/* USARTx_BAUD */ -#define USART_BAUD_FRADIV BITS(0,3) /*!< fraction part of baud-rate divider */ -#define USART_BAUD_INTDIV BITS(4,15) /*!< integer part of baud-rate divider */ - -/* USARTx_CTL0 */ -#define USART_CTL0_SBKCMD BIT(0) /*!< send break command */ -#define USART_CTL0_RWU BIT(1) /*!< receiver wakeup from mute mode */ -#define USART_CTL0_REN BIT(2) /*!< receiver enable */ -#define USART_CTL0_TEN BIT(3) /*!< transmitter enable */ -#define USART_CTL0_IDLEIE BIT(4) /*!< idle line detected interrupt enable */ -#define USART_CTL0_RBNEIE BIT(5) /*!< read data buffer not empty interrupt and overrun error interrupt enable */ -#define USART_CTL0_TCIE BIT(6) /*!< transmission complete interrupt enable */ -#define USART_CTL0_TBEIE BIT(7) /*!< transmitter buffer empty interrupt enable */ -#define USART_CTL0_PERRIE BIT(8) /*!< parity error interrupt enable */ -#define USART_CTL0_PM BIT(9) /*!< parity mode */ -#define USART_CTL0_PCEN BIT(10) /*!< parity check function enable */ -#define USART_CTL0_WM BIT(11) /*!< wakeup method in mute mode */ -#define USART_CTL0_WL BIT(12) /*!< word length */ -#define USART_CTL0_UEN BIT(13) /*!< USART enable */ -#define USART_CTL0_OVSMOD BIT(15) /*!< oversample mode */ - -/* USARTx_CTL1 */ -#define USART_CTL1_ADDR BITS(0,3) /*!< address of USART */ -#define USART_CTL1_LBLEN BIT(5) /*!< LIN break frame length */ -#define USART_CTL1_LBDIE BIT(6) /*!< LIN break detected interrupt eanble */ -#define USART_CTL1_CLEN BIT(8) /*!< CK length */ -#define USART_CTL1_CPH BIT(9) /*!< CK phase */ -#define USART_CTL1_CPL BIT(10) /*!< CK polarity */ -#define USART_CTL1_CKEN BIT(11) /*!< CK pin enable */ -#define USART_CTL1_STB BITS(12,13) /*!< STOP bits length */ -#define USART_CTL1_LMEN BIT(14) /*!< LIN mode enable */ - -/* USARTx_CTL2 */ -#define USART_CTL2_ERRIE BIT(0) /*!< error interrupt enable */ -#define USART_CTL2_IREN BIT(1) /*!< IrDA mode enable */ -#define USART_CTL2_IRLP BIT(2) /*!< IrDA low-power */ -#define USART_CTL2_HDEN BIT(3) /*!< half-duplex enable */ -#define USART_CTL2_NKEN BIT(4) /*!< NACK enable in smartcard mode */ -#define USART_CTL2_SCEN BIT(5) /*!< smartcard mode enable */ -#define USART_CTL2_DENR BIT(6) /*!< DMA request enable for reception */ -#define USART_CTL2_DENT BIT(7) /*!< DMA request enable for transmission */ -#define USART_CTL2_RTSEN BIT(8) /*!< RTS enable */ -#define USART_CTL2_CTSEN BIT(9) /*!< CTS enable */ -#define USART_CTL2_CTSIE BIT(10) /*!< CTS interrupt enable */ -#define USART_CTL2_OSB BIT(11) /*!< one sample bit method */ - -/* USARTx_GP */ -#define USART_GP_PSC BITS(0,7) /*!< prescaler value for dividing the system clock */ -#define USART_GP_GUAT BITS(8,15) /*!< guard time value in smartcard mode */ - -/* USARTx_CTL3 */ -#define USART_CTL3_RTEN BIT(0) /*!< receiver timeout enable */ -#define USART_CTL3_SCRTNUM BITS(1,3) /*!< smartcard auto-retry number */ -#define USART_CTL3_RTIE BIT(4) /*!< interrupt enable bit of receive timeout event */ -#define USART_CTL3_EBIE BIT(5) /*!< interrupt enable bit of end of block event */ -#define USART_CTL3_RINV BIT(8) /*!< RX pin level inversion */ -#define USART_CTL3_TINV BIT(9) /*!< TX pin level inversion */ -#define USART_CTL3_DINV BIT(10) /*!< data bit level inversion */ -#define USART_CTL3_MSBF BIT(11) /*!< most significant bit first */ - -/* USARTx_RT */ -#define USART_RT_RT BITS(0,23) /*!< receiver timeout threshold */ -#define USART_RT_BL BITS(24,31) /*!< block length */ - -/* USARTx_STAT1 */ -#define USART_STAT1_RTF BIT(11) /*!< receiver timeout flag */ -#define USART_STAT1_EBF BIT(12) /*!< end of block flag */ -#define USART_STAT1_BSY BIT(16) /*!< busy flag */ - -/* USARTx_CHC */ -#define USART_CHC_HCM BIT(0) /*!< hardware flow control coherence mode */ -#define USART_CHC_PCM BIT(1) /*!< parity check coherence mode */ -#define USART_CHC_BCM BIT(2) /*!< break frame coherence mode */ -#define USART_CHC_EPERR BIT(8) /*!< early parity error flag */ - -/* constants definitions */ -/* define the USART bit position and its register index offset */ -#define USART_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) -#define USART_REG_VAL(usartx, offset) (REG32((usartx) + (((uint32_t)(offset) & 0xFFFFU) >> 6))) -#define USART_BIT_POS(val) ((uint32_t)(val) & 0x1FU) -#define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ - | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) -#define USART_REG_VAL2(usartx, offset) (REG32((usartx) + ((uint32_t)(offset) >> 22))) -#define USART_BIT_POS2(val) (((uint32_t)(val) & 0x1F0000U) >> 16) - -/* register offset */ -#define USART_STAT0_REG_OFFSET 0x00U /*!< STAT0 register offset */ -#define USART_STAT1_REG_OFFSET 0x88U /*!< STAT1 register offset */ -#define USART_CTL0_REG_OFFSET 0x0CU /*!< CTL0 register offset */ -#define USART_CTL1_REG_OFFSET 0x10U /*!< CTL1 register offset */ -#define USART_CTL2_REG_OFFSET 0x14U /*!< CTL2 register offset */ -#define USART_CTL3_REG_OFFSET 0x80U /*!< CTL3 register offset */ -#define USART_CHC_REG_OFFSET 0xC0U /*!< CHC register offset */ - -/* USART flags */ -typedef enum { - /* flags in STAT0 register */ - USART_FLAG_CTS = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 9U), /*!< CTS change flag */ - USART_FLAG_LBD = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected flag */ - USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 7U), /*!< transmit data buffer empty */ - USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete */ - USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty */ - USART_FLAG_IDLE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 4U), /*!< IDLE frame detected flag */ - USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 3U), /*!< overrun error */ - USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 2U), /*!< noise error flag */ - USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 1U), /*!< frame error flag */ - USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 0U), /*!< parity error flag */ - /* flags in STAT1 register */ - USART_FLAG_BSY = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 16U), /*!< busy flag */ - USART_FLAG_EB = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 12U), /*!< end of block flag */ - USART_FLAG_RT = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 11U), /*!< receiver timeout flag */ - /* flags in CHC register */ - USART_FLAG_EPERR = USART_REGIDX_BIT(USART_CHC_REG_OFFSET, 8U) /*!< early parity error flag */ -} usart_flag_enum; - -/* USART interrupt flags */ -typedef enum { - /* interrupt flags in CTL0 register */ - USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT0_REG_OFFSET, 0U), /*!< parity error interrupt and flag */ - USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt and flag */ - USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete interrupt and flag */ - USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and flag */ - USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */ - USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt and flag */ - /* interrupt flags in CTL1 register */ - USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected interrupt and flag */ - /* interrupt flags in CTL2 register */ - USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT0_REG_OFFSET, 9U), /*!< CTS interrupt and flag */ - USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 3U), /*!< error interrupt and overrun error */ - USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 2U), /*!< error interrupt and noise error flag */ - USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 1U), /*!< error interrupt and frame error flag */ - /* interrupt flags in CTL3 register */ - USART_INT_FLAG_EB = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 5U, USART_STAT1_REG_OFFSET, 12U), /*!< interrupt enable bit of end of block event and flag */ - USART_INT_FLAG_RT = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 4U, USART_STAT1_REG_OFFSET, 11U) /*!< interrupt enable bit of receive timeout event and flag */ -} usart_interrupt_flag_enum; - -/* USART interrupt flags */ -typedef enum { - /* interrupt in CTL0 register */ - USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U), /*!< parity error interrupt */ - USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt */ - USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U), /*!< transmission complete interrupt */ - USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and overrun error interrupt */ - USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt */ - /* interrupt in CTL1 register */ - USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U), /*!< LIN break detected interrupt */ - /* interrupt in CTL2 register */ - USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U), /*!< CTS interrupt */ - USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U), /*!< error interrupt */ - /* interrupt in CTL3 register */ - USART_INT_EB = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 5U), /*!< interrupt enable bit of end of block event */ - USART_INT_RT = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 4U) /*!< interrupt enable bit of receive timeout event */ -} usart_interrupt_enum; - -/* USART invert configure */ -typedef enum { - /* data bit level inversion */ - USART_DINV_ENABLE, /*!< data bit level inversion */ - USART_DINV_DISABLE, /*!< data bit level not inversion */ - /* TX pin level inversion */ - USART_TXPIN_ENABLE, /*!< TX pin level inversion */ - USART_TXPIN_DISABLE, /*!< TX pin level not inversion */ - /* RX pin level inversion */ - USART_RXPIN_ENABLE, /*!< RX pin level inversion */ - USART_RXPIN_DISABLE /*!< RX pin level not inversion */ -} usart_invert_enum; - -/* USART receiver configure */ -#define CTL0_REN(regval) (BIT(2) & ((uint32_t)(regval) << 2)) -#define USART_RECEIVE_ENABLE CTL0_REN(1) /*!< enable receiver */ -#define USART_RECEIVE_DISABLE CTL0_REN(0) /*!< disable receiver */ - -/* USART transmitter configure */ -#define CTL0_TEN(regval) (BIT(3) & ((uint32_t)(regval) << 3)) -#define USART_TRANSMIT_ENABLE CTL0_TEN(1) /*!< enable transmitter */ -#define USART_TRANSMIT_DISABLE CTL0_TEN(0) /*!< disable transmitter */ - -/* USART parity bits definitions */ -#define CTL0_PM(regval) (BITS(9,10) & ((uint32_t)(regval) << 9)) -#define USART_PM_NONE CTL0_PM(0) /*!< no parity */ -#define USART_PM_EVEN CTL0_PM(2) /*!< even parity */ -#define USART_PM_ODD CTL0_PM(3) /*!< odd parity */ - -/* USART wakeup method in mute mode */ -#define CTL0_WM(regval) (BIT(11) & ((uint32_t)(regval) << 11)) -#define USART_WM_IDLE CTL0_WM(0) /*!< idle Line */ -#define USART_WM_ADDR CTL0_WM(1) /*!< address mask */ - -/* USART word length definitions */ -#define CTL0_WL(regval) (BIT(12) & ((uint32_t)(regval) << 12)) -#define USART_WL_8BIT CTL0_WL(0) /*!< 8 bits */ -#define USART_WL_9BIT CTL0_WL(1) /*!< 9 bits */ - -/* USART oversampling mode definitions */ -#define CTL0_OVSMOD(regval) (BIT(15) & ((uint32_t)(regval) << 15)) -#define USART_OVSMOD_16 CTL0_OVSMOD(0) /*!< 16 bits */ -#define USART_OVSMOD_8 CTL0_OVSMOD(1) /*!< 8 bits */ - -/* USART stop bits definitions */ -#define CTL1_STB(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) -#define USART_STB_1BIT CTL1_STB(0) /*!< 1 bit */ -#define USART_STB_0_5BIT CTL1_STB(1) /*!< 0.5 bit */ -#define USART_STB_2BIT CTL1_STB(2) /*!< 2 bits */ -#define USART_STB_1_5BIT CTL1_STB(3) /*!< 1.5 bits */ - -/* USART LIN break frame length */ -#define CTL1_LBLEN(regval) (BIT(5) & ((uint32_t)(regval) << 5)) -#define USART_LBLEN_10B CTL1_LBLEN(0) /*!< 10 bits */ -#define USART_LBLEN_11B CTL1_LBLEN(1) /*!< 11 bits */ - -/* USART CK length */ -#define CTL1_CLEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) -#define USART_CLEN_NONE CTL1_CLEN(0) /*!< there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame */ -#define USART_CLEN_EN CTL1_CLEN(1) /*!< there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame */ - -/* USART clock phase */ -#define CTL1_CPH(regval) (BIT(9) & ((uint32_t)(regval) << 9)) -#define USART_CPH_1CK CTL1_CPH(0) /*!< first clock transition is the first data capture edge */ -#define USART_CPH_2CK CTL1_CPH(1) /*!< second clock transition is the first data capture edge */ - -/* USART clock polarity */ -#define CTL1_CPL(regval) (BIT(10) & ((uint32_t)(regval) << 10)) -#define USART_CPL_LOW CTL1_CPL(0) /*!< steady low value on CK pin */ -#define USART_CPL_HIGH CTL1_CPL(1) /*!< steady high value on CK pin */ - -/* USART DMA request for receive configure */ -#define CLT2_DENR(regval) (BIT(6) & ((uint32_t)(regval) << 6)) -#define USART_DENR_ENABLE CLT2_DENR(1) /*!< DMA request enable for reception */ -#define USART_DENR_DISABLE CLT2_DENR(0) /*!< DMA request disable for reception */ - -/* USART DMA request for transmission configure */ -#define CLT2_DENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) -#define USART_DENT_ENABLE CLT2_DENT(1) /*!< DMA request enable for transmission */ -#define USART_DENT_DISABLE CLT2_DENT(0) /*!< DMA request disable for transmission */ - -/* USART RTS configure */ -#define CLT2_RTSEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) -#define USART_RTS_ENABLE CLT2_RTSEN(1) /*!< RTS enable */ -#define USART_RTS_DISABLE CLT2_RTSEN(0) /*!< RTS disable */ - -/* USART CTS configure */ -#define CLT2_CTSEN(regval) (BIT(9) & ((uint32_t)(regval) << 9)) -#define USART_CTS_ENABLE CLT2_CTSEN(1) /*!< CTS enable */ -#define USART_CTS_DISABLE CLT2_CTSEN(0) /*!< CTS disable */ - -/* USART one sample bit method configure */ -#define CTL2_OSB(regval) (BIT(11) & ((uint32_t)(regval) << 11)) -#define USART_OSB_1bit CTL2_OSB(1) /*!< 1 bit */ -#define USART_OSB_3bit CTL2_OSB(0) /*!< 3 bits */ - -/* USART IrDA low-power enable */ -#define CTL2_IRLP(regval) (BIT(2) & ((uint32_t)(regval) << 2)) -#define USART_IRLP_LOW CTL2_IRLP(1) /*!< low-power */ -#define USART_IRLP_NORMAL CTL2_IRLP(0) /*!< normal */ - -/* USART data is transmitted/received with the LSB/MSB first */ -#define CTL3_MSBF(regval) (BIT(11) & ((uint32_t)(regval) << 11)) -#define USART_MSBF_LSB CTL3_MSBF(0) /*!< LSB first */ -#define USART_MSBF_MSB CTL3_MSBF(1) /*!< MSB first */ - -/* break frame coherence mode */ -#define CHC_BCM(regval) (BIT(2) & ((uint32_t)(regval) << 2)) -#define USART_BCM_NONE CHC_BCM(0) /*!< no parity error is detected */ -#define USART_BCM_EN CHC_BCM(1) /*!< parity error is detected */ - -/* USART parity check coherence mode */ -#define CHC_PCM(regval) (BIT(1) & ((uint32_t)(regval) << 1)) -#define USART_PCM_NONE CHC_PCM(0) /*!< not check parity */ -#define USART_PCM_EN CHC_PCM(1) /*!< check the parity */ - -/* USART hardware flow control coherence mode */ -#define CHC_HCM(regval) (BIT(0) & ((uint32_t)(regval) << 0)) -#define USART_HCM_NONE CHC_HCM(0) /*!< nRTS signal equals to the rxne status register */ -#define USART_HCM_EN CHC_HCM(1) /*!< nRTS signal is set when the last data bit has been sampled */ - -/* function declarations */ -/* initialization functions */ -/* reset USART */ -void usart_deinit(uint32_t usart_periph); -/* configure usart baud rate value */ -void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval); -/* configure usart parity function */ -void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg); -/* configure usart word length */ -void usart_word_length_set(uint32_t usart_periph, uint32_t wlen); -/* configure usart stop bit length */ -void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen); -/* enable usart */ -void usart_enable(uint32_t usart_periph); -/* disable usart */ -void usart_disable(uint32_t usart_periph); -/* configure USART transmitter */ -void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig); -/* configure USART receiver */ -void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig); - -/* USART normal mode communication */ -/* transmit/receive ddata with the LSB/MSB first */ -void usart_data_first_config(uint32_t usart_periph, uint32_t msbf); -/* configure USART inversion */ -void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara); -/* configure the USART oversample mode */ -void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp); -/* configure sample bit method */ -void usart_sample_bit_config(uint32_t usart_periph, uint32_t obsm); -/* enable receiver timeout */ -void usart_receiver_timeout_enable(uint32_t usart_periph); -/* disable receiver timeout */ -void usart_receiver_timeout_disable(uint32_t usart_periph); -/* configure receiver timeout threshold */ -void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout); -/* USART transmit data function */ -void usart_data_transmit(uint32_t usart_periph, uint32_t data); -/* USART receive data function */ -uint16_t usart_data_receive(uint32_t usart_periph); - -/* multi-processor communication */ -/* configure address of the USART */ -void usart_address_config(uint32_t usart_periph, uint8_t addr); -/* enable mute mode */ -void usart_mute_mode_enable(uint32_t usart_periph); -/* disable mute mode */ -void usart_mute_mode_disable(uint32_t usart_periph); -/* configure wakeup method in mute mode */ -void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmehtod); - -/* LIN mode communication */ -/* enable LIN mode */ -void usart_lin_mode_enable(uint32_t usart_periph); -/* disable LIN mode */ -void usart_lin_mode_disable(uint32_t usart_periph); -/* configure lin break frame length */ -void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen); -/* send break frame */ -void usart_send_break(uint32_t usart_periph); - -/* half-duplex communication */ -/* enable half-duplex mode */ -void usart_halfduplex_enable(uint32_t usart_periph); -/* disable half-duplex mode */ -void usart_halfduplex_disable(uint32_t usart_periph); - -/* synchronous communication */ -/* enable CK pin in synchronous mode */ -void usart_synchronous_clock_enable(uint32_t usart_periph); -/* disable CK pin in synchronous mode */ -void usart_synchronous_clock_disable(uint32_t usart_periph); -/* configure usart synchronous mode parameters */ -void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl); - -/* smartcard communication */ -/* configure guard time value in smartcard mode */ -void usart_guard_time_config(uint32_t usart_periph, uint32_t guat); -/* enable smartcard mode */ -void usart_smartcard_mode_enable(uint32_t usart_periph); -/* disable smartcard mode */ -void usart_smartcard_mode_disable(uint32_t usart_periph); -/* enable NACK in smartcard mode */ -void usart_smartcard_mode_nack_enable(uint32_t usart_periph); -/* disable NACK in smartcard mode */ -void usart_smartcard_mode_nack_disable(uint32_t usart_periph); -/* configure smartcard auto-retry number */ -void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum); -/* configure block length */ -void usart_block_length_config(uint32_t usart_periph, uint32_t bl); - -/* IrDA communication */ -/* enable IrDA mode */ -void usart_irda_mode_enable(uint32_t usart_periph); -/* disable IrDA mode */ -void usart_irda_mode_disable(uint32_t usart_periph); -/* configure the peripheral clock prescaler */ -void usart_prescaler_config(uint32_t usart_periph, uint8_t psc); -/* configure IrDA low-power */ -void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp); - -/* hardware flow communication */ -/* configure hardware flow control RTS */ -void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig); -/* configure hardware flow control CTS */ -void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig); - -/* coherence control */ -/* configure break frame coherence mode */ -void usart_break_frame_coherence_config(uint32_t usart_periph, uint32_t bcm); -/* configure parity check coherence mode */ -void usart_parity_check_coherence_config(uint32_t usart_periph, uint32_t pcm); -/* configure hardware flow control coherence mode */ -void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm); - -/* DMA communication */ -/* configure USART DMA for reception */ -void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd); -/* configure USART DMA for transmission */ -void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd); - -/* flag & interrupt functions */ -/* get USART flag status */ -FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag); -/* clear USART flag status */ -void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag); -/* enable USART interrupt */ -void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt); -/* disable USART interrupt */ -void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt); -/* get USART interrupt and flag status */ -FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); -/* clear interrupt flag and flag status */ -void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); - -#endif /* GD32F5XX_USART_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h deleted file mode 100644 index 4ecac5e542f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Include/gd32f5xx_wwdgt.h +++ /dev/null @@ -1,107 +0,0 @@ -/*! - \file gd32f5xx_wwdgt.h - \brief definitions for the WWDGT - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32F5XX_WWDGT_H -#define GD32F5XX_WWDGT_H - -#include "gd32f5xx.h" - -/* WWDGT definitions */ -#define WWDGT WWDGT_BASE /*!< WWDGT base address */ - -/* registers definitions */ -#define WWDGT_CTL REG32((WWDGT) + 0x00U) /*!< WWDGT control register */ -#define WWDGT_CFG REG32((WWDGT) + 0x04U) /*!< WWDGT configuration register */ -#define WWDGT_STAT REG32((WWDGT) + 0x08U) /*!< WWDGT status register */ - -/* bits definitions */ -/* WWDGT_CTL */ -#define WWDGT_CTL_CNT BITS(0,6) /*!< WWDGT counter value */ -#define WWDGT_CTL_WDGTEN BIT(7) /*!< WWDGT counter enable */ - -/* WWDGT_CFG */ -#define WWDGT_CFG_WIN BITS(0,6) /*!< WWDGT counter window value */ -#define WWDGT_CFG_PSC (BITS(7,8) | BITS(10,12)) /*!< WWDGT prescaler divider value */ -#define WWDGT_CFG_EWIE BIT(9) /*!< early wakeup interrupt enable */ - -/* WWDGT_STAT */ -#define WWDGT_STAT_EWIF BIT(0) /*!< early wakeup interrupt flag */ - -/* constants definitions */ -#define CFG_PSCL(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) /*!< write value to WWDGT_CFG_PSC bit field */ -#define CFG_PSCH(regval) (BITS(10,12) & ((uint32_t)(regval) << 10)) /*!< write value to WWDGT_CFG_PSC bit field */ -#define WWDGT_CFG_PSC_DIV1 CFG_PSCL(0) /*!< the time base of WWDGT = (PCLK1/4096)/1 */ -#define WWDGT_CFG_PSC_DIV2 CFG_PSCL(1) /*!< the time base of WWDGT = (PCLK1/4096)/2 */ -#define WWDGT_CFG_PSC_DIV4 CFG_PSCL(2) /*!< the time base of WWDGT = (PCLK1/4096)/4 */ -#define WWDGT_CFG_PSC_DIV8 CFG_PSCL(3) /*!< the time base of WWDGT = (PCLK1/4096)/8 */ -#define WWDGT_CFG_PSC_DIV16 (CFG_PSCH(1)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/16 */ -#define WWDGT_CFG_PSC_DIV32 (CFG_PSCH(1)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/32 */ -#define WWDGT_CFG_PSC_DIV64 (CFG_PSCH(1)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/64 */ -#define WWDGT_CFG_PSC_DIV128 (CFG_PSCH(1)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/128 */ -#define WWDGT_CFG_PSC_DIV256 (CFG_PSCH(2)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/256 */ -#define WWDGT_CFG_PSC_DIV512 (CFG_PSCH(2)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/512 */ -#define WWDGT_CFG_PSC_DIV1024 (CFG_PSCH(2)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/1024 */ -#define WWDGT_CFG_PSC_DIV2048 (CFG_PSCH(2)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/2048 */ -#define WWDGT_CFG_PSC_DIV4096 (CFG_PSCH(3)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/4096 */ -#define WWDGT_CFG_PSC_DIV8192 (CFG_PSCH(3)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/8192 */ -#define WWDGT_CFG_PSC_DIV16384 (CFG_PSCH(3)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/16384 */ -#define WWDGT_CFG_PSC_DIV32768 (CFG_PSCH(3)|CFG_PSCL(3)) /*!< the time base of WWDGT = (PCLK1/4096)/32768 */ -#define WWDGT_CFG_PSC_DIV65536 (CFG_PSCH(4)|CFG_PSCL(0)) /*!< the time base of WWDGT = (PCLK1/4096)/65536 */ -#define WWDGT_CFG_PSC_DIV131072 (CFG_PSCH(4)|CFG_PSCL(1)) /*!< the time base of WWDGT = (PCLK1/4096)/131072 */ -#define WWDGT_CFG_PSC_DIV262144 (CFG_PSCH(4)|CFG_PSCL(2)) /*!< the time base of WWDGT = (PCLK1/4096)/262144 */ - -/* write value to WWDGT_CTL_CNT bit field */ -#define CTL_CNT(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) -/* write value to WWDGT_CFG_WIN bit field */ -#define CFG_WIN(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) - -/* function declarations */ -/* reset the window watchdog timer configuration */ -void wwdgt_deinit(void); -/* start the window watchdog timer counter */ -void wwdgt_enable(void); - -/* configure the window watchdog timer counter value */ -void wwdgt_counter_update(uint16_t counter_value); -/* configure counter value, window value, and prescaler divider value */ -void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler); - -/* check early wakeup interrupt state of WWDGT */ -FlagStatus wwdgt_flag_get(void); -/* clear early wakeup interrupt state of WWDGT */ -void wwdgt_flag_clear(void); -/* enable early wakeup interrupt of WWDGT */ -void wwdgt_interrupt_enable(void); - -#endif /* GD32F5XX_WWDGT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c deleted file mode 100644 index ded23c04a5d..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c +++ /dev/null @@ -1,1200 +0,0 @@ -/*! - \file gd32f5xx_adc.c - \brief ADC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_adc.h" - -#define ROUTINE_TRIGGER_MODE ((uint32_t)28U) -#define INSERTED_TRIGGER_MODE ((uint32_t)20U) -/* discontinuous mode macro*/ -#define ADC_CHANNEL_LENGTH_SUBTRACT_ONE ((uint8_t)1U) - -/* ADC routine channel macro */ -#define ADC_ROUTINE_CHANNEL_RANK_SIX ((uint8_t)6U) -#define ADC_ROUTINE_CHANNEL_RANK_TWELVE ((uint8_t)12U) -#define ADC_ROUTINE_CHANNEL_RANK_SIXTEEN ((uint8_t)16U) -#define ADC_ROUTINE_CHANNEL_RANK_LENGTH ((uint8_t)5U) - -/* ADC sampling time macro */ -#define ADC_CHANNEL_SAMPLE_TEN ((uint8_t)10U) -#define ADC_CHANNEL_SAMPLE_EIGHTEEN ((uint8_t)18U) -#define ADC_CHANNEL_SAMPLE_LENGTH ((uint8_t)3U) - -/* ADC inserted channel macro */ -#define ADC_INSERTED_CHANNEL_RANK_LENGTH ((uint8_t)5U) -#define ADC_INSERTED_CHANNEL_SHIFT_LENGTH ((uint8_t)15U) - -/* ADC inserted channel offset macro */ -#define ADC_OFFSET_LENGTH ((uint8_t)3U) -#define ADC_OFFSET_SHIFT_LENGTH ((uint8_t)4U) - -/*! - \brief reset ADC - \param[in] none - \param[out] none - \retval none -*/ -void adc_deinit(void) -{ - rcu_periph_reset_enable(RCU_ADCRST); - rcu_periph_reset_disable(RCU_ADCRST); -} - -/*! - \brief configure the ADC clock for all the ADCs - \param[in] prescaler: configure ADCs prescaler ratio - only one parameter can be selected which is shown as below: - \arg ADC_ADCCK_PCLK2_DIV2: PCLK2 div2 - \arg ADC_ADCCK_PCLK2_DIV4: PCLK2 div4 - \arg ADC_ADCCK_PCLK2_DIV6: PCLK2 div6 - \arg ADC_ADCCK_PCLK2_DIV8: PCLK2 div8 - \arg ADC_ADCCK_HCLK_DIV5: HCLK div5 - \arg ADC_ADCCK_HCLK_DIV6: HCLK div6 - \arg ADC_ADCCK_HCLK_DIV10: HCLK div10 - \arg ADC_ADCCK_HCLK_DIV20: HCLK div20 - \param[out] none - \retval none -*/ -void adc_clock_config(uint32_t prescaler) -{ - ADC_SYNCCTL &= ~((uint32_t)ADC_SYNCCTL_ADCCK); - ADC_SYNCCTL |= (uint32_t) prescaler; -} - -/*! - \brief enable or disable ADC special function - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] function: the function to config - only one parameter can be selected which is shown as below: - \arg ADC_SCAN_MODE: scan mode select - \arg ADC_INSERTED_CHANNEL_AUTO: inserted sequence convert automatically - \arg ADC_CONTINUOUS_MODE: continuous mode select - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void adc_special_function_config(uint32_t adc_periph, uint32_t function, ControlStatus newvalue) -{ - if(newvalue) { - if(0U != (function & ADC_SCAN_MODE)) { - /* enable scan mode */ - ADC_CTL0(adc_periph) |= ADC_SCAN_MODE; - } - if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)) { - /* enable inserted sequence convert automatically */ - ADC_CTL0(adc_periph) |= ADC_INSERTED_CHANNEL_AUTO; - } - if(0U != (function & ADC_CONTINUOUS_MODE)) { - /* enable continuous mode */ - ADC_CTL1(adc_periph) |= ADC_CONTINUOUS_MODE; - } - } else { - if(0U != (function & ADC_SCAN_MODE)) { - /* disable scan mode */ - ADC_CTL0(adc_periph) &= ~ADC_SCAN_MODE; - } - if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)) { - /* disable inserted sequence convert automatically */ - ADC_CTL0(adc_periph) &= ~ADC_INSERTED_CHANNEL_AUTO; - } - if(0U != (function & ADC_CONTINUOUS_MODE)) { - /* disable continuous mode */ - ADC_CTL1(adc_periph) &= ~ADC_CONTINUOUS_MODE; - } - } -} - -/*! - \brief configure ADC data alignment - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] data_alignment: data alignment select - only one parameter can be selected which is shown as below: - \arg ADC_DATAALIGN_RIGHT: LSB alignment - \arg ADC_DATAALIGN_LEFT: MSB alignment - \param[out] none - \retval none -*/ -void adc_data_alignment_config(uint32_t adc_periph, uint32_t data_alignment) -{ - if(ADC_DATAALIGN_RIGHT != data_alignment) { - /* MSB alignment */ - ADC_CTL1(adc_periph) |= ADC_CTL1_DAL; - } else { - /* LSB alignment */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DAL); - } -} - -/*! - \brief enable ADC interface - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_enable(uint32_t adc_periph) -{ - if(RESET == (ADC_CTL1(adc_periph) & ADC_CTL1_ADCON)) { - /* enable ADC */ - ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_ADCON; - } -} - -/*! - \brief disable ADC interface - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_disable(uint32_t adc_periph) -{ - /* disable ADC */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ADCON); -} - -/*! - \brief ADC calibration and reset calibration - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_calibration_enable(uint32_t adc_periph) -{ - /* reset the selected ADC calibration registers */ - ADC_CTL1(adc_periph) |= (uint32_t) ADC_CTL1_RSTCLB; - /* check the RSTCLB bit state */ - while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_RSTCLB)) { - } - /* enable ADC calibration process */ - ADC_CTL1(adc_periph) |= ADC_CTL1_CLB; - /* check the CLB bit state */ - while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_CLB)) { - } -} - -/*! - \brief configure temperature sensor and internal reference voltage channel or VBAT channel function - \param[in] function: temperature sensor and internal reference voltage channel or VBAT channel - only one parameter can be selected which is shown as below: - \arg ADC_VBAT_CHANNEL_SWITCH: channel 18 (1/4 voltate of external battery) switch of ADC0 - \arg ADC_TEMP_VREF_CHANNEL_SWITCH: channel 16 (temperature sensor) and 17 (internal reference voltage) switch of ADC0 - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void adc_channel_16_to_18(uint32_t function, ControlStatus newvalue) -{ - if(newvalue) { - if(RESET != (function & ADC_VBAT_CHANNEL_SWITCH)) { - /* enable ADC0 Vbat channel */ - ADC_SYNCCTL |= ADC_VBAT_CHANNEL_SWITCH; - } - if(RESET != (function & ADC_TEMP_VREF_CHANNEL_SWITCH)) { - /* enable ADC0 Vref and Temperature channel */ - ADC_SYNCCTL |= ADC_TEMP_VREF_CHANNEL_SWITCH; - } - } else { - if(RESET != (function & ADC_VBAT_CHANNEL_SWITCH)) { - /* disable ADC0 Vbat channel */ - ADC_SYNCCTL &= ~ADC_VBAT_CHANNEL_SWITCH; - } - if(RESET != (function & ADC_TEMP_VREF_CHANNEL_SWITCH)) { - /* disable ADC0 Vref and Temperature channel */ - ADC_SYNCCTL &= ~ADC_TEMP_VREF_CHANNEL_SWITCH; - } - } -} - -/*! - \brief configure ADC resolution - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] resolution: ADC resolution - only one parameter can be selected which is shown as below: - \arg ADC_RESOLUTION_12B: 12-bit ADC resolution - \arg ADC_RESOLUTION_10B: 10-bit ADC resolution - \arg ADC_RESOLUTION_8B: 8-bit ADC resolution - \arg ADC_RESOLUTION_6B: 6-bit ADC resolution - \param[out] none - \retval none -*/ -void adc_resolution_config(uint32_t adc_periph, uint32_t resolution) -{ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DRES); - ADC_CTL0(adc_periph) |= (uint32_t)resolution; -} - -/*! - \brief configure ADC oversample mode - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] mode: ADC oversampling mode - only one parameter can be selected which is shown as below: - \arg ADC_OVERSAMPLING_ALL_CONVERT: all oversampled conversions for a channel are done consecutively after a trigger - \arg ADC_OVERSAMPLING_ONE_CONVERT: each oversampled conversion for a channel needs a trigger - \param[in] shift: ADC oversampling shift - only one parameter can be selected which is shown as below: - \arg ADC_OVERSAMPLING_SHIFT_NONE: no oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_1B: 1-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_2B: 2-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_3B: 3-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_4B: 3-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_5B: 5-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_6B: 6-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_7B: 7-bit oversampling shift - \arg ADC_OVERSAMPLING_SHIFT_8B: 8-bit oversampling shift - \param[in] ratio: ADC oversampling ratio - only one parameter can be selected which is shown as below: - \arg ADC_OVERSAMPLING_RATIO_MUL2: oversampling ratio multiple 2 - \arg ADC_OVERSAMPLING_RATIO_MUL4: oversampling ratio multiple 4 - \arg ADC_OVERSAMPLING_RATIO_MUL8: oversampling ratio multiple 8 - \arg ADC_OVERSAMPLING_RATIO_MUL16: oversampling ratio multiple 16 - \arg ADC_OVERSAMPLING_RATIO_MUL32: oversampling ratio multiple 32 - \arg ADC_OVERSAMPLING_RATIO_MUL64: oversampling ratio multiple 64 - \arg ADC_OVERSAMPLING_RATIO_MUL128: oversampling ratio multiple 128 - \arg ADC_OVERSAMPLING_RATIO_MUL256: oversampling ratio multiple 256 - \param[out] none - \retval none -*/ -void adc_oversample_mode_config(uint32_t adc_periph, uint32_t mode, uint16_t shift, uint8_t ratio) -{ - if(ADC_OVERSAMPLING_ONE_CONVERT == mode) { - ADC_OVSAMPCTL(adc_periph) |= (uint32_t)ADC_OVSAMPCTL_TOVS; - } else { - ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_TOVS); - } - /* config the shift and ratio */ - ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)(ADC_OVSAMPCTL_OVSR | ADC_OVSAMPCTL_OVSS)); - ADC_OVSAMPCTL(adc_periph) |= ((uint32_t)shift | (uint32_t)ratio); -} - -/*! - \brief enable ADC oversample mode - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_oversample_mode_enable(uint32_t adc_periph) -{ - ADC_OVSAMPCTL(adc_periph) |= ADC_OVSAMPCTL_OVSEN; -} - -/*! - \brief disable ADC oversample mode - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_oversample_mode_disable(uint32_t adc_periph) -{ - ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_OVSEN); -} - -/*! - \brief enable DMA request - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_dma_mode_enable(uint32_t adc_periph) -{ - /* enable DMA request */ - ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DMA); -} - -/*! - \brief disable DMA request - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_dma_mode_disable(uint32_t adc_periph) -{ - /* disable DMA request */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DMA); -} - -/*! - \brief when DMA=1, the DMA engine issues a request at end of each routine conversion - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_dma_request_after_last_enable(uint32_t adc_periph) -{ - ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DDM); -} - -/*! - \brief the DMA engine is disabled after the end of transfer signal from DMA controller is detected - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_dma_request_after_last_disable(uint32_t adc_periph) -{ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DDM); -} - -/*! - \brief configure ADC discontinuous mode - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: select the sequence - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \arg ADC_CHANNEL_DISCON_DISABLE: disable discontinuous mode of routine & inserted channel - \param[in] length: number of conversions in discontinuous mode,the number can be 1..8 - for routine sequence ,the number has no effect for inserted sequence - \param[out] none - \retval none -*/ -void adc_discontinuous_mode_config(uint32_t adc_periph, uint8_t adc_sequence, uint8_t length) -{ - /* disable discontinuous mode of routine & inserted channel */ - ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_DISRC | ADC_CTL0_DISIC)); - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* config the number of conversions in discontinuous mode */ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DISNUM); - if((length <= 8U) && (length >= 1U)) { - ADC_CTL0(adc_periph) |= CTL0_DISNUM(((uint32_t)length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); - } - /* enable routine sequence discontinuous mode */ - ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISRC; - break; - case ADC_INSERTED_CHANNEL: - /* enable inserted sequence discontinuous mode */ - ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISIC; - break; - case ADC_CHANNEL_DISCON_DISABLE: - /* disable discontinuous mode of routine & inserted channel */ - default: - break; - } -} - -/*! - \brief configure the length of routine sequence or inserted sequence - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: select the sequence - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \param[in] length: the length of the channel - routine channel 1-16 - inserted channel 1-4 - \param[out] none - \retval none -*/ -void adc_channel_length_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t length) -{ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - if((length >= 1U) && (length <= 16U)) { - ADC_RSQ0(adc_periph) &= ~((uint32_t)ADC_RSQ0_RL); - ADC_RSQ0(adc_periph) |= RSQ0_RL((uint32_t)(length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); - } - break; - case ADC_INSERTED_CHANNEL: - if((length >= 1U) && (length <= 4U)) { - ADC_ISQ(adc_periph) &= ~((uint32_t)ADC_ISQ_IL); - ADC_ISQ(adc_periph) |= ISQ_IL((uint32_t)(length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); - } - break; - default: - break; - } -} - -/*! - \brief configure ADC routine channel - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] rank: the routine sequence rank,this parameter must be between 0 to 15 - \param[in] adc_channel: the selected ADC channel - only one parameter can be selected which is shown as below: - \arg ADC_CHANNEL_x(x=0..18): ADC channelx - \param[in] sample_time: the sample time value - only one parameter can be selected which is shown as below: - \arg ADC_SAMPLETIME_3: 3 cycles - \arg ADC_SAMPLETIME_15: 15 cycles - \arg ADC_SAMPLETIME_28: 28 cycles - \arg ADC_SAMPLETIME_56: 56 cycles - \arg ADC_SAMPLETIME_84: 84 cycles - \arg ADC_SAMPLETIME_112: 112 cycles - \arg ADC_SAMPLETIME_144: 144 cycles - \arg ADC_SAMPLETIME_480: 480 cycles - \param[out] none - \retval none -*/ -void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) -{ - uint32_t rsq, sampt; - - /* ADC routine sequence config */ - if(rank < ADC_ROUTINE_CHANNEL_RANK_SIX) { - /* the routine sequence rank is smaller than six */ - rsq = ADC_RSQ2(adc_periph); - rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * rank))); - /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ - rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * rank)); - ADC_RSQ2(adc_periph) = rsq; - } else if(rank < ADC_ROUTINE_CHANNEL_RANK_TWELVE) { - /* the routine sequence rank is smaller than twelve */ - rsq = ADC_RSQ1(adc_periph); - rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_SIX)))); - /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ - rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_SIX))); - ADC_RSQ1(adc_periph) = rsq; - } else if(rank < ADC_ROUTINE_CHANNEL_RANK_SIXTEEN) { - /* the routine sequence rank is smaller than sixteen */ - rsq = ADC_RSQ0(adc_periph); - rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_TWELVE)))); - /* the channel number is written to these bits to select a channel as the nth conversion in the routine sequence */ - rsq |= ((uint32_t)adc_channel << (ADC_ROUTINE_CHANNEL_RANK_LENGTH * (rank - ADC_ROUTINE_CHANNEL_RANK_TWELVE))); - ADC_RSQ0(adc_periph) = rsq; - } else { - } - - /* ADC sampling time config */ - if(adc_channel < ADC_CHANNEL_SAMPLE_TEN) { - /* the routine sequence rank is smaller than ten */ - sampt = ADC_SAMPT1(adc_periph); - sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel))); - /* channel sample time set*/ - sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel)); - ADC_SAMPT1(adc_periph) = sampt; - } else if(adc_channel <= ADC_CHANNEL_SAMPLE_EIGHTEEN) { - /* the routine sequence rank is smaller than eighteen */ - sampt = ADC_SAMPT0(adc_periph); - sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN)))); - /* channel sample time set*/ - sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN))); - ADC_SAMPT0(adc_periph) = sampt; - } else { - } -} - -/*! - \brief configure ADC inserted channel - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] rank: the inserted sequence rank,this parameter must be between 0 to 3 - \param[in] adc_channel: the selected ADC channel - only one parameter can be selected which is shown as below: - \arg ADC_CHANNEL_x(x=0..18): ADC Channelx - \param[in] sample_time: The sample time value - only one parameter can be selected which is shown as below: - \arg ADC_SAMPLETIME_3: 3 cycles - \arg ADC_SAMPLETIME_15: 15 cycles - \arg ADC_SAMPLETIME_28: 28 cycles - \arg ADC_SAMPLETIME_56: 56 cycles - \arg ADC_SAMPLETIME_84: 84 cycles - \arg ADC_SAMPLETIME_112: 112 cycles - \arg ADC_SAMPLETIME_144: 144 cycles - \arg ADC_SAMPLETIME_480: 480 cycles - \param[out] none - \retval none -*/ -void adc_inserted_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) -{ - uint8_t inserted_length; - uint32_t isq, sampt; - - /* get inserted sequence length */ - inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph), 20U, 21U); - /* the channel number is written to these bits to select a channel as the nth conversion in the inserted sequence */ - if(rank < 4U) { - isq = ADC_ISQ(adc_periph); - isq &= ~((uint32_t)(ADC_ISQ_ISQN << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH - (inserted_length - rank) * ADC_INSERTED_CHANNEL_RANK_LENGTH))); - isq |= ((uint32_t)adc_channel << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH - (inserted_length - rank) * ADC_INSERTED_CHANNEL_RANK_LENGTH)); - ADC_ISQ(adc_periph) = isq; - } - - /* ADC sampling time config */ - if(adc_channel < ADC_CHANNEL_SAMPLE_TEN) { - /* the inserted sequence rank is smaller than ten */ - sampt = ADC_SAMPT1(adc_periph); - sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel))); - /* channel sample time set*/ - sampt |= (uint32_t) sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * adc_channel); - ADC_SAMPT1(adc_periph) = sampt; - } else if(adc_channel <= ADC_CHANNEL_SAMPLE_EIGHTEEN) { - /* the inserted sequence rank is smaller than eighteen */ - sampt = ADC_SAMPT0(adc_periph); - sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN)))); - /* channel sample time set*/ - sampt |= ((uint32_t)sample_time << (ADC_CHANNEL_SAMPLE_LENGTH * (adc_channel - ADC_CHANNEL_SAMPLE_TEN))); - ADC_SAMPT0(adc_periph) = sampt; - } else { - } -} - -/*! - \brief configure ADC inserted channel offset - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] inserted_channel : insert channel select - only one parameter can be selected which is shown as below: - \arg ADC_INSERTED_CHANNEL_0: inserted channel0 - \arg ADC_INSERTED_CHANNEL_1: inserted channel1 - \arg ADC_INSERTED_CHANNEL_2: inserted channel2 - \arg ADC_INSERTED_CHANNEL_3: inserted channel3 - \param[in] offset : the offset data - \param[out] none - \retval none -*/ -void adc_inserted_channel_offset_config(uint32_t adc_periph, uint8_t inserted_channel, uint16_t offset) -{ - uint8_t inserted_length; - uint32_t num = 0U; - - inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph), 20U, 21U); - num = ((uint32_t)ADC_OFFSET_LENGTH - ((uint32_t)inserted_length - (uint32_t)inserted_channel)); - - if(num <= ADC_OFFSET_LENGTH) { - /* calculate the offset of the register */ - num = num * ADC_OFFSET_SHIFT_LENGTH; - /* config the offset of the selected channels */ - REG32((adc_periph) + 0x14U + num) = IOFFX_IOFF((uint32_t)offset); - } -} - -/*! - \brief configure ADC external trigger source - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: select the sequence - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \param[in] external_trigger_source: routine or inserted sequence trigger source - for routine sequence: - only one parameter can be selected which is shown as below: - \arg ADC_EXTTRIG_ROUTINE_T0_CH0: external trigger timer 0 CC0 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T0_CH1: external trigger timer 0 CC1 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T0_CH2: external trigger timer 0 CC2 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T1_CH1: external trigger timer 1 CC1 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T1_CH2: external trigger timer 1 CC2 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T1_CH3: external trigger timer 1 CC3 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T1_TRGO: external trigger timer 1 TRGO event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T2_CH0 : external trigger timer 2 CC0 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T2_TRGO : external trigger timer 2 TRGO event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T3_CH3: external trigger timer 3 CC3 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T4_CH0: external trigger timer 4 CC0 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T4_CH1: external trigger timer 4 CC1 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T4_CH2: external trigger timer 4 CC2 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T7_CH0: external trigger timer 7 CC0 event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_T7_TRGO: external trigger timer 7 TRGO event select for routine sequence - \arg ADC_EXTTRIG_ROUTINE_EXTI_11: external trigger extiline 11 select for routine sequence - for inserted sequence: - only one parameter can be selected which is shown as below: - \arg ADC_EXTTRIG_INSERTED_T0_CH3: timer0 capture compare 3 - \arg ADC_EXTTRIG_INSERTED_T0_TRGO: timer0 TRGO event - \arg ADC_EXTTRIG_INSERTED_T1_CH0: timer1 capture compare 0 - \arg ADC_EXTTRIG_INSERTED_T1_TRGO: timer1 TRGO event - \arg ADC_EXTTRIG_INSERTED_T2_CH1: timer2 capture compare 1 - \arg ADC_EXTTRIG_INSERTED_T2_CH3: timer2 capture compare 3 - \arg ADC_EXTTRIG_INSERTED_T3_CH0: timer3 capture compare 0 - \arg ADC_EXTTRIG_INSERTED_T3_CH1: timer3 capture compare 1 - \arg ADC_EXTTRIG_INSERTED_T3_CH2: timer3 capture compare 2 - \arg ADC_EXTTRIG_INSERTED_T3_TRGO: timer3 capture compare TRGO - \arg ADC_EXTTRIG_INSERTED_T4_CH3: timer4 capture compare 3 - \arg ADC_EXTTRIG_INSERTED_T4_TRGO: timer4 capture compare TRGO - \arg ADC_EXTTRIG_INSERTED_T7_CH1: timer7 capture compare 1 - \arg ADC_EXTTRIG_INSERTED_T7_CH2: timer7 capture compare 2 - \arg ADC_EXTTRIG_INSERTED_T7_CH3: timer7 capture compare 3 - \arg ADC_EXTTRIG_INSERTED_EXTI_15: external interrupt line 15 - \param[out] none - \retval none -*/ -void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t external_trigger_source) -{ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* configure ADC routine sequence external trigger source */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSRC); - ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; - break; - case ADC_INSERTED_CHANNEL: - /* configure ADC inserted sequence external trigger source */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSIC); - ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; - break; - default: - break; - } -} - -/*! - \brief enable ADC external trigger - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: select the sequence - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \param[in] trigger_mode: external trigger mode - only one parameter can be selected which is shown as below: - \arg EXTERNAL_TRIGGER_DISABLE: external trigger disable - \arg EXTERNAL_TRIGGER_RISING: rising edge of external trigger - \arg EXTERNAL_TRIGGER_FALLING: falling edge of external trigger - \arg EXTERNAL_TRIGGER_RISING_FALLING: rising and falling edge of external trigger - \param[out] none - \retval none -*/ -void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_sequence, uint32_t trigger_mode) -{ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* configure ADC routine sequence external trigger mode */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETMRC); - ADC_CTL1(adc_periph) |= (uint32_t)(trigger_mode << ROUTINE_TRIGGER_MODE); - break; - case ADC_INSERTED_CHANNEL: - /* configure ADC inserted sequence external trigger mode */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETMIC); - ADC_CTL1(adc_periph) |= (uint32_t)(trigger_mode << INSERTED_TRIGGER_MODE); - break; - default: - break; - } -} - -/*! - \brief enable ADC software trigger - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: select the sequence - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \param[out] none - \retval none -*/ -void adc_software_trigger_enable(uint32_t adc_periph, uint8_t adc_sequence) -{ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* enable ADC routine sequence software trigger */ - ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_SWRCST; - break; - case ADC_INSERTED_CHANNEL: - /* enable ADC inserted sequence software trigger */ - ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_SWICST; - break; - default: - break; - } -} - -/*! - \brief configure end of conversion mode - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] end_selection: end of conversion mode - only one parameter can be selected which is shown as below: - \arg ADC_EOC_SET_SEQUENCE: only at the end of a sequence of routine conversions, the EOC bit is set.Overflow detection is disabled unless DMA=1. - \arg ADC_EOC_SET_CONVERSION: at the end of each routine conversion, the EOC bit is set.Overflow is detected automatically. - \param[out] none - \retval none -*/ -void adc_end_of_conversion_config(uint32_t adc_periph, uint8_t end_selection) -{ - switch(end_selection) { - case ADC_EOC_SET_SEQUENCE: - /* only at the end of a sequence of routine conversions, the EOC bit is set */ - ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_EOCM); - break; - case ADC_EOC_SET_CONVERSION: - /* at the end of each routine conversion, the EOC bit is set.Overflow is detected automatically */ - ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_EOCM); - break; - default: - break; - } -} - -/*! - \brief read ADC routine data register - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] none - \param[out] none - \retval the conversion value -*/ -uint16_t adc_routine_data_read(uint32_t adc_periph) -{ - return (uint16_t)(ADC_RDATA(adc_periph)); -} - -/*! - \brief read ADC inserted data register - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] inserted_channel : insert channel select - only one parameter can be selected which is shown as below: - \arg ADC_INSERTED_CHANNEL_0: inserted channel0 - \arg ADC_INSERTED_CHANNEL_1: inserted channel1 - \arg ADC_INSERTED_CHANNEL_2: inserted channel2 - \arg ADC_INSERTED_CHANNEL_3: inserted channel3 - \param[out] none - \retval the conversion value -*/ -uint16_t adc_inserted_data_read(uint32_t adc_periph, uint8_t inserted_channel) -{ - uint32_t idata; - /* read the data of the selected channel */ - switch(inserted_channel) { - case ADC_INSERTED_CHANNEL_0: - /* read the data of channel 0 */ - idata = ADC_IDATA0(adc_periph); - break; - case ADC_INSERTED_CHANNEL_1: - /* read the data of channel 1 */ - idata = ADC_IDATA1(adc_periph); - break; - case ADC_INSERTED_CHANNEL_2: - /* read the data of channel 2 */ - idata = ADC_IDATA2(adc_periph); - break; - case ADC_INSERTED_CHANNEL_3: - /* read the data of channel 3 */ - idata = ADC_IDATA3(adc_periph); - break; - default: - idata = 0U; - break; - } - return (uint16_t)idata; -} - -/*! - \brief disable ADC analog watchdog single channel - \param[in] adc_periph: ADCx, x=0,1,2 - \param[out] none - \retval none -*/ -void adc_watchdog_single_channel_disable(uint32_t adc_periph) -{ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDSC); -} - -/*! - \brief enable ADC analog watchdog single channel - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_channel: the selected ADC channel - only one parameter can be selected which is shown as below: - \arg ADC_CHANNEL_x: ADC Channelx(x=0..18) - \param[out] none - \retval none -*/ -void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel) -{ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDCHSEL); - - /* analog watchdog channel select */ - ADC_CTL0(adc_periph) |= (uint32_t)adc_channel; - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDSC; -} - -/*! - \brief configure ADC analog watchdog sequence channel - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: the sequence use analog watchdog - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \arg ADC_ROUTINE_INSERTED_CHANNEL: both routine and inserted sequence - \param[out] none - \retval none -*/ -void adc_watchdog_sequence_channel_enable(uint32_t adc_periph, uint8_t adc_sequence) -{ - ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC)); - /* select the sequence */ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* routine channel analog watchdog enable */ - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_RWDEN; - break; - case ADC_INSERTED_CHANNEL: - /* inserted channel analog watchdog enable */ - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_IWDEN; - break; - case ADC_ROUTINE_INSERTED_CHANNEL: - /* routine and inserted channel analog watchdog enable */ - ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN); - break; - default: - break; - } -} - -/*! - \brief disable ADC analog watchdog - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_sequence: the sequence use analog watchdog - only one parameter can be selected which is shown as below: - \arg ADC_ROUTINE_CHANNEL: routine sequence - \arg ADC_INSERTED_CHANNEL: inserted sequence - \arg ADC_ROUTINE_INSERTED_CHANNEL: both routine and inserted sequence - \param[out] none - \retval none -*/ -void adc_watchdog_disable(uint32_t adc_periph, uint8_t adc_sequence) -{ - /* select the sequence */ - switch(adc_sequence) { - case ADC_ROUTINE_CHANNEL: - /* disable ADC analog watchdog routine sequence */ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_RWDEN); - break; - case ADC_INSERTED_CHANNEL: - /* disable ADC analog watchdog inserted sequence */ - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_IWDEN); - break; - case ADC_ROUTINE_INSERTED_CHANNEL: - /* disable ADC analog watchdog routine and inserted sequence */ - ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN)); - break; - default: - break; - } -} - -/*! - \brief configure ADC analog watchdog threshold - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] low_threshold: analog watchdog low threshold,0..4095 - \param[in] high_threshold: analog watchdog high threshold,0..4095 - \param[out] none - \retval none -*/ -void adc_watchdog_threshold_config(uint32_t adc_periph, uint16_t low_threshold, uint16_t high_threshold) -{ - /* configure ADC analog watchdog low threshold */ - ADC_WDLT(adc_periph) = (uint32_t)WDLT_WDLT(low_threshold); - /* configure ADC analog watchdog high threshold */ - ADC_WDHT(adc_periph) = (uint32_t)WDHT_WDHT(high_threshold); -} - -/*! - \brief configure the ADC sync mode - \param[in] sync_mode: ADC sync mode - only one parameter can be selected which is shown as below: - \arg ADC_SYNC_MODE_INDEPENDENT: all the ADCs work independently - \arg ADC_DAUL_ROUTINE_PARALLEL_INSERTED_PARALLEL: ADC0 and ADC1 work in combined routine parallel & inserted parallel mode - \arg ADC_DAUL_ROUTINE_PARALLEL_INSERTED_ROTATION: ADC0 and ADC1 work in combined routine parallel & trigger rotation mode - \arg ADC_DAUL_INSERTED_PARALLEL: ADC0 and ADC1 work in inserted parallel mode - \arg ADC_DAUL_ROUTINE_PARALLEL: ADC0 and ADC1 work in routine parallel mode - \arg ADC_DAUL_ROUTINE_FOLLOW_UP: ADC0 and ADC1 work in follow-up mode - \arg ADC_DAUL_INSERTED_TRRIGGER_ROTATION: ADC0 and ADC1 work in trigger rotation mode - \arg ADC_ALL_ROUTINE_PARALLEL_INSERTED_PARALLEL: all ADCs work in combined routine parallel & inserted parallel mode - \arg ADC_ALL_ROUTINE_PARALLEL_INSERTED_ROTATION: all ADCs work in combined routine parallel & trigger rotation mode - \arg ADC_ALL_INSERTED_PARALLEL: all ADCs work in inserted parallel mode - \arg ADC_ALL_ROUTINE_PARALLEL: all ADCs work in routine parallel mode - \arg ADC_ALL_ROUTINE_FOLLOW_UP: all ADCs work in follow-up mode - \arg ADC_ALL_INSERTED_TRRIGGER_ROTATION: all ADCs work in trigger rotation mode - \param[out] none - \retval none -*/ -void adc_sync_mode_config(uint32_t sync_mode) -{ - ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCM); - ADC_SYNCCTL |= sync_mode; -} - -/*! - \brief configure the delay between 2 sampling phases in ADC sync modes - \param[in] sample_delay: the delay between 2 sampling phases in ADC sync modes - only one parameter can be selected which is shown as below: - \arg ADC_SYNC_DELAY_xCYCLE: x=5..20,the delay between 2 sampling phases in ADC sync modes is x ADC clock cycles - \param[out] none - \retval none -*/ -void adc_sync_delay_config(uint32_t sample_delay) -{ - ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDLY); - ADC_SYNCCTL |= sample_delay; -} - -/*! - \brief configure ADC sync DMA mode selection - \param[in] dma_mode: ADC sync DMA mode - only one parameter can be selected which is shown as below: - \arg ADC_SYNC_DMA_DISABLE: ADC sync DMA disabled - \arg ADC_SYNC_DMA_MODE0: ADC sync DMA mode 0 - \arg ADC_SYNC_DMA_MODE1: ADC sync DMA mode 1 - \param[out] none - \retval none -*/ -void adc_sync_dma_config(uint32_t dma_mode) -{ - ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDMA); - ADC_SYNCCTL |= dma_mode; -} - -/*! - \brief configure ADC sync DMA engine is disabled after the end of transfer signal from DMA controller is detected - \param[in] none - \param[out] none - \retval none -*/ -void adc_sync_dma_request_after_last_enable(void) -{ - ADC_SYNCCTL |= ADC_SYNCCTL_SYNCDDM; -} - -/*! - \brief configure ADC sync DMA engine issues requests according to the SYNCDMA bits - \param[in] none - \param[out] none - \retval none -*/ -void adc_sync_dma_request_after_last_disable(void) -{ - ADC_SYNCCTL &= ~(ADC_SYNCCTL_SYNCDDM); -} - -/*! - \brief read ADC sync routine data register - \param[in] none - \param[out] none - \retval sync routine data -*/ -uint32_t adc_sync_routine_data_read(void) -{ - return (uint32_t)ADC_SYNCDATA; -} - -/*! - \brief get the bit state of ADCx software start conversion - \param[in] adc_periph: ADCx, x=0,1,2 only one among these parameters can be selected - \param[in] none - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus adc_routine_software_startconv_flag_get(uint32_t adc_periph) -{ - FlagStatus reval = RESET; - if((uint32_t)RESET != (ADC_STAT(adc_periph) & ADC_STAT_STRC)) { - reval = SET; - } - return reval; -} - -/*! - \brief get the bit state of ADCx software inserted channel start conversion - \param[in] adc_periph: ADCx, x=0,1,2 only one among these parameters can be selected - \param[in] none - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph) -{ - FlagStatus reval = RESET; - if((uint32_t)RESET != (ADC_STAT(adc_periph) & ADC_STAT_STIC)) { - reval = SET; - } - return reval; -} - -/*! - \brief get the ADC flag bits - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_flag: the adc flag bits - only one parameter can be selected which is shown as below: - \arg ADC_FLAG_WDE: analog watchdog event flag - \arg ADC_FLAG_EOC: end of sequence conversion flag - \arg ADC_FLAG_EOIC: end of inserted sequence conversion flag - \arg ADC_FLAG_STIC: start flag of inserted sequence - \arg ADC_FLAG_STRC: start flag of routine sequence - \arg ADC_FLAG_ROVF: routine data register overflow flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus adc_flag_get(uint32_t adc_periph, uint32_t adc_flag) -{ - FlagStatus reval = RESET; - if(ADC_STAT(adc_periph) & adc_flag) { - reval = SET; - } - return reval; - -} - -/*! - \brief clear the ADC flag bits - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_flag: the adc flag bits - only one parameter can be selected which is shown as below: - \arg ADC_FLAG_WDE: analog watchdog event flag - \arg ADC_FLAG_EOC: end of sequence conversion flag - \arg ADC_FLAG_EOIC: end of inserted sequence conversion flag - \arg ADC_FLAG_STIC: start flag of inserted sequence - \arg ADC_FLAG_STRC: start flag of routine sequence - \arg ADC_FLAG_ROVF: routine data register overflow flag - \param[out] none - \retval none -*/ -void adc_flag_clear(uint32_t adc_periph, uint32_t adc_flag) -{ - ADC_STAT(adc_periph) &= ~((uint32_t)adc_flag); -} - -/*! - \brief enable ADC interrupt - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_interrupt: the adc interrupt flag - only one parameter can be selected which is shown as below: - \arg ADC_INT_WDE: analog watchdog interrupt flag - \arg ADC_INT_EOC: end of sequence conversion interrupt flag - \arg ADC_INT_EOIC: end of inserted sequence conversion interrupt flag - \arg ADC_INT_ROVF: routine data register overflow interrupt flag - \param[out] none - \retval none -*/ -void adc_interrupt_enable(uint32_t adc_periph, uint32_t adc_interrupt) -{ - switch(adc_interrupt) { - case ADC_INT_WDE: - /* enable analog watchdog interrupt */ - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDEIE; - break; - case ADC_INT_EOC: - /* enable end of sequence conversion interrupt */ - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOCIE; - break; - case ADC_INT_EOIC: - /* enable end of inserted sequence conversion interrupt */ - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOICIE; - break; - case ADC_INT_ROVF: - ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_ROVFIE; - break; - default: - break; - } -} - -/*! - \brief disable ADC interrupt - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_flag: the adc interrupt flag - only one parameter can be selected which is shown as below: - \arg ADC_INT_WDE: analog watchdog interrupt flag - \arg ADC_INT_EOC: end of sequence conversion interrupt flag - \arg ADC_INT_EOIC: end of inserted sequence conversion interrupt flag - \arg ADC_INT_ROVF: routine data register overflow interrupt flag - \param[out] none - \retval none -*/ -void adc_interrupt_disable(uint32_t adc_periph, uint32_t adc_interrupt) -{ - switch(adc_interrupt) { - /* select the interrupt source */ - case ADC_INT_WDE: - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_WDEIE); - break; - case ADC_INT_EOC: - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_EOCIE); - break; - case ADC_INT_EOIC: - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_EOICIE); - break; - case ADC_INT_ROVF: - ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_ROVFIE); - break; - default: - break; - } -} - -/*! - \brief get the ADC interrupt bits - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_interrupt: the adc interrupt bits - only one parameter can be selected which is shown as below: - \arg ADC_INT_FLAG_WDE: analog watchdog interrupt - \arg ADC_INT_FLAG_EOC: end of sequence conversion interrupt - \arg ADC_INT_FLAG_EOIC: end of inserted sequence conversion interrupt - \arg ADC_INT_FLAG_ROVF: routine data register overflow interrupt - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus adc_interrupt_flag_get(uint32_t adc_periph, uint32_t adc_interrupt) -{ - FlagStatus interrupt_flag = RESET; - uint32_t state; - /* check the interrupt bits */ - switch(adc_interrupt) { - case ADC_INT_FLAG_WDE: - /* get the ADC analog watchdog interrupt bits */ - state = ADC_STAT(adc_periph) & ADC_STAT_WDE; - if((ADC_CTL0(adc_periph) & ADC_CTL0_WDEIE) && state) { - interrupt_flag = SET; - } - break; - case ADC_INT_FLAG_EOC: - /* get the ADC end of sequence conversion interrupt bits */ - state = ADC_STAT(adc_periph) & ADC_STAT_EOC; - if((ADC_CTL0(adc_periph) & ADC_CTL0_EOCIE) && state) { - interrupt_flag = SET; - } - break; - case ADC_INT_FLAG_EOIC: - /* get the ADC end of inserted sequence conversion interrupt bits */ - state = ADC_STAT(adc_periph) & ADC_STAT_EOIC; - if((ADC_CTL0(adc_periph) & ADC_CTL0_EOICIE) && state) { - interrupt_flag = SET; - } - break; - case ADC_INT_FLAG_ROVF: - /* get the ADC routine data register overflow interrupt bits */ - state = ADC_STAT(adc_periph) & ADC_STAT_ROVF; - if((ADC_CTL0(adc_periph) & ADC_CTL0_ROVFIE) && state) { - interrupt_flag = SET; - } - break; - default: - break; - } - return interrupt_flag; -} - -/*! - \brief clear the ADC flag - \param[in] adc_periph: ADCx, x=0,1,2 - \param[in] adc_interrupt: the adc status flag - only one parameter can be selected which is shown as below: - \arg ADC_INT_FLAG_WDE: analog watchdog interrupt - \arg ADC_INT_FLAG_EOC: end of sequence conversion interrupt - \arg ADC_INT_FLAG_EOIC: end of inserted sequence conversion interrupt - \arg ADC_INT_FLAG_ROVF: routine data register overflow interrupt - \param[out] none - \retval none -*/ -void adc_interrupt_flag_clear(uint32_t adc_periph, uint32_t adc_interrupt) -{ - ADC_STAT(adc_periph) &= ~((uint32_t)adc_interrupt); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c deleted file mode 100644 index dcc94c54d6f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c +++ /dev/null @@ -1,1431 +0,0 @@ -/*! - \file gd32f5xx_can.c - \brief CAN driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_can.h" -#include - -#define CAN_ERROR_HANDLE(s) do{}while(1) - -/* This table can be used to calculate data length in FD mode */ -const uint8_t g_can_fdlength_table[] = {12, 16, 20, 24, 32, 48, 64}; - -/*! - \brief deinitialize CAN - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_deinit(uint32_t can_periph) -{ - if(CAN0 == can_periph) { - rcu_periph_reset_enable(RCU_CAN0RST); - rcu_periph_reset_disable(RCU_CAN0RST); - } else { - rcu_periph_reset_enable(RCU_CAN1RST); - rcu_periph_reset_disable(RCU_CAN1RST); - } -} - -/*! - \brief initialize CAN parameter struct with a default value - \param[in] type: the type of CAN parameter struct - only one parameter can be selected which is shown as below: - \arg CAN_INIT_STRUCT: the CAN initial struct - \arg CAN_FILTER_STRUCT: the CAN filter struct - \arg CAN_FD_FRAME_STRUCT: the CAN FD initial struct - \arg CAN_TX_MESSAGE_STRUCT: the CAN TX message struct - \arg CAN_RX_MESSAGE_STRUCT: the CAN RX message struct - \param[in] p_struct: the pointer of the specific struct - \param[out] none - \retval none -*/ -void can_struct_para_init(can_struct_type_enum type, void *p_struct) -{ - uint8_t i; - - if(NULL == p_struct) { - CAN_ERROR_HANDLE("struct parameter can not be NULL \r\n"); - } - - /* get type of the struct */ - switch(type) { - /* used for can_init() */ - case CAN_INIT_STRUCT: - ((can_parameter_struct *)p_struct)->auto_bus_off_recovery = DISABLE; - ((can_parameter_struct *)p_struct)->auto_retrans = DISABLE; - ((can_parameter_struct *)p_struct)->auto_wake_up = DISABLE; - ((can_parameter_struct *)p_struct)->prescaler = 0x03FFU; - ((can_parameter_struct *)p_struct)->rec_fifo_overwrite = DISABLE; - ((can_parameter_struct *)p_struct)->resync_jump_width = CAN_BT_SJW_1TQ; - ((can_parameter_struct *)p_struct)->time_segment_1 = CAN_BT_BS1_3TQ; - ((can_parameter_struct *)p_struct)->time_segment_2 = CAN_BT_BS2_1TQ; - ((can_parameter_struct *)p_struct)->time_triggered = DISABLE; - ((can_parameter_struct *)p_struct)->trans_fifo_order = DISABLE; - ((can_parameter_struct *)p_struct)->working_mode = CAN_NORMAL_MODE; - - break; - /* used for can_filter_init() */ - case CAN_FILTER_STRUCT: - ((can_filter_parameter_struct *)p_struct)->filter_bits = CAN_FILTERBITS_32BIT; - ((can_filter_parameter_struct *)p_struct)->filter_enable = DISABLE; - ((can_filter_parameter_struct *)p_struct)->filter_fifo_number = CAN_FIFO0; - ((can_filter_parameter_struct *)p_struct)->filter_list_high = 0x0000U; - ((can_filter_parameter_struct *)p_struct)->filter_list_low = 0x0000U; - ((can_filter_parameter_struct *)p_struct)->filter_mask_high = 0x0000U; - ((can_filter_parameter_struct *)p_struct)->filter_mask_low = 0x0000U; - ((can_filter_parameter_struct *)p_struct)->filter_mode = CAN_FILTERMODE_MASK; - ((can_filter_parameter_struct *)p_struct)->filter_number = 0U; - - break; - /* used for can_fd_init() */ - case CAN_FD_FRAME_STRUCT: - ((can_fdframe_struct *)p_struct)->data_prescaler = 0x0400U; - ((can_fdframe_struct *)p_struct)->data_resync_jump_width = 1U - 1U; - ((can_fdframe_struct *)p_struct)->data_time_segment_1 = 3U - 1U; - ((can_fdframe_struct *)p_struct)->data_time_segment_2 = 2U - 1U; - ((can_fdframe_struct *)p_struct)->delay_compensation = DISABLE; - ((can_fdframe_struct *)p_struct)->esi_mode = CAN_ESIMOD_HARDWARE; - ((can_fdframe_struct *)p_struct)->excp_event_detect = ENABLE; - ((can_fdframe_struct *)p_struct)->fd_frame = DISABLE; - ((can_fdframe_struct *)p_struct)->iso_bosch = CAN_FDMOD_ISO; - ((can_fdframe_struct *)p_struct)->p_delay_compensation = 0U; - - break; - /* used for can_message_transmit() */ - case CAN_TX_MESSAGE_STRUCT: - ((can_trasnmit_message_struct *)p_struct)->fd_brs = CAN_BRS_DISABLE; - ((can_trasnmit_message_struct *)p_struct)->fd_esi = CAN_ESI_DOMINANT; - ((can_trasnmit_message_struct *)p_struct)->fd_flag = CAN_FDF_CLASSIC; - - for(i = 0U; i < 64U; i++) { - ((can_trasnmit_message_struct *)p_struct)->tx_data[i] = 0U; - } - - ((can_trasnmit_message_struct *)p_struct)->tx_dlen = 0u; - ((can_trasnmit_message_struct *)p_struct)->tx_efid = 0U; - ((can_trasnmit_message_struct *)p_struct)->tx_ff = (uint8_t)CAN_FF_STANDARD; - ((can_trasnmit_message_struct *)p_struct)->tx_ft = (uint8_t)CAN_FT_DATA; - ((can_trasnmit_message_struct *)p_struct)->tx_sfid = 0U; - - break; - /* used for can_message_receive() */ - case CAN_RX_MESSAGE_STRUCT: - ((can_receive_message_struct *)p_struct)->fd_brs = CAN_BRS_DISABLE; - ((can_receive_message_struct *)p_struct)->fd_esi = CAN_ESI_DOMINANT; - ((can_receive_message_struct *)p_struct)->fd_flag = CAN_FDF_CLASSIC; - - for(i = 0U; i < 64U; i++) { - ((can_receive_message_struct *)p_struct)->rx_data[i] = 0U; - } - - ((can_receive_message_struct *)p_struct)->rx_dlen = 0U; - ((can_receive_message_struct *)p_struct)->rx_efid = 0U; - ((can_receive_message_struct *)p_struct)->rx_ff = (uint8_t)CAN_FF_STANDARD; - ((can_receive_message_struct *)p_struct)->rx_fi = 0U; - ((can_receive_message_struct *)p_struct)->rx_ft = (uint8_t)CAN_FT_DATA; - ((can_receive_message_struct *)p_struct)->rx_sfid = 0U; - - break; - - default: - CAN_ERROR_HANDLE("parameter is invalid \r\n"); - } -} - -/*! - \brief initialize CAN - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] can_parameter_init: parameters for CAN initialization - \arg working_mode: CAN_NORMAL_MODE, CAN_LOOPBACK_MODE, CAN_SILENT_MODE, CAN_SILENT_LOOPBACK_MODE - \arg resync_jump_width: 0x00 - 0x07 - \arg time_segment_1: 0x00 - 0x7F - \arg time_segment_2: 0x00 - 0x1F - \arg time_triggered: ENABLE or DISABLE - \arg auto_bus_off_recovery: ENABLE or DISABLE - \arg auto_wake_up: ENABLE or DISABLE - \arg auto_retrans: ENABLE or DISABLE - \arg rec_fifo_overwrite: ENABLE or DISABLE - \arg trans_fifo_order: ENABLE or DISABLE - \arg prescaler: 0x0001 - 0x0400 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus can_init(uint32_t can_periph, can_parameter_struct *can_parameter_init) -{ - uint32_t timeout = CAN_TIMEOUT; - ErrStatus flag = ERROR; - uint32_t fdctl_status; - - /* disable sleep mode */ - CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; - /* enable initialize mode */ - CAN_CTL(can_periph) |= CAN_CTL_IWMOD; - /* wait ACK */ - while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - /* check initialize working success */ - if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { - flag = ERROR; - } else { - /* set the bit timing register */ - fdctl_status = CAN_FDCTL(can_periph); - if(CAN_FDCTL_FDEN != (fdctl_status & CAN_FDCTL_FDEN)) { - /* CAN FD disable, should first enable, then write */ - fdctl_status = fdctl_status | CAN_FDCTL_FDEN; - CAN_FDCTL(can_periph) = fdctl_status; - CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ - BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ - BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ - BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ - BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); - fdctl_status = fdctl_status & (~CAN_FDCTL_FDEN); - CAN_FDCTL(can_periph) = fdctl_status; - } else { - /* CAN FD enable */ - CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ - BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ - BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ - BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ - BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); - } - - /* time trigger communication mode */ - if(ENABLE == can_parameter_init->time_triggered) { - CAN_CTL(can_periph) |= CAN_CTL_TTC; - } else { - CAN_CTL(can_periph) &= ~CAN_CTL_TTC; - } - /* automatic bus-off management */ - if(ENABLE == can_parameter_init->auto_bus_off_recovery) { - CAN_CTL(can_periph) |= CAN_CTL_ABOR; - } else { - CAN_CTL(can_periph) &= ~CAN_CTL_ABOR; - } - /* automatic wakeup mode */ - if(ENABLE == can_parameter_init->auto_wake_up) { - CAN_CTL(can_periph) |= CAN_CTL_AWU; - } else { - CAN_CTL(can_periph) &= ~CAN_CTL_AWU; - } - /* automatic retransmission mode */ - if(ENABLE == can_parameter_init->auto_retrans) { - CAN_CTL(can_periph) &= ~CAN_CTL_ARD; - } else { - CAN_CTL(can_periph) |= CAN_CTL_ARD; - } - /* receive FIFO overwrite mode */ - if(ENABLE == can_parameter_init->rec_fifo_overwrite) { - CAN_CTL(can_periph) &= ~CAN_CTL_RFOD; - } else { - CAN_CTL(can_periph) |= CAN_CTL_RFOD; - } - /* transmit FIFO order */ - if(ENABLE == can_parameter_init->trans_fifo_order) { - CAN_CTL(can_periph) |= CAN_CTL_TFO; - } else { - CAN_CTL(can_periph) &= ~CAN_CTL_TFO; - } - /* disable initialize mode */ - CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; - timeout = CAN_TIMEOUT; - /* wait the ACK */ - while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - /* check exit initialize mode */ - if(0U != timeout) { - flag = SUCCESS; - } - } - return flag; -} - -/*! - \brief initialize CAN FD function - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] can_fdframe_init: parameters for CAN FD initialization - \arg fd_frame: ENABLE or DISABLE - \arg excp_event_detect: ENABLE or DISABLE - \arg delay_compensation: ENABLE or DISABLE - \arg p_delay_compensation: the pointer of tdc struct - can_fd_tdc_struct: - tdc_mode: CAN_TDCMOD_CALC_AND_OFFSET or CAN_TDCMOD_OFFSET - tdc_filter: 0x00 - 0x07 - tdc_offset: 0x00 - 0x07 - \arg iso_bosch: CAN_FDMOD_ISO or CAN_FDMOD_BOSCH - \arg esi_mode: CAN_ESIMOD_HARDWARE or CAN_ESIMOD_SOFTWARE - \arg data_resync_jump_width: 0x00 - 0x07 - \arg data_time_segment_1: 0x00 - 0x0F - \arg data_time_segment_2: 0x00 - 0x07 - \arg data_prescaler: 0x0001 - 0x0400 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init) -{ - uint32_t timeout = CAN_TIMEOUT; - uint32_t tempreg = 0U; - - /* check null pointer */ - if(0 == can_fdframe_init) { - return ERROR; - } - /* disable sleep mode */ - CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; - /* enable initialize mode */ - CAN_CTL(can_periph) |= CAN_CTL_IWMOD; - /* wait ACK */ - while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - /* check initialize working success */ - if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { - return ERROR; - } else { - /* set the data bit timing register */ - CAN_DBT(can_periph) = (BT_DSJW((uint32_t)can_fdframe_init->data_resync_jump_width) | \ - BT_DBS1((uint32_t)can_fdframe_init->data_time_segment_1) | \ - BT_DBS2((uint32_t)can_fdframe_init->data_time_segment_2) | \ - BT_BAUDPSC(((uint32_t)can_fdframe_init->data_prescaler) - 1U)); - - tempreg = can_fdframe_init->esi_mode | can_fdframe_init->iso_bosch; - - /* Protocol exception event detection */ - if(ENABLE == can_fdframe_init->excp_event_detect) { - tempreg &= ~CAN_FDCTL_PRED; - } else { - tempreg |= CAN_FDCTL_PRED; - } - - /* Transmitter delay compensation mode */ - if(ENABLE == can_fdframe_init->delay_compensation) { - tempreg |= CAN_FDCTL_TDCEN; - /* p_delay_compensation pointer should be config when TDC mode is enabled */ - if(0 != can_fdframe_init->p_delay_compensation) { - tempreg |= (can_fdframe_init->p_delay_compensation->tdc_mode & CAN_FDCTL_TDCMOD); - CAN_FDTDC(can_periph) = (FDTDC_TDCF(can_fdframe_init->p_delay_compensation->tdc_filter) | FDTDC_TDCO( - can_fdframe_init->p_delay_compensation->tdc_offset)); - } else { - return ERROR; - } - } else { - /* Transmitter delay compensation mode is disabled */ - tempreg &= ~CAN_FDCTL_TDCEN; - } - - /* FD operation mode */ - if(ENABLE == can_fdframe_init->fd_frame) { - tempreg |= CAN_FDCTL_FDEN; - } else { - tempreg &= ~CAN_FDCTL_FDEN; - } - CAN_FDCTL(can_periph) = tempreg; - - /* disable initialize mode */ - CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; - timeout = CAN_TIMEOUT; - /* wait the ACK */ - while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - /* check exit initialize mode */ - if(0U == timeout) { - return ERROR; - } - } - - return SUCCESS; -} - -/*! - \brief initialize CAN filter - \param[in] can_filter_parameter_init: struct for CAN filter initialization - \arg filter_list_high: 0x0000 - 0xFFFF - \arg filter_list_low: 0x0000 - 0xFFFF - \arg filter_mask_high: 0x0000 - 0xFFFF - \arg filter_mask_low: 0x0000 - 0xFFFF - \arg filter_fifo_number: CAN_FIFO0, CAN_FIFO1 - \arg filter_number: 0 - 27 - \arg filter_mode: CAN_FILTERMODE_MASK, CAN_FILTERMODE_LIST - \arg filter_bits: CAN_FILTERBITS_32BIT, CAN_FILTERBITS_16BIT - \arg filter_enable: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void can_filter_init(can_filter_parameter_struct *can_filter_parameter_init) -{ - uint32_t val = 0U; - - val = ((uint32_t)1) << (can_filter_parameter_init->filter_number); - /* filter lock disable */ - CAN_FCTL(CAN0) |= CAN_FCTL_FLD; - /* disable filter */ - CAN_FW(CAN0) &= ~(uint32_t)val; - - /* filter 16 bits */ - if(CAN_FILTERBITS_16BIT == can_filter_parameter_init->filter_bits) { - /* set filter 16 bits */ - CAN_FSCFG(CAN0) &= ~(uint32_t)val; - /* first 16 bits list and first 16 bits mask or first 16 bits list and second 16 bits list */ - CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ - FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS) | \ - FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); - /* second 16 bits list and second 16 bits mask or third 16 bits list and fourth 16 bits list */ - CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ - FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | \ - FDATA_MASK_LOW((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS); - } - /* filter 32 bits */ - if(CAN_FILTERBITS_32BIT == can_filter_parameter_init->filter_bits) { - /* set filter 32 bits */ - CAN_FSCFG(CAN0) |= (uint32_t)val; - /* 32 bits list or first 32 bits list */ - CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ - FDATA_MASK_HIGH((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS) | - FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); - /* 32 bits mask or second 32 bits list */ - CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ - FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | - FDATA_MASK_LOW((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS); - } - - /* filter mode */ - if(CAN_FILTERMODE_MASK == can_filter_parameter_init->filter_mode) { - /* mask mode */ - CAN_FMCFG(CAN0) &= ~(uint32_t)val; - } else { - /* list mode */ - CAN_FMCFG(CAN0) |= (uint32_t)val; - } - - /* filter FIFO */ - if(CAN_FIFO0 == (can_filter_parameter_init->filter_fifo_number)) { - /* FIFO0 */ - CAN_FAFIFO(CAN0) &= ~(uint32_t)val; - } else { - /* FIFO1 */ - CAN_FAFIFO(CAN0) |= (uint32_t)val; - } - - /* filter working */ - if(ENABLE == can_filter_parameter_init->filter_enable) { - - CAN_FW(CAN0) |= (uint32_t)val; - } - - /* filter lock enable */ - CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; -} - -/*! - \brief CAN filter mask mode initialization - \param[in] id: extended(11-bits) or standard(29-bits) identifier - \arg 0x00000000 - 0x1FFFFFFF - \param[in] mask: extended(11-bits) or standard(29-bits) identifier mask - \arg 0x00000000 - 0x1FFFFFFF - \param[in] format_fifo: format and FIFO states - only one parameter can be selected which is shown as below: - \arg CAN_STANDARD_FIFO0 - \arg CAN_STANDARD_FIFO1 - \arg CAN_EXTENDED_FIFO0 - \arg CAN_EXTENDED_FIFO1 - \param[in] filter_number: filter sequence number - \arg 0x00 - 0x1B - \param[out] none - \retval none -*/ -void can_filter_mask_mode_init(uint32_t id, uint32_t mask, can_format_fifo_enum format_fifo, uint16_t filter_number) -{ - can_filter_parameter_struct can_filter; - - /* Initialize the filter structure */ - can_struct_para_init(CAN_FILTER_STRUCT, &can_filter); - - /* filter config */ - can_filter.filter_number = filter_number; - can_filter.filter_mode = CAN_FILTERMODE_MASK; - can_filter.filter_bits = CAN_FILTERBITS_32BIT; - can_filter.filter_enable = ENABLE; - - switch(format_fifo) { - /* standard FIFO 0 */ - case CAN_STANDARD_FIFO0: - can_filter.filter_fifo_number = CAN_FIFO0; - /* configure SFID[10:0] */ - can_filter.filter_list_high = (uint16_t)id << 5; - can_filter.filter_list_low = 0x0000U; - /* configure SFID[10:0] mask */ - can_filter.filter_mask_high = (uint16_t)mask << 5; - /* both data and remote frames can be received */ - can_filter.filter_mask_low = (uint16_t)(1U << 2U); - - break; - /* standard FIFO 1 */ - case CAN_STANDARD_FIFO1: - can_filter.filter_fifo_number = CAN_FIFO1; - /* configure SFID[10:0] */ - can_filter.filter_list_high = (uint16_t)id << 5; - can_filter.filter_list_low = 0x0000U; - /* configure SFID[10:0] mask */ - can_filter.filter_mask_high = (uint16_t)mask << 5; - /* both data and remote frames can be received */ - can_filter.filter_mask_low = (uint16_t)(1U << 2U); - - break; - /* extended FIFO 0 */ - case CAN_EXTENDED_FIFO0: - can_filter.filter_fifo_number = CAN_FIFO0; - /* configure EFID[28:13] */ - can_filter.filter_list_high = (uint16_t)(id >> 13); - /* configure EFID[12:0] and frame format bit set */ - can_filter.filter_list_low = ((uint16_t)(id << 3)) | (1U << 2); - /* configure EFID[28:13] mask */ - can_filter.filter_mask_high = (uint16_t)(mask >> 13); - /* configure EFID[12:0] and frame format bit mask */ - /* both data and remote frames can be received */ - can_filter.filter_mask_low = ((uint16_t)(mask << 3)) | (1U << 2); - - break; - /* extended FIFO 1 */ - case CAN_EXTENDED_FIFO1: - can_filter.filter_fifo_number = CAN_FIFO1; - /* configure EFID[28:13] */ - can_filter.filter_list_high = (uint16_t)(id >> 13); - /* configure EFID[12:0] and frame format bit set */ - can_filter.filter_list_low = ((uint16_t)(id << 3)) | (1U << 2); - /* configure EFID[28:13] mask */ - can_filter.filter_mask_high = (uint16_t)(mask >> 13); - /* configure EFID[12:0] and frame format bit mask */ - /* both data and remote frames can be received */ - can_filter.filter_mask_low = ((uint16_t)(mask << 3)) | (1U << 2); - - break; - default: - CAN_ERROR_HANDLE("parameter is invalid \r\n"); - } - - can_filter_init(&can_filter); -} - -/*! - \brief CAN communication mode configure - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] mode: communication mode - only one parameter can be selected which is shown as below: - \arg CAN_NORMAL_MODE - \arg CAN_LOOPBACK_MODE - \arg CAN_SILENT_MODE - \arg CAN_SILENT_LOOPBACK_MODE - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus can_monitor_mode_set(uint32_t can_periph, uint8_t mode) -{ - ErrStatus reval = SUCCESS; - uint32_t timeout = CAN_TIMEOUT; - - if(mode == (mode & CAN_SILENT_LOOPBACK_MODE)) { - /* disable sleep mode */ - CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); - /* set initialize mode */ - CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; - /* wait the acknowledge */ - timeout = CAN_TIMEOUT; - while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - - if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { - reval = ERROR; - } else { - CAN_BT(can_periph) &= ~BT_MODE(3); - CAN_BT(can_periph) |= BT_MODE(mode); - - timeout = CAN_TIMEOUT; - /* enter normal mode */ - CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); - /* wait the acknowledge */ - while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)) { - timeout--; - } - if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) { - reval = ERROR; - } - } - } else { - reval = ERROR; - } - - return reval; -} - -/*! - \brief CAN FD frame function enable - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_fd_function_enable(uint32_t can_periph) -{ - CAN_FDCTL(can_periph) |= CAN_FDCTL_FDEN; -} - -/*! - \brief CAN FD frame function disable - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_fd_function_disable(uint32_t can_periph) -{ - CAN_FDCTL(can_periph) &= ~CAN_FDCTL_FDEN; -} - -/*! - \brief set CAN1 filter start bank number - \param[in] start_bank: CAN1 start bank number - only one parameter can be selected which is shown as below: - \arg (1..27) - \param[out] none - \retval none -*/ -void can1_filter_start_bank(uint8_t start_bank) -{ - /* filter lock disable */ - CAN_FCTL(CAN0) |= CAN_FCTL_FLD; - /* set CAN1 filter start number */ - CAN_FCTL(CAN0) &= ~(uint32_t)CAN_FCTL_HBC1F; - CAN_FCTL(CAN0) |= FCTL_HBC1F(start_bank); - /* filter lock enable */ - CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; -} - -/*! - \brief enable CAN debug freeze - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_debug_freeze_enable(uint32_t can_periph) -{ - /* set DFZ bit */ - CAN_CTL(can_periph) |= CAN_CTL_DFZ; - - if(CAN0 == can_periph) { - dbg_periph_enable(DBG_CAN0_HOLD); - } else { - dbg_periph_enable(DBG_CAN1_HOLD); - } -} - -/*! - \brief disable CAN debug freeze - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_debug_freeze_disable(uint32_t can_periph) -{ - /* set DFZ bit */ - CAN_CTL(can_periph) &= ~CAN_CTL_DFZ; - - if(CAN0 == can_periph) { - dbg_periph_disable(DBG_CAN0_HOLD); - } else { - dbg_periph_disable(DBG_CAN1_HOLD); - } -} - -/*! - \brief enable CAN time trigger mode - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_time_trigger_mode_enable(uint32_t can_periph) -{ - uint8_t mailbox_number; - - /* enable the TTC mode */ - CAN_CTL(can_periph) |= CAN_CTL_TTC; - /* enable time stamp */ - for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++) { - CAN_TMP(can_periph, mailbox_number) |= CAN_TMP_TSEN; - } -} - -/*! - \brief disable CAN time trigger mode - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval none -*/ -void can_time_trigger_mode_disable(uint32_t can_periph) -{ - uint8_t mailbox_number; - - /* disable the TTC mode */ - CAN_CTL(can_periph) &= ~CAN_CTL_TTC; - /* reset TSEN bits */ - for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++) { - CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_TSEN; - } -} - -/*! - \brief transmit CAN message - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] transmit_message: struct for CAN transmit message - \arg tx_sfid: 0x00000000 - 0x000007FF - \arg tx_efid: 0x00000000 - 0x1FFFFFFF - \arg tx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED - \arg tx_ft: CAN_FT_DATA, CAN_FT_REMOTE - \arg tx_dlen: 0 - 8 (FD mode: 0 - 8, or 12, 16, 20, 24, 32, 48, 64) - \arg tx_data[]: 0x00 - 0xFF - \param[out] none - \retval mailbox_number -*/ -uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct *transmit_message) -{ - uint8_t mailbox_number = CAN_MAILBOX0; - uint8_t i = 0U; - uint8_t hit = 0U; - uint32_t canfd_en = 0U; - volatile uint32_t p_temp; - uint32_t reg_temp = 0U; - - /* select one empty mailbox */ - if(CAN_TSTAT_TME0 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME0)) { - mailbox_number = CAN_MAILBOX0; - } else if(CAN_TSTAT_TME1 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME1)) { - mailbox_number = CAN_MAILBOX1; - } else if(CAN_TSTAT_TME2 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME2)) { - mailbox_number = CAN_MAILBOX2; - } else { - mailbox_number = CAN_NOMAILBOX; - } - /* return no mailbox empty */ - if(CAN_NOMAILBOX == mailbox_number) { - return CAN_NOMAILBOX; - } - - CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN; - if(CAN_FF_STANDARD == transmit_message->tx_ff) { - /* set transmit mailbox standard identifier */ - CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \ - transmit_message->tx_ft); - } else { - /* set transmit mailbox extended identifier */ - CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \ - transmit_message->tx_ff | \ - transmit_message->tx_ft); - } - - if(CAN_FDF_CLASSIC == transmit_message->fd_flag) { - /* set the data length */ - CAN_TMP(can_periph, mailbox_number) &= ~(CAN_TMP_DLENC | CAN_TMP_ESI | CAN_TMP_BRS | CAN_TMP_FDF); - CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen; - /* set the data */ - CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \ - TMDATA0_DB2(transmit_message->tx_data[2]) | \ - TMDATA0_DB1(transmit_message->tx_data[1]) | \ - TMDATA0_DB0(transmit_message->tx_data[0]); - CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \ - TMDATA1_DB6(transmit_message->tx_data[6]) | \ - TMDATA1_DB5(transmit_message->tx_data[5]) | \ - TMDATA1_DB4(transmit_message->tx_data[4]); - } else { - canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN; - /* check FD function has been enabled */ - if(canfd_en) { - if(transmit_message->tx_dlen <= 8U) { - /* set the data length */ - reg_temp |= transmit_message->tx_dlen; - } else { - /* data length greater than 8 */ - for(i = 0U; i < 7U; i++) { - if(transmit_message->tx_dlen == g_can_fdlength_table[i]) { - hit = 1U; - break; - } - } - /* data length is valid */ - if(1U == hit) { - reg_temp |= 9U + i; - } else { - CAN_ERROR_HANDLE("dlen is invalid \r\n"); - } - } - reg_temp |= (((uint32_t)transmit_message->fd_brs << 5U) | ((uint32_t)transmit_message->fd_esi << 4U) | (( - uint32_t)transmit_message->fd_flag << 7U)); - CAN_TMP(can_periph, mailbox_number) = reg_temp; - - /* set the data */ - i = transmit_message->tx_dlen / 4U; - - /* data length is 5-7 need send 2 word */ - if((1U == i) && (4U != transmit_message->tx_dlen)) { - i++; - } - p_temp = (uint32_t)transmit_message->tx_data; - if((0U == i)) { - CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp; - } else { - for(; i > 0U; i--) { - CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp; - p_temp = ((uint32_t)((uint32_t)p_temp + 4U)); - } - } - - } else { - CAN_ERROR_HANDLE("CAN FD function disabled \r\n"); - } - } - - /* enable transmission */ - CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN; - - return mailbox_number; -} - -/*! - \brief get CAN transmit state - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] mailbox_number - only one parameter can be selected which is shown as below: - \arg CAN_MAILBOX(x=0,1,2) - \param[out] none - \retval can_transmit_state_enum -*/ -can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number) -{ - can_transmit_state_enum state = CAN_TRANSMIT_FAILED; - uint32_t val = 0U; - - /* check selected mailbox state */ - switch(mailbox_number) { - /* mailbox0 */ - case CAN_MAILBOX0: - val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0); - break; - /* mailbox1 */ - case CAN_MAILBOX1: - val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1); - break; - /* mailbox2 */ - case CAN_MAILBOX2: - val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2); - break; - default: - val = CAN_TRANSMIT_FAILED; - break; - } - - switch(val) { - /* transmit pending */ - case(CAN_STATE_PENDING): - state = CAN_TRANSMIT_PENDING; - break; - /* mailbox0 transmit succeeded */ - case(CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0): - state = CAN_TRANSMIT_OK; - break; - /* mailbox1 transmit succeeded */ - case(CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1): - state = CAN_TRANSMIT_OK; - break; - /* mailbox2 transmit succeeded */ - case(CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2): - state = CAN_TRANSMIT_OK; - break; - /* transmit failed */ - default: - state = CAN_TRANSMIT_FAILED; - break; - } - return state; -} - -/*! - \brief stop CAN transmission - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] mailbox_number - only one parameter can be selected which is shown as below: - \arg CAN_MAILBOXx(x=0,1,2) - \param[out] none - \retval none -*/ -void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number) -{ - if(CAN_MAILBOX0 == mailbox_number) { - CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0; - while(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)) { - } - } else if(CAN_MAILBOX1 == mailbox_number) { - CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1; - while(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)) { - } - } else if(CAN_MAILBOX2 == mailbox_number) { - CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2; - while(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)) { - } - } else { - /* illegal parameters */ - } -} - -/*! - \brief CAN receive message - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] fifo_number - \arg CAN_FIFOx(x=0,1) - \param[out] receive_message: struct for CAN receive message - \arg rx_sfid: 0x00000000 - 0x000007FF - \arg rx_efid: 0x00000000 - 0x1FFFFFFF - \arg rx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED - \arg rx_ft: CAN_FT_DATA, CAN_FT_REMOTE - \arg rx_dlen: 0 - 8 (FD mode: 0 - 8, or 12, 16, 20, 24, 32, 48, 64) - \arg rx_data[]: 0x00 - 0xFF - \arg rx_fi: 0 - 27 - \retval none -*/ -void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct *receive_message) -{ - uint32_t canfd_en = 0U; - volatile uint32_t p_temp; - uint32_t data_temp; - uint8_t canfd_recv_cnt = 0U; - uint8_t i; - - /* get the frame format */ - receive_message->rx_ff = (uint8_t)(CAN_RFIFOMI_FF & CAN_RFIFOMI(can_periph, fifo_number)); - if(CAN_FF_STANDARD == receive_message->rx_ff) { - /* get standard identifier */ - receive_message->rx_sfid = (uint32_t)(GET_RFIFOMI_SFID(CAN_RFIFOMI(can_periph, fifo_number))); - } else { - /* get extended identifier */ - receive_message->rx_efid = (uint32_t)(GET_RFIFOMI_EFID(CAN_RFIFOMI(can_periph, fifo_number))); - } - - /* get frame type */ - receive_message->rx_ft = (uint8_t)(CAN_RFIFOMI_FT & CAN_RFIFOMI(can_periph, fifo_number)); - /* filtering index */ - receive_message->rx_fi = (uint8_t)(GET_RFIFOMP_FI(CAN_RFIFOMP(can_periph, fifo_number))); - receive_message->fd_flag = (uint8_t)((CAN_RFIFOMP_FDF & CAN_RFIFOMP(can_periph, fifo_number)) >> 7); - - canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN; - if(!canfd_en) { - if(CAN_FDF_CLASSIC == receive_message->fd_flag) { - /* get receive data length */ - receive_message->rx_dlen = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); - /* receive data */ - receive_message->rx_data[0] = (uint8_t)(GET_RFIFOMDATA0_DB0(CAN_RFIFOMDATA0(can_periph, fifo_number))); - receive_message->rx_data[1] = (uint8_t)(GET_RFIFOMDATA0_DB1(CAN_RFIFOMDATA0(can_periph, fifo_number))); - receive_message->rx_data[2] = (uint8_t)(GET_RFIFOMDATA0_DB2(CAN_RFIFOMDATA0(can_periph, fifo_number))); - receive_message->rx_data[3] = (uint8_t)(GET_RFIFOMDATA0_DB3(CAN_RFIFOMDATA0(can_periph, fifo_number))); - receive_message->rx_data[4] = (uint8_t)(GET_RFIFOMDATA1_DB4(CAN_RFIFOMDATA1(can_periph, fifo_number))); - receive_message->rx_data[5] = (uint8_t)(GET_RFIFOMDATA1_DB5(CAN_RFIFOMDATA1(can_periph, fifo_number))); - receive_message->rx_data[6] = (uint8_t)(GET_RFIFOMDATA1_DB6(CAN_RFIFOMDATA1(can_periph, fifo_number))); - receive_message->rx_data[7] = (uint8_t)(GET_RFIFOMDATA1_DB7(CAN_RFIFOMDATA1(can_periph, fifo_number))); - } else { - CAN_ERROR_HANDLE("CAN FD function disabled \r\n"); - } - } else { - /* check FD function has been enabled */ - /* get receive data length */ - canfd_recv_cnt = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); - - if(canfd_recv_cnt <= 8U) { - /* set the data length */ - receive_message->rx_dlen = canfd_recv_cnt; - } else { - receive_message->rx_dlen = g_can_fdlength_table[canfd_recv_cnt - 9U]; - } - - receive_message->fd_brs = (uint8_t)((CAN_RFIFOMP(can_periph, fifo_number) & CAN_RFIFOMP_BRS) >> 5); - receive_message->fd_esi = (uint8_t)((CAN_RFIFOMP(can_periph, fifo_number) & CAN_RFIFOMP_ESI) >> 4); - - /* get the data */ - i = receive_message->rx_dlen / 4U; - - /* data length is 5-7 need receive 2 word */ - if((1U == i) && (4U != receive_message->rx_dlen)) { - i++; - } - p_temp = (uint32_t)(uint32_t)receive_message->rx_data; - if(0U == i) { - data_temp = CAN_RFIFOMDATA0(can_periph, fifo_number); - *(uint32_t *)p_temp = data_temp; - } else { - /* get the data by reading from CAN_RFIFOMDATA0 register*/ - for(; i > 0U; i--) { - data_temp = CAN_RFIFOMDATA0(can_periph, fifo_number); - *(uint32_t *)p_temp = data_temp; - p_temp = ((uint32_t)((uint32_t)p_temp + 4U)); - } - } - } - - /* release FIFO */ - if(CAN_FIFO0 == fifo_number) { - CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; - } else { - CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; - } -} - -/*! - \brief release FIFO - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] fifo_number - only one parameter can be selected which is shown as below: - \arg CAN_FIFOx(x=0,1) - \param[out] none - \retval none -*/ -void can_fifo_release(uint32_t can_periph, uint8_t fifo_number) -{ - if(CAN_FIFO0 == fifo_number) { - CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; - } else if(CAN_FIFO1 == fifo_number) { - CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; - } else { - /* illegal parameters */ - CAN_ERROR_HANDLE("CAN FIFO NUM is invalid \r\n"); - } -} - -/*! - \brief CAN receive message length - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] fifo_number - only one parameter can be selected which is shown as below: - \arg CAN_FIFOx(x=0,1) - \param[out] none - \retval message length -*/ -uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number) -{ - uint8_t val = 0U; - - if(CAN_FIFO0 == fifo_number) { - /* FIFO0 */ - val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIF_RFL_MASK); - } else if(CAN_FIFO1 == fifo_number) { - /* FIFO1 */ - val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIF_RFL_MASK); - } else { - /* illegal parameters */ - } - return val; -} - -/*! - \brief set CAN working mode - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] can_working_mode - only one parameter can be selected which is shown as below: - \arg CAN_MODE_INITIALIZE - \arg CAN_MODE_NORMAL - \arg CAN_MODE_SLEEP - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode) -{ - ErrStatus flag = ERROR; - /* timeout for IWS or also for SLPWS bits */ - uint32_t timeout = CAN_TIMEOUT; - - if(CAN_MODE_INITIALIZE == working_mode) { - /* disable sleep mode */ - CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); - /* set initialize mode */ - CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; - /* wait the acknowledge */ - while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)) { - timeout--; - } - if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) { - flag = ERROR; - } else { - flag = SUCCESS; - } - } else if(CAN_MODE_NORMAL == working_mode) { - /* enter normal mode */ - CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); - /* wait the acknowledge */ - while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)) { - timeout--; - } - if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) { - flag = ERROR; - } else { - flag = SUCCESS; - } - } else if(CAN_MODE_SLEEP == working_mode) { - /* disable initialize mode */ - CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_IWMOD); - /* set sleep mode */ - CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_SLPWMOD; - /* wait the acknowledge */ - while((CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0U != timeout)) { - timeout--; - } - if(CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) { - flag = ERROR; - } else { - flag = SUCCESS; - } - } else { - flag = ERROR; - } - return flag; -} - -/*! - \brief wake up CAN - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus can_wakeup(uint32_t can_periph) -{ - ErrStatus flag = ERROR; - uint32_t timeout = CAN_TIMEOUT; - - /* wakeup */ - CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; - - while((0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0x00U != timeout)) { - timeout--; - } - /* check state */ - if(0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) { - flag = ERROR; - } else { - flag = SUCCESS; - } - return flag; -} - -/*! - \brief get CAN error type - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval can_error_enum - \arg CAN_ERROR_NONE: no error - \arg CAN_ERROR_FILL: fill error - \arg CAN_ERROR_FORMATE: format error - \arg CAN_ERROR_ACK: ACK error - \arg CAN_ERROR_BITRECESSIVE: bit recessive - \arg CAN_ERROR_BITDOMINANTER: bit dominant error - \arg CAN_ERROR_CRC: CRC error - \arg CAN_ERROR_SOFTWARECFG: software configure -*/ -can_error_enum can_error_get(uint32_t can_periph) -{ - can_error_enum error; - error = CAN_ERROR_NONE; - - /* get error type */ - error = (can_error_enum)(GET_ERR_ERRN(CAN_ERR(can_periph))); - return error; -} - -/*! - \brief get CAN receive error number - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval error number -*/ -uint8_t can_receive_error_number_get(uint32_t can_periph) -{ - uint8_t val; - - /* get error count */ - val = (uint8_t)(GET_ERR_RECNT(CAN_ERR(can_periph))); - return val; -} - -/*! - \brief get CAN transmit error number - \param[in] can_periph - \arg CANx(x=0,1) - \param[out] none - \retval error number -*/ -uint8_t can_transmit_error_number_get(uint32_t can_periph) -{ - uint8_t val; - - val = (uint8_t)(GET_ERR_TECNT(CAN_ERR(can_periph))); - return val; -} - -/*! - \brief get CAN flag state - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] flag: CAN flags, refer to can_flag_enum - only one parameter can be selected which is shown as below: - \arg CAN_FLAG_RXL: RX level - \arg CAN_FLAG_LASTRX: last sample value of RX pin - \arg CAN_FLAG_RS: receiving state - \arg CAN_FLAG_TS: transmitting state - \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode - \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode - \arg CAN_FLAG_ERRIF: error flag - \arg CAN_FLAG_SLPWS: sleep working state - \arg CAN_FLAG_IWS: initial working state - \arg CAN_FLAG_TMLS2: transmit mailbox 2 last sending in TX FIFO - \arg CAN_FLAG_TMLS1: transmit mailbox 1 last sending in TX FIFO - \arg CAN_FLAG_TMLS0: transmit mailbox 0 last sending in TX FIFO - \arg CAN_FLAG_TME2: transmit mailbox 2 empty - \arg CAN_FLAG_TME1: transmit mailbox 1 empty - \arg CAN_FLAG_TME0: transmit mailbox 0 empty - \arg CAN_FLAG_MTE2: mailbox 2 transmit error - \arg CAN_FLAG_MTE1: mailbox 1 transmit error - \arg CAN_FLAG_MTE0: mailbox 0 transmit error - \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost - \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost - \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost - \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error - \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error - \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error - \arg CAN_FLAG_MTF2: mailbox 2 transmit finished - \arg CAN_FLAG_MTF1: mailbox 1 transmit finished - \arg CAN_FLAG_MTF0: mailbox 0 transmit finished - \arg CAN_FLAG_RFO0: receive FIFO0 overfull - \arg CAN_FLAG_RFF0: receive FIFO0 full - \arg CAN_FLAG_RFO1: receive FIFO1 overfull - \arg CAN_FLAG_RFF1: receive FIFO1 full - \arg CAN_FLAG_BOERR: bus-off error - \arg CAN_FLAG_PERR: passive error - \arg CAN_FLAG_WERR: warning error - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag) -{ - /* get flag and interrupt enable state */ - if(RESET != (CAN_REG_VAL(can_periph, flag) & BIT(CAN_BIT_POS(flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear CAN flag state - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] flag: CAN flags, refer to can_flag_enum - only one parameter can be selected which is shown as below: - \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode - \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode - \arg CAN_FLAG_ERRIF: error flag - \arg CAN_FLAG_MTE2: mailbox 2 transmit error - \arg CAN_FLAG_MTE1: mailbox 1 transmit error - \arg CAN_FLAG_MTE0: mailbox 0 transmit error - \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost - \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost - \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost - \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error - \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error - \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error - \arg CAN_FLAG_MTF2: mailbox 2 transmit finished - \arg CAN_FLAG_MTF1: mailbox 1 transmit finished - \arg CAN_FLAG_MTF0: mailbox 0 transmit finished - \arg CAN_FLAG_RFO0: receive FIFO0 overfull - \arg CAN_FLAG_RFF0: receive FIFO0 full - \arg CAN_FLAG_RFO1: receive FIFO1 overfull - \arg CAN_FLAG_RFF1: receive FIFO1 full - \param[out] none - \retval none -*/ -void can_flag_clear(uint32_t can_periph, can_flag_enum flag) -{ - CAN_REG_VAL(can_periph, flag) = BIT(CAN_BIT_POS(flag)); -} - -/*! - \brief enable CAN interrupt - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] interrupt - one or more parameters can be selected which are shown as below: - \arg CAN_INT_TME: transmit mailbox empty interrupt enable - \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable - \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable - \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable - \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable - \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable - \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable - \arg CAN_INT_WERR: warning error interrupt enable - \arg CAN_INT_PERR: passive error interrupt enable - \arg CAN_INT_BO: bus-off interrupt enable - \arg CAN_INT_ERRN: error number interrupt enable - \arg CAN_INT_ERR: error interrupt enable - \arg CAN_INT_WAKEUP: wakeup interrupt enable - \arg CAN_INT_SLPW: sleep working interrupt enable - \param[out] none - \retval none -*/ -void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt) -{ - CAN_INTEN(can_periph) |= interrupt; -} - -/*! - \brief disable CAN interrupt - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] interrupt - one or more parameters can be selected which are shown as below: - \arg CAN_INT_TME: transmit mailbox empty interrupt enable - \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable - \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable - \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable - \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable - \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable - \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable - \arg CAN_INT_WERR: warning error interrupt enable - \arg CAN_INT_PERR: passive error interrupt enable - \arg CAN_INT_BO: bus-off interrupt enable - \arg CAN_INT_ERRN: error number interrupt enable - \arg CAN_INT_ERR: error interrupt enable - \arg CAN_INT_WAKEUP: wakeup interrupt enable - \arg CAN_INT_SLPW: sleep working interrupt enable - \param[out] none - \retval none -*/ -void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt) -{ - CAN_INTEN(can_periph) &= ~interrupt; -} - -/*! - \brief get CAN interrupt flag state - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering - \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode - \arg CAN_INT_FLAG_ERRIF: error interrupt flag - \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag - \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag - \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag - \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag - \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag - \arg CAN_INT_FLAG_RFL0: receive FIFO0 not empty interrupt flag - \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag - \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag - \arg CAN_INT_FLAG_RFL1: receive FIFO1 not empty interrupt flag - \arg CAN_INT_FLAG_ERRN: error number interrupt flag - \arg CAN_INT_FLAG_BOERR: bus-off error interrupt flag - \arg CAN_INT_FLAG_PERR: passive error interrupt flag - \arg CAN_INT_FLAG_WERR: warning error interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag) -{ - uint32_t ret1 = RESET; - uint32_t ret2 = RESET; - - /* get the status of interrupt flag */ - if(flag == CAN_INT_FLAG_RFL0) { - ret1 = can_receive_message_length_get(can_periph, CAN_FIFO0); - } else if(flag == CAN_INT_FLAG_RFL1) { - ret1 = can_receive_message_length_get(can_periph, CAN_FIFO1); - } else if(flag == CAN_INT_FLAG_ERRN) { - ret1 = can_error_get(can_periph); - } else { - ret1 = CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag)); - } - /* get the status of interrupt enable bit */ - ret2 = CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag)); - if(ret1 && ret2) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear CAN interrupt flag state - \param[in] can_periph - \arg CANx(x=0,1) - \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering - \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode - \arg CAN_INT_FLAG_ERRIF: error interrupt flag - \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag - \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag - \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag - \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag - \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag - \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag - \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag - \param[out] none - \retval none -*/ -void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag) -{ - CAN_REG_VALS(can_periph, flag) = BIT(CAN_BIT_POS0(flag)); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c deleted file mode 100644 index ea6dfcb326c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c +++ /dev/null @@ -1,718 +0,0 @@ -/*! - \file gd32f5xx_cau.c - \brief CAU driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_cau.h" -#include "gd32f5xx_rcu.h" - -#define STAT0_AESDES_MASK ((uint32_t)0x00000015U) -#define STAT0_TDES_MASK ((uint32_t)0x00000014U) - -/*! - \brief reset the CAU peripheral - \param[in] none - \param[out] none - \retval none -*/ -void cau_deinit(void) -{ - /* enable CAU reset state */ - rcu_periph_reset_enable(RCU_CAURST); - /* release CAU from reset state */ - rcu_periph_reset_disable(RCU_CAURST); -} - - -/*! - \brief initialize the CAU encrypt and decrypt parameter struct with the default values - \param[in] none - \param[out] cau_parameter: - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bytes - iv: initialization vector - iv_size: iv size in bytes - input: input data - in_length: input data length in bytes - aad: additional authentication data - aad_size: header size - \retval none -*/ -void cau_struct_para_init(cau_parameter_struct *cau_parameter) -{ - /* set the CAU encrypt and decrypt parameters struct with the default values */ - cau_parameter->alg_dir = CAU_ENCRYPT; - cau_parameter->key = 0U; - cau_parameter->key_size = 0U; - cau_parameter->iv = 0U; - cau_parameter->iv_size = 0U; - cau_parameter->input = 0U; - cau_parameter->in_length = 0U; - cau_parameter->aad = 0U; - cau_parameter->aad_size = 0U; -} - -/*! - \brief initialize the key parameter structure with the default values - \param[in] none - \param[out] key_initpara: - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - \retval none -*/ -void cau_key_struct_para_init(cau_key_parameter_struct *key_initpara) -{ - /* set the key parameters struct with the default values */ - key_initpara->key_0_high = 0U; - key_initpara->key_0_low = 0U; - key_initpara->key_1_high = 0U; - key_initpara->key_1_low = 0U; - key_initpara->key_2_high = 0U; - key_initpara->key_2_low = 0U; - key_initpara->key_3_high = 0U; - key_initpara->key_3_low = 0U; -} - -/*! - \brief initialize the vectors parameter struct with the default values - \param[in] none - \param[out] iv_initpara: - iv_0_high: init vector 0 high - iv_0_low: init vector 0 low - iv_1_high: init vector 1 high - iv_1_low: init vector 1 low - \retval none -*/ -void cau_iv_struct_para_init(cau_iv_parameter_struct *iv_initpara) -{ - /* set the vectors parameters struct with the default values */ - iv_initpara->iv_0_high = 0U; - iv_initpara->iv_0_low = 0U; - iv_initpara->iv_1_high = 0U; - iv_initpara->iv_1_low = 0U; -} - -/*! - \brief initialize the context parameter struct with the default values - \param[in] none - \param[out] cau_context: - ctl_config: current configuration - iv_0_high: init vector 0 high - iv_0_low: init vector 0 low - iv_1_high: init vector 1 high - iv_1_low: init vector 1 low - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - gcmccmctxs[8]: GCM or CCM mode context switch - gcmctxs[8]: GCM mode context switch - \retval none -*/ -void cau_context_struct_para_init(cau_context_parameter_struct *cau_context) -{ - cau_context->ctl_config = 0U; - - /* set the vectors parameters with the default values */ - cau_context->iv_0_high = 0U; - cau_context->iv_0_low = 0U; - cau_context->iv_1_high = 0U; - cau_context->iv_1_low = 0U; - - /* set the key parameters with the default values */ - cau_context->key_0_high = 0U; - cau_context->key_0_low = 0U; - cau_context->key_1_high = 0U; - cau_context->key_1_low = 0U; - cau_context->key_2_high = 0U; - cau_context->key_2_low = 0U; - cau_context->key_3_high = 0U; - cau_context->key_3_low = 0U; - - /* set the context switch with the default values */ - cau_context->gcmccmctxs[0] = 0U; - cau_context->gcmccmctxs[1] = 0U; - cau_context->gcmccmctxs[2] = 0U; - cau_context->gcmccmctxs[3] = 0U; - cau_context->gcmccmctxs[4] = 0U; - cau_context->gcmccmctxs[5] = 0U; - cau_context->gcmccmctxs[6] = 0U; - cau_context->gcmccmctxs[7] = 0U; - - cau_context->gcmctxs[0] = 0U; - cau_context->gcmctxs[1] = 0U; - cau_context->gcmctxs[2] = 0U; - cau_context->gcmctxs[3] = 0U; - cau_context->gcmctxs[4] = 0U; - cau_context->gcmctxs[5] = 0U; - cau_context->gcmctxs[6] = 0U; - cau_context->gcmctxs[7] = 0U; -} - -/*! - \brief enable the CAU peripheral - \param[in] none - \param[out] none - \retval none -*/ -void cau_enable(void) -{ - /* enable the CAU processor */ - CAU_CTL |= CAU_CTL_CAUEN; -} - -/*! - \brief disable the CAU peripheral - \param[in] none - \param[out] none - \retval none -*/ -void cau_disable(void) -{ - /* disable the CAU processor */ - CAU_CTL &= ~CAU_CTL_CAUEN; -} - -/*! - \brief enable the CAU DMA interface - \param[in] dma_req: specify the CAU DMA transfer request to be enabled - one or more parameters can be selected which are shown as below: - \arg CAU_DMA_INFIFO: DMA for incoming(Rx) data transfer - \arg CAU_DMA_OUTFIFO: DMA for outgoing(Tx) data transfer - \param[out] none - \retval none -*/ -void cau_dma_enable(uint32_t dma_req) -{ - /* enable the selected CAU DMA request */ - CAU_DMAEN |= dma_req; -} - -/*! - \brief disable the CAU DMA interface - \param[in] dma_req: specify the CAU DMA transfer request to be disabled - one or more parameters can be selected which are shown as below: - \arg CAU_DMA_INFIFO: DMA for incoming(Rx) data transfer - \arg CAU_DMA_OUTFIFO: DMA for outgoing(Tx) data transfer - \param[out] none - \retval none -*/ -void cau_dma_disable(uint32_t dma_req) -{ - /* disable the selected CAU DMA request */ - CAU_DMAEN &= ~(dma_req); -} - -/*! - \brief initialize the CAU peripheral - \param[in] alg_dir: algorithm direction - only one parameter can be selected which is shown as below: - \arg CAU_ENCRYPT: encrypt - \arg CAU_DECRYPT: decrypt - \param[in] algo_mode: algorithm mode selection - only one parameter can be selected which is shown as below: - \arg CAU_MODE_TDES_ECB: TDES-ECB (3DES Electronic codebook) - \arg CAU_MODE_TDES_CBC: TDES-CBC (3DES Cipher block chaining) - \arg CAU_MODE_DES_ECB: DES-ECB (simple DES Electronic codebook) - \arg CAU_MODE_DES_CBC: DES-CBC (simple DES Cipher block chaining) - \arg CAU_MODE_AES_ECB: AES-ECB (AES Electronic codebook) - \arg CAU_MODE_AES_CBC: AES-CBC (AES Cipher block chaining) - \arg CAU_MODE_AES_CTR: AES-CTR (AES counter mode) - \arg CAU_MODE_AES_KEY: AES decryption key preparation mode - \arg CAU_MODE_AES_GCM: AES-GCM (AES Galois/counter mode) - \arg CAU_MODE_AES_CCM: AES-CCM (AES combined cipher machine mode) - \arg CAU_MODE_AES_CFB: AES-CFB (cipher feedback mode) - \arg CAU_MODE_AES_OFB: AES-OFB (output feedback mode) - \param[in] swapping: data swapping selection - only one parameter can be selected which is shown as below: - \arg CAU_SWAPPING_32BIT: no swapping - \arg CAU_SWAPPING_16BIT: half-word swapping - \arg CAU_SWAPPING_8BIT: bytes swapping - \arg CAU_SWAPPING_1BIT: bit swapping - \param[out] none - \retval none -*/ -void cau_init(uint32_t alg_dir, uint32_t algo_mode, uint32_t swapping) -{ - /* select algorithm mode */ - CAU_CTL &= ~CAU_CTL_ALGM; - CAU_CTL |= algo_mode; - - /* select data swapping */ - CAU_CTL &= ~CAU_CTL_DATAM; - CAU_CTL |= swapping; - - /* select algorithm direction */ - CAU_CTL &= ~CAU_CTL_CAUDIR; - CAU_CTL |= alg_dir; -} - -/*! - \brief configure key size if use AES algorithm - \param[in] key_size: key length selection when aes mode - only one parameter can be selected which is shown as below: - \arg CAU_KEYSIZE_128BIT: 128 bit key length - \arg CAU_KEYSIZE_192BIT: 192 bit key length - \arg CAU_KEYSIZE_256BIT: 256 bit key length - \param[out] none - \retval none -*/ -void cau_aes_keysize_config(uint32_t key_size) -{ - CAU_CTL &= ~CAU_CTL_KEYM; - CAU_CTL |= key_size; -} - -/*! - \brief initialize the key parameters - \param[in] key_initpara: key init parameter struct - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - \param[out] none - \retval none -*/ -void cau_key_init(cau_key_parameter_struct *key_initpara) -{ - CAU_KEY0H = key_initpara->key_0_high; - CAU_KEY0L = key_initpara->key_0_low; - CAU_KEY1H = key_initpara->key_1_high; - CAU_KEY1L = key_initpara->key_1_low; - CAU_KEY2H = key_initpara->key_2_high; - CAU_KEY2L = key_initpara->key_2_low; - CAU_KEY3H = key_initpara->key_3_high; - CAU_KEY3L = key_initpara->key_3_low; -} - -/*! - \brief initialize the vectors parameters - \param[in] iv_initpara: vectors init parameter struct - iv_0_high: init vector 0 high - iv_0_low: init vector 0 low - iv_1_high: init vector 1 high - iv_1_low: init vector 1 low - \param[out] none - \retval none -*/ -void cau_iv_init(cau_iv_parameter_struct *iv_initpara) -{ - CAU_IV0H = iv_initpara->iv_0_high; - CAU_IV0L = iv_initpara->iv_0_low; - CAU_IV1H = iv_initpara->iv_1_high; - CAU_IV1L = iv_initpara->iv_1_low; -} - -/*! - \brief configure phase - \param[in] phase: gcm or ccm phase - only one parameter can be selected which is shown as below: - \arg CAU_PREPARE_PHASE: prepare phase - \arg CAU_AAD_PHASE: AAD phase - \arg CAU_ENCRYPT_DECRYPT_PHASE: encryption/decryption phase - \arg CAU_TAG_PHASE: tag phase - \param[out] none - \retval none -*/ -void cau_phase_config(uint32_t phase) -{ - uint32_t temp; - /* Get the CTL register */ - temp = CAU_CTL; - /* Reset the phase configuration bits */ - temp &= ~CAU_CTL_GCM_CCMPH; - /* Set the selected phase */ - temp |= phase; - /* Set the CTL register */ - CAU_CTL = temp; -} - -/*! - \brief flush the IN and OUT FIFOs - \param[in] none - \param[out] none - \retval none -*/ -void cau_fifo_flush(void) -{ - /* reset the read and write pointers of the FIFOs */ - CAU_CTL |= CAU_CTL_FFLUSH; -} - -/*! - \brief return whether CAU peripheral is enabled or disabled - \param[in] none - \param[out] none - \retval ControlStatus: ENABLE or DISABLE -*/ -ControlStatus cau_enable_state_get(void) -{ - ControlStatus ret = DISABLE; - if(RESET != (CAU_CTL & CAU_CTL_CAUEN)) { - ret = ENABLE; - } - return ret; -} - -/*! - \brief write data to the IN FIFO - \param[in] data: data to write (0 - 0xFFFFFFFF) - \param[out] none - \retval none -*/ -void cau_data_write(uint32_t data) -{ - CAU_DI = data; -} - -/*! - \brief return the last data entered into the output FIFO - \param[in] none - \param[out] none - \retval last data entered into the output FIFO -*/ -uint32_t cau_data_read(void) -{ - return CAU_DO; -} - -/*! - \brief save context before context switching - \param[in] key_initpara: key init parameter struct - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - \param[out] cau_context: - ctl_config: current configuration - iv_0_high: init vector 0 high - iv_0_low: init vector 0 low - iv_1_high: init vector 1 high - iv_1_low: init vector 1 low - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - gcmccmctxs[8]: GCM or CCM mode context switch - gcmctxs[8]: GCM mode context switch - \retval none -*/ -void cau_context_save(cau_context_parameter_struct *cau_context, cau_key_parameter_struct *key_initpara) -{ - uint32_t checkmask = 0U; - uint32_t checkbits = 0U; - uint32_t algm_reg = 0U; - - /* stop DMA transfers on the IN FIFO by clearing the DMAIEN bit in the CAU_DMAEN */ - CAU_DMAEN &= ~CAU_DMA_INFIFO; - - algm_reg = CAU_CTL & CAU_CTL_ALGM; - /* AES or DES */ - if((uint32_t)0 != (algm_reg & (~CAU_MODE_TDES_CBC))) { - /* wait until both the IN and OUT FIFOs are empty (IEM=1 and ONE=0 in the CAU_STAT0 register) and BUSY=0 */ - checkbits = CAU_STAT0_IEM; - checkmask = STAT0_AESDES_MASK; - /* TDES */ - } else { - /* wait until OUT FIFO is empty (ONE=0 in the CAU_STAT0 register) and BUSY=0 */ - checkbits = 0U; - checkmask = STAT0_TDES_MASK; - } - - while((CAU_STAT0 & checkmask) != checkbits) { - } - - /* stop DMA transfers on the OUT FIFO by clear CAU_DMAEN_DMAOEN=0 */ - CAU_DMAEN &= ~CAU_DMAEN_DMAOEN; - /* disable CAU */ - CAU_CTL &= ~CAU_CTL_CAUEN; - - /* save the current configuration (bit 19, bit[17:16] and bit[9:2] in the CAU_CTL register) */ - cau_context->ctl_config = CAU_CTL & (CAU_CTL_GCM_CCMPH | - CAU_CTL_KEYM | - CAU_CTL_DATAM | - CAU_CTL_ALGM | - CAU_CTL_CAUDIR | - CAU_CTL_NBPILB); - - /* save the key value */ - cau_context->key_0_high = key_initpara->key_0_high; - cau_context->key_0_low = key_initpara->key_0_low; - cau_context->key_1_high = key_initpara->key_1_high; - cau_context->key_1_low = key_initpara->key_1_low; - cau_context->key_2_high = key_initpara->key_2_high; - cau_context->key_2_low = key_initpara->key_2_low; - cau_context->key_3_high = key_initpara->key_3_high; - cau_context->key_3_low = key_initpara->key_3_low; - - if((CAU_MODE_TDES_ECB != algm_reg) && (CAU_MODE_DES_ECB != algm_reg) && (CAU_MODE_AES_ECB != algm_reg)) { - /* if not in ECB mode, save the initialization vectors */ - cau_context->iv_0_high = CAU_IV0H; - cau_context->iv_0_low = CAU_IV0L; - cau_context->iv_1_high = CAU_IV1H; - cau_context->iv_1_low = CAU_IV1L; - } - - /* if in GCM/CCM mode, save the context switch registers */ - if((CAU_MODE_AES_GCM == algm_reg) || (CAU_MODE_AES_CCM == algm_reg)) { - cau_context->gcmccmctxs[0U] = CAU_GCMCCMCTXSx(0U); - cau_context->gcmccmctxs[1U] = CAU_GCMCCMCTXSx(1U); - cau_context->gcmccmctxs[2U] = CAU_GCMCCMCTXSx(2U); - cau_context->gcmccmctxs[3U] = CAU_GCMCCMCTXSx(3U); - cau_context->gcmccmctxs[4U] = CAU_GCMCCMCTXSx(4U); - cau_context->gcmccmctxs[5U] = CAU_GCMCCMCTXSx(5U); - cau_context->gcmccmctxs[6U] = CAU_GCMCCMCTXSx(6U); - cau_context->gcmccmctxs[7U] = CAU_GCMCCMCTXSx(7U); - } - - /* if in GCM mode, save the context switch registers */ - if(CAU_MODE_AES_GCM == algm_reg) { - cau_context->gcmctxs[0U] = CAU_GCMCTXSx(0U); - cau_context->gcmctxs[1U] = CAU_GCMCTXSx(1U); - cau_context->gcmctxs[2U] = CAU_GCMCTXSx(2U); - cau_context->gcmctxs[3U] = CAU_GCMCTXSx(3U); - cau_context->gcmctxs[4U] = CAU_GCMCTXSx(4U); - cau_context->gcmctxs[5U] = CAU_GCMCTXSx(5U); - cau_context->gcmctxs[6U] = CAU_GCMCTXSx(6U); - cau_context->gcmctxs[7U] = CAU_GCMCTXSx(7U); - } -} - -/*! - \brief restore context after context switching - \param[in] cau_context: - ctl_config: current configuration - iv_0_high: init vector 0 high - iv_0_low: init vector 0 low - iv_1_high: init vector 1 high - iv_1_low: init vector 1 low - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - gcmccmctxs[8]: GCM or CCM mode context switch - gcmctxs[8]: GCM mode context switch - \param[out] none - \retval none -*/ -void cau_context_restore(cau_context_parameter_struct *cau_context) -{ - uint32_t algm_reg, aes_decrypt; - - /* configure the processor with the saved configuration */ - CAU_CTL = cau_context->ctl_config; - - algm_reg = CAU_CTL & CAU_CTL_ALGM; - - /* restore the key value */ - CAU_KEY0H = cau_context->key_0_high; - CAU_KEY0L = cau_context->key_0_low; - CAU_KEY1H = cau_context->key_1_high; - CAU_KEY1L = cau_context->key_1_low; - CAU_KEY2H = cau_context->key_2_high; - CAU_KEY2L = cau_context->key_2_low; - CAU_KEY3H = cau_context->key_3_high; - CAU_KEY3L = cau_context->key_3_low; - - if((CAU_MODE_TDES_ECB != algm_reg) && (CAU_MODE_DES_ECB != algm_reg) && (CAU_MODE_AES_ECB != algm_reg)) { - /* restore the initialization vectors */ - CAU_IV0H = cau_context->iv_0_high; - CAU_IV0L = cau_context->iv_0_low; - CAU_IV1H = cau_context->iv_1_high; - CAU_IV1L = cau_context->iv_1_low; - } - - /* if in GCM/CCM mode, restore the context switch registers */ - if((CAU_MODE_AES_GCM == algm_reg) || (CAU_MODE_AES_CCM == algm_reg)) { - CAU_GCMCCMCTXSx(0U) = cau_context->gcmccmctxs[0U]; - CAU_GCMCCMCTXSx(1U) = cau_context->gcmccmctxs[1U]; - CAU_GCMCCMCTXSx(2U) = cau_context->gcmccmctxs[2U]; - CAU_GCMCCMCTXSx(3U) = cau_context->gcmccmctxs[3U]; - CAU_GCMCCMCTXSx(4U) = cau_context->gcmccmctxs[4U]; - CAU_GCMCCMCTXSx(5U) = cau_context->gcmccmctxs[5U]; - CAU_GCMCCMCTXSx(6U) = cau_context->gcmccmctxs[6U]; - CAU_GCMCCMCTXSx(7U) = cau_context->gcmccmctxs[7U]; - } - - /* if in GCM mode, restore the context switch registers */ - if(CAU_MODE_AES_GCM == algm_reg) { - CAU_GCMCTXSx(0U) = cau_context->gcmctxs[0U]; - CAU_GCMCTXSx(1U) = cau_context->gcmctxs[1U]; - CAU_GCMCTXSx(2U) = cau_context->gcmctxs[2U]; - CAU_GCMCTXSx(3U) = cau_context->gcmctxs[3U]; - CAU_GCMCTXSx(4U) = cau_context->gcmctxs[4U]; - CAU_GCMCTXSx(5U) = cau_context->gcmctxs[5U]; - CAU_GCMCTXSx(6U) = cau_context->gcmctxs[6U]; - CAU_GCMCTXSx(7U) = cau_context->gcmctxs[7U]; - } - - /* if it is AES ECB/CBC decryption, then first prepare key */ - aes_decrypt = CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR); - if(((CAU_MODE_AES_ECB | CAU_DECRYPT) == aes_decrypt) || ((CAU_MODE_AES_CBC | CAU_DECRYPT) == aes_decrypt)) { - uint32_t alg_dir, algo_mode, swapping; - - /* flush IN/OUT FIFOs */ - cau_fifo_flush(); - /* parameters for key preparation for AES decryption */ - alg_dir = CAU_DECRYPT; - algo_mode = CAU_MODE_AES_KEY; - swapping = CAU_SWAPPING_32BIT; - cau_init(alg_dir, algo_mode, swapping); - - /* enable CAU */ - cau_enable(); - - /* wait until BUSY=0 */ - while((uint32_t)0U != cau_flag_get(CAU_FLAG_BUSY)) { - } - - /* parameters for decryption */ - CAU_CTL = cau_context->ctl_config; - } - - /* enable CAU */ - cau_enable(); -} - -/*! - \brief get the CAU flag status - \param[in] flag: CAU flag status - only one parameter can be selected which is shown as below: - \arg CAU_FLAG_INFIFO_EMPTY: input FIFO empty - \arg CAU_FLAG_INFIFO_NO_FULL: input FIFO is not full - \arg CAU_FLAG_OUTFIFO_NO_EMPTY: output FIFO not empty - \arg CAU_FLAG_OUTFIFO_FULL: output FIFO is full - \arg CAU_FLAG_BUSY: the CAU core is busy - \arg CAU_FLAG_INFIFO: input FIFO flag status - \arg CAU_FLAG_OUTFIFO: output FIFO flag status - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus cau_flag_get(uint32_t flag) -{ - uint32_t reg = 0U; - FlagStatus ret_flag = RESET; - - /* check if the flag is in CAU_STAT1 register */ - if(1U == (flag >> 31U)) { - reg = CAU_STAT1; - } else { - /* the flag is in CAU_STAT0 register */ - reg = CAU_STAT0; - } - - /* check the status of the specified CAU flag */ - if(0U != (reg & flag)) { - ret_flag = SET; - } - - return ret_flag; -} - -/*! - \brief enable the CAU interrupts - \param[in] interrupt: specify the CAU interrupt source to be enabled - one or more parameters can be selected which are shown as below: - \arg CAU_INT_INFIFO: input FIFO interrupt - \arg CAU_INT_OUTFIFO: output FIFO interrupt - \param[out] none - \retval none -*/ -void cau_interrupt_enable(uint32_t interrupt) -{ - /* enable the selected CAU interrupt */ - CAU_INTEN |= interrupt; -} - -/*! - \brief disable the CAU interrupts - \param[in] interrupt: specify the CAU interrupt source to be disabled - one or more parameters can be selected which are shown as below: - \arg CAU_INT_INFIFO: input FIFO interrupt - \arg CAU_INT_OUTFIFO: output FIFO interrupt - \param[out] none - \retval none -*/ -void cau_interrupt_disable(uint32_t interrupt) -{ - /* disable the selected CAU interrupt */ - CAU_INTEN &= ~(interrupt); -} - -/*! - \brief get the interrupt flag - \param[in] interrupt: CAU interrupt flag - only one parameter can be selected which is shown as below: - \arg CAU_INT_FLAG_INFIFO: input FIFO interrupt - \arg CAU_INT_FLAG_OUTFIFO: output FIFO interrupt - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus cau_interrupt_flag_get(uint32_t interrupt) -{ - FlagStatus flag = RESET; - - /* check the status of the specified CAU interrupt */ - if(RESET != (CAU_INTF & interrupt)) { - flag = SET; - } - - return flag; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c deleted file mode 100644 index 51b731121ff..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_aes.c +++ /dev/null @@ -1,915 +0,0 @@ -/*! - \file gd32f5xx_cau_aes.c - \brief CAU AES driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_cau.h" -#include "string.h" - -#define AESBSY_TIMEOUT ((uint32_t)0x00010000U) -#define BLOCK_B0_MASK ((uint8_t)0x07U) -#define BLOCK_DATA_SIZE 16U -#define MAX_CCM_IV_SIZE 15U - -/* configure AES key structure parameter */ -static void cau_aes_key_config(uint8_t *key, uint32_t keysize, cau_key_parameter_struct *cau_key_initpara); -/* fill data into data input register */ -static ErrStatus cau_fill_data(uint8_t *input, uint32_t in_length); -/* AES calculate process */ -static ErrStatus cau_aes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); - -/*! - \brief encrypt and decrypt using AES in ECB mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* AES decryption */ - if(CAU_DECRYPT == cau_parameter->alg_dir) { - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* initialize the CAU peripheral */ - cau_init(CAU_DECRYPT, CAU_MODE_AES_KEY, CAU_SWAPPING_32BIT); - - /* enable the CAU peripheral */ - cau_enable(); - - /* wait until the busy flag is RESET */ - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } - } - - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_ECB, CAU_SWAPPING_8BIT); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - - /* enable the CAU peripheral */ - cau_enable(); - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in CBC mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - iv: initialization vector, 16 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* AES decryption */ - if(CAU_DECRYPT == cau_parameter->alg_dir) { - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* initialize the CAU peripheral */ - cau_init(CAU_DECRYPT, CAU_MODE_AES_KEY, CAU_SWAPPING_32BIT); - - /* enable the CAU peripheral */ - cau_enable(); - - /* wait until the busy flag is RESET */ - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } - } - - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CBC, CAU_SWAPPING_8BIT); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - - /* enable the CAU peripheral */ - cau_enable(); - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in CTR mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - iv: initialization vector, 16 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_ctr(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CTR, CAU_SWAPPING_8BIT); - - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - - /* enable the CAU peripheral */ - cau_enable(); - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in CFB mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - iv: initialization vector, 16 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_cfb(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CFB, CAU_SWAPPING_8BIT); - - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in OFB mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - iv: initialization vector, 16 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_ofb(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_OFB, CAU_SWAPPING_8BIT); - - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in GCM mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bits, must be either 128, 192 or 256 - iv: initialization vector, 16 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 16 bytes - aad: additional authentication data - aad_size: aad size in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned output data buffer - \param[out] tag: pointer to the returned tag buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_gcm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t *tag) -{ - ErrStatus ret = SUCCESS; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint64_t aadlength = (uint64_t)cau_parameter->aad_size * 8U; - uint64_t inputlength = (uint64_t)cau_parameter->in_length * 8U; - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - uint32_t tagaddr = (uint32_t)tag; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_GCM, CAU_SWAPPING_8BIT); - - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* prepare phase */ - /* select prepare phase */ - cau_phase_config(CAU_PREPARE_PHASE); - /* enable the CAU peripheral */ - cau_enable(); - /* wait for CAUEN bit to be 0 */ - while(ENABLE == cau_enable_state_get()) { - } - - /* aad phase */ - if((uint32_t)0U != cau_parameter->aad_size) { - /* select aad phase */ - cau_phase_config(CAU_AAD_PHASE); - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - - ret = cau_fill_data(cau_parameter->aad, cau_parameter->aad_size); - - if(ERROR == ret) { - return ret; - } - } - - /* encrypt or dcrypt phase */ - if((uint32_t)0U != cau_parameter->in_length) { - /* select encrypt or dcrypt phase */ - cau_phase_config(CAU_ENCRYPT_DECRYPT_PHASE); - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - - /* AES calculate process */ - ret = cau_aes_calculate(cau_parameter->input, cau_parameter->in_length, output); - - if(ERROR == ret) { - return ret; - } - } - - /* tag phase */ - /* select tag phase */ - cau_phase_config(CAU_TAG_PHASE); - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - cau_data_write(__REV((uint32_t)(aadlength >> 32U))); - cau_data_write(__REV((uint32_t)aadlength)); - cau_data_write(__REV((uint32_t)(inputlength >> 32U))); - cau_data_write(__REV((uint32_t)inputlength)); - - /* wait until the ONE flag is set */ - while(RESET == cau_flag_get(CAU_FLAG_OUTFIFO_NO_EMPTY)) { - } - - /* read the tag in the OUT FIFO */ - *(uint32_t *)(tagaddr) = cau_data_read(); - tagaddr += 4U; - *(uint32_t *)(tagaddr) = cau_data_read(); - tagaddr += 4U; - *(uint32_t *)(tagaddr) = cau_data_read(); - tagaddr += 4U; - *(uint32_t *)(tagaddr) = cau_data_read(); - tagaddr += 4U; - - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using AES in CCM mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key - key_size: key size in bytes - iv: initialization vector - iv_size: iv size in bytes - input: input data - in_length: input data length in bytes - aad: additional authentication data - aad_size: aad size - \param[in] mac_size: mac size (in bytes) - \param[out] output: pointer to the returned output data buffer - \param[out] tag: pointer to the returned tag buffer - \param[out] aad_buf: pointer to the user buffer used when formatting aad block - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_aes_ccm(cau_parameter_struct *cau_parameter, uint8_t *output, uint8_t tag[], uint32_t tag_size, - uint8_t aad_buf[]) -{ - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - ErrStatus ret = ERROR; - uint32_t inputaddr = (uint32_t)cau_parameter->input; - uint32_t inputsize = cau_parameter->in_length; - uint32_t aadaddr = (uint32_t)cau_parameter->aad; - uint32_t aadsize = cau_parameter->aad_size; - uint32_t aad_block_size = 0U; - uint32_t ivaddr = (uint32_t)cau_parameter->iv; - uint32_t ivsize = cau_parameter->iv_size; - uint32_t outputaddr = (uint32_t)output; - uint32_t i = 0U, plen = 0U; - uint32_t head_index = 0U; - uint8_t blockb0[16U] = {0U}; - uint8_t counter[16U] = {0U}; - uint32_t ctraddr = (uint32_t)counter; - uint32_t b0addr = (uint32_t)blockb0; - uint32_t temp_tag[4U]; - - /* formatting the aad block */ - if((uint32_t)0U != aadsize) { - /* check that the aad length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ - if(aadsize < 65280U) { - aad_buf[head_index++] = (uint8_t)((aadsize >> 8U) & 0xFFU); - aad_buf[head_index++] = (uint8_t)((aadsize) & 0xFFU); - aad_block_size = aadsize + 2U; - } else { - /* aad is encoded as 0xFF || 0xFE || [aadsize]32, i.e., six octets */ - aad_buf[head_index++] = 0xFFU; - aad_buf[head_index++] = 0xFEU; - aad_buf[head_index++] = (uint8_t)((aadsize & 0xFF000000U) >> 24U); - aad_buf[head_index++] = (uint8_t)((aadsize & 0x00FF0000U) >> 16U); - aad_buf[head_index++] = (uint8_t)((aadsize & 0x0000FF00U) >> 8U); - aad_buf[head_index++] = (uint8_t)(aadsize & 0x000000FFU); - aad_block_size = aadsize + 6U; - } - /* copy the aad buffer in internal buffer "HBuffer" */ - for(i = 0U; i < aadsize; i++) { - aad_buf[head_index++] = *(uint8_t *)((uint32_t)(aadaddr + i)); - } - /* check if the aad block size is modulo 16 */ - if(0U != (aad_block_size % 16U)) { - /* Padd the aad buffer with 0s till the HBuffer length is modulo 16 */ - for(i = aad_block_size; i <= ((aad_block_size / 16U) + 1U) * 16U; i++) { - aad_buf[i] = 0U; - } - /* set the aad size to modulo 16 */ - aad_block_size = ((aad_block_size / 16U) + 1U) * 16U; - } - /* set the pointer aadaddr to HBuffer */ - aadaddr = (uint32_t)aad_buf; - } - - /* formatting the block B0 */ - if(0U != aadsize) { - blockb0[0] = 0x40U; - } - /* flags byte */ - blockb0[0] |= (0U | (((((uint8_t) tag_size - 2U) / 2U) & 0x07U) << 3U) | (((uint8_t)(15U - ivsize) - 1U) & 0x07U)); - - if(ivsize > MAX_CCM_IV_SIZE) { - return ERROR; - } - - for(i = 0U; i < ivsize; i++) { - blockb0[i + 1U] = *(uint8_t *)((uint32_t)(ivaddr + i)); - } - - /* the byte length for payload length expressing, which plus the ivsize must equal to 15 bytes */ - plen = 15U - ivsize; - /* if the byte length for payload length expressing is more than 4 bytes */ - if(plen > 4U) { - /* pad the blockb0 after vectors, and before the last 4 bytes */ - for(; i < 11U; i++) { - blockb0[i + 1U] = 0U; - } - blockb0[12U] = (uint8_t)((inputsize >> 24U) & 0xFFU); - blockb0[13U] = (uint8_t)((inputsize >> 16U) & 0xFFU); - blockb0[14U] = (uint8_t)((inputsize >> 8U) & 0xFFU); - blockb0[15U] = (uint8_t)(inputsize & 0xFFU); - } else { - /* the payload length is expressed in plen bytes */ - for(; i < 15U; i++) { - blockb0[i + 1U] = (uint8_t)((inputsize >> ((plen - 1U) * 8U)) & 0xFFU); - plen--; - } - } - - /* formatting the initial counter */ - /* byte 0: bits 0-2 contain the same encoding of q as in B0 */ - counter[0] = blockb0[0] & BLOCK_B0_MASK; - for(i = 1U; i < ivsize + 1U; i++) { - counter[i] = blockb0[i]; - } - /* set the LSB to 1 */ - counter[15] |= 0x01U; - - /* prepare phase */ - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* clear CAUEN bit to ensure CAU is disable */ - cau_disable(); - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_AES_CCM, CAU_SWAPPING_8BIT); - /* select prepare phase */ - cau_phase_config(CAU_PREPARE_PHASE); - - /* AES key structure parameter config */ - cau_aes_key_config(cau_parameter->key, cau_parameter->key_size, &key_initpara); - /* key initialization */ - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - iv_initpara.iv_1_high = __REV(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - iv_initpara.iv_1_low = __REV(*(uint32_t *)(ctraddr)); - cau_iv_init(&iv_initpara); - - /* enable the CAU peripheral */ - cau_enable(); - - /* write block B0 in the In FIFO */ - cau_data_write(*(uint32_t *)(b0addr)); - b0addr += 4U; - cau_data_write(*(uint32_t *)(b0addr)); - b0addr += 4U; - cau_data_write(*(uint32_t *)(b0addr)); - b0addr += 4U; - cau_data_write(*(uint32_t *)(b0addr)); - - /* wait for CAUEN bit to be 0 */ - while(ENABLE == cau_enable_state_get()) { - } - - /* aad phase */ - if((uint32_t)0U != aadsize) { - /* select aad phase */ - cau_phase_config(CAU_AAD_PHASE); - /* enable the CAU peripheral */ - cau_enable(); - - ret = cau_fill_data((uint8_t *)aadaddr, aad_block_size); - - if(ERROR == ret) { - return ret; - } - } - - /* encrypt or dcrypt phase */ - inputsize = cau_parameter->in_length; - - if((uint32_t)0U != inputsize) { - /* select encrypt or dcrypt phase */ - cau_phase_config(CAU_ENCRYPT_DECRYPT_PHASE); - /* enable the CAU peripheral */ - cau_enable(); - - /* AES calculate process */ - ret = cau_aes_calculate((uint8_t *)inputaddr, inputsize, (uint8_t *)outputaddr); - - if(ERROR == ret) { - return ret; - } - } - - /* tag phase */ - /* select final phase */ - cau_phase_config(CAU_TAG_PHASE); - /* enable the CAU peripheral */ - cau_enable(); - - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - ctraddr = (uint32_t)counter; - - cau_data_write(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - cau_data_write(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - cau_data_write(*(uint32_t *)(ctraddr)); - ctraddr += 4U; - /* reset bit 0 (after 8-bit swap) is equivalent to reset bit 24 (before 8-bit swap) */ - cau_data_write(*(uint32_t *)(ctraddr) & 0xFEFFFFFFU); - - /* wait until the ONE flag is set */ - while(RESET == cau_flag_get(CAU_FLAG_OUTFIFO_NO_EMPTY)) { - } - - /* read the tag in the OUT FIFO */ - temp_tag[0] = cau_data_read(); - temp_tag[1] = cau_data_read(); - temp_tag[2] = cau_data_read(); - temp_tag[3] = cau_data_read(); - - /* disable the CAU peripheral */ - cau_disable(); - - /* Copy temporary authentication TAG in user TAG buffer */ - for(i = 0U; i < tag_size; i++) { - tag[i] = (uint8_t)(temp_tag[i / 4U] >> (8U * (i % 4U))); - } - - return ret; -} -/*! - \brief AES key structure parameter config - \param[in] key: key used for AES algorithm - \param[in] keysize: length of the key in bits, must be either 128, 192 or 256 - \param[out] cau_key_initpara: key init parameter struct - key_0_high: key 0 high - key_0_low: key 0 low - key_1_high: key 1 high - key_1_low: key 1 low - key_2_high: key 2 high - key_2_low: key 2 low - key_3_high: key 3 high - key_3_low: key 3 low - \retval none -*/ -static void cau_aes_key_config(uint8_t *key, uint32_t keysize, cau_key_parameter_struct *cau_key_initpara) -{ - uint32_t keyaddr = (uint32_t)key; - - switch(keysize) { - case 128: - cau_aes_keysize_config(CAU_KEYSIZE_128BIT); - cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); - break; - case 192: - cau_aes_keysize_config(CAU_KEYSIZE_192BIT); - cau_key_initpara->key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_1_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); - break; - case 256: - cau_aes_keysize_config(CAU_KEYSIZE_256BIT); - cau_key_initpara->key_0_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_0_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_1_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_2_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_2_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - cau_key_initpara->key_3_low = __REV(*(uint32_t *)(keyaddr)); - break; - default: - break; - } -} - -/*! - \brief fill data into data input register - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer in bytes, must be a multiple of 16 bytes - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus cau_fill_data(uint8_t *input, uint32_t in_length) -{ - uint32_t inputaddr = (uint32_t)input; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - for(i = 0U; i < in_length; i += BLOCK_DATA_SIZE) { - /* wait until the IEM flag is set */ - while(RESET == cau_flag_get(CAU_FLAG_INFIFO_EMPTY)) { - } - - if(i + BLOCK_DATA_SIZE > in_length) { - /* the last block data number is less than 128bit */ - uint32_t block_data_temp[4] = {0U}; - - /* fill the remaining bits with zero */ - memcpy(block_data_temp, (uint32_t *)inputaddr, in_length - i); - inputaddr = (uint32_t)block_data_temp; - - /* if GCM encryption or CCM decryption, then configurate NBPILB bits in CTL register */ - if((CAU_CTL & CAU_CTL_GCM_CCMPH) == CAU_ENCRYPT_DECRYPT_PHASE) { - if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_GCM | CAU_ENCRYPT)) { - CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); - } else if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_CCM | CAU_DECRYPT)) { - CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); - } else { - } - } - } - - /* write data to the IN FIFO */ - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - } - /* wait until the complete message has been processed */ - counter = 0U; - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } - - return SUCCESS; -} - -/*! - \brief AES calculate process - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer in bytes, must be a multiple of 16 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus cau_aes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) -{ - uint32_t inputaddr = (uint32_t)input; - uint32_t outputaddr = (uint32_t)output; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - /* the clock is not enabled or there is no embeded CAU peripheral */ - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - for(i = 0U; i < in_length; i += BLOCK_DATA_SIZE) { - /* wait until the IEM flag is set */ - while(RESET == cau_flag_get(CAU_FLAG_INFIFO_EMPTY)) { - } - - /* check if the last input data block */ - if(i + BLOCK_DATA_SIZE > in_length) { - /* the last block data number is less than 128bit */ - uint32_t block_data_temp[4] = {0}; - - /* fill the remaining bits with zero */ - memcpy(block_data_temp, (uint32_t *)inputaddr, in_length - i); - inputaddr = (uint32_t)block_data_temp; - - /* if GCM encryption or CCM decryption, then configurate NBPILB bits in CTL register */ - if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_GCM | CAU_ENCRYPT)) { - CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); - } else if((CAU_CTL & (CAU_CTL_ALGM | CAU_CTL_CAUDIR)) == (CAU_MODE_AES_CCM | CAU_DECRYPT)) { - CAU_CTL |= CAU_PADDING_BYTES(i + BLOCK_DATA_SIZE - in_length); - } else { - } - } - - /* write data to the IN FIFO */ - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - - /* wait until the complete message has been processed */ - counter = 0U; - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((AESBSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } else { - /* read the output block from the output FIFO */ - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - } - } - - return SUCCESS; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c deleted file mode 100644 index 22c72fe99cd..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_des.c +++ /dev/null @@ -1,183 +0,0 @@ -/*! - \file gd32f5xx_cau_des.c - \brief CAU DES driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_cau.h" - -#define DESBUSY_TIMEOUT ((uint32_t)0x00010000U) - -/* DES calculate process */ -static ErrStatus cau_des_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); - -/*! - \brief encrypt and decrypt using DES in ECB mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key, 8 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 8 bytes - \param[out] output: pointer to the output buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_des_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - uint32_t keyaddr = (uint32_t)(cau_parameter->key); - uint32_t inputaddr = (uint32_t)(cau_parameter->input); - uint32_t outputaddr = (uint32_t)output; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_DES_ECB, CAU_SWAPPING_8BIT); - - /* key initialisation */ - key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); - cau_key_init(&key_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - /* DES calculate process */ - ret = cau_des_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using DES in CBC mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key, 8 bytes - iv: initialization vector, 8 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 8 bytes - \param[out] output: pointer to the output structure - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_des_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint32_t keyaddr = (uint32_t)(cau_parameter->key); - uint32_t inputaddr = (uint32_t)(cau_parameter->input); - uint32_t outputaddr = (uint32_t)output; - uint32_t ivaddr = (uint32_t)(cau_parameter->iv); - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_DES_CBC, CAU_SWAPPING_8BIT); - - /* key initialisation */ - key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - - /* enable the CAU peripheral */ - cau_enable(); - /* DES calculate process */ - ret = cau_des_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief DES calculate process - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer in bytes, must be a multiple of 8 bytes - \param[in] output: pointer to the returned buffer - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus cau_des_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) -{ - uint32_t inputaddr = (uint32_t)input; - uint32_t outputaddr = (uint32_t)output; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - /* the clock is not enabled or there is no embeded CAU peripheral */ - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - for(i = 0U; i < in_length; i += 8U) { - /* write data to the IN FIFO */ - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - - /* wait until the complete message has been processed */ - counter = 0U; - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((DESBUSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } else { - /* read the output block from the output FIFO */ - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - } - } - - return SUCCESS; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c deleted file mode 100644 index 02558f85eb6..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau_tdes.c +++ /dev/null @@ -1,198 +0,0 @@ -/*! - \file gd32f5xx_cau_tdes.c - \brief CAU TDES driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_cau.h" - -#define TDESBSY_TIMEOUT ((uint32_t)0x00010000U) - -/* TDES calculate process */ -static ErrStatus cau_tdes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output); - -/*! - \brief encrypt and decrypt using TDES in ECB mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key, 24 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 8 bytes - \param[out] output: pointer to the output structure - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_tdes_ecb(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - uint32_t keyaddr = (uint32_t)(cau_parameter->key); - uint32_t inputaddr = (uint32_t)(cau_parameter->input); - uint32_t outputaddr = (uint32_t)output; - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_TDES_ECB, CAU_SWAPPING_8BIT); - - /* key initialization */ - key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_2_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_2_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_3_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_3_low = __REV(*(uint32_t *)(keyaddr)); - cau_key_init(&key_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - - /* enable the CAU peripheral */ - cau_enable(); - /* TDES calculate process */ - ret = cau_tdes_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief encrypt and decrypt using TDES in CBC mode - \param[in] cau_parameter: pointer to the input structure - alg_dir: algorithm direction - CAU_ENCRYPT, CAU_DECRYPT - key: key, 24 bytes - iv: initialization vector, 8 bytes - input: input data - in_length: input data length in bytes, must be a multiple of 8 bytes - \param[out] output: pointer to the output structure - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus cau_tdes_cbc(cau_parameter_struct *cau_parameter, uint8_t *output) -{ - ErrStatus ret = ERROR; - cau_key_parameter_struct key_initpara; - cau_iv_parameter_struct iv_initpara; - uint32_t keyaddr = (uint32_t)(cau_parameter->key); - uint32_t inputaddr = (uint32_t)(cau_parameter->input); - uint32_t outputaddr = (uint32_t)output; - uint32_t ivaddr = (uint32_t)(cau_parameter->iv); - - /* key structure initialization */ - cau_key_struct_para_init(&key_initpara); - /* initialize the CAU peripheral */ - cau_init(cau_parameter->alg_dir, CAU_MODE_TDES_CBC, CAU_SWAPPING_8BIT); - - /* key initialization */ - key_initpara.key_1_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_1_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_2_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_2_low = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_3_high = __REV(*(uint32_t *)(keyaddr)); - keyaddr += 4U; - key_initpara.key_3_low = __REV(*(uint32_t *)(keyaddr)); - cau_key_init(&key_initpara); - - /* vectors initialization */ - iv_initpara.iv_0_high = __REV(*(uint32_t *)(ivaddr)); - ivaddr += 4U; - iv_initpara.iv_0_low = __REV(*(uint32_t *)(ivaddr)); - cau_iv_init(&iv_initpara); - - /* flush the IN and OUT FIFOs */ - cau_fifo_flush(); - /* enable the CAU peripheral */ - cau_enable(); - /* TDES calculate process */ - ret = cau_tdes_calculate((uint8_t *)inputaddr, cau_parameter->in_length, (uint8_t *)outputaddr); - /* disable the CAU peripheral */ - cau_disable(); - - return ret; -} - -/*! - \brief TDES calculate process - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer in bytes, must be a multiple of 8 bytes - \param[out] output: pointer to the returned buffer - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus cau_tdes_calculate(uint8_t *input, uint32_t in_length, uint8_t *output) -{ - uint32_t inputaddr = (uint32_t)input; - uint32_t outputaddr = (uint32_t)output; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - - /* the clock is not enabled or there is no embeded CAU peripheral */ - if(DISABLE == cau_enable_state_get()) { - return ERROR; - } - - for(i = 0U; i < in_length; i += 8U) { - /* write data to the IN FIFO */ - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - cau_data_write(*(uint32_t *)(inputaddr)); - inputaddr += 4U; - - /* wait until the complete message has been processed */ - counter = 0U; - do { - busystatus = cau_flag_get(CAU_FLAG_BUSY); - counter++; - } while((TDESBSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus) { - return ERROR; - } else { - /* read the output block from the output FIFO */ - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - *(uint32_t *)(outputaddr) = cau_data_read(); - outputaddr += 4U; - } - } - - return SUCCESS; -} \ No newline at end of file diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c deleted file mode 100644 index 51507eb4fca..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_crc.c +++ /dev/null @@ -1,127 +0,0 @@ -/*! - \file gd32f5xx_crc.c - \brief CRC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_crc.h" - -#define CRC_DATA_RESET_VALUE ((uint32_t)0xFFFFFFFFU) -#define CRC_FDATA_RESET_VALUE ((uint32_t)0x00000000U) - -/*! - \brief deinit CRC calculation unit - \param[in] none - \param[out] none - \retval none -*/ -void crc_deinit(void) -{ - CRC_DATA = CRC_DATA_RESET_VALUE; - CRC_FDATA = CRC_FDATA_RESET_VALUE; - CRC_CTL = (uint32_t)CRC_CTL_RST; -} - -/*! - \brief reset data register(CRC_DATA) to the value of 0xFFFFFFFF - \param[in] none - \param[out] none - \retval none -*/ -void crc_data_register_reset(void) -{ - CRC_CTL |= (uint32_t)CRC_CTL_RST; -} - -/*! - \brief read the value of the data register - \param[in] none - \param[out] none - \retval 32-bit value of the data register,0-0xFFFFFFFF -*/ -uint32_t crc_data_register_read(void) -{ - uint32_t data; - data = CRC_DATA; - return (data); -} - -/*! - \brief read the value of the free data register - \param[in] none - \param[out] none - \retval 8-bit value of the free data register,0-0xFF -*/ -uint8_t crc_free_data_register_read(void) -{ - uint8_t fdata; - fdata = (uint8_t)CRC_FDATA; - return (fdata); -} - -/*! - \brief write data to the free data register - \param[in] free_data: specified 8-bit data - \param[out] none - \retval none -*/ -void crc_free_data_register_write(uint8_t free_data) -{ - CRC_FDATA = (uint32_t)free_data; -} - -/*! - \brief calculate the CRC value of a 32-bit data - \param[in] sdata: specified 32-bit data - \param[out] none - \retval 32-bit value calculated by CRC,0-0xFFFFFFFF -*/ -uint32_t crc_single_data_calculate(uint32_t sdata) -{ - CRC_DATA = sdata; - return (CRC_DATA); -} - -/*! - \brief calculate the CRC value of an array of 32-bit values - \param[in] array: pointer to an array of 32-bit values - \param[in] size: size of the array - \param[out] none - \retval 32-bit value calculated by CRC,0-0xFFFFFFFF -*/ -uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size) -{ - uint32_t index; - for(index = 0U; index < size; index++) { - CRC_DATA = array[index]; - } - return (CRC_DATA); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c deleted file mode 100644 index e14c0a1d936..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ctc.c +++ /dev/null @@ -1,388 +0,0 @@ -/*! - \file gd32f5xx_ctc.c - \brief CTC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_ctc.h" - -#define CTC_FLAG_MASK ((uint32_t)0x00000700U) - -/* CTC register bit offset */ -#define CTC_TRIMVALUE_OFFSET ((uint32_t)8U) -#define CTC_TRIM_VALUE_OFFSET ((uint32_t)8U) -#define CTC_REFCAP_OFFSET ((uint32_t)16U) -#define CTC_LIMIT_VALUE_OFFSET ((uint32_t)16U) - -/*! - \brief reset CTC clock trim controller - \param[in] none - \param[out] none - \retval none -*/ -void ctc_deinit(void) -{ - /* reset CTC */ - rcu_periph_reset_enable(RCU_CTCRST); - rcu_periph_reset_disable(RCU_CTCRST); -} - -/*! - \brief enable CTC trim counter - \param[in] none - \param[out] none - \retval none -*/ -void ctc_counter_enable(void) -{ - CTC_CTL0 |= (uint32_t)CTC_CTL0_CNTEN; -} - -/*! - \brief disable CTC trim counter - \param[in] none - \param[out] none - \retval none -*/ -void ctc_counter_disable(void) -{ - CTC_CTL0 &= (uint32_t)(~CTC_CTL0_CNTEN); -} - -/*! - \brief configure the IRC48M trim value - \param[in] ctc_trim_value: 8-bit IRC48M trim value - \arg 0x00 - 0x3F - \param[out] none - \retval none -*/ -void ctc_irc48m_trim_value_config(uint8_t trim_value) -{ - /* clear TRIMVALUE bits */ - CTC_CTL0 &= (~(uint32_t)CTC_CTL0_TRIMVALUE); - /* set TRIMVALUE bits */ - CTC_CTL0 |= ((uint32_t)trim_value << CTC_TRIM_VALUE_OFFSET); -} - -/*! - \brief generate software reference source sync pulse - \param[in] none - \param[out] none - \retval none -*/ -void ctc_software_refsource_pulse_generate(void) -{ - CTC_CTL0 |= (uint32_t)CTC_CTL0_SWREFPUL; -} - -/*! - \brief configure hardware automatically trim mode - \param[in] hardmode: - only one parameter can be selected which is shown as below: - \arg CTC_HARDWARE_TRIM_MODE_ENABLE: hardware automatically trim mode enable - \arg CTC_HARDWARE_TRIM_MODE_DISABLE: hardware automatically trim mode disable - \param[out] none - \retval none -*/ -void ctc_hardware_trim_mode_config(uint32_t hardmode) -{ - CTC_CTL0 &= (uint32_t)(~CTC_CTL0_AUTOTRIM); - CTC_CTL0 |= (uint32_t)hardmode; -} - -/*! - \brief configure reference signal source polarity - \param[in] polarity: - only one parameter can be selected which is shown as below: - \arg CTC_REFSOURCE_POLARITY_FALLING: reference signal source polarity is falling edge - \arg CTC_REFSOURCE_POLARITY_RISING: reference signal source polarity is rising edge - \param[out] none - \retval none -*/ -void ctc_refsource_polarity_config(uint32_t polarity) -{ - CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPOL); - CTC_CTL1 |= (uint32_t)polarity; -} - -/*! - \brief select reference signal source - \param[in] refs: - only one parameter can be selected which is shown as below: - \arg CTC_REFSOURCE_GPIO: GPIO is selected - \arg CTC_REFSOURCE_LXTAL: LXTAL is selected - \param[out] none - \retval none -*/ -void ctc_refsource_signal_select(uint32_t refs) -{ - CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFSEL); - CTC_CTL1 |= (uint32_t)refs; -} - -/*! - \brief configure reference signal source prescaler - \param[in] prescaler: - only one parameter can be selected which is shown as below: - \arg CTC_REFSOURCE_PSC_OFF: reference signal not divided - \arg CTC_REFSOURCE_PSC_DIV2: reference signal divided by 2 - \arg CTC_REFSOURCE_PSC_DIV4: reference signal divided by 4 - \arg CTC_REFSOURCE_PSC_DIV8: reference signal divided by 8 - \arg CTC_REFSOURCE_PSC_DIV16: reference signal divided by 16 - \arg CTC_REFSOURCE_PSC_DIV32: reference signal divided by 32 - \arg CTC_REFSOURCE_PSC_DIV64: reference signal divided by 64 - \arg CTC_REFSOURCE_PSC_DIV128: reference signal divided by 128 - \param[out] none - \retval none -*/ -void ctc_refsource_prescaler_config(uint32_t prescaler) -{ - CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPSC); - CTC_CTL1 |= (uint32_t)prescaler; -} - -/*! - \brief configure clock trim base limit value - \param[in] limit_value: 8-bit clock trim base limit value - \arg 0x00 - 0xFF - \param[out] none - \retval none -*/ -void ctc_clock_limit_value_config(uint8_t limit_value) -{ - CTC_CTL1 &= (uint32_t)(~CTC_CTL1_CKLIM); - CTC_CTL1 |= (uint32_t)((uint32_t)limit_value << CTC_LIMIT_VALUE_OFFSET); -} - -/*! - \brief configure CTC counter reload value - \param[in] reload_value: 16-bit CTC counter reload value - \arg 0x0000 - 0xFFFF - \param[out] none - \retval none -*/ -void ctc_counter_reload_value_config(uint16_t reload_value) -{ - CTC_CTL1 &= (uint32_t)(~CTC_CTL1_RLVALUE); - CTC_CTL1 |= (uint32_t)reload_value; -} - -/*! - \brief read CTC counter capture value when reference sync pulse occurred - \param[in] none - \param[out] none - \retval the 16-bit CTC counter capture value -*/ -uint16_t ctc_counter_capture_value_read(void) -{ - uint16_t capture_value = 0U; - capture_value = (uint16_t)((CTC_STAT & CTC_STAT_REFCAP) >> CTC_REFCAP_OFFSET); - return (capture_value); -} - -/*! - \brief read CTC trim counter direction when reference sync pulse occurred - \param[in] none - \param[out] none - \retval FlagStatus: SET or RESET - \arg SET: CTC trim counter direction is down-counting - \arg RESET: CTC trim counter direction is up-counting -*/ -FlagStatus ctc_counter_direction_read(void) -{ - if(RESET != (CTC_STAT & CTC_STAT_REFDIR)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief read CTC counter reload value - \param[in] none - \param[out] none - \retval the 16-bit CTC counter reload value -*/ -uint16_t ctc_counter_reload_value_read(void) -{ - uint16_t reload_value = 0U; - reload_value = (uint16_t)(CTC_CTL1 & CTC_CTL1_RLVALUE); - return (reload_value); -} - -/*! - \brief read the IRC48M trim value - \param[in] none - \param[out] none - \retval the 8-bit IRC48M trim value -*/ -uint8_t ctc_irc48m_trim_value_read(void) -{ - uint8_t trim_value = 0U; - trim_value = (uint8_t)((CTC_CTL0 & CTC_CTL0_TRIMVALUE) >> CTC_TRIMVALUE_OFFSET); - return (trim_value); -} - -/*! - \brief enable the CTC interrupt - \param[in] interrupt: CTC interrupt enable - one or more parameters can be selected which are shown as below: - \arg CTC_INT_CKOK: clock trim OK interrupt enable - \arg CTC_INT_CKWARN: clock trim warning interrupt enable - \arg CTC_INT_ERR: error interrupt enable - \arg CTC_INT_EREF: expect reference interrupt enable - \param[out] none - \retval none -*/ -void ctc_interrupt_enable(uint32_t interrupt) -{ - CTC_CTL0 |= (uint32_t)interrupt; -} - -/*! - \brief disable the CTC interrupt - \param[in] interrupt: CTC interrupt enable source - one or more parameters can be selected which are shown as below: - \arg CTC_INT_CKOK: clock trim OK interrupt enable - \arg CTC_INT_CKWARN: clock trim warning interrupt enable - \arg CTC_INT_ERR: error interrupt enable - \arg CTC_INT_EREF: expect reference interrupt enable - \param[out] none - \retval none -*/ -void ctc_interrupt_disable(uint32_t interrupt) -{ - CTC_CTL0 &= (uint32_t)(~interrupt); -} - -/*! - \brief get CTC interrupt flag - \param[in] int_flag: the CTC interrupt flag - only one parameter can be selected which is shown as below: - \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt - \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt - \arg CTC_INT_FLAG_ERR: error interrupt - \arg CTC_INT_FLAG_EREF: expect reference interrupt - \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt - \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt - \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus ctc_interrupt_flag_get(uint32_t int_flag) -{ - uint32_t interrupt_flag = 0U, intenable = 0U; - - /* check whether the interrupt is enabled */ - if(RESET != (int_flag & CTC_FLAG_MASK)) { - intenable = CTC_CTL0 & CTC_CTL0_ERRIE; - } else { - intenable = CTC_CTL0 & int_flag; - } - - /* get interrupt flag status */ - interrupt_flag = CTC_STAT & int_flag; - - if(interrupt_flag && intenable) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear CTC interrupt flag - \param[in] int_flag: the CTC interrupt flag - only one parameter can be selected which is shown as below: - \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt - \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt - \arg CTC_INT_FLAG_ERR: error interrupt - \arg CTC_INT_FLAG_EREF: expect reference interrupt - \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt - \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt - \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt - \param[out] none - \retval none -*/ -void ctc_interrupt_flag_clear(uint32_t int_flag) -{ - if(RESET != (int_flag & CTC_FLAG_MASK)) { - CTC_INTC |= CTC_INTC_ERRIC; - } else { - CTC_INTC |= int_flag; - } -} - -/*! - \brief get CTC flag - \param[in] flag: the CTC flag - only one parameter can be selected which is shown as below: - \arg CTC_FLAG_CKOK: clock trim OK flag - \arg CTC_FLAG_CKWARN: clock trim warning flag - \arg CTC_FLAG_ERR: error flag - \arg CTC_FLAG_EREF: expect reference flag - \arg CTC_FLAG_CKERR: clock trim error bit - \arg CTC_FLAG_REFMISS: reference sync pulse miss - \arg CTC_FLAG_TRIMERR: trim value error bit - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus ctc_flag_get(uint32_t flag) -{ - if(RESET != (CTC_STAT & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear CTC flag - \param[in] flag: the CTC flag - only one parameter can be selected which is shown as below: - \arg CTC_FLAG_CKOK: clock trim OK flag - \arg CTC_FLAG_CKWARN: clock trim warning flag - \arg CTC_FLAG_ERR: error flag - \arg CTC_FLAG_EREF: expect reference flag - \arg CTC_FLAG_CKERR: clock trim error bit - \arg CTC_FLAG_REFMISS: reference sync pulse miss - \arg CTC_FLAG_TRIMERR: trim value error bit - \param[out] none - \retval none -*/ -void ctc_flag_clear(uint32_t flag) -{ - if(RESET != (flag & CTC_FLAG_MASK)) { - CTC_INTC |= CTC_INTC_ERRIC; - } else { - CTC_INTC |= flag; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c deleted file mode 100644 index 816e250afe8..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c +++ /dev/null @@ -1,679 +0,0 @@ -/*! - \file gd32f5xx_dac.c - \brief DAC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_dac.h" - -/* DAC register bit offset */ -#define OUT1_REG_OFFSET ((uint32_t)0x00000010U) -#define DH_12BIT_OFFSET ((uint32_t)0x00000010U) -#define DH_8BIT_OFFSET ((uint32_t)0x00000008U) - -#define DAC_STAT_FLAG_MASK0 (DAC_FLAG_DDUDR0 | DAC_FLAG_DDUDR1) -#define DAC_INT_EN_MASK0 (DAC_INT_DDUDR0 | DAC_INT_DDUDR1) -#define DAC_INT_FLAG_MASK0 (DAC_INT_FLAG_DDUDR0 | DAC_INT_FLAG_DDUDR1) - -/*! - \brief deinitialize DAC - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_deinit(uint32_t dac_periph) -{ - switch(dac_periph){ - case DAC0: - /* reset DAC0 */ - rcu_periph_reset_enable(RCU_DACRST); - rcu_periph_reset_disable(RCU_DACRST); - break; - default: - break; - } -} - -/*! - \brief enable DAC - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_enable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DEN0; - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DEN1; - }else{ - /* illegal parameters */ - } -} - -/*! - \brief disable DAC - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_disable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DEN0); - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DEN1); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC DMA function - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_dma_enable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DDMAEN0; - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DDMAEN1; - }else{ - /* illegal parameters */ - } -} - -/*! - \brief disable DAC DMA function - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_dma_disable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DDMAEN0); - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DDMAEN1); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC output buffer - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_output_buffer_enable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DBOFF0); - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DBOFF1); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief disable DAC output buffer - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_output_buffer_disable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DBOFF0; - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DBOFF1; - }else{ - /* illegal parameters */ - } -} - -/*! - \brief get DAC output value - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval DAC output data: 0~4095 -*/ -uint16_t dac_output_value_get(uint32_t dac_periph, uint8_t dac_out) -{ - uint16_t data = 0U; - - if(DAC_OUT0 == dac_out){ - /* store the DACx_OUT0 output value */ - data = (uint16_t)DAC_OUT0_DO(dac_periph); - }else if(DAC_OUT1 == dac_out){ - /* store the DACx_OUT1 output value */ - data = (uint16_t)DAC_OUT1_DO(dac_periph); - }else{ - /* illegal parameters */ - } - - return data; -} - -/*! - \brief set DAC data holding register value - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[in] dac_align: DAC data alignment mode - only one parameter can be selected which is shown as below: - \arg DAC_ALIGN_12B_R: 12-bit right-aligned data - \arg DAC_ALIGN_12B_L: 12-bit left-aligned data - \arg DAC_ALIGN_8B_R: 8-bit right-aligned data - \param[in] data: data to be loaded(0~4095) - \param[out] none - \retval none -*/ -void dac_data_set(uint32_t dac_periph, uint8_t dac_out, uint32_t dac_align, uint16_t data) -{ - /* DAC_OUT0 data alignment */ - if(DAC_OUT0 == dac_out){ - switch(dac_align){ - /* 12-bit right-aligned data */ - case DAC_ALIGN_12B_R: - DAC_OUT0_R12DH(dac_periph) = data; - break; - /* 12-bit left-aligned data */ - case DAC_ALIGN_12B_L: - DAC_OUT0_L12DH(dac_periph) = data; - break; - /* 8-bit right-aligned data */ - case DAC_ALIGN_8B_R: - DAC_OUT0_R8DH(dac_periph) = data; - break; - default: - break; - } - }else if(DAC_OUT1 == dac_out){ - /* DAC_OUT1 data alignment */ - switch(dac_align){ - /* 12-bit right-aligned data */ - case DAC_ALIGN_12B_R: - DAC_OUT1_R12DH(dac_periph) = data; - break; - /* 12-bit left-aligned data */ - case DAC_ALIGN_12B_L: - DAC_OUT1_L12DH(dac_periph) = data; - break; - /* 8-bit right-aligned data */ - case DAC_ALIGN_8B_R: - DAC_OUT1_R8DH(dac_periph) = data; - break; - default: - break; - } - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC trigger - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_trigger_enable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DTEN0; - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) |= (uint32_t)DAC_CTL0_DTEN1; - }else{ - /* illegal parameters */ - } -} - -/*! - \brief disable DAC trigger - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[out] none - \retval none -*/ -void dac_trigger_disable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTEN0); - }else if(DAC_OUT1 == dac_out){ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTEN1); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief configure DAC trigger source - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[in] triggersource: external trigger of DAC - only one parameter can be selected which is shown as below: - \arg DAC_TRIGGER_T5_TRGO: TIMER5 TRGO - \arg DAC_TRIGGER_T7_TRGO: TIMER7 TRGO - \arg DAC_TRIGGER_T6_TRGO: TIMER6 TRGO - \arg DAC_TRIGGER_T4_TRGO: TIMER4 TRGO - \arg DAC_TRIGGER_T1_TRGO: TIMER1 TRGO - \arg DAC_TRIGGER_T3_TRGO: TIMER3 TRGO - \arg DAC_TRIGGER_EXTI_9: EXTI interrupt line9 event - \arg DAC_TRIGGER_SOFTWARE: software trigger - \param[out] none - \retval none -*/ -void dac_trigger_source_config(uint32_t dac_periph, uint8_t dac_out, uint32_t triggersource) -{ - if(DAC_OUT0 == dac_out){ - /* configure DACx_OUT0 trigger source */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTSEL0); - DAC_CTL0(dac_periph) |= triggersource; - }else if(DAC_OUT1 == dac_out){ - /* configure DACx_OUT1 trigger source */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DTSEL1); - DAC_CTL0(dac_periph) |= (triggersource << OUT1_REG_OFFSET); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC software trigger - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \retval none -*/ -void dac_software_trigger_enable(uint32_t dac_periph, uint8_t dac_out) -{ - if(DAC_OUT0 == dac_out){ - DAC_SWT(dac_periph) |= (uint32_t)DAC_SWT_SWTR0; - }else if(DAC_OUT1 == dac_out){ - DAC_SWT(dac_periph) |= (uint32_t)DAC_SWT_SWTR1; - }else{ - /* illegal parameters */ - } -} - -/*! - \brief configure DAC wave mode - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[in] wave_mode: DAC wave mode - only one parameter can be selected which is shown as below: - \arg DAC_WAVE_DISABLE: wave mode disable - \arg DAC_WAVE_MODE_LFSR: LFSR noise mode - \arg DAC_WAVE_MODE_TRIANGLE: triangle noise mode - \param[out] none - \retval none -*/ -void dac_wave_mode_config(uint32_t dac_periph, uint8_t dac_out, uint32_t wave_mode) -{ - if(DAC_OUT0 == dac_out){ - /* configure DACx_OUT0 wave mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWM0); - DAC_CTL0(dac_periph) |= wave_mode; - }else if(DAC_OUT1 == dac_out){ - /* configure DACx_OUT1 wave mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWM1); - DAC_CTL0(dac_periph) |= (wave_mode << OUT1_REG_OFFSET); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief configure DAC LFSR noise mode - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[in] unmask_bits: LFSR noise unmask bits - only one parameter can be selected which is shown as below: - \arg DAC_LFSR_BIT0: unmask the LFSR bit0 - \arg DAC_LFSR_BITS1_0: unmask the LFSR bits[1:0] - \arg DAC_LFSR_BITS2_0: unmask the LFSR bits[2:0] - \arg DAC_LFSR_BITS3_0: unmask the LFSR bits[3:0] - \arg DAC_LFSR_BITS4_0: unmask the LFSR bits[4:0] - \arg DAC_LFSR_BITS5_0: unmask the LFSR bits[5:0] - \arg DAC_LFSR_BITS6_0: unmask the LFSR bits[6:0] - \arg DAC_LFSR_BITS7_0: unmask the LFSR bits[7:0] - \arg DAC_LFSR_BITS8_0: unmask the LFSR bits[8:0] - \arg DAC_LFSR_BITS9_0: unmask the LFSR bits[9:0] - \arg DAC_LFSR_BITS10_0: unmask the LFSR bits[10:0] - \arg DAC_LFSR_BITS11_0: unmask the LFSR bits[11:0] - \param[out] none - \retval none -*/ -void dac_lfsr_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t unmask_bits) -{ - if(DAC_OUT0 == dac_out){ - /* configure DACx_OUT0 LFSR noise mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW0); - DAC_CTL0(dac_periph) |= unmask_bits; - }else if(DAC_OUT1 == dac_out){ - /* configure DACx_OUT1 LFSR noise mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW1); - DAC_CTL0(dac_periph) |= (unmask_bits << OUT1_REG_OFFSET); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief configure DAC triangle noise mode - \param[in] dac_periph: DACx(x=0) - \param[in] dac_out: DAC_OUTx(x=0,1) - \param[in] amplitude: the amplitude of the triangle - only one parameter can be selected which is shown as below: - \arg DAC_TRIANGLE_AMPLITUDE_1: triangle amplitude is 1 - \arg DAC_TRIANGLE_AMPLITUDE_3: triangle amplitude is 3 - \arg DAC_TRIANGLE_AMPLITUDE_7: triangle amplitude is 7 - \arg DAC_TRIANGLE_AMPLITUDE_15: triangle amplitude is 15 - \arg DAC_TRIANGLE_AMPLITUDE_31: triangle amplitude is 31 - \arg DAC_TRIANGLE_AMPLITUDE_63: triangle amplitude is 63 - \arg DAC_TRIANGLE_AMPLITUDE_127: triangle amplitude is 127 - \arg DAC_TRIANGLE_AMPLITUDE_255: triangle amplitude is 255 - \arg DAC_TRIANGLE_AMPLITUDE_511: triangle amplitude is 511 - \arg DAC_TRIANGLE_AMPLITUDE_1023: triangle amplitude is 1023 - \arg DAC_TRIANGLE_AMPLITUDE_2047: triangle amplitude is 2047 - \arg DAC_TRIANGLE_AMPLITUDE_4095: triangle amplitude is 4095 - \param[out] none - \retval none -*/ -void dac_triangle_noise_config(uint32_t dac_periph, uint8_t dac_out, uint32_t amplitude) -{ - if(DAC_OUT0 == dac_out){ - /* configure DACx_OUT0 triangle noise mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW0); - DAC_CTL0(dac_periph) |= amplitude; - }else if(DAC_OUT1 == dac_out){ - /* configure DACx_OUT1 triangle noise mode */ - DAC_CTL0(dac_periph) &= (uint32_t)(~DAC_CTL0_DWBW1); - DAC_CTL0(dac_periph) |= (amplitude << OUT1_REG_OFFSET); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC concurrent mode - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_concurrent_enable(uint32_t dac_periph) -{ - uint32_t ctl = 0U; - - ctl = (uint32_t)(DAC_CTL0_DEN0 | DAC_CTL0_DEN1); - DAC_CTL0(dac_periph) |= (uint32_t)ctl; -} - -/*! - \brief disable DAC concurrent mode - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_concurrent_disable(uint32_t dac_periph) -{ - uint32_t ctl = 0U; - - ctl = (uint32_t)(DAC_CTL0_DEN0 | DAC_CTL0_DEN1); - DAC_CTL0(dac_periph) &= (uint32_t)(~ctl); -} - -/*! - \brief enable DAC concurrent software trigger - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_concurrent_software_trigger_enable(uint32_t dac_periph) -{ - uint32_t swt = 0U; - - swt = (uint32_t)(DAC_SWT_SWTR0 | DAC_SWT_SWTR1); - DAC_SWT(dac_periph) |= (uint32_t)swt; -} - -/*! - \brief enable DAC concurrent buffer function - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_concurrent_output_buffer_enable(uint32_t dac_periph) -{ - uint32_t ctl = 0U; - - ctl = (uint32_t)(DAC_CTL0_DBOFF0 | DAC_CTL0_DBOFF1); - DAC_CTL0(dac_periph) &= (uint32_t)(~ctl); -} - -/*! - \brief disable DAC concurrent buffer function - \param[in] dac_periph: DACx(x=0) - \param[out] none - \retval none -*/ -void dac_concurrent_output_buffer_disable(uint32_t dac_periph) -{ - uint32_t ctl = 0U; - - ctl = (uint32_t)(DAC_CTL0_DBOFF0 | DAC_CTL0_DBOFF1); - DAC_CTL0(dac_periph) |= (uint32_t)ctl; -} - -/*! - \brief set DAC concurrent mode data holding register value - \param[in] dac_periph: DACx(x=0) - \param[in] dac_align: DAC data alignment mode - only one parameter can be selected which is shown as below: - \arg DAC_ALIGN_12B_R: 12-bit right-aligned data - \arg DAC_ALIGN_12B_L: 12-bit left-aligned data - \arg DAC_ALIGN_8B_R: 8-bit right-aligned data - \param[in] data0: data to be loaded(0~4095) - \param[in] data1: data to be loaded(0~4095) - \param[out] none - \retval none -*/ -void dac_concurrent_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data0, uint16_t data1) -{ - uint32_t data = 0U; - - switch(dac_align){ - /* 12-bit right-aligned data */ - case DAC_ALIGN_12B_R: - data = (uint32_t)(((uint32_t)data1 << DH_12BIT_OFFSET) | data0); - DACC_R12DH(dac_periph) = (uint32_t)data; - break; - /* 12-bit left-aligned data */ - case DAC_ALIGN_12B_L: - data = (uint32_t)(((uint32_t)data1 << DH_12BIT_OFFSET) | data0); - DACC_L12DH(dac_periph) = (uint32_t)data; - break; - /* 8-bit right-aligned data */ - case DAC_ALIGN_8B_R: - data = (uint32_t)(((uint32_t)data1 << DH_8BIT_OFFSET) | data0); - DACC_R8DH(dac_periph) = (uint32_t)data; - break; - default: - break; - } -} - -/*! - \brief get the DAC flag - \param[in] dac_periph: DACx(x=0) - \param[in] flag: the DAC status flags, only one parameter can be selected which is shown - as below: - \arg DAC_FLAG_DDUDR0: DACx_OUT0 DMA underrun flag - \arg DAC_FLAG_DDUDR1: DACx_OUT1 DMA underrun flag - \param[out] none - \retval the state of DAC bit(SET or RESET) -*/ -FlagStatus dac_flag_get(uint32_t dac_periph, uint32_t flag) -{ - if(flag & DAC_STAT_FLAG_MASK0){ - /* check DAC_STAT0 flag */ - if(RESET != (DAC_STAT0(dac_periph) & flag)){ - return SET; - }else{ - return RESET; - } - }else{ - /* illegal parameters */ - return RESET; - } -} - -/*! - \brief clear the DAC flag - \param[in] dac_periph: DACx(x=0) - \param[in] flag: DAC flag - one or more parameter can be selected which are shown as below: - \arg DAC_FLAG_DDUDR0: DACx_OUT0 DMA underrun flag - \arg DAC_FLAG_DDUDR1: DACx_OUT1 DMA underrun flag - \param[out] none - \retval none -*/ -void dac_flag_clear(uint32_t dac_periph, uint32_t flag) -{ - if(flag & DAC_STAT_FLAG_MASK0){ - /* check DAC_STAT0 flag */ - DAC_STAT0(dac_periph) = (uint32_t)(flag & DAC_STAT_FLAG_MASK0); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief enable DAC interrupt(DAC DMA underrun interrupt) - \param[in] dac_periph: DACx(x=0) - \param[in] interrupt: the DAC interrupt - one or more parameter can be selected which are shown as below: - \arg DAC_INT_DDUDR0: DACx_OUT0 DMA underrun interrupt - \arg DAC_INT_DDUDR1: DACx_OUT1 DMA underrun interrupt - \param[out] none - \retval none -*/ -void dac_interrupt_enable(uint32_t dac_periph, uint32_t interrupt) -{ - if(interrupt & DAC_INT_EN_MASK0){ - /* enable underrun interrupt */ - DAC_CTL0(dac_periph) |= (uint32_t)(interrupt & DAC_INT_EN_MASK0); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief disable DAC interrupt(DAC DMA underrun interrupt) - \param[in] dac_periph: DACx(x=0) - \param[in] interrupt: the DAC interrupt - one and more parameter can be selected which are shown as below: - \arg DAC_INT_DDUDR0: DACx_OUT0 DMA underrun interrupt - \arg DAC_INT_DDUDR1: DACx_OUT1 DMA underrun interrupt - \param[out] none - \retval none -*/ -void dac_interrupt_disable(uint32_t dac_periph, uint32_t interrupt) -{ - if(interrupt & DAC_INT_EN_MASK0){ - /* disable underrun interrupt */ - DAC_CTL0(dac_periph) &= (uint32_t)(~(interrupt & DAC_INT_EN_MASK0)); - }else{ - /* illegal parameters */ - } -} - -/*! - \brief get the DAC interrupt flag(DAC DMA underrun interrupt flag) - \param[in] dac_periph: DACx(x=0) - \param[in] int_flag: DAC interrupt flag - only one parameter can be selected which is shown as below: - \arg DAC_INT_FLAG_DDUDR0: DACx_OUT0 DMA underrun interrupt flag - \arg DAC_INT_FLAG_DDUDR1: DACx_OUT1 DMA underrun interrupt flag - \param[out] none - \retval the state of DAC interrupt flag(SET or RESET) -*/ -FlagStatus dac_interrupt_flag_get(uint32_t dac_periph, uint32_t int_flag) -{ - uint32_t reg1 = 0U, reg2 = 0U; - - if(int_flag & DAC_INT_FLAG_MASK0){ - /* check underrun interrupt int_flag */ - reg1 = DAC_STAT0(dac_periph) & int_flag; - reg2 = DAC_CTL0(dac_periph) & int_flag; - }else{ - /* illegal parameters */ - } - - /*get DAC interrupt flag status */ - if((RESET != reg1) && (RESET != reg2)){ - return SET; - }else{ - return RESET; - } -} - -/*! - \brief clear the DAC interrupt flag(DAC DMA underrun interrupt flag) - \param[in] dac_periph: DACx(x=0) - \param[in] int_flag: DAC interrupt flag - one or more parameter can be selected which are shown as below: - \arg DAC_INT_FLAG_DDUDR0: DACx_OUT0 DMA underrun interrupt flag - \arg DAC_INT_FLAG_DDUDR1: DACx_OUT1 DMA underrun interrupt flag - \param[out] none - \retval none -*/ -void dac_interrupt_flag_clear(uint32_t dac_periph, uint32_t int_flag) -{ - /* clear underrun interrupt int_flag */ - if(int_flag & DAC_INT_FLAG_MASK0){ - DAC_STAT0(dac_periph) = (uint32_t)(int_flag & DAC_INT_FLAG_MASK0); - }else{ - /* illegal parameters */ - } -} - diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c deleted file mode 100644 index 7287918bc93..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dbg.c +++ /dev/null @@ -1,209 +0,0 @@ -/*! - \file gd32f5xx_dbg.c - \brief DBG driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_dbg.h" - -#define DBG_RESET_VAL 0x00000000U -#define DBG_DEVICEID_SET(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) -/*! - \brief deinitialize the DBG - \param[in] none - \param[out] none - \retval none -*/ -void dbg_deinit(void) -{ - DBG_CTL0 = DBG_RESET_VAL; - DBG_CTL1 = DBG_RESET_VAL; - DBG_CTL2 = DBG_RESET_VAL; -} - -/*! - \brief read DBG_ID code register - \param[in] none - \param[out] none - \retval DBG_ID code -*/ -uint32_t dbg_id_get(void) -{ - return DBG_ID; -} - -/*! - \brief enable low power behavior when the mcu is in debug mode - \param[in] dbg_low_power: - this parameter can be any combination of the following values: - \arg DBG_LOW_POWER_SLEEP: keep debugger connection during sleep mode - \arg DBG_LOW_POWER_DEEPSLEEP: keep debugger connection during deepsleep mode - \arg DBG_LOW_POWER_STANDBY: keep debugger connection during standby mode - \param[out] none - \retval none -*/ -void dbg_low_power_enable(uint32_t dbg_low_power) -{ - DBG_CTL0 |= dbg_low_power; -} - -/*! - \brief disable low power behavior when the mcu is in debug mode - \param[in] dbg_low_power: - this parameter can be any combination of the following values: - \arg DBG_LOW_POWER_SLEEP: donot keep debugger connection during sleep mode - \arg DBG_LOW_POWER_DEEPSLEEP: donot keep debugger connection during deepsleep mode - \arg DBG_LOW_POWER_STANDBY: donot keep debugger connection during standby mode - \param[out] none - \retval none -*/ -void dbg_low_power_disable(uint32_t dbg_low_power) -{ - DBG_CTL0 &= ~dbg_low_power; -} - -/*! - \brief enable peripheral behavior when the mcu is in debug mode - \param[in] dbg_periph: dbg_periph_enum - only one parameter can be selected which is shown as below: - \arg DBG_TIMER1_HOLD: hold TIMER1 counter when core is halted - \arg DBG_TIMER2_HOLD: hold TIMER2 counter when core is halted - \arg DBG_TIMER3_HOLD: hold TIMER3 counter when core is halted - \arg DBG_TIMER4_HOLD: hold TIMER4 counter when core is halted - \arg DBG_TIMER5_HOLD: hold TIMER5 counter when core is halted - \arg DBG_TIMER6_HOLD: hold TIMER6 counter when core is halted - \arg DBG_TIMER11_HOLD: hold TIMER11 counter when core is halted - \arg DBG_TIMER12_HOLD: hold TIMER12 counter when core is halted - \arg DBG_TIMER13_HOLD: hold TIMER13 counter when core is halted - \arg DBG_RTC_HOLD: hold RTC calendar and wakeup counter when core is halted - \arg DBG_WWDGT_HOLD: debug WWDGT kept when core is halted - \arg DBG_FWDGT_HOLD: debug FWDGT kept when core is halted - \arg DBG_I2C3_HOLD: hold I2C3 smbus when core is halted - \arg DBG_I2C4_HOLD: hold I2C4 smbus when core is halted - \arg DBG_I2C5_HOLD: hold I2C5 smbus when core is halted - \arg DBG_I2C0_HOLD: hold I2C0 smbus when core is halted - \arg DBG_I2C1_HOLD: hold I2C1 smbus when core is halted - \arg DBG_I2C2_HOLD: hold I2C2 smbus when core is halted - \arg DBG_CAN0_HOLD: debug CAN0 kept when core is halted - \arg DBG_CAN1_HOLD: debug CAN1 kept when core is halted - \arg DBG_TIMER0_HOLD: hold TIMER0 counter when core is halted - \arg DBG_TIMER7_HOLD: hold TIMER7 counter when core is halted - \arg DBG_TIMER8_HOLD: hold TIMER8 counter when core is halted - \arg DBG_TIMER9_HOLD: hold TIMER9 counter when core is halted - \arg DBG_TIMER10_HOLD: hold TIMER10 counter when core is halted - \retval none -*/ -void dbg_periph_enable(dbg_periph_enum dbg_periph) -{ - DBG_REG_VAL(dbg_periph) |= BIT(DBG_BIT_POS(dbg_periph)); -} - -/*! - \brief disable peripheral behavior when the mcu is in debug mode - \param[in] dbg_periph: dbg_periph_enum - only one parameter can be selected which is shown as below: - \arg DBG_TIMER1_HOLD: hold TIMER1 counter when core is halted - \arg DBG_TIMER2_HOLD: hold TIMER2 counter when core is halted - \arg DBG_TIMER3_HOLD: hold TIMER3 counter when core is halted - \arg DBG_TIMER4_HOLD: hold TIMER4 counter when core is halted - \arg DBG_TIMER5_HOLD: hold TIMER5 counter when core is halted - \arg DBG_TIMER6_HOLD: hold TIMER6 counter when core is halted - \arg DBG_TIMER11_HOLD: hold TIMER11 counter when core is halted - \arg DBG_TIMER12_HOLD: hold TIMER12 counter when core is halted - \arg DBG_TIMER13_HOLD: hold TIMER13 counter when core is halted - \arg DBG_RTC_HOLD: hold RTC calendar and wakeup counter when core is halted - \arg DBG_WWDGT_HOLD: debug WWDGT kept when core is halted - \arg DBG_FWDGT_HOLD: debug FWDGT kept when core is halted - \arg DBG_I2C3_HOLD: hold I2C3 smbus when core is halted - \arg DBG_I2C4_HOLD: hold I2C4 smbus when core is halted - \arg DBG_I2C5_HOLD: hold I2C5 smbus when core is halted - \arg DBG_I2C0_HOLD: hold I2C0 smbus when core is halted - \arg DBG_I2C1_HOLD: hold I2C1 smbus when core is halted - \arg DBG_I2C2_HOLD: hold I2C2 smbus when core is halted - \arg DBG_CAN0_HOLD: debug CAN0 kept when core is halted - \arg DBG_CAN1_HOLD: debug CAN1 kept when core is halted - \arg DBG_TIMER0_HOLD: hold TIMER0 counter when core is halted - \arg DBG_TIMER7_HOLD: hold TIMER7 counter when core is halted - \arg DBG_TIMER8_HOLD: hold TIMER8 counter when core is halted - \arg DBG_TIMER9_HOLD: hold TIMER9 counter when core is halted - \arg DBG_TIMER10_HOLD: hold TIMER10 counter when core is halted - \param[out] none - \retval none -*/ -void dbg_periph_disable(dbg_periph_enum dbg_periph) -{ - DBG_REG_VAL(dbg_periph) &= ~BIT(DBG_BIT_POS(dbg_periph)); -} - -/*! - \brief enable trace pin assignment - \param[in] none - \param[out] none - \retval none -*/ -void dbg_trace_pin_enable(void) -{ - DBG_CTL0 |= DBG_CTL0_TRACE_IOEN; -} - -/*! - \brief disable trace pin assignment - \param[in] none - \param[out] none - \retval none -*/ -void dbg_trace_pin_disable(void) -{ - DBG_CTL0 &= ~DBG_CTL0_TRACE_IOEN; -} - - -/*! - \brief read DBG DEVICEID - \param[in] none - \param[out] none - \retval DBG DEVICEID -*/ -uint32_t dbg_deviceid_get(void) -{ - return DBG_CTL3; -} - -/*! - \brief write DBG DEVICEID - \param[in] deviceid: deviceid which connect to MCU instanceid - \param[out] none - \retval none -*/ -void dbg_deviceid_set(uint32_t deviceid) -{ - DBG_CTL3 = (uint32_t)DBG_DEVICEID_SET(deviceid); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c deleted file mode 100644 index bc2aae23eed..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dci.c +++ /dev/null @@ -1,343 +0,0 @@ -/*! - \file gd32f5xx_dci.c - \brief DCI driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_dci.h" - -/*! - \brief DCI deinit - \param[in] none - \param[out] none - \retval none -*/ -void dci_deinit(void) -{ - rcu_periph_reset_enable(RCU_DCIRST); - rcu_periph_reset_disable(RCU_DCIRST); -} - -/*! - \brief initialize DCI registers - \param[in] dci_struct: DCI parameter initialization structure - members of the structure and the member values are shown as below: - capture_mode : DCI_CAPTURE_MODE_CONTINUOUS, DCI_CAPTURE_MODE_SNAPSHOT - colck_polarity : DCI_CK_POLARITY_FALLING, DCI_CK_POLARITY_RISING - hsync_polarity : DCI_HSYNC_POLARITY_LOW, DCI_HSYNC_POLARITY_HIGH - vsync_polarity : DCI_VSYNC_POLARITY_LOW, DCI_VSYNC_POLARITY_HIGH - frame_rate : DCI_FRAME_RATE_ALL, DCI_FRAME_RATE_1_2, DCI_FRAME_RATE_1_4 - interface_format: DCI_INTERFACE_FORMAT_8BITS, DCI_INTERFACE_FORMAT_10BITS, - DCI_INTERFACE_FORMAT_12BITS, DCI_INTERFACE_FORMAT_14BITS - \param[out] none - \retval none -*/ -void dci_init(dci_parameter_struct *dci_struct) -{ - uint32_t reg = 0U; - /* disable capture function and DCI */ - DCI_CTL &= ~(DCI_CTL_CAP | DCI_CTL_DCIEN); - /* configure DCI parameter */ - reg |= dci_struct->capture_mode; - reg |= dci_struct->clock_polarity; - reg |= dci_struct->hsync_polarity; - reg |= dci_struct->vsync_polarity; - reg |= dci_struct->frame_rate; - reg |= dci_struct->interface_format; - - DCI_CTL = reg; -} - -/*! - \brief enable DCI function - \param[in] none - \param[out] none - \retval none -*/ -void dci_enable(void) -{ - DCI_CTL |= DCI_CTL_DCIEN; -} - -/*! - \brief disable DCI function - \param[in] none - \param[out] none - \retval none -*/ -void dci_disable(void) -{ - DCI_CTL &= ~DCI_CTL_DCIEN; -} - -/*! - \brief enable DCI capture - \param[in] none - \param[out] none - \retval none -*/ -void dci_capture_enable(void) -{ - DCI_CTL |= DCI_CTL_CAP; -} - -/*! - \brief disable DCI capture - \param[in] none - \param[out] none - \retval none -*/ -void dci_capture_disable(void) -{ - DCI_CTL &= ~DCI_CTL_CAP; -} - -/*! - \brief enable DCI jpeg mode - \param[in] none - \param[out] none - \retval none -*/ -void dci_jpeg_enable(void) -{ - DCI_CTL |= DCI_CTL_JM; -} - -/*! - \brief disable DCI jpeg mode - \param[in] none - \param[out] none - \retval none -*/ -void dci_jpeg_disable(void) -{ - DCI_CTL &= ~DCI_CTL_JM; -} - -/*! - \brief enable cropping window function - \param[in] none - \param[out] none - \retval none -*/ -void dci_crop_window_enable(void) -{ - DCI_CTL |= DCI_CTL_WDEN; -} - -/*! - \brief disable cropping window function - \param[in] none - \param[out] none - \retval none -*/ -void dci_crop_window_disable(void) -{ - DCI_CTL &= ~DCI_CTL_WDEN; -} - -/*! - \brief configure DCI cropping window - \param[in] start_x: window horizontal start position - \param[in] start_y: window vertical start position - \param[in] size_width: window horizontal size - \param[in] size_height: window vertical size - \param[out] none - \retval none -*/ -void dci_crop_window_config(uint16_t start_x, uint16_t start_y, uint16_t size_width, uint16_t size_height) -{ - DCI_CWSPOS = ((uint32_t)start_x | ((uint32_t)start_y << 16)); - DCI_CWSZ = ((uint32_t)size_width | ((uint32_t)size_height << 16)); -} - -/*! - \brief enable embedded synchronous mode - \param[in] none - \param[out] none - \retval none -*/ -void dci_embedded_sync_enable(void) -{ - DCI_CTL |= DCI_CTL_ESM; -} - -/*! - \brief disable embedded synchronous mode - \param[in] none - \param[out] none - \retval none -*/ -void dci_embedded_sync_disable(void) -{ - DCI_CTL &= ~DCI_CTL_ESM; -} -/*! - \brief configure synchronous codes in embedded synchronous mode - \param[in] frame_start: frame start code in embedded synchronous mode - \param[in] line_start: line start code in embedded synchronous mode - \param[in] line_end: line end code in embedded synchronous mode - \param[in] frame_end: frame end code in embedded synchronous mode - \param[out] none - \retval none -*/ -void dci_sync_codes_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end) -{ - DCI_SC = ((uint32_t)frame_start | ((uint32_t)line_start << 8) | ((uint32_t)line_end << 16) | ((uint32_t)frame_end << 24)); -} - -/*! - \brief configure synchronous codes unmask in embedded synchronous mode - \param[in] frame_start: frame start code unmask bits in embedded synchronous mode - \param[in] line_start: line start code unmask bits in embedded synchronous mode - \param[in] line_end: line end code unmask bits in embedded synchronous mode - \param[in] frame_end: frame end code unmask bits in embedded synchronous mode - \param[out] none - \retval none -*/ -void dci_sync_codes_unmask_config(uint8_t frame_start, uint8_t line_start, uint8_t line_end, uint8_t frame_end) -{ - DCI_SCUMSK = ((uint32_t)frame_start | ((uint32_t)line_start << 8) | ((uint32_t)line_end << 16) | ((uint32_t)frame_end << 24)); -} - -/*! - \brief read DCI data register - \param[in] none - \param[out] none - \retval data -*/ -uint32_t dci_data_read(void) -{ - return DCI_DATA; -} - -/*! - \brief get specified flag - \param[in] flag: - \arg DCI_FLAG_HS: HS line status - \arg DCI_FLAG_VS: VS line status - \arg DCI_FLAG_FV:FIFO valid - \arg DCI_FLAG_EF: end of frame flag - \arg DCI_FLAG_OVR: FIFO overrun flag - \arg DCI_FLAG_ESE: embedded synchronous error flag - \arg DCI_FLAG_VSYNC: vsync flag - \arg DCI_FLAG_EL: end of line flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus dci_flag_get(uint32_t flag) -{ - uint32_t stat = 0U; - - if(flag >> 31) { - /* get flag status from DCI_STAT1 register */ - stat = DCI_STAT1; - } else { - /* get flag status from DCI_STAT0 register */ - stat = DCI_STAT0; - } - - if(flag & stat) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief enable specified DCI interrupt - \param[in] interrupt: - \arg DCI_INT_EF: end of frame interrupt - \arg DCI_INT_OVR: FIFO overrun interrupt - \arg DCI_INT_ESE: embedded synchronous error interrupt - \arg DCI_INT_VSYNC: vsync interrupt - \arg DCI_INT_EL: end of line interrupt - \param[out] none - \retval none -*/ -void dci_interrupt_enable(uint32_t interrupt) -{ - DCI_INTEN |= interrupt; -} - -/*! - \brief disable specified DCI interrupt - \param[in] interrupt: - \arg DCI_INT_EF: end of frame interrupt - \arg DCI_INT_OVR: FIFO overrun interrupt - \arg DCI_INT_ESE: embedded synchronous error interrupt - \arg DCI_INT_VSYNC: vsync interrupt - \arg DCI_INT_EL: end of line interrupt - \param[out] none - \retval none -*/ -void dci_interrupt_disable(uint32_t interrupt) -{ - DCI_INTEN &= ~interrupt; -} - -/*! - \brief clear specified interrupt flag - \param[in] int_flag: - \arg DCI_INT_EF: end of frame interrupt - \arg DCI_INT_OVR: FIFO overrun interrupt - \arg DCI_INT_ESE: embedded synchronous error interrupt - \arg DCI_INT_VSYNC: vsync interrupt - \arg DCI_INT_EL: end of line interrupt - \param[out] none - \retval none -*/ -void dci_interrupt_flag_clear(uint32_t int_flag) -{ - DCI_INTC |= int_flag; -} - -/*! - \brief get specified interrupt flag - \param[in] int_flag: - \arg DCI_INT_FLAG_EF: end of frame interrupt flag - \arg DCI_INT_FLAG_OVR: FIFO overrun interrupt flag - \arg DCI_INT_FLAG_ESE: embedded synchronous error interrupt flag - \arg DCI_INT_FLAG_VSYNC: vsync interrupt flag - \arg DCI_INT_FLAG_EL: end of line interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus dci_interrupt_flag_get(uint32_t int_flag) -{ - if(RESET == (DCI_INTF & int_flag)) { - return RESET; - } else { - return SET; - } -} - - diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c deleted file mode 100644 index df86bfa7c71..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c +++ /dev/null @@ -1,902 +0,0 @@ -/*! - \file gd32f5xx_dma.c - \brief DMA driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_dma.h" - -/* DMA register bit offset */ -#define CHXCTL_PERIEN_OFFSET ((uint32_t)25U) - -/*! - \brief deinitialize DMA a channel registers - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel is deinitialized - \arg DMA_CHx(x=0..7) - \param[out] none - \retval none -*/ -void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx) -{ - /* disable DMA a channel */ - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; - /* reset DMA channel registers */ - DMA_CHCTL(dma_periph, channelx) = DMA_CHCTL_RESET_VALUE; - DMA_CHCNT(dma_periph, channelx) = DMA_CHCNT_RESET_VALUE; - DMA_CHPADDR(dma_periph, channelx) = DMA_CHPADDR_RESET_VALUE; - DMA_CHM0ADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; - DMA_CHM1ADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; - DMA_CHFCTL(dma_periph, channelx) = DMA_CHFCTL_RESET_VALUE; - if(channelx < DMA_CH4) { - DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); - } else { - channelx -= (dma_channel_enum)4; - DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); - } -} - -/*! - \brief initialize the DMA single data mode parameters struct with the default values - \param[in] init_struct: the initialization data needed to initialize DMA channel - \param[out] none - \retval none -*/ -void dma_single_data_para_struct_init(dma_single_data_parameter_struct *init_struct) -{ - /* set the DMA struct with the default values */ - init_struct->periph_addr = 0U; - init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; - init_struct->memory0_addr = 0U; - init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; - init_struct->periph_memory_width = 0U; - init_struct->circular_mode = DMA_CIRCULAR_MODE_DISABLE; - init_struct->direction = DMA_PERIPH_TO_MEMORY; - init_struct->number = 0U; - init_struct->priority = DMA_PRIORITY_LOW; -} - -/*! - \brief initialize the DMA multi data mode parameters struct with the default values - \param[in] init_struct: the initialization data needed to initialize DMA channel - \param[out] none - \retval none -*/ -void dma_multi_data_para_struct_init(dma_multi_data_parameter_struct *init_struct) -{ - /* set the DMA struct with the default values */ - init_struct->periph_addr = 0U; - init_struct->periph_width = 0U; - init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; - init_struct->memory0_addr = 0U; - init_struct->memory_width = 0U; - init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; - init_struct->memory_burst_width = 0U; - init_struct->periph_burst_width = 0U; - init_struct->circular_mode = DMA_CIRCULAR_MODE_DISABLE; - init_struct->direction = DMA_PERIPH_TO_MEMORY; - init_struct->number = 0U; - init_struct->priority = DMA_PRIORITY_LOW; -} - -/*! - \brief initialize DMA single data mode - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel is initialized - \arg DMA_CHx(x=0..7) - \param[in] init_struct: the data needed to initialize DMA single data mode - periph_addr: peripheral base address - periph_inc: DMA_PERIPH_INCREASE_ENABLE,DMA_PERIPH_INCREASE_DISABLE,DMA_PERIPH_INCREASE_FIX - memory0_addr: memory base address - memory_inc: DMA_MEMORY_INCREASE_ENABLE,DMA_MEMORY_INCREASE_DISABLE - periph_memory_width: DMA_PERIPH_WIDTH_8BIT,DMA_PERIPH_WIDTH_16BIT,DMA_PERIPH_WIDTH_32BIT - circular_mode: DMA_CIRCULAR_MODE_ENABLE,DMA_CIRCULAR_MODE_DISABLE - direction: DMA_PERIPH_TO_MEMORY,DMA_MEMORY_TO_PERIPH,DMA_MEMORY_TO_MEMORY - number: the number of remaining data to be transferred by the DMA - priority: DMA_PRIORITY_LOW,DMA_PRIORITY_MEDIUM,DMA_PRIORITY_HIGH,DMA_PRIORITY_ULTRA_HIGH - \param[out] none - \retval none -*/ -void dma_single_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_single_data_parameter_struct *init_struct) -{ - uint32_t ctl; - - /* select single data mode */ - DMA_CHFCTL(dma_periph, channelx) &= ~DMA_CHXFCTL_MDMEN; - - /* configure peripheral base address */ - DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; - - /* configure memory base address */ - DMA_CHM0ADDR(dma_periph, channelx) = init_struct->memory0_addr; - - /* configure the number of remaining data to be transferred */ - DMA_CHCNT(dma_periph, channelx) = init_struct->number; - - /* configure peripheral and memory transfer width,channel priotity,transfer mode */ - ctl = DMA_CHCTL(dma_periph, channelx); - ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO | DMA_CHXCTL_TM); - ctl |= (init_struct->periph_memory_width | (init_struct->periph_memory_width << 2) | init_struct->priority | init_struct->direction); - DMA_CHCTL(dma_periph, channelx) = ctl; - - /* configure peripheral increasing mode */ - if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; - } else if(DMA_PERIPH_INCREASE_DISABLE == init_struct->periph_inc) { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; - } - - /* configure memory increasing mode */ - if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; - } - - /* configure DMA circular mode */ - if(DMA_CIRCULAR_MODE_ENABLE == init_struct->circular_mode) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; - } else { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; - } -} - -/*! - \brief initialize DMA multi data mode - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel is initialized - \arg DMA_CHx(x=0..7) - \param[in] dma_multi_data_parameter_struct: the data needed to initialize DMA multi data mode - periph_addr: peripheral base address - periph_width: DMA_PERIPH_WIDTH_8BIT,DMA_PERIPH_WIDTH_16BIT,DMA_PERIPH_WIDTH_32BIT - periph_inc: DMA_PERIPH_INCREASE_ENABLE,DMA_PERIPH_INCREASE_DISABLE,DMA_PERIPH_INCREASE_FIX - memory0_addr: memory0 base address - memory_width: DMA_MEMORY_WIDTH_8BIT,DMA_MEMORY_WIDTH_16BIT,DMA_MEMORY_WIDTH_32BIT - memory_inc: DMA_MEMORY_INCREASE_ENABLE,DMA_MEMORY_INCREASE_DISABLE - memory_burst_width: DMA_MEMORY_BURST_SINGLE,DMA_MEMORY_BURST_4_BEAT,DMA_MEMORY_BURST_8_BEAT,DMA_MEMORY_BURST_16_BEAT - periph_burst_width: DMA_PERIPH_BURST_SINGLE,DMA_PERIPH_BURST_4_BEAT,DMA_PERIPH_BURST_8_BEAT,DMA_PERIPH_BURST_16_BEAT - critical_value: DMA_FIFO_1_WORD,DMA_FIFO_2_WORD,DMA_FIFO_3_WORD,DMA_FIFO_4_WORD - circular_mode: DMA_CIRCULAR_MODE_ENABLE,DMA_CIRCULAR_MODE_DISABLE - direction: DMA_PERIPH_TO_MEMORY,DMA_MEMORY_TO_PERIPH,DMA_MEMORY_TO_MEMORY - number: the number of remaining data to be transferred by the DMA - priority: DMA_PRIORITY_LOW,DMA_PRIORITY_MEDIUM,DMA_PRIORITY_HIGH,DMA_PRIORITY_ULTRA_HIGH - \param[out] none - \retval none -*/ -void dma_multi_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_multi_data_parameter_struct *init_struct) -{ - uint32_t ctl; - - /* select multi data mode and configure FIFO critical value */ - DMA_CHFCTL(dma_periph, channelx) |= (DMA_CHXFCTL_MDMEN | init_struct->critical_value); - - /* configure peripheral base address */ - DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; - - /* configure memory base address */ - DMA_CHM0ADDR(dma_periph, channelx) = init_struct->memory0_addr; - - /* configure the number of remaining data to be transferred */ - DMA_CHCNT(dma_periph, channelx) = init_struct->number; - - /* configure peripheral and memory transfer width,channel priotity,transfer mode,peripheral and memory burst transfer width */ - ctl = DMA_CHCTL(dma_periph, channelx); - ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO | DMA_CHXCTL_TM | DMA_CHXCTL_PBURST | DMA_CHXCTL_MBURST); - ctl |= (init_struct->periph_width | (init_struct->memory_width) | init_struct->priority | init_struct->direction | init_struct->memory_burst_width | - init_struct->periph_burst_width); - DMA_CHCTL(dma_periph, channelx) = ctl; - - /* configure peripheral increasing mode */ - if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; - } else if(DMA_PERIPH_INCREASE_DISABLE == init_struct->periph_inc) { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; - } - - /* configure memory increasing mode */ - if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; - } - - /* configure DMA circular mode */ - if(DMA_CIRCULAR_MODE_ENABLE == init_struct->circular_mode) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; - } else { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; - } -} - -/*! - \brief set DMA peripheral base address - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to set peripheral base address - \arg DMA_CHx(x=0..7) - \param[in] address: peripheral base address - \param[out] none - \retval none -*/ -void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) -{ - DMA_CHPADDR(dma_periph, channelx) = address; -} - -/*! - \brief set DMA Memory0 base address - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to set Memory base address - \arg DMA_CHx(x=0..7) - \param[in] memory_flag: DMA_MEMORY_x(x=0,1) - \param[in] address: Memory base address - \param[out] none - \retval none -*/ -void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t memory_flag, uint32_t address) -{ - if(memory_flag) { - DMA_CHM1ADDR(dma_periph, channelx) = address; - } else { - DMA_CHM0ADDR(dma_periph, channelx) = address; - } -} - -/*! - \brief set the number of remaining data to be transferred by the DMA - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to set number - \arg DMA_CHx(x=0..7) - \param[in] number: the number of remaining data to be transferred by the DMA - \param[out] none - \retval none -*/ -void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number) -{ - DMA_CHCNT(dma_periph, channelx) = number; -} - -/*! - \brief get the number of remaining data to be transferred by the DMA - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to set number - \arg DMA_CHx(x=0..7) - \param[out] none - \retval uint32_t: the number of remaining data to be transferred by the DMA -*/ -uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx) -{ - return (uint32_t)DMA_CHCNT(dma_periph, channelx); -} - -/*! - \brief configure priority level of DMA channel - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] priority: priority Level of this channel - only one parameter can be selected which is shown as below: - \arg DMA_PRIORITY_LOW: low priority - \arg DMA_PRIORITY_MEDIUM: medium priority - \arg DMA_PRIORITY_HIGH: high priority - \arg DMA_PRIORITY_ULTRA_HIGH: ultra high priority - \param[out] none - \retval none -*/ -void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_PRIO; - ctl |= priority; - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief configure transfer burst beats of memory - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] mbeat: transfer burst beats - \arg DMA_MEMORY_BURST_SINGLE: memory transfer single burst - \arg DMA_MEMORY_BURST_4_BEAT: memory transfer 4-beat burst - \arg DMA_MEMORY_BURST_8_BEAT: memory transfer 8-beat burst - \arg DMA_MEMORY_BURST_16_BEAT: memory transfer 16-beat burst - \param[out] none - \retval none -*/ -void dma_memory_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mbeat) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_MBURST; - ctl |= mbeat; - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief configure transfer burst beats of peripheral - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] pbeat: transfer burst beats - only one parameter can be selected which is shown as below: - \arg DMA_PERIPH_BURST_SINGLE: peripheral transfer single burst - \arg DMA_PERIPH_BURST_4_BEAT: peripheral transfer 4-beat burst - \arg DMA_PERIPH_BURST_8_BEAT: peripheral transfer 8-beat burst - \arg DMA_PERIPH_BURST_16_BEAT: peripheral transfer 16-beat burst - \param[out] none - \retval none -*/ -void dma_periph_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t pbeat) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_PBURST; - ctl |= pbeat; - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief configure transfer data size of memory - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] msize: transfer data size of memory - only one parameter can be selected which is shown as below: - \arg DMA_MEMORY_WIDTH_8BIT: transfer data size of memory is 8-bit - \arg DMA_MEMORY_WIDTH_16BIT: transfer data size of memory is 16-bit - \arg DMA_MEMORY_WIDTH_32BIT: transfer data size of memory is 32-bit - \param[out] none - \retval none -*/ -void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t msize) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_MWIDTH; - ctl |= msize; - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief configure transfer data size of peripheral - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] msize: transfer data size of peripheral - only one parameter can be selected which is shown as below: - \arg DMA_PERIPHERAL_WIDTH_8BIT: transfer data size of peripheral is 8-bit - \arg DMA_PERIPHERAL_WIDTH_16BIT: transfer data size of peripheral is 16-bit - \arg DMA_PERIPHERAL_WIDTH_32BIT: transfer data size of peripheral is 32-bit - \param[out] none - \retval none -*/ -void dma_periph_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t psize) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_PWIDTH; - ctl |= psize; - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief configure memory address generation generation_algorithm - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] generation_algorithm: the address generation algorithm - only one parameter can be selected which is shown as below: - \arg DMA_MEMORY_INCREASE_ENABLE: next address of memory is increasing address mode - \arg DMA_MEMORY_INCREASE_DISABLE: next address of memory is fixed address mode - \param[out] none - \retval none -*/ -void dma_memory_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm) -{ - if(DMA_MEMORY_INCREASE_ENABLE == generation_algorithm) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; - } -} - -/*! - \brief configure peripheral address generation_algorithm - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] generation_algorithm: the address generation algorithm - only one parameter can be selected which is shown as below: - \arg DMA_PERIPH_INCREASE_ENABLE: next address of peripheral is increasing address mode - \arg DMA_PERIPH_INCREASE_DISABLE: next address of peripheral is fixed address mode - \arg DMA_PERIPH_INCREASE_FIX: increasing steps of peripheral address is fixed - \param[out] none - \retval none -*/ -void dma_peripheral_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm) -{ - if(DMA_PERIPH_INCREASE_ENABLE == generation_algorithm) { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; - } else if(DMA_PERIPH_INCREASE_DISABLE == generation_algorithm) { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; - } else { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PAIF; - } -} - -/*! - \brief enable DMA circulation mode - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval none -*/ -void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx) -{ - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; -} - -/*! - \brief disable DMA circulation mode - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval none -*/ -void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx) -{ - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; -} - -/*! - \brief enable DMA channel - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval none -*/ -void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx) -{ - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CHEN; -} - -/*! - \brief disable DMA channel - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval none -*/ -void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx) -{ - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; -} - -/*! - \brief configure the direction of data transfer on the channel - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] direction: specify the direction of data transfer - only one parameter can be selected which is shown as below: - \arg DMA_PERIPH_TO_MEMORY: read from peripheral and write to memory - \arg DMA_MEMORY_TO_PERIPH: read from memory and write to peripheral - \arg DMA_MEMORY_TO_MEMORY: read from memory and write to memory - \param[out] none - \retval none -*/ -void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t direction) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_TM; - ctl |= direction; - - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief DMA switch buffer mode config - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] memory1_addr: memory1 base address - \param[in] memory_select: DMA_MEMORY_0 or DMA_MEMORY_1 - \param[out] none - \retval none -*/ -void dma_switch_buffer_mode_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t memory1_addr, uint32_t memory_select) -{ - /* configure memory1 base address */ - DMA_CHM1ADDR(dma_periph, channelx) = memory1_addr; - - if(DMA_MEMORY_0 == memory_select) { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MBS; - } else { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MBS; - } -} - -/*! - \brief DMA using memory get - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval the using memory -*/ -uint32_t dma_using_memory_get(uint32_t dma_periph, dma_channel_enum channelx) -{ - if((DMA_CHCTL(dma_periph, channelx)) & DMA_CHXCTL_MBS) { - return DMA_MEMORY_1; - } else { - return DMA_MEMORY_0; - } -} - -/*! - \brief DMA channel peripheral select - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] sub_periph: specify DMA channel peripheral - \arg DMA_SUBPERIx(x=0..7) - \param[out] none - \retval none -*/ -void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph) -{ - uint32_t ctl; - /* acquire DMA_CHxCTL register */ - ctl = DMA_CHCTL(dma_periph, channelx); - /* assign regiser */ - ctl &= ~DMA_CHXCTL_PERIEN; - ctl |= ((uint32_t)sub_periph << CHXCTL_PERIEN_OFFSET); - - DMA_CHCTL(dma_periph, channelx) = ctl; -} - -/*! - \brief DMA flow controller configure - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] controller: specify DMA flow controler - only one parameter can be selected which is shown as below: - \arg DMA_FLOW_CONTROLLER_DMA: DMA is the flow controller - \arg DMA_FLOW_CONTROLLER_PERI: peripheral is the flow controller - \param[out] none - \retval none -*/ -void dma_flow_controller_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t controller) -{ - if(DMA_FLOW_CONTROLLER_DMA == controller) { - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_TFCS; - } else { - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_TFCS; - } -} - -/*! - \brief DMA switch buffer mode enable - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void dma_switch_buffer_mode_enable(uint32_t dma_periph, dma_channel_enum channelx, ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - /* switch buffer mode enable */ - DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_SBMEN; - } else { - /* switch buffer mode disable */ - DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_SBMEN; - } -} - -/*! - \brief DMA FIFO status get - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[out] none - \retval the using memory -*/ -uint32_t dma_fifo_status_get(uint32_t dma_periph, dma_channel_enum channelx) -{ - return (DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FCNT); -} - -/*! - \brief get DMA flag is set or not - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to get flag - \arg DMA_CHx(x=0..7) - \param[in] flag: specify get which flag - only one parameter can be selected which is shown as below: - \arg DMA_FLAG_FEE: FIFO error and exception flag - \arg DMA_FLAG_SDE: single data mode exception flag - \arg DMA_FLAG_TAE: transfer access error flag - \arg DMA_FLAG_HTF: half transfer finish flag - \arg DMA_FLAG_FTF: full transger finish flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) -{ - if(channelx < DMA_CH4) { - if(DMA_INTF0(dma_periph) & DMA_FLAG_ADD(flag, channelx)) { - return SET; - } else { - return RESET; - } - } else { - channelx -= (dma_channel_enum)4; - if(DMA_INTF1(dma_periph) & DMA_FLAG_ADD(flag, channelx)) { - return SET; - } else { - return RESET; - } - } -} - -/*! - \brief clear DMA a channel flag - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to get flag - \arg DMA_CHx(x=0..7) - \param[in] flag: specify get which flag - only one parameter can be selected which is shown as below: - \arg DMA_FLAG_FEE: FIFO error and exception flag - \arg DMA_FLAG_SDE: single data mode exception flag - \arg DMA_FLAG_TAE: transfer access error flag - \arg DMA_FLAG_HTF: half transfer finish flag - \arg DMA_FLAG_FTF: full transger finish flag - \param[out] none - \retval none -*/ -void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) -{ - if(channelx < DMA_CH4) { - DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(flag, channelx); - } else { - channelx -= (dma_channel_enum)4; - DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(flag, channelx); - } -} - -/*! - \brief enable DMA interrupt - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] interrupt: specify which interrupt to enbale - only one parameters can be selected which are shown as below: - \arg DMA_INT_SDE: single data mode exception interrupt enable - \arg DMA_INT_TAE: tranfer access error interrupt enable - \arg DMA_INT_HTF: half transfer finish interrupt enable - \arg DMA_INT_FTF: full transfer finish interrupt enable - \arg DMA_INT_FEE: FIFO exception interrupt enable - \param[out] none - \retval none -*/ -void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) -{ - if(DMA_INT_FEE != interrupt) { - DMA_CHCTL(dma_periph, channelx) |= interrupt; - } else { - DMA_CHFCTL(dma_periph, channelx) |= interrupt; - } -} - -/*! - \brief disable DMA interrupt - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel - \arg DMA_CHx(x=0..7) - \param[in] interrupt: specify which interrupt to disbale - only one parameters can be selected which are shown as below: - \arg DMA_INT_SDE: single data mode exception interrupt enable - \arg DMA_INT_TAE: tranfer access error interrupt enable - \arg DMA_INT_HTF: half transfer finish interrupt enable - \arg DMA_INT_FTF: full transfer finish interrupt enable - \arg DMA_INT_FEE: FIFO exception interrupt enable - \param[out] none - \retval none -*/ -void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) -{ - if(DMA_INT_FEE != interrupt) { - DMA_CHCTL(dma_periph, channelx) &= ~interrupt; - } else { - DMA_CHFCTL(dma_periph, channelx) &= ~interrupt; - } -} - -/*! - \brief get DMA interrupt flag is set or not - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to get interrupt flag - \arg DMA_CHx(x=0..7) - \param[in] interrupt: specify get which flag - only one parameter can be selected which is shown as below: - \arg DMA_INT_FLAG_FEE: FIFO error and exception interrupt flag - \arg DMA_INT_FLAG_SDE: single data mode exception interrupt flag - \arg DMA_INT_FLAG_TAE: transfer access error interrupt flag - \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag - \arg DMA_INT_FLAG_FTF: full transger finish interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) -{ - uint32_t interrupt_enable = 0U, interrupt_flag = 0U; - dma_channel_enum channel_flag_offset = channelx; - if(channelx < DMA_CH4) { - switch(interrupt) { - case DMA_INTF_FEEIF: - interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); - interrupt_enable = DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FEEIE; - break; - case DMA_INTF_SDEIF: - interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_SDEIE; - break; - case DMA_INTF_TAEIF: - interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_TAEIE; - break; - case DMA_INTF_HTFIF: - interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; - break; - case DMA_INTF_FTFIF: - interrupt_flag = (DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt, channelx)); - interrupt_enable = (DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE); - break; - default: - break; - } - } else { - channel_flag_offset -= (dma_channel_enum)4; - switch(interrupt) { - case DMA_INTF_FEEIF: - interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); - interrupt_enable = DMA_CHFCTL(dma_periph, channelx) & DMA_CHXFCTL_FEEIE; - break; - case DMA_INTF_SDEIF: - interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_SDEIE; - break; - case DMA_INTF_TAEIF: - interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_TAEIE; - break; - case DMA_INTF_HTFIF: - interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; - break; - case DMA_INTF_FTFIF: - interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt, channel_flag_offset); - interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE; - break; - default: - break; - } - } - - if(interrupt_flag && interrupt_enable) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear DMA a channel interrupt flag - \param[in] dma_periph: DMAx(x=0,1) - \arg DMAx(x=0,1) - \param[in] channelx: specify which DMA channel to clear interrupt flag - \arg DMA_CHx(x=0..7) - \param[in] interrupt: specify get which flag - only one parameter can be selected which is shown as below: - \arg DMA_INT_FLAG_FEE: FIFO error and exception interrupt flag - \arg DMA_INT_FLAG_SDE: single data mode exception interrupt flag - \arg DMA_INT_FLAG_TAE: transfer access error interrupt flag - \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag - \arg DMA_INT_FLAG_FTF: full transger finish interrupt flag - \param[out] none - \retval none -*/ -void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt) -{ - if(channelx < DMA_CH4) { - DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(interrupt, channelx); - } else { - channelx -= (dma_channel_enum)4; - DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(interrupt, channelx); - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c deleted file mode 100644 index 99235e3f0c1..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c +++ /dev/null @@ -1,3701 +0,0 @@ -/*! - \file gd32f5xx_enet.c - \brief ENET driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_enet.h" -#include - -#if defined (__CC_ARM) /*!< ARM compiler */ -__align(4) -enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ -__align(4) -enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ -__align(4) -uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ -__align(4) -uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ - -#elif defined ( __ICCARM__ ) /*!< IAR compiler */ -#pragma data_alignment=4 -enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ -#pragma data_alignment=4 -enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ -#pragma data_alignment=4 -uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ -#pragma data_alignment=4 -uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ - -#elif defined (__GNUC__) /* GNU Compiler */ -enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM] __attribute__((aligned(4))); /*!< ENET RxDMA descriptor */ -enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM] __attribute__((aligned(4))); /*!< ENET TxDMA descriptor */ -uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__((aligned(4))); /*!< ENET receive buffer */ -uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__((aligned(4))); /*!< ENET transmit buffer */ - -#endif /* __CC_ARM */ - -/* global transmit and receive descriptors pointers */ -enet_descriptors_struct *dma_current_txdesc; -enet_descriptors_struct *dma_current_rxdesc; - -/* structure pointer of ptp descriptor for normal mode */ -enet_descriptors_struct *dma_current_ptp_txdesc = NULL; -enet_descriptors_struct *dma_current_ptp_rxdesc = NULL; - -/* init structure parameters for ENET initialization */ -static enet_initpara_struct enet_initpara = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static uint32_t enet_unknow_err = 0U; -/* array of register offset for debug information get */ -static const uint16_t enet_reg_tab[] = { - 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0028, 0x002C, 0x0034, - - 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x1080, - - 0x0100, 0x0104, 0x0108, 0x010C, 0x0110, 0x014C, 0x0150, 0x0168, 0x0194, 0x0198, 0x01C4, - - 0x0700, 0x0704, 0x0708, 0x070C, 0x0710, 0x0714, 0x0718, 0x071C, 0x0720, 0x0728, 0x072C, - - 0x1000, 0x1004, 0x1008, 0x100C, 0x1010, 0x1014, 0x1018, 0x101C, 0x1020, 0x1024, 0x1048, - - 0x104C, 0x1050, 0x1054 -}; - -/* initialize ENET peripheral with generally concerned parameters, call it by enet_init() */ -static void enet_default_init(void); -#ifndef USE_DELAY -/* insert a delay time */ -static void enet_delay(uint32_t ncount); -#endif /* USE_DELAY */ - -/*! - \brief deinitialize the ENET, and reset structure parameters for ENET initialization - \param[in] none - \param[out] none - \retval none -*/ -void enet_deinit(void) -{ - rcu_periph_reset_enable(RCU_ENETRST); - rcu_periph_reset_disable(RCU_ENETRST); - enet_initpara_reset(); -} - -/*! - \brief configure the parameters which are usually less cared for initialization - note -- this function must be called before enet_init(), otherwise - configuration will be no effect - \param[in] option: different function option, which is related to several parameters, - only one parameter can be selected which is shown as below, refer to enet_option_enum - \arg FORWARD_OPTION: choose to configure the frame forward related parameters - \arg DMABUS_OPTION: choose to configure the DMA bus mode related parameters - \arg DMA_MAXBURST_OPTION: choose to configure the DMA max burst related parameters - \arg DMA_ARBITRATION_OPTION: choose to configure the DMA arbitration related parameters - \arg STORE_OPTION: choose to configure the store forward mode related parameters - \arg DMA_OPTION: choose to configure the DMA descriptor related parameters - \arg VLAN_OPTION: choose to configure vlan related parameters - \arg FLOWCTL_OPTION: choose to configure flow control related parameters - \arg HASHH_OPTION: choose to configure hash high - \arg HASHL_OPTION: choose to configure hash low - \arg FILTER_OPTION: choose to configure frame filter related parameters - \arg HALFDUPLEX_OPTION: choose to configure halfduplex mode related parameters - \arg TIMER_OPTION: choose to configure time counter related parameters - \arg INTERFRAMEGAP_OPTION: choose to configure the inter frame gap related parameters - \param[in] para: the related parameters according to the option - all the related parameters should be configured which are shown as below - FORWARD_OPTION related parameters: - - ENET_AUTO_PADCRC_DROP_ENABLE/ ENET_AUTO_PADCRC_DROP_DISABLE ; - - ENET_TYPEFRAME_CRC_DROP_ENABLE/ ENET_TYPEFRAME_CRC_DROP_DISABLE ; - - ENET_FORWARD_ERRFRAMES_ENABLE/ ENET_FORWARD_ERRFRAMES_DISABLE ; - - ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE/ ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE . - DMABUS_OPTION related parameters: - - ENET_ADDRESS_ALIGN_ENABLE/ ENET_ADDRESS_ALIGN_DISABLE ; - - ENET_FIXED_BURST_ENABLE/ ENET_FIXED_BURST_DISABLE ; - - ENET_MIXED_BURST_ENABLE/ ENET_MIXED_BURST_DISABLE ; - DMA_MAXBURST_OPTION related parameters: - - ENET_RXDP_1BEAT/ ENET_RXDP_2BEAT/ ENET_RXDP_4BEAT/ - ENET_RXDP_8BEAT/ ENET_RXDP_16BEAT/ ENET_RXDP_32BEAT/ - ENET_RXDP_4xPGBL_4BEAT/ ENET_RXDP_4xPGBL_8BEAT/ - ENET_RXDP_4xPGBL_16BEAT/ ENET_RXDP_4xPGBL_32BEAT/ - ENET_RXDP_4xPGBL_64BEAT/ ENET_RXDP_4xPGBL_128BEAT ; - - ENET_PGBL_1BEAT/ ENET_PGBL_2BEAT/ ENET_PGBL_4BEAT/ - ENET_PGBL_8BEAT/ ENET_PGBL_16BEAT/ ENET_PGBL_32BEAT/ - ENET_PGBL_4xPGBL_4BEAT/ ENET_PGBL_4xPGBL_8BEAT/ - ENET_PGBL_4xPGBL_16BEAT/ ENET_PGBL_4xPGBL_32BEAT/ - ENET_PGBL_4xPGBL_64BEAT/ ENET_PGBL_4xPGBL_128BEAT ; - - ENET_RXTX_DIFFERENT_PGBL/ ENET_RXTX_SAME_PGBL ; - DMA_ARBITRATION_OPTION related parameters: - - ENET_ARBITRATION_RXPRIORTX - - ENET_ARBITRATION_RXTX_1_1/ ENET_ARBITRATION_RXTX_2_1/ - ENET_ARBITRATION_RXTX_3_1/ ENET_ARBITRATION_RXTX_4_1/. - STORE_OPTION related parameters: - - ENET_RX_MODE_STOREFORWARD/ ENET_RX_MODE_CUTTHROUGH ; - - ENET_TX_MODE_STOREFORWARD/ ENET_TX_MODE_CUTTHROUGH ; - - ENET_RX_THRESHOLD_64BYTES/ ENET_RX_THRESHOLD_32BYTES/ - ENET_RX_THRESHOLD_96BYTES/ ENET_RX_THRESHOLD_128BYTES ; - - ENET_TX_THRESHOLD_64BYTES/ ENET_TX_THRESHOLD_128BYTES/ - ENET_TX_THRESHOLD_192BYTES/ ENET_TX_THRESHOLD_256BYTES/ - ENET_TX_THRESHOLD_40BYTES/ ENET_TX_THRESHOLD_32BYTES/ - ENET_TX_THRESHOLD_24BYTES/ ENET_TX_THRESHOLD_16BYTES . - DMA_OPTION related parameters: - - ENET_FLUSH_RXFRAME_ENABLE/ ENET_FLUSH_RXFRAME_DISABLE ; - - ENET_SECONDFRAME_OPT_ENABLE/ ENET_SECONDFRAME_OPT_DISABLE ; - - ENET_ENHANCED_DESCRIPTOR/ ENET_NORMAL_DESCRIPTOR . - VLAN_OPTION related parameters: - - ENET_VLANTAGCOMPARISON_12BIT/ ENET_VLANTAGCOMPARISON_16BIT ; - - MAC_VLT_VLTI(regval) . - FLOWCTL_OPTION related parameters: - - MAC_FCTL_PTM(regval) ; - - ENET_ZERO_QUANTA_PAUSE_ENABLE/ ENET_ZERO_QUANTA_PAUSE_DISABLE ; - - ENET_PAUSETIME_MINUS4/ ENET_PAUSETIME_MINUS28/ - ENET_PAUSETIME_MINUS144/ENET_PAUSETIME_MINUS256 ; - - ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT/ ENET_UNIQUE_PAUSEDETECT ; - - ENET_RX_FLOWCONTROL_ENABLE/ ENET_RX_FLOWCONTROL_DISABLE ; - - ENET_TX_FLOWCONTROL_ENABLE/ ENET_TX_FLOWCONTROL_DISABLE ; - - ENET_ACTIVE_THRESHOLD_256BYTES/ ENET_ACTIVE_THRESHOLD_512BYTES ; - - ENET_ACTIVE_THRESHOLD_768BYTES/ ENET_ACTIVE_THRESHOLD_1024BYTES ; - - ENET_ACTIVE_THRESHOLD_1280BYTES/ ENET_ACTIVE_THRESHOLD_1536BYTES ; - - ENET_ACTIVE_THRESHOLD_1792BYTES ; - - ENET_DEACTIVE_THRESHOLD_256BYTES/ ENET_DEACTIVE_THRESHOLD_512BYTES ; - - ENET_DEACTIVE_THRESHOLD_768BYTES/ ENET_DEACTIVE_THRESHOLD_1024BYTES ; - - ENET_DEACTIVE_THRESHOLD_1280BYTES/ ENET_DEACTIVE_THRESHOLD_1536BYTES ; - - ENET_DEACTIVE_THRESHOLD_1792BYTES . - HASHH_OPTION related parameters: - - 0x0~0xFFFF FFFFU - HASHL_OPTION related parameters: - - 0x0~0xFFFF FFFFU - FILTER_OPTION related parameters: - - ENET_SRC_FILTER_NORMAL_ENABLE/ ENET_SRC_FILTER_INVERSE_ENABLE/ - ENET_SRC_FILTER_DISABLE ; - - ENET_DEST_FILTER_INVERSE_ENABLE/ ENET_DEST_FILTER_INVERSE_DISABLE ; - - ENET_MULTICAST_FILTER_HASH_OR_PERFECT/ ENET_MULTICAST_FILTER_HASH/ - ENET_MULTICAST_FILTER_PERFECT/ ENET_MULTICAST_FILTER_NONE ; - - ENET_UNICAST_FILTER_EITHER/ ENET_UNICAST_FILTER_HASH/ - ENET_UNICAST_FILTER_PERFECT ; - - ENET_PCFRM_PREVENT_ALL/ ENET_PCFRM_PREVENT_PAUSEFRAME/ - ENET_PCFRM_FORWARD_ALL/ ENET_PCFRM_FORWARD_FILTERED . - HALFDUPLEX_OPTION related parameters: - - ENET_CARRIERSENSE_ENABLE/ ENET_CARRIERSENSE_DISABLE ; - - ENET_RECEIVEOWN_ENABLE/ ENET_RECEIVEOWN_DISABLE ; - - ENET_RETRYTRANSMISSION_ENABLE/ ENET_RETRYTRANSMISSION_DISABLE ; - - ENET_BACKOFFLIMIT_10/ ENET_BACKOFFLIMIT_8/ - ENET_BACKOFFLIMIT_4/ ENET_BACKOFFLIMIT_1 ; - - ENET_DEFERRALCHECK_ENABLE/ ENET_DEFERRALCHECK_DISABLE . - TIMER_OPTION related parameters: - - ENET_WATCHDOG_ENABLE/ ENET_WATCHDOG_DISABLE ; - - ENET_JABBER_ENABLE/ ENET_JABBER_DISABLE ; - INTERFRAMEGAP_OPTION related parameters: - - ENET_INTERFRAMEGAP_96BIT/ ENET_INTERFRAMEGAP_88BIT/ - ENET_INTERFRAMEGAP_80BIT/ ENET_INTERFRAMEGAP_72BIT/ - ENET_INTERFRAMEGAP_64BIT/ ENET_INTERFRAMEGAP_56BIT/ - ENET_INTERFRAMEGAP_48BIT/ ENET_INTERFRAMEGAP_40BIT . - \param[out] none - \retval none -*/ -void enet_initpara_config(enet_option_enum option, uint32_t para) -{ - switch(option) { - case FORWARD_OPTION: - /* choose to configure forward_frame, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)FORWARD_OPTION; - enet_initpara.forward_frame = para; - break; - case DMABUS_OPTION: - /* choose to configure dmabus_mode, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)DMABUS_OPTION; - enet_initpara.dmabus_mode = para; - break; - case DMA_MAXBURST_OPTION: - /* choose to configure dma_maxburst, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)DMA_MAXBURST_OPTION; - enet_initpara.dma_maxburst = para; - break; - case DMA_ARBITRATION_OPTION: - /* choose to configure dma_arbitration, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)DMA_ARBITRATION_OPTION; - enet_initpara.dma_arbitration = para; - break; - case STORE_OPTION: - /* choose to configure store_forward_mode, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)STORE_OPTION; - enet_initpara.store_forward_mode = para; - break; - case DMA_OPTION: - /* choose to configure dma_function, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)DMA_OPTION; - -#ifndef SELECT_DESCRIPTORS_ENHANCED_MODE - para &= ~ENET_ENHANCED_DESCRIPTOR; -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - - enet_initpara.dma_function = para; - break; - case VLAN_OPTION: - /* choose to configure vlan_config, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)VLAN_OPTION; - enet_initpara.vlan_config = para; - break; - case FLOWCTL_OPTION: - /* choose to configure flow_control, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)FLOWCTL_OPTION; - enet_initpara.flow_control = para; - break; - case HASHH_OPTION: - /* choose to configure hashtable_high, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)HASHH_OPTION; - enet_initpara.hashtable_high = para; - break; - case HASHL_OPTION: - /* choose to configure hashtable_low, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)HASHL_OPTION; - enet_initpara.hashtable_low = para; - break; - case FILTER_OPTION: - /* choose to configure framesfilter_mode, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)FILTER_OPTION; - enet_initpara.framesfilter_mode = para; - break; - case HALFDUPLEX_OPTION: - /* choose to configure halfduplex_param, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)HALFDUPLEX_OPTION; - enet_initpara.halfduplex_param = para; - break; - case TIMER_OPTION: - /* choose to configure timer_config, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)TIMER_OPTION; - enet_initpara.timer_config = para; - break; - case INTERFRAMEGAP_OPTION: - /* choose to configure interframegap, and save the configuration parameters */ - enet_initpara.option_enable |= (uint32_t)INTERFRAMEGAP_OPTION; - enet_initpara.interframegap = para; - break; - default: - break; - } -} - -/*! - \brief initialize ENET peripheral with generally concerned parameters and the less cared - parameters - \param[in] mediamode: PHY mode and mac loopback configurations, only one parameter can be selected - which is shown as below, refer to enet_mediamode_enum - \arg ENET_AUTO_NEGOTIATION: PHY auto negotiation - \arg ENET_100M_FULLDUPLEX: 100Mbit/s, full-duplex - \arg ENET_100M_HALFDUPLEX: 100Mbit/s, half-duplex - \arg ENET_10M_FULLDUPLEX: 10Mbit/s, full-duplex - \arg ENET_10M_HALFDUPLEX: 10Mbit/s, half-duplex - \arg ENET_LOOPBACKMODE: MAC in loopback mode at the MII - \param[in] checksum: IP frame checksum offload function, only one parameter can be selected - which is shown as below, refer to enet_mediamode_enum - \arg ENET_NO_AUTOCHECKSUM: disable IP frame checksum function - \arg ENET_AUTOCHECKSUM_DROP_FAILFRAMES: enable IP frame checksum function - \arg ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES: enable IP frame checksum function, and the received frame - with only payload error but no other errors will not be dropped - \param[in] recept: frame filter function, only one parameter can be selected - which is shown as below, refer to enet_frmrecept_enum - \arg ENET_PROMISCUOUS_MODE: promiscuous mode enabled - \arg ENET_RECEIVEALL: all received frame are forwarded to application - \arg ENET_BROADCAST_FRAMES_PASS: the address filters pass all received broadcast frames - \arg ENET_BROADCAST_FRAMES_DROP: the address filters filter all incoming broadcast frames - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept) -{ - uint32_t reg_value = 0U, reg_temp = 0U, temp = 0U; - uint32_t media_temp = 0U; - uint32_t timeout = 0U; - uint16_t phy_value = 0U; - ErrStatus phy_state = ERROR, enet_state = ERROR; - - /* PHY interface configuration, configure SMI clock and reset PHY chip */ - if(ERROR == enet_phy_config()) { - _ENET_DELAY_(PHY_RESETDELAY); - if(ERROR == enet_phy_config()) { - return enet_state; - } - } - /* initialize ENET peripheral with generally concerned parameters */ - enet_default_init(); - - /* 1st, configure mediamode */ - media_temp = (uint32_t)mediamode; - /* if is PHY auto negotiation */ - if((uint32_t)ENET_AUTO_NEGOTIATION == media_temp) { - /* wait for PHY_LINKED_STATUS bit be set */ - do { - enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); - phy_value &= PHY_LINKED_STATUS; - timeout++; - } while((RESET == phy_value) && (timeout < PHY_READ_TO)); - /* return ERROR due to timeout */ - if(PHY_READ_TO == timeout) { - return enet_state; - } - /* reset timeout counter */ - timeout = 0U; - - /* enable auto-negotiation */ - phy_value = PHY_AUTONEGOTIATION; - phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); - if(!phy_state) { - /* return ERROR due to write timeout */ - return enet_state; - } - - /* wait for the PHY_AUTONEGO_COMPLETE bit be set */ - do { - enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); - phy_value &= PHY_AUTONEGO_COMPLETE; - timeout++; - } while((RESET == phy_value) && (timeout < (uint32_t)PHY_READ_TO)); - /* return ERROR due to timeout */ - if(PHY_READ_TO == timeout) { - return enet_state; - } - /* reset timeout counter */ - timeout = 0U; - - /* read the result of the auto-negotiation */ - enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_SR, &phy_value); - /* configure the duplex mode of MAC following the auto-negotiation result */ - if((uint16_t)RESET != (phy_value & PHY_DUPLEX_STATUS)) { - media_temp = ENET_MODE_FULLDUPLEX; - } else { - media_temp = ENET_MODE_HALFDUPLEX; - } - /* configure the communication speed of MAC following the auto-negotiation result */ - if((uint16_t)RESET != (phy_value & PHY_SPEED_STATUS)) { - media_temp |= ENET_SPEEDMODE_10M; - } else { - media_temp |= ENET_SPEEDMODE_100M; - } - } else { - phy_value = (uint16_t)((media_temp & ENET_MAC_CFG_DPM) >> 3); - phy_value |= (uint16_t)((media_temp & ENET_MAC_CFG_SPD) >> 1); - phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); - if(!phy_state) { - /* return ERROR due to write timeout */ - return enet_state; - } - /* PHY configuration need some time */ - _ENET_DELAY_(PHY_CONFIGDELAY); - } - /* after configuring the PHY, use mediamode to configure registers */ - reg_value = ENET_MAC_CFG; - /* configure ENET_MAC_CFG register */ - reg_value &= (~(ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM | ENET_MAC_CFG_LBM)); - reg_value |= media_temp; - ENET_MAC_CFG = reg_value; - - - /* 2st, configure checksum */ - if(RESET != ((uint32_t)checksum & ENET_CHECKSUMOFFLOAD_ENABLE)) { - ENET_MAC_CFG |= ENET_CHECKSUMOFFLOAD_ENABLE; - - reg_value = ENET_DMA_CTL; - /* configure ENET_DMA_CTL register */ - reg_value &= ~ENET_DMA_CTL_DTCERFD; - reg_value |= ((uint32_t)checksum & ENET_DMA_CTL_DTCERFD); - ENET_DMA_CTL = reg_value; - } - - /* 3rd, configure recept */ - ENET_MAC_FRMF |= (uint32_t)recept; - - /* 4th, configure different function options */ - /* configure forward_frame related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)FORWARD_OPTION)) { - reg_temp = enet_initpara.forward_frame; - - reg_value = ENET_MAC_CFG; - temp = reg_temp; - /* configure ENET_MAC_CFG register */ - reg_value &= (~(ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD)); - temp &= (ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD); - reg_value |= temp; - ENET_MAC_CFG = reg_value; - - reg_value = ENET_DMA_CTL; - temp = reg_temp; - /* configure ENET_DMA_CTL register */ - reg_value &= (~(ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF)); - temp &= ((ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF) << 2); - reg_value |= (temp >> 2); - ENET_DMA_CTL = reg_value; - } - - /* configure dmabus_mode related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)DMABUS_OPTION)) { - temp = enet_initpara.dmabus_mode; - - reg_value = ENET_DMA_BCTL; - /* configure ENET_DMA_BCTL register */ - reg_value &= ~(ENET_DMA_BCTL_AA | ENET_DMA_BCTL_FB \ - | ENET_DMA_BCTL_FPBL | ENET_DMA_BCTL_MB); - reg_value |= temp; - ENET_DMA_BCTL = reg_value; - } - - /* configure dma_maxburst related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_MAXBURST_OPTION)) { - temp = enet_initpara.dma_maxburst; - - reg_value = ENET_DMA_BCTL; - /* configure ENET_DMA_BCTL register */ - reg_value &= ~(ENET_DMA_BCTL_RXDP | ENET_DMA_BCTL_PGBL | ENET_DMA_BCTL_UIP); - reg_value |= temp; - ENET_DMA_BCTL = reg_value; - } - - /* configure dma_arbitration related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_ARBITRATION_OPTION)) { - temp = enet_initpara.dma_arbitration; - - reg_value = ENET_DMA_BCTL; - /* configure ENET_DMA_BCTL register */ - reg_value &= ~(ENET_DMA_BCTL_RTPR | ENET_DMA_BCTL_DAB); - reg_value |= temp; - ENET_DMA_BCTL = reg_value; - } - - /* configure store_forward_mode related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)STORE_OPTION)) { - temp = enet_initpara.store_forward_mode; - - reg_value = ENET_DMA_CTL; - /* configure ENET_DMA_CTL register */ - reg_value &= ~(ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD | ENET_DMA_CTL_RTHC | ENET_DMA_CTL_TTHC); - reg_value |= temp; - ENET_DMA_CTL = reg_value; - } - - /* configure dma_function related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_OPTION)) { - reg_temp = enet_initpara.dma_function; - - reg_value = ENET_DMA_CTL; - temp = reg_temp; - /* configure ENET_DMA_CTL register */ - reg_value &= (~(ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF)); - temp &= (ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF); - reg_value |= temp; - ENET_DMA_CTL = reg_value; - - reg_value = ENET_DMA_BCTL; - temp = reg_temp; - /* configure ENET_DMA_BCTL register */ - reg_value &= (~ENET_DMA_BCTL_DFM); - temp &= ENET_DMA_BCTL_DFM; - reg_value |= temp; - ENET_DMA_BCTL = reg_value; - } - - /* configure vlan_config related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)VLAN_OPTION)) { - reg_temp = enet_initpara.vlan_config; - - reg_value = ENET_MAC_VLT; - /* configure ENET_MAC_VLT register */ - reg_value &= ~(ENET_MAC_VLT_VLTI | ENET_MAC_VLT_VLTC); - reg_value |= reg_temp; - ENET_MAC_VLT = reg_value; - } - - /* configure flow_control related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)FLOWCTL_OPTION)) { - reg_temp = enet_initpara.flow_control; - - reg_value = ENET_MAC_FCTL; - temp = reg_temp; - /* configure ENET_MAC_FCTL register */ - reg_value &= ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ - | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); - temp &= (ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ - | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); - reg_value |= temp; - ENET_MAC_FCTL = reg_value; - - reg_value = ENET_MAC_FCTH; - temp = reg_temp; - /* configure ENET_MAC_FCTH register */ - reg_value &= ~(ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD); - temp &= ((ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD) << 8); - reg_value |= (temp >> 8); - ENET_MAC_FCTH = reg_value; - } - - /* configure hashtable_high related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)HASHH_OPTION)) { - ENET_MAC_HLH = enet_initpara.hashtable_high; - } - - /* configure hashtable_low related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)HASHL_OPTION)) { - ENET_MAC_HLL = enet_initpara.hashtable_low; - } - - /* configure framesfilter_mode related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)FILTER_OPTION)) { - reg_temp = enet_initpara.framesfilter_mode; - - reg_value = ENET_MAC_FRMF; - /* configure ENET_MAC_FRMF register */ - reg_value &= ~(ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT | ENET_MAC_FRMF_DAIFLT \ - | ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_MFD \ - | ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_PCFRM); - reg_value |= reg_temp; - ENET_MAC_FRMF = reg_value; - } - - /* configure halfduplex_param related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)HALFDUPLEX_OPTION)) { - reg_temp = enet_initpara.halfduplex_param; - - reg_value = ENET_MAC_CFG; - /* configure ENET_MAC_CFG register */ - reg_value &= ~(ENET_MAC_CFG_CSD | ENET_MAC_CFG_ROD | ENET_MAC_CFG_RTD \ - | ENET_MAC_CFG_BOL | ENET_MAC_CFG_DFC); - reg_value |= reg_temp; - ENET_MAC_CFG = reg_value; - } - - /* configure timer_config related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)TIMER_OPTION)) { - reg_temp = enet_initpara.timer_config; - - reg_value = ENET_MAC_CFG; - /* configure ENET_MAC_CFG register */ - reg_value &= ~(ENET_MAC_CFG_WDD | ENET_MAC_CFG_JBD); - reg_value |= reg_temp; - ENET_MAC_CFG = reg_value; - } - - /* configure interframegap related registers */ - if(RESET != (enet_initpara.option_enable & (uint32_t)INTERFRAMEGAP_OPTION)) { - reg_temp = enet_initpara.interframegap; - - reg_value = ENET_MAC_CFG; - /* configure ENET_MAC_CFG register */ - reg_value &= ~ENET_MAC_CFG_IGBS; - reg_value |= reg_temp; - ENET_MAC_CFG = reg_value; - } - - enet_state = SUCCESS; - return enet_state; -} - -/*! - \brief reset all core internal registers located in CLK_TX and CLK_RX - \param[in] none - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_software_reset(void) -{ - uint32_t timeout = 0U; - ErrStatus enet_state = ERROR; - uint32_t dma_flag; - - /* reset all core internal registers located in CLK_TX and CLK_RX */ - ENET_DMA_BCTL |= ENET_DMA_BCTL_SWR; - - /* wait for reset operation complete */ - do { - dma_flag = (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR); - timeout++; - } while((RESET != dma_flag) && (ENET_DELAY_TO != timeout)); - - /* reset operation complete */ - if(RESET == (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR)) { - enet_state = SUCCESS; - } - - return enet_state; -} - -/*! - \brief check receive frame valid and return frame size - \param[in] none - \param[out] none - \retval size of received frame: 0x0 - 0x3FFF -*/ -uint32_t enet_rxframe_size_get(void) -{ - uint32_t size = 0U; - uint32_t status; - - /* get rdes0 information of current RxDMA descriptor */ - status = dma_current_rxdesc->status; - - /* if the desciptor is owned by DMA */ - if((uint32_t)RESET != (status & ENET_RDES0_DAV)) { - return 0U; - } - - /* if has any error, or the frame uses two or more descriptors */ - if((((uint32_t)RESET) != (status & ENET_RDES0_ERRS)) || - (((uint32_t)RESET) == (status & ENET_RDES0_LDES)) || - (((uint32_t)RESET) == (status & ENET_RDES0_FDES))) { - /* drop current receive frame */ - enet_rxframe_drop(); - - return 1U; - } -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE - /* if is an ethernet-type frame, and IP frame payload error occurred */ - if(((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FRMT) && - ((uint32_t)RESET) != (dma_current_rxdesc->extended_status & ENET_RDES4_IPPLDERR)) { - /* drop current receive frame */ - enet_rxframe_drop(); - - return 1U; - } -#else - /* if is an ethernet-type frame, and IP frame payload error occurred */ - if((((uint32_t)RESET) != (status & ENET_RDES0_FRMT)) && - (((uint32_t)RESET) != (status & ENET_RDES0_PCERR))) { - /* drop current receive frame */ - enet_rxframe_drop(); - - return 1U; - } -#endif - /* if CPU owns current descriptor, no error occured, the frame uses only one descriptor */ - if((((uint32_t)RESET) == (status & ENET_RDES0_DAV)) && - (((uint32_t)RESET) == (status & ENET_RDES0_ERRS)) && - (((uint32_t)RESET) != (status & ENET_RDES0_LDES)) && - (((uint32_t)RESET) != (status & ENET_RDES0_FDES))) { - /* get the size of the received data including CRC */ - size = GET_RDES0_FRML(status); - /* substract the CRC size */ - size = size - 4U; - - /* if is a type frame, and CRC is not included in forwarding frame */ - if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (status & ENET_RDES0_FRMT))) { - size = size + 4U; - } - } else { - enet_unknow_err++; - enet_rxframe_drop(); - - return 1U; - } - - /* return packet size */ - return size; -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in chain mode - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[out] none - \retval none -*/ -void enet_descriptors_chain_init(enet_dmadirection_enum direction) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc, *desc_tab; - uint8_t *buf; - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* select chain mode */ - desc_status = ENET_TDES0_TCHM; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* select receive chained mode and set buffer1 size */ - desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - } - dma_current_ptp_rxdesc = NULL; - dma_current_ptp_txdesc = NULL; - - /* configure each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* if is not the last descriptor */ - if(num < (count - 1U)) { - /* configure the next descriptor address */ - desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); - } else { - /* when it is the last descriptor, the next descriptor address - equals to first descriptor address in descriptor table */ - desc->buffer2_next_desc_addr = (uint32_t) desc_tab; - } - } -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in ring mode - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[out] none - \retval none -*/ -void enet_descriptors_ring_init(enet_dmadirection_enum direction) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc; - enet_descriptors_struct *desc_tab; - uint8_t *buf; - - /* configure descriptor skip length */ - ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; - ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* set buffer1 size */ - desc_bufsize = ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - } - dma_current_ptp_rxdesc = NULL; - dma_current_ptp_txdesc = NULL; - - /* configure each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* when it is the last descriptor */ - if(num == (count - 1U)) { - if(ENET_DMA_TX == direction) { - /* configure transmit end of ring mode */ - desc->status |= ENET_TDES0_TERM; - } else { - /* configure receive end of ring mode */ - desc->control_buffer_size |= ENET_RDES1_RERM; - } - } - } -} - -/*! - \brief handle current received frame data to application buffer - \param[in] bufsize: the size of buffer which is the parameter in function - \param[out] buffer: pointer to the received frame data - note -- if the input is NULL, user should copy data in application by himself - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize) -{ - uint32_t offset = 0U, size = 0U; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { - return ERROR; - } - - - /* if buffer pointer is null, indicates that users has copied data in application */ - if(NULL != buffer) { - /* if no error occurs, and the frame uses only one descriptor */ - if((((uint32_t)RESET) == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && - (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && - (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { - /* get the frame length except CRC */ - size = GET_RDES0_FRML(dma_current_rxdesc->status); - size = size - 4U; - - /* if is a type frame, and CRC is not included in forwarding frame */ - if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { - size = size + 4U; - } - - /* to avoid situation that the frame size exceeds the buffer length */ - if(size > bufsize) { - return ERROR; - } - - /* copy data from Rx buffer to application buffer */ - for(offset = 0U; offset < size; offset++) { - (*(buffer + offset)) = (*(__IO uint8_t *)(uint32_t)((dma_current_rxdesc->buffer1_addr) + offset)); - } - - } else { - /* return ERROR */ - return ERROR; - } - } - /* enable reception, descriptor is owned by DMA */ - dma_current_rxdesc->status = ENET_RDES0_DAV; - - /* check Rx buffer unavailable flag status */ - if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { - /* clear RBU flag */ - ENET_DMA_STAT = ENET_DMA_STAT_RBU; - /* resume DMA reception by writing to the RPEN register*/ - ENET_DMA_RPEN = 0U; - } - - /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ - /* chained mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { - dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + - (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); - } - } - - return SUCCESS; -} - -/*! - \brief handle application buffer data to transmit it - \param[in] buffer: pointer to the frame data to be transmitted, - note -- if the input is NULL, user should handle the data in application by himself - \param[in] length: the length of frame data to be transmitted - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length) -{ - uint32_t offset = 0U; - uint32_t dma_tbu_flag, dma_tu_flag; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { - return ERROR; - } - - /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ - if(length > ENET_MAX_FRAME_SIZE) { - return ERROR; - } - - /* if buffer pointer is null, indicates that users has handled data in application */ - if(NULL != buffer) { - /* copy frame data from application buffer to Tx buffer */ - for(offset = 0U; offset < length; offset++) { - (*(__IO uint8_t *)(uint32_t)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); - } - } - - /* set the frame length */ - dma_current_txdesc->control_buffer_size = length; - /* set the segment of frame, frame is transmitted in one descriptor */ - dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; - /* enable the DMA transmission */ - dma_current_txdesc->status |= ENET_TDES0_DAV; - - /* check Tx buffer unavailable flag status */ - dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); - dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); - - if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { - /* clear TBU and TU flag */ - ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); - /* resume DMA transmission by writing to the TPEN register*/ - ENET_DMA_TPEN = 0U; - } - - /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ - /* chained mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { - dma_current_txdesc = (enet_descriptors_struct *)(dma_current_txdesc->buffer2_next_desc_addr); - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_txdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + - (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); - } - } - - return SUCCESS; -} - -/*! - \brief configure the transmit IP frame checksum offload calculation and insertion - \param[in] desc: the descriptor pointer which users want to configure - \param[in] checksum: IP frame checksum configuration - only one parameter can be selected which is shown as below - \arg ENET_CHECKSUM_DISABLE: checksum insertion disabled - \arg ENET_CHECKSUM_IPV4HEADER: only IP header checksum calculation and insertion are enabled - \arg ENET_CHECKSUM_TCPUDPICMP_SEGMENT: TCP/UDP/ICMP checksum insertion calculated but pseudo-header - \arg ENET_CHECKSUM_TCPUDPICMP_FULL: TCP/UDP/ICMP checksum insertion fully calculated - \param[out] none - \retval ErrStatus: ERROR, SUCCESS -*/ -ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum) -{ - if(NULL != desc) { - desc->status &= ~ENET_TDES0_CM; - desc->status |= checksum; - return SUCCESS; - } else { - return ERROR; - } -} - -/*! - \brief ENET Tx and Rx function enable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_enable(void) -{ - enet_tx_enable(); - enet_rx_enable(); -} - -/*! - \brief ENET Tx and Rx function disable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_disable(void) -{ - enet_tx_disable(); - enet_rx_disable(); -} - -/*! - \brief configure MAC address - \param[in] mac_addr: select which MAC address will be set, - only one parameter can be selected which is shown as below - \arg ENET_MAC_ADDRESS0: set MAC address 0 filter - \arg ENET_MAC_ADDRESS1: set MAC address 1 filter - \arg ENET_MAC_ADDRESS2: set MAC address 2 filter - \arg ENET_MAC_ADDRESS3: set MAC address 3 filter - \param[in] paddr: the buffer pointer which stores the MAC address - (little-ending store, such as MAC address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) - \param[out] none - \retval none -*/ -void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]) -{ - REG32(ENET_ADDRH_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRH(paddr); - REG32(ENET_ADDRL_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRL(paddr); -} - -/*! - \brief get MAC address - \param[in] mac_addr: select which MAC address will be get, refer to enet_macaddress_enum - only one parameter can be selected which is shown as below - \arg ENET_MAC_ADDRESS0: get MAC address 0 filter - \arg ENET_MAC_ADDRESS1: get MAC address 1 filter - \arg ENET_MAC_ADDRESS2: get MAC address 2 filter - \arg ENET_MAC_ADDRESS3: get MAC address 3 filter - \param[out] paddr: the buffer pointer which is stored the MAC address - (little-ending store, such as mac address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) - \param[in] bufsize: refer to the size of the buffer which stores the MAC address - \arg 6 - 255 - \retval ErrStatus: ERROR, SUCCESS -*/ -ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize) -{ - if(bufsize < 6U) { - return ERROR; - } - paddr[0] = ENET_GET_MACADDR(mac_addr, 0U); - paddr[1] = ENET_GET_MACADDR(mac_addr, 1U); - paddr[2] = ENET_GET_MACADDR(mac_addr, 2U); - paddr[3] = ENET_GET_MACADDR(mac_addr, 3U); - paddr[4] = ENET_GET_MACADDR(mac_addr, 4U); - paddr[5] = ENET_GET_MACADDR(mac_addr, 5U); - return SUCCESS; -} - -/*! - \brief get the ENET MAC/MSC/PTP/DMA status flag - \param[in] enet_flag: ENET status flag, refer to enet_flag_enum, - only one parameter can be selected which is shown as below - \arg ENET_MAC_FLAG_MPKR: magic packet received flag - \arg ENET_MAC_FLAG_WUFR: wakeup frame received flag - \arg ENET_MAC_FLAG_FLOWCONTROL: flow control status flag - \arg ENET_MAC_FLAG_WUM: WUM status flag - \arg ENET_MAC_FLAG_MSC: MSC status flag - \arg ENET_MAC_FLAG_MSCR: MSC receive status flag - \arg ENET_MAC_FLAG_MSCT: MSC transmit status flag - \arg ENET_MAC_FLAG_TMST: time stamp trigger status flag - \arg ENET_PTP_FLAG_TSSCO: timestamp second counter overflow flag - \arg ENET_PTP_FLAG_TTM: target time match flag - \arg ENET_MSC_FLAG_RFCE: received frames CRC error flag - \arg ENET_MSC_FLAG_RFAE: received frames alignment error flag - \arg ENET_MSC_FLAG_RGUF: received good unicast frames flag - \arg ENET_MSC_FLAG_TGFSC: transmitted good frames single collision flag - \arg ENET_MSC_FLAG_TGFMSC: transmitted good frames more single collision flag - \arg ENET_MSC_FLAG_TGF: transmitted good frames flag - \arg ENET_DMA_FLAG_TS: transmit status flag - \arg ENET_DMA_FLAG_TPS: transmit process stopped status flag - \arg ENET_DMA_FLAG_TBU: transmit buffer unavailable status flag - \arg ENET_DMA_FLAG_TJT: transmit jabber timeout status flag - \arg ENET_DMA_FLAG_RO: receive overflow status flag - \arg ENET_DMA_FLAG_TU: transmit underflow status flag - \arg ENET_DMA_FLAG_RS: receive status flag - \arg ENET_DMA_FLAG_RBU: receive buffer unavailable status flag - \arg ENET_DMA_FLAG_RPS: receive process stopped status flag - \arg ENET_DMA_FLAG_RWT: receive watchdog timeout status flag - \arg ENET_DMA_FLAG_ET: early transmit status flag - \arg ENET_DMA_FLAG_FBE: fatal bus error status flag - \arg ENET_DMA_FLAG_ER: early receive status flag - \arg ENET_DMA_FLAG_AI: abnormal interrupt summary flag - \arg ENET_DMA_FLAG_NI: normal interrupt summary flag - \arg ENET_DMA_FLAG_EB_DMA_ERROR: DMA error flag - \arg ENET_DMA_FLAG_EB_TRANSFER_ERROR: transfer error flag - \arg ENET_DMA_FLAG_EB_ACCESS_ERROR: access error flag - \arg ENET_DMA_FLAG_MSC: MSC status flag - \arg ENET_DMA_FLAG_WUM: WUM status flag - \arg ENET_DMA_FLAG_TST: timestamp trigger status flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus enet_flag_get(enet_flag_enum enet_flag) -{ - if(RESET != (ENET_REG_VAL(enet_flag) & BIT(ENET_BIT_POS(enet_flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear the ENET DMA status flag - \param[in] enet_flag: ENET DMA flag clear, refer to enet_flag_clear_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_FLAG_TS_CLR: transmit status flag clear - \arg ENET_DMA_FLAG_TPS_CLR: transmit process stopped status flag clear - \arg ENET_DMA_FLAG_TBU_CLR: transmit buffer unavailable status flag clear - \arg ENET_DMA_FLAG_TJT_CLR: transmit jabber timeout status flag clear - \arg ENET_DMA_FLAG_RO_CLR: receive overflow status flag clear - \arg ENET_DMA_FLAG_TU_CLR: transmit underflow status flag clear - \arg ENET_DMA_FLAG_RS_CLR: receive status flag clear - \arg ENET_DMA_FLAG_RBU_CLR: receive buffer unavailable status flag clear - \arg ENET_DMA_FLAG_RPS_CLR: receive process stopped status flag clear - \arg ENET_DMA_FLAG_RWT_CLR: receive watchdog timeout status flag clear - \arg ENET_DMA_FLAG_ET_CLR: early transmit status flag clear - \arg ENET_DMA_FLAG_FBE_CLR: fatal bus error status flag clear - \arg ENET_DMA_FLAG_ER_CLR: early receive status flag clear - \arg ENET_DMA_FLAG_AI_CLR: abnormal interrupt summary flag clear - \arg ENET_DMA_FLAG_NI_CLR: normal interrupt summary flag clear - \param[out] none - \retval none -*/ -void enet_flag_clear(enet_flag_clear_enum enet_flag) -{ - /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ - ENET_REG_VAL(enet_flag) = BIT(ENET_BIT_POS(enet_flag)); -} - -/*! - \brief enable ENET MAC/MSC/DMA interrupt - \param[in] enet_int: ENET interrupt,, refer to enet_int_enum - only one parameter can be selected which is shown as below - \arg ENET_MAC_INT_WUMIM: WUM interrupt mask - \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask - \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask - \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask - \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask - \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask - \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask - \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask - \arg ENET_DMA_INT_TIE: transmit interrupt enable - \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable - \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable - \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable - \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable - \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable - \arg ENET_DMA_INT_RIE: receive interrupt enable - \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable - \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable - \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable - \arg ENET_DMA_INT_ETIE: early transmit interrupt enable - \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable - \arg ENET_DMA_INT_ERIE: early receive interrupt enable - \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable - \arg ENET_DMA_INT_NIE: normal interrupt summary enable - \param[out] none - \retval none -*/ -void enet_interrupt_enable(enet_int_enum enet_int) -{ - if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)) { - /* ENET_DMA_INTEN register interrupt */ - ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); - } else { - /* other INTMSK register interrupt */ - ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); - } -} - -/*! - \brief disable ENET MAC/MSC/DMA interrupt - \param[in] enet_int: ENET interrupt, - only one parameter can be selected which is shown as below - \arg ENET_MAC_INT_WUMIM: WUM interrupt mask - \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask - \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask - \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask - \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask - \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask - \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask - \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask - \arg ENET_DMA_INT_TIE: transmit interrupt enable - \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable - \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable - \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable - \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable - \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable - \arg ENET_DMA_INT_RIE: receive interrupt enable - \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable - \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable - \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable - \arg ENET_DMA_INT_ETIE: early transmit interrupt enable - \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable - \arg ENET_DMA_INT_ERIE: early receive interrupt enable - \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable - \arg ENET_DMA_INT_NIE: normal interrupt summary enable - \param[out] none - \retval none -*/ -void enet_interrupt_disable(enet_int_enum enet_int) -{ - if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)) { - /* ENET_DMA_INTEN register interrupt */ - ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); - } else { - /* other INTMSK register interrupt */ - ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); - } -} - -/*! - \brief get ENET MAC/MSC/DMA interrupt flag - \param[in] int_flag: ENET interrupt flag, - only one parameter can be selected which is shown as below - \arg ENET_MAC_INT_FLAG_WUM: WUM status flag - \arg ENET_MAC_INT_FLAG_MSC: MSC status flag - \arg ENET_MAC_INT_FLAG_MSCR: MSC receive status flag - \arg ENET_MAC_INT_FLAG_MSCT: MSC transmit status flag - \arg ENET_MAC_INT_FLAG_TMST: time stamp trigger status flag - \arg ENET_MSC_INT_FLAG_RFCE: received frames CRC error flag - \arg ENET_MSC_INT_FLAG_RFAE: received frames alignment error flag - \arg ENET_MSC_INT_FLAG_RGUF: received good unicast frames flag - \arg ENET_MSC_INT_FLAG_TGFSC: transmitted good frames single collision flag - \arg ENET_MSC_INT_FLAG_TGFMSC: transmitted good frames more single collision flag - \arg ENET_MSC_INT_FLAG_TGF: transmitted good frames flag - \arg ENET_DMA_INT_FLAG_TS: transmit status flag - \arg ENET_DMA_INT_FLAG_TPS: transmit process stopped status flag - \arg ENET_DMA_INT_FLAG_TBU: transmit buffer unavailable status flag - \arg ENET_DMA_INT_FLAG_TJT: transmit jabber timeout status flag - \arg ENET_DMA_INT_FLAG_RO: receive overflow status flag - \arg ENET_DMA_INT_FLAG_TU: transmit underflow status flag - \arg ENET_DMA_INT_FLAG_RS: receive status flag - \arg ENET_DMA_INT_FLAG_RBU: receive buffer unavailable status flag - \arg ENET_DMA_INT_FLAG_RPS: receive process stopped status flag - \arg ENET_DMA_INT_FLAG_RWT: receive watchdog timeout status flag - \arg ENET_DMA_INT_FLAG_ET: early transmit status flag - \arg ENET_DMA_INT_FLAG_FBE: fatal bus error status flag - \arg ENET_DMA_INT_FLAG_ER: early receive status flag - \arg ENET_DMA_INT_FLAG_AI: abnormal interrupt summary flag - \arg ENET_DMA_INT_FLAG_NI: normal interrupt summary flag - \arg ENET_DMA_INT_FLAG_MSC: MSC status flag - \arg ENET_DMA_INT_FLAG_WUM: WUM status flag - \arg ENET_DMA_INT_FLAG_TST: timestamp trigger status flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag) -{ - if(RESET != (ENET_REG_VAL(int_flag) & BIT(ENET_BIT_POS(int_flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear ENET DMA interrupt flag - \param[in] int_flag_clear: clear ENET interrupt flag, - only one parameter can be selected which is shown as below - \arg ENET_DMA_INT_FLAG_TS_CLR: transmit status flag - \arg ENET_DMA_INT_FLAG_TPS_CLR: transmit process stopped status flag - \arg ENET_DMA_INT_FLAG_TBU_CLR: transmit buffer unavailable status flag - \arg ENET_DMA_INT_FLAG_TJT_CLR: transmit jabber timeout status flag - \arg ENET_DMA_INT_FLAG_RO_CLR: receive overflow status flag - \arg ENET_DMA_INT_FLAG_TU_CLR: transmit underflow status flag - \arg ENET_DMA_INT_FLAG_RS_CLR: receive status flag - \arg ENET_DMA_INT_FLAG_RBU_CLR: receive buffer unavailable status flag - \arg ENET_DMA_INT_FLAG_RPS_CLR: receive process stopped status flag - \arg ENET_DMA_INT_FLAG_RWT_CLR: receive watchdog timeout status flag - \arg ENET_DMA_INT_FLAG_ET_CLR: early transmit status flag - \arg ENET_DMA_INT_FLAG_FBE_CLR: fatal bus error status flag - \arg ENET_DMA_INT_FLAG_ER_CLR: early receive status flag - \arg ENET_DMA_INT_FLAG_AI_CLR: abnormal interrupt summary flag - \arg ENET_DMA_INT_FLAG_NI_CLR: normal interrupt summary flag - \param[out] none - \retval none -*/ -void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear) -{ - /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ - ENET_REG_VAL(int_flag_clear) = BIT(ENET_BIT_POS(int_flag_clear)); -} - -/*! - \brief ENET Tx function enable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_tx_enable(void) -{ - ENET_MAC_CFG |= ENET_MAC_CFG_TEN; - enet_txfifo_flush(); - ENET_DMA_CTL |= ENET_DMA_CTL_STE; -} - -/*! - \brief ENET Tx function disable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_tx_disable(void) -{ - ENET_DMA_CTL &= ~ENET_DMA_CTL_STE; - enet_txfifo_flush(); - ENET_MAC_CFG &= ~ENET_MAC_CFG_TEN; -} - -/*! - \brief ENET Rx function enable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_rx_enable(void) -{ - ENET_MAC_CFG |= ENET_MAC_CFG_REN; - ENET_DMA_CTL |= ENET_DMA_CTL_SRE; -} - -/*! - \brief ENET Rx function disable (include MAC and DMA module) - \param[in] none - \param[out] none - \retval none -*/ -void enet_rx_disable(void) -{ - ENET_DMA_CTL &= ~ENET_DMA_CTL_SRE; - ENET_MAC_CFG &= ~ENET_MAC_CFG_REN; -} - -/*! - \brief put registers value into the application buffer - \param[in] type: register type which will be get, refer to enet_registers_type_enum, - only one parameter can be selected which is shown as below - \arg ALL_MAC_REG: get the registers within the offset scope between ENET_MAC_CFG and ENET_MAC_FCTH - \arg ALL_MSC_REG: get the registers within the offset scope between ENET_MSC_CTL and ENET_MSC_RGUFCNT - \arg ALL_PTP_REG: get the registers within the offset scope between ENET_PTP_TSCTL and ENET_PTP_PPSCTL - \arg ALL_DMA_REG: get the registers within the offset scope between ENET_DMA_BCTL and ENET_DMA_CRBADDR - \param[in] num: the number of registers that the user want to get - \param[out] preg: the application buffer pointer for storing the register value - \retval none -*/ -void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num) -{ - uint32_t offset = 0U, max = 0U, limit = 0U; - - offset = (uint32_t)type; - max = (uint32_t)type + num; - limit = sizeof(enet_reg_tab) / sizeof(uint16_t); - - /* prevent element in this array is out of range */ - if(max > limit) { - max = limit; - } - - for(; offset < max; offset++) { - /* get value of the corresponding register */ - *preg = REG32((ENET) + enet_reg_tab[offset]); - preg++; - } -} - -/*! - \brief get the enet debug status from the debug register - \param[in] mac_debug: enet debug status - only one parameter can be selected which is shown as below - \arg ENET_MAC_RECEIVER_NOT_IDLE: MAC receiver is not in idle state - \arg ENET_RX_ASYNCHRONOUS_FIFO_STATE: Rx asynchronous FIFO status - \arg ENET_RXFIFO_WRITING: RxFIFO is doing write operation - \arg ENET_RXFIFO_READ_STATUS: RxFIFO read operation status - \arg ENET_RXFIFO_STATE: RxFIFO state - \arg ENET_MAC_TRANSMITTER_NOT_IDLE: MAC transmitter is not in idle state - \arg ENET_MAC_TRANSMITTER_STATUS: status of MAC transmitter - \arg ENET_PAUSE_CONDITION_STATUS: pause condition status - \arg ENET_TXFIFO_READ_STATUS: TxFIFO read operation status - \arg ENET_TXFIFO_WRITING: TxFIFO is doing write operation - \arg ENET_TXFIFO_NOT_EMPTY: TxFIFO is not empty - \arg ENET_TXFIFO_FULL: TxFIFO is full - \param[out] none - \retval value of the status users want to get -*/ -uint32_t enet_debug_status_get(uint32_t mac_debug) -{ - uint32_t temp_state = 0U; - - switch(mac_debug) { - case ENET_RX_ASYNCHRONOUS_FIFO_STATE: - temp_state = GET_MAC_DBG_RXAFS(ENET_MAC_DBG); - break; - case ENET_RXFIFO_READ_STATUS: - temp_state = GET_MAC_DBG_RXFRS(ENET_MAC_DBG); - break; - case ENET_RXFIFO_STATE: - temp_state = GET_MAC_DBG_RXFS(ENET_MAC_DBG); - break; - case ENET_MAC_TRANSMITTER_STATUS: - temp_state = GET_MAC_DBG_SOMT(ENET_MAC_DBG); - break; - case ENET_TXFIFO_READ_STATUS: - temp_state = GET_MAC_DBG_TXFRS(ENET_MAC_DBG); - break; - default: - if(RESET != (ENET_MAC_DBG & mac_debug)) { - temp_state = 0x1U; - } - break; - } - return temp_state; -} - -/*! - \brief enable the MAC address filter - \param[in] mac_addr: select which MAC address will be enable - \arg ENET_MAC_ADDRESS1: enable MAC address 1 filter - \arg ENET_MAC_ADDRESS2: enable MAC address 2 filter - \arg ENET_MAC_ADDRESS3: enable MAC address 3 filter - \param[out] none - \retval none -*/ -void enet_address_filter_enable(enet_macaddress_enum mac_addr) -{ - REG32(ENET_ADDRH_BASE + mac_addr) |= ENET_MAC_ADDR1H_AFE; -} - -/*! - \brief disable the MAC address filter - \param[in] mac_addr: select which MAC address will be disable, - only one parameter can be selected which is shown as below - \arg ENET_MAC_ADDRESS1: disable MAC address 1 filter - \arg ENET_MAC_ADDRESS2: disable MAC address 2 filter - \arg ENET_MAC_ADDRESS3: disable MAC address 3 filter - \param[out] none - \retval none -*/ -void enet_address_filter_disable(enet_macaddress_enum mac_addr) -{ - REG32(ENET_ADDRH_BASE + mac_addr) &= ~ENET_MAC_ADDR1H_AFE; -} - -/*! - \brief configure the MAC address filter - \param[in] mac_addr: select which MAC address will be configured, - only one parameter can be selected which is shown as below - \arg ENET_MAC_ADDRESS1: configure MAC address 1 filter - \arg ENET_MAC_ADDRESS2: configure MAC address 2 filter - \arg ENET_MAC_ADDRESS3: configure MAC address 3 filter - \param[in] addr_mask: select which MAC address bytes will be mask, - one or more parameters can be selected which are shown as below - \arg ENET_ADDRESS_MASK_BYTE0: mask ENET_MAC_ADDR1L[7:0] bits - \arg ENET_ADDRESS_MASK_BYTE1: mask ENET_MAC_ADDR1L[15:8] bits - \arg ENET_ADDRESS_MASK_BYTE2: mask ENET_MAC_ADDR1L[23:16] bits - \arg ENET_ADDRESS_MASK_BYTE3: mask ENET_MAC_ADDR1L [31:24] bits - \arg ENET_ADDRESS_MASK_BYTE4: mask ENET_MAC_ADDR1H [7:0] bits - \arg ENET_ADDRESS_MASK_BYTE5: mask ENET_MAC_ADDR1H [15:8] bits - \param[in] filter_type: select which MAC address filter type will be selected, - only one parameter can be selected which is shown as below - \arg ENET_ADDRESS_FILTER_SA: The MAC address is used to compared with the SA field of the received frame - \arg ENET_ADDRESS_FILTER_DA: The MAC address is used to compared with the DA field of the received frame - \param[out] none - \retval none -*/ -void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type) -{ - uint32_t reg; - - /* get the address filter register value which is to be configured */ - reg = REG32(ENET_ADDRH_BASE + mac_addr); - - /* clear and configure the address filter register */ - reg &= ~(ENET_MAC_ADDR1H_MB | ENET_MAC_ADDR1H_SAF); - reg |= (addr_mask | filter_type); - REG32(ENET_ADDRH_BASE + mac_addr) = reg; -} - -/*! - \brief PHY interface configuration (configure SMI clock and reset PHY chip) - \param[in] none - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_phy_config(void) -{ - uint32_t ahbclk; - uint32_t reg; - uint16_t phy_value; - ErrStatus enet_state = ERROR; - - /* clear the previous MDC clock */ - reg = ENET_MAC_PHY_CTL; - reg &= ~ENET_MAC_PHY_CTL_CLR; - - /* get the HCLK frequency */ - ahbclk = rcu_clock_freq_get(CK_AHB); - - /* configure MDC clock according to HCLK frequency range */ - if(ENET_RANGE(ahbclk, 20000000U, 35000000U)) { - reg |= ENET_MDC_HCLK_DIV16; - } else if(ENET_RANGE(ahbclk, 35000000U, 60000000U)) { - reg |= ENET_MDC_HCLK_DIV26; - } else if(ENET_RANGE(ahbclk, 60000000U, 100000000U)) { - reg |= ENET_MDC_HCLK_DIV42; - } else if(ENET_RANGE(ahbclk, 100000000U, 150000000U)) { - reg |= ENET_MDC_HCLK_DIV62; - } else if((ENET_RANGE(ahbclk, 150000000U, 200000000U)) || (200000000U == ahbclk)) { - reg |= ENET_MDC_HCLK_DIV102; - } else { - return enet_state; - } - ENET_MAC_PHY_CTL = reg; - - /* reset PHY */ - phy_value = PHY_RESET; - if(ERROR == (enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value))) { - return enet_state; - } - /* PHY reset need some time */ - _ENET_DELAY_(ENET_DELAY_TO); - - /* check whether PHY reset is complete */ - if(ERROR == (enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &phy_value))) { - return enet_state; - } - - /* PHY reset complete */ - if(RESET == (phy_value & PHY_RESET)) { - enet_state = SUCCESS; - } - - return enet_state; -} - -/*! - \brief write to / read from a PHY register - \param[in] direction: only one parameter can be selected which is shown as below, refer to enet_phydirection_enum - \arg ENET_PHY_WRITE: write data to phy register - \arg ENET_PHY_READ: read data from phy register - \param[in] phy_address: 0x0 - 0x1F - \param[in] phy_reg: 0x0 - 0x1F - \param[in] pvalue: the value will be written to the PHY register in ENET_PHY_WRITE direction - \param[out] pvalue: the value will be read from the PHY register in ENET_PHY_READ direction - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, - uint16_t *pvalue) -{ - uint32_t reg, phy_flag; - uint32_t timeout = 0U; - ErrStatus enet_state = ERROR; - - /* configure ENET_MAC_PHY_CTL with write/read operation */ - reg = ENET_MAC_PHY_CTL; - reg &= ~(ENET_MAC_PHY_CTL_PB | ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PR | ENET_MAC_PHY_CTL_PA); - reg |= (direction | MAC_PHY_CTL_PR(phy_reg) | MAC_PHY_CTL_PA(phy_address) | ENET_MAC_PHY_CTL_PB); - - /* if do the write operation, write value to the register */ - if(ENET_PHY_WRITE == direction) { - ENET_MAC_PHY_DATA = *pvalue; - } - - /* do PHY write/read operation, and wait the operation complete */ - ENET_MAC_PHY_CTL = reg; - do { - phy_flag = (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB); - timeout++; - } while((RESET != phy_flag) && (ENET_DELAY_TO != timeout)); - - /* write/read operation complete */ - if(RESET == (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB)) { - enet_state = SUCCESS; - } - - /* if do the read operation, get value from the register */ - if(ENET_PHY_READ == direction) { - *pvalue = (uint16_t)ENET_MAC_PHY_DATA; - } - - return enet_state; -} - -/*! - \brief enable the loopback function of PHY chip - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus enet_phyloopback_enable(void) -{ - uint16_t temp_phy = 0U; - ErrStatus phy_state = ERROR; - - /* get the PHY configuration to update it */ - enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); - - /* enable the PHY loopback mode */ - temp_phy |= PHY_LOOPBACK; - - /* update the PHY control register with the new configuration */ - phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); - - return phy_state; -} - -/*! - \brief disable the loopback function of PHY chip - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus enet_phyloopback_disable(void) -{ - uint16_t temp_phy = 0U; - ErrStatus phy_state = ERROR; - - /* get the PHY configuration to update it */ - enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); - - /* disable the PHY loopback mode */ - temp_phy &= (uint16_t)~PHY_LOOPBACK; - - /* update the PHY control register with the new configuration */ - phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); - - return phy_state; -} - -/*! - \brief enable ENET forward feature - \param[in] feature: the feature of ENET forward mode - one or more parameters can be selected which are shown as below - \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames - \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding - \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory - \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames - \param[out] none - \retval none -*/ -void enet_forward_feature_enable(uint32_t feature) -{ - uint32_t mask; - - mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); - ENET_MAC_CFG |= mask; - - mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); - ENET_DMA_CTL |= (mask >> 2); -} - -/*! - \brief disable ENET forward feature - \param[in] feature: the feature of ENET forward mode - one or more parameters can be selected which are shown as below - \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames - \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding - \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory - \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames - \param[out] none - \retval none -*/ -void enet_forward_feature_disable(uint32_t feature) -{ - uint32_t mask; - - mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); - ENET_MAC_CFG &= ~mask; - - mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); - ENET_DMA_CTL &= ~(mask >> 2); -} - -/*! - \brief enable ENET fliter feature - \param[in] feature: the feature of ENET fliter mode - one or more parameters can be selected which are shown as below - \arg ENET_SRC_FILTER: filter source address function - \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function - \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function - \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function - \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function - \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function - \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function - \param[out] none - \retval none -*/ -void enet_fliter_feature_enable(uint32_t feature) -{ - ENET_MAC_FRMF |= feature; -} - -/*! - \brief disable ENET fliter feature - \param[in] feature: the feature of ENET fliter mode - one or more parameters can be selected which are shown as below - \arg ENET_SRC_FILTER: filter source address function - \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function - \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function - \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function - \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function - \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function - \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function - \param[out] none - \retval none -*/ -void enet_fliter_feature_disable(uint32_t feature) -{ - ENET_MAC_FRMF &= ~feature; -} - -/*! - \brief generate the pause frame, ENET will send pause frame after enable transmit flow control - this function only use in full-dulex mode - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus enet_pauseframe_generate(void) -{ - ErrStatus enet_state = ERROR; - uint32_t temp = 0U; - - /* in full-duplex mode, must make sure this bit is 0 before writing register */ - temp = ENET_MAC_FCTL & ENET_MAC_FCTL_FLCBBKPA; - if(RESET == temp) { - ENET_MAC_FCTL |= ENET_MAC_FCTL_FLCBBKPA; - enet_state = SUCCESS; - } - return enet_state; -} - -/*! - \brief configure the pause frame detect type - \param[in] detect: pause frame detect type - only one parameter can be selected which is shown as below - \arg ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT: besides the unique multicast address, MAC can also - use the MAC0 address to detecting pause frame - \arg ENET_UNIQUE_PAUSEDETECT: only the unique multicast address for pause frame which is specified - in IEEE802.3 can be detected - \param[out] none - \retval none -*/ -void enet_pauseframe_detect_config(uint32_t detect) -{ - ENET_MAC_FCTL &= ~ENET_MAC_FCTL_UPFDT; - ENET_MAC_FCTL |= detect; -} - -/*! - \brief configure the pause frame parameters - \param[in] pausetime: pause time in transmit pause control frame - \param[in] pause_threshold: the threshold of the pause timer for retransmitting frames automatically, - this value must make sure to be less than configured pause time, only one parameter can be - selected which is shown as below - \arg ENET_PAUSETIME_MINUS4: pause time minus 4 slot times - \arg ENET_PAUSETIME_MINUS28: pause time minus 28 slot times - \arg ENET_PAUSETIME_MINUS144: pause time minus 144 slot times - \arg ENET_PAUSETIME_MINUS256: pause time minus 256 slot times - \param[out] none - \retval none -*/ -void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold) -{ - ENET_MAC_FCTL &= ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_PLTS); - ENET_MAC_FCTL |= (MAC_FCTL_PTM(pausetime) | pause_threshold); -} - -/*! - \brief configure the threshold of the flow control(deactive and active threshold) - \param[in] deactive: the threshold of the deactive flow control, this value - should always be less than active flow control value, only one - parameter can be selected which is shown as below - \arg ENET_DEACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes - \arg ENET_DEACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes - \arg ENET_DEACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes - \arg ENET_DEACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes - \arg ENET_DEACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes - \arg ENET_DEACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes - \arg ENET_DEACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes - \param[in] active: the threshold of the active flow control, only one parameter - can be selected which is shown as below - \arg ENET_ACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes - \arg ENET_ACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes - \arg ENET_ACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes - \arg ENET_ACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes - \arg ENET_ACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes - \arg ENET_ACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes - \arg ENET_ACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes - \param[out] none - \retval none -*/ -void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active) -{ - ENET_MAC_FCTH = ((deactive | active) >> 8); -} - -/*! - \brief enable ENET flow control feature - \param[in] feature: the feature of ENET flow control mode - one or more parameters can be selected which are shown as below - \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function - \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC - \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it - \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) - \param[out] none - \retval none -*/ -void enet_flowcontrol_feature_enable(uint32_t feature) -{ - if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)) { - ENET_MAC_FCTL &= ~ENET_ZERO_QUANTA_PAUSE; - } - feature &= ~ENET_ZERO_QUANTA_PAUSE; - ENET_MAC_FCTL |= feature; -} - -/*! - \brief disable ENET flow control feature - \param[in] feature: the feature of ENET flow control mode - one or more parameters can be selected which are shown as below - \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function - \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC - \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it - \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) - \param[out] none - \retval none -*/ -void enet_flowcontrol_feature_disable(uint32_t feature) -{ - if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)) { - ENET_MAC_FCTL |= ENET_ZERO_QUANTA_PAUSE; - } - feature &= ~ENET_ZERO_QUANTA_PAUSE; - ENET_MAC_FCTL &= ~feature; -} - -/*! - \brief get the dma transmit/receive process state - \param[in] direction: choose the direction of dma process which users want to check, - refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: dma transmit process - \arg ENET_DMA_RX: dma receive process - \param[out] none - \retval state of dma process, the value range shows below: - ENET_RX_STATE_STOPPED, ENET_RX_STATE_FETCHING, ENET_RX_STATE_WAITING, - ENET_RX_STATE_SUSPENDED, ENET_RX_STATE_CLOSING, ENET_RX_STATE_QUEUING, - ENET_TX_STATE_STOPPED, ENET_TX_STATE_FETCHING, ENET_TX_STATE_WAITING, - ENET_TX_STATE_READING, ENET_TX_STATE_SUSPENDED, ENET_TX_STATE_CLOSING -*/ -uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction) -{ - uint32_t reval; - reval = (uint32_t)(ENET_DMA_STAT & (uint32_t)direction); - return reval; -} - -/*! - \brief poll the DMA transmission/reception enable by writing any value to the - ENET_DMA_TPEN/ENET_DMA_RPEN register, this will make the DMA to resume transmission/reception - \param[in] direction: choose the direction of DMA process which users want to resume, - refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA transmit process - \arg ENET_DMA_RX: DMA receive process - \param[out] none - \retval none -*/ -void enet_dmaprocess_resume(enet_dmadirection_enum direction) -{ - if(ENET_DMA_TX == direction) { - ENET_DMA_TPEN = 0U; - } else { - ENET_DMA_RPEN = 0U; - } -} - -/*! - \brief check and recover the Rx process - \param[in] none - \param[out] none - \retval none -*/ -void enet_rxprocess_check_recovery(void) -{ - uint32_t status; - - /* get DAV information of current RxDMA descriptor */ - status = dma_current_rxdesc->status; - status &= ENET_RDES0_DAV; - - /* if current descriptor is owned by DMA, but the descriptor address mismatches with - receive descriptor address pointer updated by RxDMA controller */ - if((ENET_DMA_CRDADDR != ((uint32_t)dma_current_rxdesc)) && - (ENET_RDES0_DAV == status)) { - dma_current_rxdesc = (enet_descriptors_struct *)ENET_DMA_CRDADDR; - } -} - -/*! - \brief flush the ENET transmit FIFO, and wait until the flush operation completes - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus enet_txfifo_flush(void) -{ - uint32_t flush_state; - uint32_t timeout = 0U; - ErrStatus enet_state = ERROR; - - /* set the FTF bit for flushing transmit FIFO */ - ENET_DMA_CTL |= ENET_DMA_CTL_FTF; - /* wait until the flush operation completes */ - do { - flush_state = ENET_DMA_CTL & ENET_DMA_CTL_FTF; - timeout++; - } while((RESET != flush_state) && (timeout < ENET_DELAY_TO)); - /* return ERROR due to timeout */ - if(RESET == flush_state) { - enet_state = SUCCESS; - } - - return enet_state; -} - -/*! - \brief get the transmit/receive address of current descriptor, or current buffer, or descriptor table - \param[in] addr_get: choose the address which users want to get, refer to enet_desc_reg_enum - only one parameter can be selected which is shown as below - \arg ENET_RX_DESC_TABLE: the start address of the receive descriptor table - \arg ENET_RX_CURRENT_DESC: the start descriptor address of the current receive descriptor read by - the RxDMA controller - \arg ENET_RX_CURRENT_BUFFER: the current receive buffer address being read by the RxDMA controller - \arg ENET_TX_DESC_TABLE: the start address of the transmit descriptor table - \arg ENET_TX_CURRENT_DESC: the start descriptor address of the current transmit descriptor read by - the TxDMA controller - \arg ENET_TX_CURRENT_BUFFER: the current transmit buffer address being read by the TxDMA controller - \param[out] none - \retval address value -*/ -uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get) -{ - uint32_t reval = 0U; - - reval = REG32((ENET) + (uint32_t)addr_get); - return reval; -} - -/*! - \brief get the Tx or Rx descriptor information - \param[in] desc: the descriptor pointer which users want to get information - \param[in] info_get: the descriptor information type which is selected, - only one parameter can be selected which is shown as below - \arg RXDESC_BUFFER_1_SIZE: receive buffer 1 size - \arg RXDESC_BUFFER_2_SIZE: receive buffer 2 size - \arg RXDESC_FRAME_LENGTH: the byte length of the received frame that was transferred to the buffer - \arg TXDESC_COLLISION_COUNT: the number of collisions occurred before the frame was transmitted - \arg RXDESC_BUFFER_1_ADDR: the buffer1 address of the Rx frame - \arg TXDESC_BUFFER_1_ADDR: the buffer1 address of the Tx frame - \param[out] none - \retval descriptor information, if value is 0xFFFFFFFFU, means the false input parameter -*/ -uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get) -{ - uint32_t reval = 0xFFFFFFFFU; - - switch(info_get) { - case RXDESC_BUFFER_1_SIZE: - reval = GET_RDES1_RB1S(desc->control_buffer_size); - break; - case RXDESC_BUFFER_2_SIZE: - reval = GET_RDES1_RB2S(desc->control_buffer_size); - break; - case RXDESC_FRAME_LENGTH: - reval = GET_RDES0_FRML(desc->status); - if(reval > 4U) { - reval = reval - 4U; - - /* if is a type frame, and CRC is not included in forwarding frame */ - if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (desc->status & ENET_RDES0_FRMT))) { - reval = reval + 4U; - } - } else { - reval = 0U; - } - - break; - case RXDESC_BUFFER_1_ADDR: - reval = desc->buffer1_addr; - break; - case TXDESC_BUFFER_1_ADDR: - reval = desc->buffer1_addr; - break; - case TXDESC_COLLISION_COUNT: - reval = GET_TDES0_COCNT(desc->status); - break; - default: - break; - } - return reval; -} - -/*! - \brief get the number of missed frames during receiving - \param[in] none - \param[out] rxfifo_drop: pointer to the number of frames dropped by RxFIFO - \param[out] rxdma_drop: pointer to the number of frames missed by the RxDMA controller - \retval none -*/ -void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop) -{ - uint32_t temp_counter = 0U; - - temp_counter = ENET_DMA_MFBOCNT; - *rxfifo_drop = GET_DMA_MFBOCNT_MSFA(temp_counter); - *rxdma_drop = GET_DMA_MFBOCNT_MSFC(temp_counter); -} - -/*! - \brief get the bit flag of ENET DMA descriptor - \param[in] desc: the descriptor pointer which users want to get flag - \param[in] desc_flag: the bit flag of ENET DMA descriptor - only one parameter can be selected which is shown as below - \arg ENET_TDES0_DB: deferred - \arg ENET_TDES0_UFE: underflow error - \arg ENET_TDES0_EXD: excessive deferral - \arg ENET_TDES0_VFRM: VLAN frame - \arg ENET_TDES0_ECO: excessive collision - \arg ENET_TDES0_LCO: late collision - \arg ENET_TDES0_NCA: no carrier - \arg ENET_TDES0_LCA: loss of carrier - \arg ENET_TDES0_IPPE: IP payload error - \arg ENET_TDES0_FRMF: frame flushed - \arg ENET_TDES0_JT: jabber timeout - \arg ENET_TDES0_ES: error summary - \arg ENET_TDES0_IPHE: IP header error - \arg ENET_TDES0_TTMSS: transmit timestamp status - \arg ENET_TDES0_TCHM: the second address chained mode - \arg ENET_TDES0_TERM: transmit end of ring mode - \arg ENET_TDES0_TTSEN: transmit timestamp function enable - \arg ENET_TDES0_DPAD: disable adding pad - \arg ENET_TDES0_DCRC: disable CRC - \arg ENET_TDES0_FSG: first segment - \arg ENET_TDES0_LSG: last segment - \arg ENET_TDES0_INTC: interrupt on completion - \arg ENET_TDES0_DAV: DAV bit - - \arg ENET_RDES0_PCERR: payload checksum error - \arg ENET_RDES0_EXSV: extended status valid - \arg ENET_RDES0_CERR: CRC error - \arg ENET_RDES0_DBERR: dribble bit error - \arg ENET_RDES0_RERR: receive error - \arg ENET_RDES0_RWDT: receive watchdog timeout - \arg ENET_RDES0_FRMT: frame type - \arg ENET_RDES0_LCO: late collision - \arg ENET_RDES0_IPHERR: IP frame header error - \arg ENET_RDES0_TSV: timestamp valid - \arg ENET_RDES0_LDES: last descriptor - \arg ENET_RDES0_FDES: first descriptor - \arg ENET_RDES0_VTAG: VLAN tag - \arg ENET_RDES0_OERR: overflow error - \arg ENET_RDES0_LERR: length error - \arg ENET_RDES0_SAFF: SA filter fail - \arg ENET_RDES0_DERR: descriptor error - \arg ENET_RDES0_ERRS: error summary - \arg ENET_RDES0_DAFF: destination address filter fail - \arg ENET_RDES0_DAV: descriptor available - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag) -{ - FlagStatus enet_flag = RESET; - - if((uint32_t)RESET != (desc->status & desc_flag)) { - enet_flag = SET; - } - - return enet_flag; -} - -/*! - \brief set the bit flag of ENET DMA descriptor - \param[in] desc: the descriptor pointer which users want to set flag - \param[in] desc_flag: the bit flag of ENET DMA descriptor - only one parameter can be selected which is shown as below - \arg ENET_TDES0_VFRM: VLAN frame - \arg ENET_TDES0_FRMF: frame flushed - \arg ENET_TDES0_TCHM: the second address chained mode - \arg ENET_TDES0_TERM: transmit end of ring mode - \arg ENET_TDES0_TTSEN: transmit timestamp function enable - \arg ENET_TDES0_DPAD: disable adding pad - \arg ENET_TDES0_DCRC: disable CRC - \arg ENET_TDES0_FSG: first segment - \arg ENET_TDES0_LSG: last segment - \arg ENET_TDES0_INTC: interrupt on completion - \arg ENET_TDES0_DAV: DAV bit - \arg ENET_RDES0_DAV: descriptor available - \param[out] none - \retval none -*/ -void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag) -{ - desc->status |= desc_flag; -} - -/*! - \brief clear the bit flag of ENET DMA descriptor - \param[in] desc: the descriptor pointer which users want to clear flag - \param[in] desc_flag: the bit flag of ENET DMA descriptor - only one parameter can be selected which is shown as below - \arg ENET_TDES0_VFRM: VLAN frame - \arg ENET_TDES0_FRMF: frame flushed - \arg ENET_TDES0_TCHM: the second address chained mode - \arg ENET_TDES0_TERM: transmit end of ring mode - \arg ENET_TDES0_TTSEN: transmit timestamp function enable - \arg ENET_TDES0_DPAD: disable adding pad - \arg ENET_TDES0_DCRC: disable CRC - \arg ENET_TDES0_FSG: first segment - \arg ENET_TDES0_LSG: last segment - \arg ENET_TDES0_INTC: interrupt on completion - \arg ENET_TDES0_DAV: DAV bit - \arg ENET_RDES0_DAV: descriptor available - \param[out] none - \retval none -*/ -void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag) -{ - desc->status &= ~desc_flag; -} - -/*! - \brief when receiving completed, set RS bit in ENET_DMA_STAT register will immediately set - \param[in] desc: the descriptor pointer which users want to configure - \param[out] none - \retval none -*/ -void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc) -{ - desc->control_buffer_size &= ~ENET_RDES1_DINTC; -} - -/*! - \brief when receiving completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time - \param[in] desc: the descriptor pointer which users want to configure - \param[in] delay_time: delay a time of 256*delay_time HCLK, this value must be between 0 and 0xFF - \param[out] none - \retval none -*/ -void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time) -{ - desc->control_buffer_size |= ENET_RDES1_DINTC; - ENET_DMA_RSWDC = DMA_RSWDC_WDCFRS(delay_time); -} - -/*! - \brief drop current receive frame - \param[in] none - \param[out] none - \retval none -*/ -void enet_rxframe_drop(void) -{ - /* enable reception, descriptor is owned by DMA */ - dma_current_rxdesc->status = ENET_RDES0_DAV; - - /* chained mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { - if(NULL != dma_current_ptp_rxdesc) { - dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->buffer2_next_desc_addr); - /* if it is the last ptp descriptor */ - if(0U != dma_current_ptp_rxdesc->status) { - /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ - dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); - } else { - /* ponter to the next ptp descriptor */ - dma_current_ptp_rxdesc++; - } - } else { - dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); - } - - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); - if(NULL != dma_current_ptp_rxdesc) { - dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); - } - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + - GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); - if(NULL != dma_current_ptp_rxdesc) { - dma_current_ptp_rxdesc++; - } - } - } -} - -/*! - \brief enable DMA feature - \param[in] feature: the feature of DMA mode - one or more parameters can be selected which are shown as below - \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function - \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function - \param[out] none - \retval none -*/ -void enet_dma_feature_enable(uint32_t feature) -{ - ENET_DMA_CTL |= feature; -} - -/*! - \brief disable DMA feature - \param[in] feature: the feature of DMA mode - one or more parameters can be selected which are shown as below - \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function - \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function - \param[out] none - \retval none -*/ -void enet_dma_feature_disable(uint32_t feature) -{ - ENET_DMA_CTL &= ~feature; -} - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE -/*! - \brief get the bit of extended status flag in ENET DMA descriptor - \param[in] desc: the descriptor pointer which users want to get the extended status flag - \param[in] desc_status: the extended status want to get - only one parameter can be selected which is shown as below - \arg ENET_RDES4_IPPLDT: IP frame payload type - \arg ENET_RDES4_IPHERR: IP frame header error - \arg ENET_RDES4_IPPLDERR: IP frame payload error - \arg ENET_RDES4_IPCKSB: IP frame checksum bypassed - \arg ENET_RDES4_IPF4: IP frame in version 4 - \arg ENET_RDES4_IPF6: IP frame in version 6 - \arg ENET_RDES4_PTPMT: PTP message type - \arg ENET_RDES4_PTPOEF: PTP on ethernet frame - \arg ENET_RDES4_PTPVF: PTP version format - \param[out] none - \retval value of extended status -*/ -uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status) -{ - uint32_t reval = 0xFFFFFFFFU; - - switch(desc_status) { - case ENET_RDES4_IPPLDT: - reval = GET_RDES4_IPPLDT(desc->extended_status); - break; - case ENET_RDES4_PTPMT: - reval = GET_RDES4_PTPMT(desc->extended_status); - break; - default: - if((uint32_t)RESET != (desc->extended_status & desc_status)) { - reval = 1U; - } else { - reval = 0U; - } - } - - return reval; -} - -/*! - \brief configure descriptor to work in enhanced mode - \param[in] none - \param[out] none - \retval none -*/ -void enet_desc_select_enhanced_mode(void) -{ - ENET_DMA_BCTL |= ENET_DMA_BCTL_DFM; -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced chain mode with ptp function - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[out] none - \retval none -*/ -void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc, *desc_tab; - uint8_t *buf; - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* select chain mode, and enable transmit timestamp function */ - desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* select receive chained mode and set buffer1 size */ - desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - } - - /* configuration each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* if is not the last descriptor */ - if(num < (count - 1U)) { - /* configure the next descriptor address */ - desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); - } else { - /* when it is the last descriptor, the next descriptor address - equals to first descriptor address in descriptor table */ - desc->buffer2_next_desc_addr = (uint32_t)desc_tab; - } - } -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced ring mode with ptp function - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[out] none - \retval none -*/ -void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc; - enet_descriptors_struct *desc_tab; - uint8_t *buf; - - /* configure descriptor skip length */ - ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; - ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* select ring mode, and enable transmit timestamp function */ - desc_status = ENET_TDES0_TTSEN; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* set buffer1 size */ - desc_bufsize = ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - } - - /* configure each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* when it is the last descriptor */ - if(num == (count - 1U)) { - if(ENET_DMA_TX == direction) { - /* configure transmit end of ring mode */ - desc->status |= ENET_TDES0_TERM; - } else { - /* configure receive end of ring mode */ - desc->control_buffer_size |= ENET_RDES1_RERM; - } - } - } -} - -/*! - \brief receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode - \param[in] bufsize: the size of buffer which is the parameter in function - \param[out] buffer: pointer to the application buffer - note -- if the input is NULL, user should copy data in application by himself - \param[out] timestamp: pointer to the table which stores the timestamp high and low - note -- if the input is NULL, timestamp is ignored - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) -{ - uint32_t offset = 0U, size = 0U; - uint32_t timeout = 0U; - uint32_t rdes0_tsv_flag; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { - return ERROR; - } - - /* if buffer pointer is null, indicates that users has copied data in application */ - if(NULL != buffer) { - /* if no error occurs, and the frame uses only one descriptor */ - if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && - ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && - ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { - /* get the frame length except CRC */ - size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; - - /* if is a type frame, and CRC is not included in forwarding frame */ - if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { - size = size + 4U; - } - - /* to avoid situation that the frame size exceeds the buffer length */ - if(size > bufsize) { - return ERROR; - } - - /* copy data from Rx buffer to application buffer */ - for(offset = 0; offset < size; offset++) { - (*(buffer + offset)) = (*(__IO uint8_t *)((dma_current_rxdesc->buffer1_addr) + offset)); - } - } else { - return ERROR; - } - } - - /* if timestamp pointer is null, indicates that users don't care timestamp in application */ - if(NULL != timestamp) { - /* wait for ENET_RDES0_TSV flag to be set, the timestamp value is taken and - write to the RDES6 and RDES7 */ - do { - rdes0_tsv_flag = (dma_current_rxdesc->status & ENET_RDES0_TSV); - timeout++; - } while((RESET == rdes0_tsv_flag) && (timeout < ENET_DELAY_TO)); - - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - return ERROR; - } - - /* clear the ENET_RDES0_TSV flag */ - dma_current_rxdesc->status &= ~ENET_RDES0_TSV; - /* get the timestamp value of the received frame */ - timestamp[0] = dma_current_rxdesc->timestamp_low; - timestamp[1] = dma_current_rxdesc->timestamp_high; - } - - /* enable reception, descriptor is owned by DMA */ - dma_current_rxdesc->status = ENET_RDES0_DAV; - - /* check Rx buffer unavailable flag status */ - if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { - /* Clear RBU flag */ - ENET_DMA_STAT = ENET_DMA_STAT_RBU; - /* resume DMA reception by writing to the RPEN register*/ - ENET_DMA_RPEN = 0; - } - - /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ - /* chained mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { - dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_rxdesc->buffer2_next_desc_addr); - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_rxdesc = (enet_descriptors_struct *)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + GET_DMA_BCTL_DPSL( - ENET_DMA_BCTL)); - } - } - - return SUCCESS; -} - -/*! - \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode - \param[in] buffer: pointer on the application buffer - note -- if the input is NULL, user should copy data in application by himself - \param[in] length: the length of frame data to be transmitted - \param[out] timestamp: pointer to the table which stores the timestamp high and low - note -- if the input is NULL, timestamp is ignored - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) -{ - uint32_t offset = 0; - uint32_t dma_tbu_flag, dma_tu_flag; - uint32_t tdes0_ttmss_flag; - uint32_t timeout = 0; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { - return ERROR; - } - - /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ - if(length > ENET_MAX_FRAME_SIZE) { - return ERROR; - } - - /* if buffer pointer is null, indicates that users has handled data in application */ - if(NULL != buffer) { - /* copy frame data from application buffer to Tx buffer */ - for(offset = 0; offset < length; offset++) { - (*(__IO uint8_t *)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); - } - } - /* set the frame length */ - dma_current_txdesc->control_buffer_size = length; - /* set the segment of frame, frame is transmitted in one descriptor */ - dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; - /* enable the DMA transmission */ - dma_current_txdesc->status |= ENET_TDES0_DAV; - - /* check Tx buffer unavailable flag status */ - dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); - dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); - - if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { - /* Clear TBU and TU flag */ - ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); - /* resume DMA transmission by writing to the TPEN register*/ - ENET_DMA_TPEN = 0; - } - - /* if timestamp pointer is null, indicates that users don't care timestamp in application */ - if(NULL != timestamp) { - /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ - do { - tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); - timeout++; - } while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); - - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - return ERROR; - } - - /* clear the ENET_TDES0_TTMSS flag */ - dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; - /* get the timestamp value of the transmit frame */ - timestamp[0] = dma_current_txdesc->timestamp_low; - timestamp[1] = dma_current_txdesc->timestamp_high; - } - - /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ - /* chained mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { - dma_current_txdesc = (enet_descriptors_struct *)(dma_current_txdesc->buffer2_next_desc_addr); - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_txdesc = (enet_descriptors_struct *)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + GET_DMA_BCTL_DPSL( - ENET_DMA_BCTL)); - } - } - - return SUCCESS; -} - -#else - -/*! - \brief configure descriptor to work in normal mode - \param[in] none - \param[out] none - \retval none -*/ -void enet_desc_select_normal_mode(void) -{ - ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DFM; -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in normal chain mode with PTP function - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table - \param[out] none - \retval none -*/ -void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc, *desc_tab; - uint8_t *buf; - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* select chain mode, and enable transmit timestamp function */ - desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - dma_current_ptp_txdesc = desc_ptptab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* select receive chained mode and set buffer1 size */ - desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - dma_current_ptp_rxdesc = desc_ptptab; - } - - /* configure each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* if is not the last descriptor */ - if(num < (count - 1U)) { - /* configure the next descriptor address */ - desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); - } else { - /* when it is the last descriptor, the next descriptor address - equals to first descriptor address in descriptor table */ - desc->buffer2_next_desc_addr = (uint32_t)desc_tab; - } - /* set desc_ptptab equal to desc_tab */ - (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; - (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; - } - /* when it is the last ptp descriptor, preserve the first descriptor - address of desc_ptptab in ptp descriptor status */ - (&desc_ptptab[num - 1U])->status = (uint32_t)desc_ptptab; -} - -/*! - \brief initialize the DMA Tx/Rx descriptors's parameters in normal ring mode with PTP function - \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum - only one parameter can be selected which is shown as below - \arg ENET_DMA_TX: DMA Tx descriptors - \arg ENET_DMA_RX: DMA Rx descriptors - \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table - \param[out] none - \retval none -*/ -void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) -{ - uint32_t num = 0U, count = 0U, maxsize = 0U; - uint32_t desc_status = 0U, desc_bufsize = 0U; - enet_descriptors_struct *desc, *desc_tab; - uint8_t *buf; - - /* configure descriptor skip length */ - ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; - ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); - - /* if want to initialize DMA Tx descriptors */ - if(ENET_DMA_TX == direction) { - /* save a copy of the DMA Tx descriptors */ - desc_tab = txdesc_tab; - buf = &tx_buff[0][0]; - count = ENET_TXBUF_NUM; - maxsize = ENET_TXBUF_SIZE; - - /* select ring mode, and enable transmit timestamp function */ - desc_status = ENET_TDES0_TTSEN; - - /* configure DMA Tx descriptor table address register */ - ENET_DMA_TDTADDR = (uint32_t)desc_tab; - dma_current_txdesc = desc_tab; - dma_current_ptp_txdesc = desc_ptptab; - } else { - /* if want to initialize DMA Rx descriptors */ - /* save a copy of the DMA Rx descriptors */ - desc_tab = rxdesc_tab; - buf = &rx_buff[0][0]; - count = ENET_RXBUF_NUM; - maxsize = ENET_RXBUF_SIZE; - - /* enable receiving */ - desc_status = ENET_RDES0_DAV; - /* select receive ring mode and set buffer1 size */ - desc_bufsize = (uint32_t)ENET_RXBUF_SIZE; - - /* configure DMA Rx descriptor table address register */ - ENET_DMA_RDTADDR = (uint32_t)desc_tab; - dma_current_rxdesc = desc_tab; - dma_current_ptp_rxdesc = desc_ptptab; - } - - /* configure each descriptor */ - for(num = 0U; num < count; num++) { - /* get the pointer to the next descriptor of the descriptor table */ - desc = desc_tab + num; - - /* configure descriptors */ - desc->status = desc_status; - desc->control_buffer_size = desc_bufsize; - desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); - - /* when it is the last descriptor */ - if(num == (count - 1U)) { - if(ENET_DMA_TX == direction) { - /* configure transmit end of ring mode */ - desc->status |= ENET_TDES0_TERM; - } else { - /* configure receive end of ring mode */ - desc->control_buffer_size |= ENET_RDES1_RERM; - } - } - /* set desc_ptptab equal to desc_tab */ - (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; - (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; - } - /* when it is the last ptp descriptor, preserve the first descriptor - address of desc_ptptab in ptp descriptor status */ - (&desc_ptptab[num - 1U])->status = (uint32_t)desc_ptptab; -} - -/*! - \brief receive a packet data with timestamp values to application buffer, when the DMA is in normal mode - \param[in] bufsize: the size of buffer which is the parameter in function - \param[out] buffer: pointer to the application buffer - note -- if the input is NULL, user should copy data in application by himself - \param[out] timestamp: pointer to the table which stores the timestamp high and low - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) -{ - uint32_t offset = 0U, size = 0U; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)) { - return ERROR; - } - - /* if buffer pointer is null, indicates that users has copied data in application */ - if(NULL != buffer) { - /* if no error occurs, and the frame uses only one descriptor */ - if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && - ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && - ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))) { - - /* get the frame length except CRC */ - size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; - /* if is a type frame, and CRC is not included in forwarding frame */ - if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))) { - size = size + 4U; - } - - /* to avoid situation that the frame size exceeds the buffer length */ - if(size > bufsize) { - return ERROR; - } - - /* copy data from Rx buffer to application buffer */ - for(offset = 0U; offset < size; offset++) { - (*(buffer + offset)) = (*(__IO uint8_t *)(uint32_t)((dma_current_ptp_rxdesc->buffer1_addr) + offset)); - } - - } else { - return ERROR; - } - } - /* copy timestamp value from Rx descriptor to application array */ - timestamp[0] = dma_current_rxdesc->buffer1_addr; - timestamp[1] = dma_current_rxdesc->buffer2_next_desc_addr; - - dma_current_rxdesc->buffer1_addr = dma_current_ptp_rxdesc ->buffer1_addr ; - dma_current_rxdesc->buffer2_next_desc_addr = dma_current_ptp_rxdesc ->buffer2_next_desc_addr; - - /* enable reception, descriptor is owned by DMA */ - dma_current_rxdesc->status = ENET_RDES0_DAV; - - /* check Rx buffer unavailable flag status */ - if((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)) { - /* clear RBU flag */ - ENET_DMA_STAT = ENET_DMA_STAT_RBU; - /* resume DMA reception by writing to the RPEN register*/ - ENET_DMA_RPEN = 0U; - } - - - /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ - /* chained mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)) { - dma_current_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->buffer2_next_desc_addr); - /* if it is the last ptp descriptor */ - if(0U != dma_current_ptp_rxdesc->status) { - /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ - dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); - } else { - /* ponter to the next ptp descriptor */ - dma_current_ptp_rxdesc++; - } - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_rxdesc = (enet_descriptors_struct *)(ENET_DMA_RDTADDR); - /* RDES2 and RDES3 will not be covered by buffer address, so do not need to preserve a new table, - use the same table with RxDMA descriptor */ - dma_current_ptp_rxdesc = (enet_descriptors_struct *)(dma_current_ptp_rxdesc->status); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_rxdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + - GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); - dma_current_ptp_rxdesc ++; - } - } - - return SUCCESS; -} - -/*! - \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode - \param[in] buffer: pointer on the application buffer - note -- if the input is NULL, user should copy data in application by himself - \param[in] length: the length of frame data to be transmitted - \param[out] timestamp: pointer to the table which stores the timestamp high and low - note -- if the input is NULL, timestamp is ignored - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) -{ - uint32_t offset = 0U, timeout = 0U; - uint32_t dma_tbu_flag, dma_tu_flag, tdes0_ttmss_flag; - - /* the descriptor is busy due to own by the DMA */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)) { - return ERROR; - } - - /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ - if(length > ENET_MAX_FRAME_SIZE) { - return ERROR; - } - - /* if buffer pointer is null, indicates that users has handled data in application */ - if(NULL != buffer) { - /* copy frame data from application buffer to Tx buffer */ - for(offset = 0U; offset < length; offset++) { - (*(__IO uint8_t *)(uint32_t)((dma_current_ptp_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); - } - } - /* set the frame length */ - dma_current_txdesc->control_buffer_size = (length & (uint32_t)0x1FFF); - /* set the segment of frame, frame is transmitted in one descriptor */ - dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; - /* enable the DMA transmission */ - dma_current_txdesc->status |= ENET_TDES0_DAV; - - /* check Tx buffer unavailable flag status */ - dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); - dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); - - if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)) { - /* clear TBU and TU flag */ - ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); - /* resume DMA transmission by writing to the TPEN register*/ - ENET_DMA_TPEN = 0U; - } - - /* if timestamp pointer is null, indicates that users don't care timestamp in application */ - if(NULL != timestamp) { - /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ - do { - tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); - timeout++; - } while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); - - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - return ERROR; - } - - /* clear the ENET_TDES0_TTMSS flag */ - dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; - /* get the timestamp value of the transmit frame */ - timestamp[0] = dma_current_txdesc->buffer1_addr; - timestamp[1] = dma_current_txdesc->buffer2_next_desc_addr; - } - dma_current_txdesc->buffer1_addr = dma_current_ptp_txdesc ->buffer1_addr ; - dma_current_txdesc->buffer2_next_desc_addr = dma_current_ptp_txdesc ->buffer2_next_desc_addr; - - /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table */ - /* chained mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)) { - dma_current_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->buffer2_next_desc_addr); - /* if it is the last ptp descriptor */ - if(0U != dma_current_ptp_txdesc->status) { - /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ - dma_current_ptp_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->status); - } else { - /* ponter to the next ptp descriptor */ - dma_current_ptp_txdesc++; - } - } else { - /* ring mode */ - if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)) { - /* if is the last descriptor in table, the next descriptor is the table header */ - dma_current_txdesc = (enet_descriptors_struct *)(ENET_DMA_TDTADDR); - /* TDES2 and TDES3 will not be covered by buffer address, so do not need to preserve a new table, - use the same table with TxDMA descriptor */ - dma_current_ptp_txdesc = (enet_descriptors_struct *)(dma_current_ptp_txdesc->status); - } else { - /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ - dma_current_txdesc = (enet_descriptors_struct *)(uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + - GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); - dma_current_ptp_txdesc ++; - } - } - return SUCCESS; -} - -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ - -/*! - \brief wakeup frame filter register pointer reset - \param[in] none - \param[out] none - \retval none -*/ -void enet_wum_filter_register_pointer_reset(void) -{ - ENET_MAC_WUM |= ENET_MAC_WUM_WUFFRPR; -} - -/*! - \brief set the remote wakeup frame registers - \param[in] pdata: pointer to buffer data which is written to remote wakeup frame registers (8 words total) - \param[out] none - \retval none -*/ -void enet_wum_filter_config(uint32_t pdata[]) -{ - uint32_t num = 0U; - - /* configure ENET_MAC_RWFF register */ - for(num = 0U; num < ETH_WAKEUP_REGISTER_LENGTH; num++) { - ENET_MAC_RWFF = pdata[num]; - } -} - -/*! - \brief enable wakeup management features - \param[in] feature: the wake up type which is selected - one or more parameters can be selected which are shown as below - \arg ENET_WUM_POWER_DOWN: power down mode - \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception - \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception - \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame - \param[out] none - \retval none -*/ -void enet_wum_feature_enable(uint32_t feature) -{ - ENET_MAC_WUM |= feature; -} - -/*! - \brief disable wakeup management features - \param[in] feature: the wake up type which is selected - one or more parameters can be selected which are shown as below - \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception - \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception - \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame - \param[out] none - \retval none -*/ -void enet_wum_feature_disable(uint32_t feature) -{ - ENET_MAC_WUM &= (~feature); -} - -/*! - \brief reset the MAC statistics counters - \param[in] none - \param[out] none - \retval none -*/ -void enet_msc_counters_reset(void) -{ - /* reset all counters */ - ENET_MSC_CTL |= ENET_MSC_CTL_CTR; -} - -/*! - \brief enable the MAC statistics counter features - \param[in] feature: the feature of MAC statistics counter - one or more parameters can be selected which are shown as below - \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover - \arg ENET_MSC_RESET_ON_READ: reset on read - \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze - \param[out] none - \retval none -*/ -void enet_msc_feature_enable(uint32_t feature) -{ - ENET_MSC_CTL |= feature; -} - -/*! - \brief disable the MAC statistics counter features - \param[in] feature: the feature of MAC statistics counter - one or more parameters can be selected which are shown as below - \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover - \arg ENET_MSC_RESET_ON_READ: reset on read - \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze - \param[out] none - \retval none -*/ -void enet_msc_feature_disable(uint32_t feature) -{ - ENET_MSC_CTL &= (~feature); -} - -/*! - \brief configure MAC statistics counters preset mode - \param[in] mode: MSC counters preset mode, refer to enet_msc_preset_enum - only one parameter can be selected which is shown as below - \arg ENET_MSC_PRESET_NONE: do not preset MSC counter - \arg ENET_MSC_PRESET_HALF: preset all MSC counters to almost-half(0x7FFF FFF0) value - \arg ENET_MSC_PRESET_FULL: preset all MSC counters to almost-full(0xFFFF FFF0) value - \param[out] none - \retval none -*/ -void enet_msc_counters_preset_config(enet_msc_preset_enum mode) -{ - ENET_MSC_CTL &= ENET_MSC_PRESET_MASK; - ENET_MSC_CTL |= (uint32_t)mode; -} - -/*! - \brief get MAC statistics counter - \param[in] counter: MSC counters which is selected, refer to enet_msc_counter_enum - only one parameter can be selected which is shown as below - \arg ENET_MSC_TX_SCCNT: MSC transmitted good frames after a single collision counter - \arg ENET_MSC_TX_MSCCNT: MSC transmitted good frames after more than a single collision counter - \arg ENET_MSC_TX_TGFCNT: MSC transmitted good frames counter - \arg ENET_MSC_RX_RFCECNT: MSC received frames with CRC error counter - \arg ENET_MSC_RX_RFAECNT: MSC received frames with alignment error counter - \arg ENET_MSC_RX_RGUFCNT: MSC received good unicast frames counter - \param[out] none - \retval the MSC counter value -*/ -uint32_t enet_msc_counters_get(enet_msc_counter_enum counter) -{ - uint32_t reval; - - reval = REG32((ENET + (uint32_t)counter)); - - return reval; -} - -/*! - \brief change subsecond to nanosecond - \param[in] subsecond: subsecond value - \param[out] none - \retval the nanosecond value -*/ -uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond) -{ - uint64_t val = subsecond * 1000000000Ull; - val >>= 31; - return (uint32_t)val; -} - -/*! - \brief change nanosecond to subsecond - \param[in] nanosecond: nanosecond value - \param[out] none - \retval the subsecond value -*/ -uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond) -{ - uint64_t val = nanosecond * 0x80000000Ull; - val /= 1000000000U; - return (uint32_t)val; -} - -/*! - \brief enable the PTP features - \param[in] feature: the feature of ENET PTP mode - one or more parameters can be selected which are shown as below - \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames - \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger - \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot - \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame - \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame - \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame - \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame - \param[out] none - \retval none -*/ -void enet_ptp_feature_enable(uint32_t feature) -{ - ENET_PTP_TSCTL |= feature; -} - -/*! - \brief disable the PTP features - \param[in] feature: the feature of ENET PTP mode - one or more parameters can be selected which are shown as below - \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames - \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger - \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot - \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame - \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame - \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame - \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame - \param[out] none - \retval none -*/ -void enet_ptp_feature_disable(uint32_t feature) -{ - ENET_PTP_TSCTL &= ~feature; -} - -/*! - \brief configure the PTP timestamp function - \param[in] func: the function of PTP timestamp - only one parameter can be selected which is shown as below - \arg ENET_CKNT_ORDINARY: type of ordinary clock node type for timestamp - \arg ENET_CKNT_BOUNDARY: type of boundary clock node type for timestamp - \arg ENET_CKNT_END_TO_END: type of end-to-end transparent clock node type for timestamp - \arg ENET_CKNT_PEER_TO_PEER: type of peer-to-peer transparent clock node type for timestamp - \arg ENET_PTP_ADDEND_UPDATE: addend register update - \arg ENET_PTP_SYSTIME_UPDATE: timestamp update - \arg ENET_PTP_SYSTIME_INIT: timestamp initialize - \arg ENET_PTP_FINEMODE: the system timestamp uses the fine method for updating - \arg ENET_PTP_COARSEMODE: the system timestamp uses the coarse method for updating - \arg ENET_SUBSECOND_DIGITAL_ROLLOVER: digital rollover mode - \arg ENET_SUBSECOND_BINARY_ROLLOVER: binary rollover mode - \arg ENET_SNOOPING_PTP_VERSION_2: version 2 - \arg ENET_SNOOPING_PTP_VERSION_1: version 1 - \arg ENET_EVENT_TYPE_MESSAGES_SNAPSHOT: only event type messages are taken snapshot - \arg ENET_ALL_TYPE_MESSAGES_SNAPSHOT: all type messages are taken snapshot except announce, - management and signaling message - \arg ENET_MASTER_NODE_MESSAGE_SNAPSHOT: snapshot is only take for master node message - \arg ENET_SLAVE_NODE_MESSAGE_SNAPSHOT: snapshot is only taken for slave node message - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func) -{ - uint32_t temp_config = 0U, temp_state = 0U; - uint32_t timeout = 0U; - ErrStatus enet_state = SUCCESS; - - switch(func) { - case ENET_CKNT_ORDINARY: - case ENET_CKNT_BOUNDARY: - case ENET_CKNT_END_TO_END: - case ENET_CKNT_PEER_TO_PEER: - ENET_PTP_TSCTL &= ~ENET_PTP_TSCTL_CKNT; - ENET_PTP_TSCTL |= (uint32_t)func; - break; - case ENET_PTP_ADDEND_UPDATE: - /* this bit must be read as zero before application set it */ - do { - temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSARU; - timeout++; - } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - enet_state = ERROR; - } else { - ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSARU; - } - break; - case ENET_PTP_SYSTIME_UPDATE: - /* both the TMSSTU and TMSSTI bits must be read as zero before application set this bit */ - do { - temp_state = ENET_PTP_TSCTL & (ENET_PTP_TSCTL_TMSSTU | ENET_PTP_TSCTL_TMSSTI); - timeout++; - } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - enet_state = ERROR; - } else { - ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTU; - } - break; - case ENET_PTP_SYSTIME_INIT: - /* this bit must be read as zero before application set it */ - do { - temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSSTI; - timeout++; - } while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); - /* return ERROR due to timeout */ - if(ENET_DELAY_TO == timeout) { - enet_state = ERROR; - } else { - ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTI; - } - break; - default: - temp_config = (uint32_t)func & (~BIT(31)); - if(RESET != ((uint32_t)func & BIT(31))) { - ENET_PTP_TSCTL |= temp_config; - } else { - ENET_PTP_TSCTL &= ~temp_config; - } - break; - } - - return enet_state; -} - -/*! - \brief configure system time subsecond increment value - \param[in] subsecond: the value will be added to the subsecond value of system time, - this value must be between 0 and 0xFF - \param[out] none - \retval none -*/ -void enet_ptp_subsecond_increment_config(uint32_t subsecond) -{ - ENET_PTP_SSINC = PTP_SSINC_STMSSI(subsecond); -} - -/*! - \brief adjusting the clock frequency only in fine update mode - \param[in] add: the value will be added to the accumulator register to achieve time synchronization - \param[out] none - \retval none -*/ -void enet_ptp_timestamp_addend_config(uint32_t add) -{ - ENET_PTP_TSADDEND = add; -} - -/*! - \brief initialize or add/subtract to second of the system time - \param[in] sign: timestamp update positive or negative sign - only one parameter can be selected which is shown as below - \arg ENET_PTP_ADD_TO_TIME: timestamp update value is added to system time - \arg ENET_PTP_SUBSTRACT_FROM_TIME: timestamp update value is subtracted from system time - \param[in] second: initializing or adding/subtracting to second of the system time - \param[in] subsecond: the current subsecond of the system time - with 0.46 ns accuracy if required accuracy is 20 ns - \param[out] none - \retval none -*/ -void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond) -{ - ENET_PTP_TSUH = second; - ENET_PTP_TSUL = sign | PTP_TSUL_TMSUSS(subsecond); -} - -/*! - \brief configure the expected target time - \param[in] second: the expected target second time - \param[in] nanosecond: the expected target nanosecond time (signed) - \param[out] none - \retval none -*/ -void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond) -{ - ENET_PTP_ETH = second; - ENET_PTP_ETL = nanosecond; -} - -/*! - \brief get the current system time - \param[in] none - \param[out] systime_struct: pointer to a enet_ptp_systime_struct structure which contains - parameters of PTP system time - members of the structure and the member values are shown as below: - second: 0x0 - 0xFFFF FFFF - subsecond: 0x0 - 0x7FFF FFFF - sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE - \retval none -*/ -void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct) -{ - uint32_t temp_sec = 0U, temp_subs = 0U; - - /* get the value of sysytem time registers */ - temp_sec = (uint32_t)ENET_PTP_TSH; - temp_subs = (uint32_t)ENET_PTP_TSL; - - /* get sysytem time and construct the enet_ptp_systime_struct structure */ - systime_struct->second = temp_sec; - systime_struct->nanosecond = GET_PTP_TSL_STMSS(temp_subs); - systime_struct->nanosecond = enet_ptp_subsecond_2_nanosecond(systime_struct->nanosecond); - systime_struct->sign = GET_PTP_TSL_STS(temp_subs); -} - -/*! - \brief configure the PPS output frequency - \param[in] freq: PPS output frequency - only one parameter can be selected which is shown as below - \arg ENET_PPSOFC_1HZ: PPS output 1Hz frequency - \arg ENET_PPSOFC_2HZ: PPS output 2Hz frequency - \arg ENET_PPSOFC_4HZ: PPS output 4Hz frequency - \arg ENET_PPSOFC_8HZ: PPS output 8Hz frequency - \arg ENET_PPSOFC_16HZ: PPS output 16Hz frequency - \arg ENET_PPSOFC_32HZ: PPS output 32Hz frequency - \arg ENET_PPSOFC_64HZ: PPS output 64Hz frequency - \arg ENET_PPSOFC_128HZ: PPS output 128Hz frequency - \arg ENET_PPSOFC_256HZ: PPS output 256Hz frequency - \arg ENET_PPSOFC_512HZ: PPS output 512Hz frequency - \arg ENET_PPSOFC_1024HZ: PPS output 1024Hz frequency - \arg ENET_PPSOFC_2048HZ: PPS output 2048Hz frequency - \arg ENET_PPSOFC_4096HZ: PPS output 4096Hz frequency - \arg ENET_PPSOFC_8192HZ: PPS output 8192Hz frequency - \arg ENET_PPSOFC_16384HZ: PPS output 16384Hz frequency - \arg ENET_PPSOFC_32768HZ: PPS output 32768Hz frequency - \param[out] none - \retval none -*/ -void enet_ptp_pps_output_frequency_config(uint32_t freq) -{ - ENET_PTP_PPSCTL = freq; -} - -/*! - \brief configure and start PTP timestamp counter - \param[in] updatemethod: method for updating - \arg ENET_PTP_FINEMODE: fine correction method - \arg ENET_PTP_COARSEMODE: coarse correction method - \param[in] init_sec: second value for initializing system time - \param[in] init_subsec: subsecond value for initializing system time - \param[in] carry_cfg: the value to be added to the accumulator register (in fine method is used) - \param[in] accuracy_cfg: the value to be added to the subsecond value of system time - \param[out] none - \retval none -*/ -void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, - uint32_t accuracy_cfg) -{ - /* mask the timestamp trigger interrupt */ - enet_interrupt_disable(ENET_MAC_INT_TMSTIM); - - /* enable timestamp */ - enet_ptp_feature_enable(ENET_ALL_RX_TIMESTAMP | ENET_RXTX_TIMESTAMP); - - /* configure system time subsecond increment based on the PTP clock frequency */ - enet_ptp_subsecond_increment_config(accuracy_cfg); - - if(ENET_PTP_FINEMODE == updatemethod) { - /* fine correction method: configure the timestamp addend, then update */ - enet_ptp_timestamp_addend_config(carry_cfg); - enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); - /* wait until update is completed */ - while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_ADDEND_UPDATE)) { - } - } - - /* choose the fine correction method */ - enet_ptp_timestamp_function_config((enet_ptp_function_enum)updatemethod); - - /* initialize the system time */ - enet_ptp_timestamp_update_config(ENET_PTP_ADD_TO_TIME, init_sec, init_subsec); - enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); - -#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE - enet_desc_select_enhanced_mode(); -#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ -} - -/*! - \brief adjust frequency in fine method by configure addend register - \param[in] carry_cfg: the value to be added to the accumulator register - \param[out] none - \retval none -*/ -void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg) -{ - /* re-configure the timestamp addend, then update */ - enet_ptp_timestamp_addend_config((uint32_t)carry_cfg); - enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); -} - -/*! - \brief update system time in coarse method - \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains - parameters of PTP system time - members of the structure and the member values are shown as below: - second: 0x0 - 0xFFFF FFFF - nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 - sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE - \param[out] none - \retval none -*/ -void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct) -{ - uint32_t subsecond_val; - uint32_t carry_cfg; - - subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); - - /* save the carry_cfg value */ - carry_cfg = ENET_PTP_TSADDEND_TMSA; - - /* update the system time */ - enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); - enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_UPDATE); - - /* wait until the update is completed */ - while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_UPDATE)) { - } - - /* write back the carry_cfg value, then update */ - enet_ptp_timestamp_addend_config(carry_cfg); - enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); -} - -/*! - \brief set system time in fine method - \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains - parameters of PTP system time - members of the structure and the member values are shown as below: - second: 0x0 - 0xFFFF FFFF - nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 - sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE - \param[out] none - \retval none -*/ -void enet_ptp_finecorrection_settime(enet_ptp_systime_struct *systime_struct) -{ - uint32_t subsecond_val; - - subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); - - /* initialize the system time */ - enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); - enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); - - /* wait until the system time initialzation finished */ - while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_INIT)) { - } -} - -/*! - \brief get the ptp flag status - \param[in] flag: ptp flag status to be checked - \arg ENET_PTP_ADDEND_UPDATE: addend register update - \arg ENET_PTP_SYSTIME_UPDATE: timestamp update - \arg ENET_PTP_SYSTIME_INIT: timestamp initialize - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus enet_ptp_flag_get(uint32_t flag) -{ - FlagStatus bitstatus = RESET; - - if((uint32_t)RESET != (ENET_PTP_TSCTL & flag)) { - bitstatus = SET; - } - - return bitstatus; -} - -/*! - \brief reset the ENET initpara struct, call it before using enet_initpara_config() - \param[in] none - \param[out] none - \retval none -*/ -void enet_initpara_reset(void) -{ - enet_initpara.option_enable = 0U; - enet_initpara.forward_frame = 0U; - enet_initpara.dmabus_mode = 0U; - enet_initpara.dma_maxburst = 0U; - enet_initpara.dma_arbitration = 0U; - enet_initpara.store_forward_mode = 0U; - enet_initpara.dma_function = 0U; - enet_initpara.vlan_config = 0U; - enet_initpara.flow_control = 0U; - enet_initpara.hashtable_high = 0U; - enet_initpara.hashtable_low = 0U; - enet_initpara.framesfilter_mode = 0U; - enet_initpara.halfduplex_param = 0U; - enet_initpara.timer_config = 0U; - enet_initpara.interframegap = 0U; -} - -/*! - \brief initialize ENET peripheral with generally concerned parameters, call it by enet_init() - \param[in] none - \param[out] none - \retval none -*/ -static void enet_default_init(void) -{ - uint32_t reg_value = 0U; - - /* MAC */ - /* configure ENET_MAC_CFG register */ - reg_value = ENET_MAC_CFG; - reg_value &= MAC_CFG_MASK; - reg_value |= ENET_WATCHDOG_ENABLE | ENET_JABBER_ENABLE | ENET_INTERFRAMEGAP_96BIT \ - | ENET_SPEEDMODE_10M | ENET_MODE_HALFDUPLEX | ENET_LOOPBACKMODE_DISABLE \ - | ENET_CARRIERSENSE_DISABLE | ENET_RECEIVEOWN_ENABLE \ - | ENET_RETRYTRANSMISSION_ENABLE | ENET_BACKOFFLIMIT_10 \ - | ENET_DEFERRALCHECK_DISABLE \ - | ENET_TYPEFRAME_CRC_DROP_DISABLE \ - | ENET_AUTO_PADCRC_DROP_DISABLE \ - | ENET_CHECKSUMOFFLOAD_DISABLE; - ENET_MAC_CFG = reg_value; - - /* configure ENET_MAC_FRMF register */ - ENET_MAC_FRMF = ENET_SRC_FILTER_DISABLE | ENET_DEST_FILTER_INVERSE_DISABLE \ - | ENET_MULTICAST_FILTER_PERFECT | ENET_UNICAST_FILTER_PERFECT \ - | ENET_PCFRM_PREVENT_ALL | ENET_BROADCASTFRAMES_ENABLE \ - | ENET_PROMISCUOUS_DISABLE | ENET_RX_FILTER_ENABLE; - - /* configure ENET_MAC_HLH, ENET_MAC_HLL register */ - ENET_MAC_HLH = 0x0U; - - ENET_MAC_HLL = 0x0U; - - /* configure ENET_MAC_FCTL, ENET_MAC_FCTH register */ - reg_value = ENET_MAC_FCTL; - reg_value &= MAC_FCTL_MASK; - reg_value |= MAC_FCTL_PTM(0) | ENET_ZERO_QUANTA_PAUSE_DISABLE \ - | ENET_PAUSETIME_MINUS4 | ENET_UNIQUE_PAUSEDETECT \ - | ENET_RX_FLOWCONTROL_DISABLE | ENET_TX_FLOWCONTROL_DISABLE; - ENET_MAC_FCTL = reg_value; - - /* configure ENET_MAC_VLT register */ - ENET_MAC_VLT = ENET_VLANTAGCOMPARISON_16BIT | MAC_VLT_VLTI(0); - - /* disable MAC interrupt */ - ENET_MAC_INTMSK |= ENET_MAC_INTMSK_TMSTIM | ENET_MAC_INTMSK_WUMIM; - - /* MSC */ - /* disable MSC Rx interrupt */ - ENET_MSC_RINTMSK |= ENET_MSC_RINTMSK_RFAEIM | ENET_MSC_RINTMSK_RFCEIM \ - | ENET_MSC_RINTMSK_RGUFIM; - - /* disable MSC Tx interrupt */ - ENET_MSC_TINTMSK |= ENET_MSC_TINTMSK_TGFIM | ENET_MSC_TINTMSK_TGFMSCIM \ - | ENET_MSC_TINTMSK_TGFSCIM; - - /* DMA */ - /* configure ENET_DMA_CTL register */ - reg_value = ENET_DMA_CTL; - reg_value &= DMA_CTL_MASK; - reg_value |= ENET_TCPIP_CKSUMERROR_DROP | ENET_RX_MODE_STOREFORWARD \ - | ENET_FLUSH_RXFRAME_ENABLE | ENET_TX_MODE_STOREFORWARD \ - | ENET_TX_THRESHOLD_64BYTES | ENET_RX_THRESHOLD_64BYTES \ - | ENET_SECONDFRAME_OPT_DISABLE; - ENET_DMA_CTL = reg_value; - - /* configure ENET_DMA_BCTL register */ - reg_value = ENET_DMA_BCTL; - reg_value &= DMA_BCTL_MASK; - reg_value = ENET_ADDRESS_ALIGN_ENABLE | ENET_ARBITRATION_RXTX_2_1 \ - | ENET_RXDP_32BEAT | ENET_PGBL_32BEAT | ENET_RXTX_DIFFERENT_PGBL \ - | ENET_FIXED_BURST_ENABLE | ENET_MIXED_BURST_DISABLE \ - | ENET_NORMAL_DESCRIPTOR; - ENET_DMA_BCTL = reg_value; -} - -#ifndef USE_DELAY -/*! - \brief insert a delay time - \param[in] ncount: specifies the delay time length - \param[out] none - \param[out] none -*/ -static void enet_delay(uint32_t ncount) -{ - __IO uint32_t delay_time = 0U; - - for(delay_time = ncount; delay_time != 0U; delay_time--) { - } -} -#endif /* USE_DELAY */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c deleted file mode 100644 index 03db6db8ce9..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c +++ /dev/null @@ -1,1264 +0,0 @@ -/*! - \file gd32f5xx_exmc.c - \brief EXMC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_exmc.h" - -/* EXMC bank0 register reset value */ -#define BANK0_SNCTL_RESET ((uint32_t)0x000030DAU) -#define BANK0_SNTCFG_RESET ((uint32_t)0x0FFFFFFFU) -#define BANK0_SNWTCFG_RESET ((uint32_t)0x0FFFFFFFU) - -/* EXMC bank1/2 register reset mask */ -#define BANK1_2_NPCTL_RESET ((uint32_t)0x00000008U) -#define BANK1_2_NPINTEN_RESET ((uint32_t)0x00000042U) -#define BANK1_2_NPCTCFG_RESET ((uint32_t)0xFFFFFFFFU) -#define BANK1_2_NPATCFG_RESET ((uint32_t)0xFFFFFFFFU) - -/* EXMC bank3 register reset mask */ -#define BANK3_NPCTL_RESET ((uint32_t)0x00000008U) -#define BANK3_NPINTEN_RESET ((uint32_t)0x00000040U) -#define BANK3_NPCTCFG_RESET ((uint32_t)0xFFFFFFFFU) -#define BANK3_NPATCFG_RESET ((uint32_t)0xFFFFFFFFU) -#define BANK3_PIOTCFG3_RESET ((uint32_t)0xFFFFFFFFU) - -/* EXMC SDRAM device register reset mask */ -#define SDRAM_DEVICE_SDCTL_RESET ((uint32_t)0x000002D0U) -#define SDRAM_DEVICE_SDTCFG_RESET ((uint32_t)0x0FFFFFFFU) -#define SDRAM_DEVICE_SDCMD_RESET ((uint32_t)0x00000000U) -#define SDRAM_DEVICE_SDARI_RESET ((uint32_t)0x00000000U) -#define SDRAM_DEVICE_SDSTAT_RESET ((uint32_t)0x00000000U) -#define SDRAM_DEVICE_SDRSCTL_RESET ((uint32_t)0x00000000U) - -/* EXMC bank0 SQPI-PSRAM register reset mask */ -#define BANK0_SQPI_SINIT_RESET ((uint32_t)0x18010000U) -#define BANK0_SQPI_SRCMD_RESET ((uint32_t)0x00000000U) -#define BANK0_SQPI_SWCMD_RESET ((uint32_t)0x00000000U) -#define BANK0_SQPI_SIDL_RESET ((uint32_t)0x00000000U) -#define BANK0_SQPI_SIDH_RESET ((uint32_t)0x00000000U) - -/* EXMC register bit offset */ -/* SNCTL offset */ -#define SNCTL_NRMUX_OFFSET ((uint32_t)1U) -#define SNCTL_SBRSTEN_OFFSET ((uint32_t)8U) -#define SNCTL_WRAPEN_OFFSET ((uint32_t)10U) -#define SNCTL_WREN_OFFSET ((uint32_t)12U) -#define SNCTL_NRWTEN_OFFSET ((uint32_t)13U) -#define SNCTL_EXMODEN_OFFSET ((uint32_t)14U) -#define SNCTL_ASYNCWAIT_OFFSET ((uint32_t)15U) - -/* SNTCFG offset */ -#define SNTCFG_AHLD_OFFSET ((uint32_t)4U) -#define SNTCFG_DSET_OFFSET ((uint32_t)8U) -#define SNTCFG_BUSLAT_OFFSET ((uint32_t)16U) - -/* NPCTL offset */ -#define NPCTL_NDWTEN_OFFSET ((uint32_t)1U) -#define NPCTL_ECCEN_OFFSET ((uint32_t)6U) - -/* NPCTCFG offset */ -#define NPCTCFG_COMWAIT_OFFSET ((uint32_t)8U) -#define NPCTCFG_COMHLD_OFFSET ((uint32_t)16U) -#define NPCTCFG_COMHIZ_OFFSET ((uint32_t)24U) - -/* NPATCFG offset */ -#define NPATCFG_ATTWAIT_OFFSET ((uint32_t)8U) -#define NPATCFG_ATTHLD_OFFSET ((uint32_t)16U) -#define NPATCFG_ATTHIZ_OFFSET ((uint32_t)24U) - -/* PIOTCFG offset */ -#define PIOTCFG_IOWAIT_OFFSET ((uint32_t)8U) -#define PIOTCFG_IOHLD_OFFSET ((uint32_t)16U) -#define PIOTCFG_IOHIZ_OFFSET ((uint32_t)24U) - -/* SDCTL offset */ -#define SDCTL_WPEN_OFFSET ((uint32_t)9U) -#define SDCTL_BRSTRD_OFFSET ((uint32_t)12U) - -/* SDTCFG offset */ -#define SDTCFG_XSRD_OFFSET ((uint32_t)4U) -#define SDTCFG_RASD_OFFSET ((uint32_t)8U) -#define SDTCFG_ARFD_OFFSET ((uint32_t)12U) -#define SDTCFG_WRD_OFFSET ((uint32_t)16U) -#define SDTCFG_RPD_OFFSET ((uint32_t)20U) -#define SDTCFG_RCD_OFFSET ((uint32_t)24U) - -/* SDCMD offset */ -#define SDCMD_NARF_OFFSET ((uint32_t)5U) -#define SDCMD_MRC_OFFSET ((uint32_t)9U) - -/* SDARI offset */ -#define SDARI_ARINTV_OFFSET ((uint32_t)1U) - -/* SDSTAT offset */ -#define SDSTAT_STA0_OFFSET ((uint32_t)1U) -#define SDSTAT_STA1_OFFSET ((uint32_t)3U) - -/* SRCMD offset */ -#define SRCMD_RWAITCYCLE_OFFSET ((uint32_t)16U) -#define SWCMD_WWAITCYCLE_OFFSET ((uint32_t)16U) - -/* INTEN offset */ -#define INTEN_INTS_OFFSET ((uint32_t)3U) - -/*! - \brief deinitialize EXMC NOR/SRAM region - \param[in] exmc_norsram_region: select the region of bank0 - only one parameter can be selected which is shown as below: - \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) - \param[out] none - \retval none -*/ -void exmc_norsram_deinit(uint32_t exmc_norsram_region) -{ - /* reset the registers */ - EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_RESET; - EXMC_SNTCFG(exmc_norsram_region) = BANK0_SNTCFG_RESET; - EXMC_SNWTCFG(exmc_norsram_region) = BANK0_SNWTCFG_RESET; -} - -/*! - \brief initialize exmc_norsram_parameter_struct with the default values - \param[in] none - \param[out] exmc_norsram_init_struct: the initialized struct exmc_norsram_parameter_struct pointer - \retval none -*/ -void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct) -{ - /* configure the structure with default values */ - exmc_norsram_init_struct->norsram_region = EXMC_BANK0_NORSRAM_REGION0; - exmc_norsram_init_struct->address_data_mux = ENABLE; - exmc_norsram_init_struct->memory_type = EXMC_MEMORY_TYPE_SRAM; - exmc_norsram_init_struct->databus_width = EXMC_NOR_DATABUS_WIDTH_8B; - exmc_norsram_init_struct->burst_mode = DISABLE; - exmc_norsram_init_struct->nwait_polarity = EXMC_NWAIT_POLARITY_LOW; - exmc_norsram_init_struct->wrap_burst_mode = DISABLE; - exmc_norsram_init_struct->nwait_config = EXMC_NWAIT_CONFIG_BEFORE; - exmc_norsram_init_struct->memory_write = ENABLE; - exmc_norsram_init_struct->nwait_signal = ENABLE; - exmc_norsram_init_struct->extended_mode = DISABLE; - exmc_norsram_init_struct->asyn_wait = DISABLE; - exmc_norsram_init_struct->write_mode = EXMC_ASYN_WRITE; - - /* configure read/write timing */ - exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime = 0xFU; - exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime = 0xFU; - exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime = 0xFFU; - exmc_norsram_init_struct->read_write_timing->bus_latency = 0xFU; - exmc_norsram_init_struct->read_write_timing->syn_clk_division = EXMC_SYN_CLOCK_RATIO_16_CLK; - exmc_norsram_init_struct->read_write_timing->syn_data_latency = EXMC_DATALAT_17_CLK; - exmc_norsram_init_struct->read_write_timing->syn_data_latency_dec = 0x0U; - exmc_norsram_init_struct->read_write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; - - /* configure write timing, when extended mode is used */ - exmc_norsram_init_struct->write_timing->asyn_address_setuptime = 0xFU; - exmc_norsram_init_struct->write_timing->asyn_address_holdtime = 0xFU; - exmc_norsram_init_struct->write_timing->asyn_data_setuptime = 0xFFU; - exmc_norsram_init_struct->write_timing->bus_latency = 0xFU; - exmc_norsram_init_struct->write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; -} - -/*! - \brief initialize EXMC NOR/SRAM region - \param[in] exmc_norsram_init_struct: configure the EXMC NOR/SRAM parameter - norsram_region: EXMC_BANK0_NORSRAM_REGIONx, x=0..3 - write_mode: EXMC_ASYN_WRITE, EXMC_SYN_WRITE - extended_mode: ENABLE or DISABLE - asyn_wait: ENABLE or DISABLE - nwait_signal: ENABLE or DISABLE - memory_write: ENABLE or DISABLE - nwait_config: EXMC_NWAIT_CONFIG_BEFORE, EXMC_NWAIT_CONFIG_DURING - wrap_burst_mode: ENABLE or DISABLE - nwait_polarity: EXMC_NWAIT_POLARITY_LOW, EXMC_NWAIT_POLARITY_HIGH - burst_mode: ENABLE or DISABLE - databus_width: EXMC_NOR_DATABUS_WIDTH_8B, EXMC_NOR_DATABUS_WIDTH_16B - memory_type: EXMC_MEMORY_TYPE_SRAM, EXMC_MEMORY_TYPE_PSRAM, EXMC_MEMORY_TYPE_NOR - address_data_mux: ENABLE or DISABLE - read_write_timing: struct exmc_norsram_timing_parameter_struct set the time - asyn_access_mode: EXMC_ACCESS_MODE_A, EXMC_ACCESS_MODE_B, EXMC_ACCESS_MODE_C, EXMC_ACCESS_MODE_D - syn_data_latency: EXMC_DATALAT_x_CLK, x=2..17 - syn_data_latency_dec: 0x1U~0x7U - syn_clk_division: EXMC_SYN_CLOCK_RATIO_DISABLE, EXMC_SYN_CLOCK_RATIO_x_CLK, x=2..16 - bus_latency: 0x0U~0xFU - asyn_data_setuptime: 0x01U~0xFFU - asyn_address_holdtime: 0x1U~0xFU - asyn_address_setuptime: 0x0U~0xFU - write_timing: struct exmc_norsram_timing_parameter_struct set the time - asyn_access_mode: EXMC_ACCESS_MODE_A, EXMC_ACCESS_MODE_B, EXMC_ACCESS_MODE_C, EXMC_ACCESS_MODE_D - bus_latency: 0x0U~0xFU - asyn_data_setuptime: 0x01U~0xFFU - asyn_address_holdtime: 0x1U~0xFU - asyn_address_setuptime: 0x0U~0xFU - \param[out] none - \retval none -*/ -void exmc_norsram_init(exmc_norsram_parameter_struct *exmc_norsram_init_struct) -{ - uint32_t snctl = 0x00000000U, sntcfg = 0x00000000U, snwtcfg = 0x00000000U, snlatdec = 0x00000000U; - - /* get the register value */ - snctl = EXMC_SNCTL(exmc_norsram_init_struct->norsram_region); - - /* clear relative bits */ - snctl &= ((uint32_t)~(EXMC_SNCTL_NREN | EXMC_SNCTL_NRTP | EXMC_SNCTL_NRW | EXMC_SNCTL_SBRSTEN | - EXMC_SNCTL_NRWTPOL | EXMC_SNCTL_WRAPEN | EXMC_SNCTL_NRWTCFG | EXMC_SNCTL_WEN | - EXMC_SNCTL_NRWTEN | EXMC_SNCTL_EXMODEN | EXMC_SNCTL_ASYNCWTEN | EXMC_SNCTL_SYNCWR | - EXMC_SNCTL_NRMUX)); - - /* configure control bits */ - snctl |= (uint32_t)(exmc_norsram_init_struct->address_data_mux << SNCTL_NRMUX_OFFSET) | - exmc_norsram_init_struct->memory_type | - exmc_norsram_init_struct->databus_width | - (exmc_norsram_init_struct->burst_mode << SNCTL_SBRSTEN_OFFSET) | - exmc_norsram_init_struct->nwait_polarity | - (exmc_norsram_init_struct->wrap_burst_mode << SNCTL_WRAPEN_OFFSET) | - exmc_norsram_init_struct->nwait_config | - (exmc_norsram_init_struct->memory_write << SNCTL_WREN_OFFSET) | - (exmc_norsram_init_struct->nwait_signal << SNCTL_NRWTEN_OFFSET) | - (exmc_norsram_init_struct->extended_mode << SNCTL_EXMODEN_OFFSET) | - (exmc_norsram_init_struct->asyn_wait << SNCTL_ASYNCWAIT_OFFSET) | - exmc_norsram_init_struct->write_mode; - - /* configure timing */ - sntcfg = (uint32_t)exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime | - (exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime << SNTCFG_AHLD_OFFSET) | - (exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime << SNTCFG_DSET_OFFSET) | - (exmc_norsram_init_struct->read_write_timing->bus_latency << SNTCFG_BUSLAT_OFFSET) | - exmc_norsram_init_struct->read_write_timing->syn_clk_division | - exmc_norsram_init_struct->read_write_timing->syn_data_latency | - exmc_norsram_init_struct->read_write_timing->asyn_access_mode; - - /* configure data latency decreasing value */ - snlatdec = (uint32_t)(exmc_norsram_init_struct->read_write_timing->syn_data_latency_dec & EXMC_SNLATDEC_LATDEC); - - /* enable nor flash access */ - if(EXMC_MEMORY_TYPE_NOR == exmc_norsram_init_struct->memory_type) { - snctl |= (uint32_t)EXMC_SNCTL_NREN; - } - - /* configure extended mode */ - if(ENABLE == exmc_norsram_init_struct->extended_mode) { - snwtcfg = (uint32_t)exmc_norsram_init_struct->write_timing->asyn_address_setuptime | - (exmc_norsram_init_struct->write_timing->asyn_address_holdtime << SNTCFG_AHLD_OFFSET) | - (exmc_norsram_init_struct->write_timing->asyn_data_setuptime << SNTCFG_DSET_OFFSET) | - (exmc_norsram_init_struct->write_timing->bus_latency << SNTCFG_BUSLAT_OFFSET) | - exmc_norsram_init_struct->write_timing->asyn_access_mode; - } else { - snwtcfg = BANK0_SNWTCFG_RESET; - } - - /* configure the registers */ - EXMC_SNCTL(exmc_norsram_init_struct->norsram_region) = snctl; - EXMC_SNTCFG(exmc_norsram_init_struct->norsram_region) = sntcfg; - EXMC_SNWTCFG(exmc_norsram_init_struct->norsram_region) = snwtcfg; - EXMC_SNLATDEC(exmc_norsram_init_struct->norsram_region) = snlatdec; -} - -/*! - \brief enable EXMC NOR/PSRAM bank region - \param[in] exmc_norsram_region: specify the region of NOR/PSRAM bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) - \param[out] none - \retval none -*/ -void exmc_norsram_enable(uint32_t exmc_norsram_region) -{ - EXMC_SNCTL(exmc_norsram_region) |= (uint32_t)EXMC_SNCTL_NRBKEN; -} - -/*! - \brief disable EXMC NOR/PSRAM bank region - \param[in] exmc_norsram_region: specify the region of NOR/PSRAM Bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) - \param[out] none - \retval none -*/ -void exmc_norsram_disable(uint32_t exmc_norsram_region) -{ - EXMC_SNCTL(exmc_norsram_region) &= ~(uint32_t)EXMC_SNCTL_NRBKEN; -} - -/*! - \brief deinitialize EXMC NAND bank - \param[in] exmc_nand_bank: select the bank of NAND - only one parameter can be selected which is shown as below: - \arg EXMC_BANKx_NAND(x=1,2) - \param[out] none - \retval none -*/ -void exmc_nand_deinit(uint32_t exmc_nand_bank) -{ - /* EXMC_BANK1_NAND or EXMC_BANK2_NAND */ - EXMC_NPCTL(exmc_nand_bank) = BANK1_2_NPCTL_RESET; - EXMC_NPINTEN(exmc_nand_bank) = BANK1_2_NPINTEN_RESET; - EXMC_NPCTCFG(exmc_nand_bank) = BANK1_2_NPCTCFG_RESET; - EXMC_NPATCFG(exmc_nand_bank) = BANK1_2_NPATCFG_RESET; -} - -/*! - \brief initialize exmc_norsram_parameter_struct with the default values - \param[in] none - \param[out] the initialized struct exmc_nand_parameter_struct pointer - \retval none -*/ -void exmc_nand_struct_para_init(exmc_nand_parameter_struct *exmc_nand_init_struct) -{ - /* configure the structure with default values */ - exmc_nand_init_struct->nand_bank = EXMC_BANK1_NAND; - exmc_nand_init_struct->wait_feature = DISABLE; - exmc_nand_init_struct->databus_width = EXMC_NAND_DATABUS_WIDTH_8B; - exmc_nand_init_struct->ecc_logic = DISABLE; - exmc_nand_init_struct->ecc_size = EXMC_ECC_SIZE_256BYTES; - exmc_nand_init_struct->ctr_latency = 0x0U; - exmc_nand_init_struct->atr_latency = 0x0U; - exmc_nand_init_struct->common_space_timing->setuptime = 0xFCU; - exmc_nand_init_struct->common_space_timing->waittime = 0xFCU; - exmc_nand_init_struct->common_space_timing->holdtime = 0xFCU; - exmc_nand_init_struct->common_space_timing->databus_hiztime = 0xFCU; - exmc_nand_init_struct->attribute_space_timing->setuptime = 0xFCU; - exmc_nand_init_struct->attribute_space_timing->waittime = 0xFCU; - exmc_nand_init_struct->attribute_space_timing->holdtime = 0xFCU; - exmc_nand_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; -} - -/*! - \brief initialize EXMC NAND bank - \param[in] exmc_nand_init_struct: configure the EXMC NAND parameter - nand_bank: EXMC_BANK1_NAND,EXMC_BANK2_NAND - ecc_size: EXMC_ECC_SIZE_xBYTES,x=256,512,1024,2048,4096 - atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 - ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 - ecc_logic: ENABLE or DISABLE - databus_width: EXMC_NAND_DATABUS_WIDTH_8B,EXMC_NAND_DATABUS_WIDTH_16B - wait_feature: ENABLE or DISABLE - common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time - databus_hiztime: 0x01U~0xFFU - holdtime: 0x01U~0xFEU - waittime: 0x02U~0xFFU - setuptime: 0x01U~0xFFU - attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time - databus_hiztime: 0x00U~0xFEU - holdtime: 0x01U~0xFEU - waittime: 0x02U~0xFFU - setuptime: 0x01U~0xFFU - \param[out] none - \retval none -*/ -void exmc_nand_init(exmc_nand_parameter_struct *exmc_nand_init_struct) -{ - uint32_t npctl = 0x00000000U, npctcfg = 0x00000000U, npatcfg = 0x00000000U; - - npctl = (uint32_t)(exmc_nand_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) | - EXMC_NPCTL_NDTP | - exmc_nand_init_struct->databus_width | - (exmc_nand_init_struct->ecc_logic << NPCTL_ECCEN_OFFSET) | - exmc_nand_init_struct->ecc_size | - exmc_nand_init_struct->ctr_latency | - exmc_nand_init_struct->atr_latency; - - npctcfg = (uint32_t)((exmc_nand_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET) | - (((exmc_nand_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT) | - ((exmc_nand_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD) | - (((exmc_nand_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ); - - npatcfg = (uint32_t)((exmc_nand_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET) | - (((exmc_nand_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT) | - ((exmc_nand_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD) | - ((exmc_nand_init_struct->attribute_space_timing->databus_hiztime << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ); - - /* initialize EXMC_BANK1_NAND or EXMC_BANK2_NAND */ - EXMC_NPCTL(exmc_nand_init_struct->nand_bank) = npctl; - EXMC_NPCTCFG(exmc_nand_init_struct->nand_bank) = npctcfg; - EXMC_NPATCFG(exmc_nand_init_struct->nand_bank) = npatcfg; -} - -/*! - \brief enable NAND bank - \param[in] exmc_nand_bank: specify the NAND bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANKx_NAND(x=1,2) - \param[out] none - \retval none -*/ -void exmc_nand_enable(uint32_t exmc_nand_bank) -{ - EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_NDBKEN; -} - -/*! - \brief disable NAND bank - \param[in] exmc_nand_bank: specify the NAND bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANKx_NAND(x=1,2) - \param[out] none - \retval none -*/ -void exmc_nand_disable(uint32_t exmc_nand_bank) -{ - EXMC_NPCTL(exmc_nand_bank) &= ~EXMC_NPCTL_NDBKEN; -} - -/*! - \brief deinitialize EXMC PC card bank - \param[in] none - \param[out] none - \retval none -*/ -void exmc_pccard_deinit(void) -{ - /* EXMC_BANK3_PCCARD */ - EXMC_NPCTL3 = BANK3_NPCTL_RESET; - EXMC_NPINTEN3 = BANK3_NPINTEN_RESET; - EXMC_NPCTCFG3 = BANK3_NPCTCFG_RESET; - EXMC_NPATCFG3 = BANK3_NPATCFG_RESET; - EXMC_PIOTCFG3 = BANK3_PIOTCFG3_RESET; -} - -/*! - \brief initialize exmc_pccard_parameter_struct with the default values - \param[in] none - \param[out] the initialized struct exmc_pccard_parameter_struct pointer - \retval none -*/ -void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct) -{ - /* configure the structure with default values */ - exmc_pccard_init_struct->wait_feature = DISABLE; - exmc_pccard_init_struct->ctr_latency = 0x0U; - exmc_pccard_init_struct->atr_latency = 0x0U; - exmc_pccard_init_struct->common_space_timing->setuptime = 0xFCU; - exmc_pccard_init_struct->common_space_timing->waittime = 0xFCU; - exmc_pccard_init_struct->common_space_timing->holdtime = 0xFCU; - exmc_pccard_init_struct->common_space_timing->databus_hiztime = 0xFCU; - exmc_pccard_init_struct->attribute_space_timing->setuptime = 0xFCU; - exmc_pccard_init_struct->attribute_space_timing->waittime = 0xFCU; - exmc_pccard_init_struct->attribute_space_timing->holdtime = 0xFCU; - exmc_pccard_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; - exmc_pccard_init_struct->io_space_timing->setuptime = 0xFCU; - exmc_pccard_init_struct->io_space_timing->waittime = 0xFCU; - exmc_pccard_init_struct->io_space_timing->holdtime = 0xFCU; - exmc_pccard_init_struct->io_space_timing->databus_hiztime = 0xFCU; -} - -/*! - \brief initialize EXMC PC card bank - \param[in] exmc_pccard_init_struct: configure the EXMC NAND parameter - atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 - ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 - wait_feature: ENABLE or DISABLE - common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time - databus_hiztime: 0x01U~0xFFU - holdtime: 0x01U~0xFEU - waittime: 0x02U~0xFFU - setuptime: 0x01U~0xFFU - attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time - databus_hiztime: 0x00U~0xFEU - holdtime: 0x01U~0xFEU - waittime: 0x02U~0xFFU - setuptime: 0x01U~0xFFU - io_space_timing: exmc_nand_pccard_timing_parameter_struct set the time - databus_hiztime: 0x00U~0xFFU - holdtime: 0x01U~0xFFU - waittime: 0x02U~0x100U - setuptime: 0x01U~0x100U - \param[out] none - \retval none -*/ -void exmc_pccard_init(exmc_pccard_parameter_struct *exmc_pccard_init_struct) -{ - /* configure the EXMC bank3 PC card control register */ - EXMC_NPCTL3 = (uint32_t)(exmc_pccard_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) | - EXMC_NAND_DATABUS_WIDTH_16B | - exmc_pccard_init_struct->ctr_latency | - exmc_pccard_init_struct->atr_latency ; - - /* configure the EXMC bank3 PC card common space timing configuration register */ - EXMC_NPCTCFG3 = (uint32_t)((exmc_pccard_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET) | - (((exmc_pccard_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT) | - ((exmc_pccard_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD) | - (((exmc_pccard_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ); - - /* configure the EXMC bank3 PC card attribute space timing configuration register */ - EXMC_NPATCFG3 = (uint32_t)((exmc_pccard_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET) | - (((exmc_pccard_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT) | - ((exmc_pccard_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD) | - ((exmc_pccard_init_struct->attribute_space_timing->databus_hiztime << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ); - - /* configure the EXMC bank3 PC card io space timing configuration register */ - EXMC_PIOTCFG3 = (uint32_t)((exmc_pccard_init_struct->io_space_timing->setuptime - 1U) & EXMC_PIOTCFG3_IOSET) | - (((exmc_pccard_init_struct->io_space_timing->waittime - 1U) << PIOTCFG_IOWAIT_OFFSET) & EXMC_PIOTCFG3_IOWAIT) | - ((exmc_pccard_init_struct->io_space_timing->holdtime << PIOTCFG_IOHLD_OFFSET) & EXMC_PIOTCFG3_IOHLD) | - ((exmc_pccard_init_struct->io_space_timing->databus_hiztime << PIOTCFG_IOHIZ_OFFSET) & EXMC_PIOTCFG3_IOHIZ); -} - -/*! - \brief enable PC Card Bank - \param[in] none - \param[out] none - \retval none -*/ -void exmc_pccard_enable(void) -{ - EXMC_NPCTL3 |= EXMC_NPCTL_NDBKEN; -} - -/*! - \brief disable PC Card Bank - \param[in] none - \param[out] none - \retval none -*/ -void exmc_pccard_disable(void) -{ - EXMC_NPCTL3 &= ~EXMC_NPCTL_NDBKEN; -} - -/*! - \brief deinitialize EXMC SDRAM device - \param[in] exmc_sdram_device: select the SRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_SDRAM_DEVICEx(x=0, 1) - \param[in] none - \param[out] none - \retval none -*/ -void exmc_sdram_deinit(uint32_t exmc_sdram_device) -{ - /* reset SDRAM registers */ - EXMC_SDCTL(exmc_sdram_device) = SDRAM_DEVICE_SDCTL_RESET; - EXMC_SDTCFG(exmc_sdram_device) = SDRAM_DEVICE_SDTCFG_RESET; - EXMC_SDCMD = SDRAM_DEVICE_SDCMD_RESET; - EXMC_SDARI = SDRAM_DEVICE_SDARI_RESET; - EXMC_SDRSCTL = SDRAM_DEVICE_SDRSCTL_RESET; -} - -/*! - \brief initialize exmc_sdram_parameter_struct with the default values - \param[in] none - \param[out] the initialized struct exmc_sdram_parameter_struct pointer - \retval none -*/ -void exmc_sdram_struct_para_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct) -{ - /* configure the structure with default values */ - exmc_sdram_init_struct->sdram_device = EXMC_SDRAM_DEVICE0; - exmc_sdram_init_struct->column_address_width = EXMC_SDRAM_COW_ADDRESS_8; - exmc_sdram_init_struct->row_address_width = EXMC_SDRAM_ROW_ADDRESS_11; - exmc_sdram_init_struct->data_width = EXMC_SDRAM_DATABUS_WIDTH_16B; - exmc_sdram_init_struct->internal_bank_number = EXMC_SDRAM_4_INTER_BANK; - exmc_sdram_init_struct->cas_latency = EXMC_CAS_LATENCY_1_SDCLK; - exmc_sdram_init_struct->write_protection = ENABLE; - exmc_sdram_init_struct->sdclock_config = EXMC_SDCLK_DISABLE; - exmc_sdram_init_struct->burst_read_switch = DISABLE; - exmc_sdram_init_struct->pipeline_read_delay = EXMC_PIPELINE_DELAY_0_HCLK; - - exmc_sdram_init_struct->timing->load_mode_register_delay = 16U; - exmc_sdram_init_struct->timing->exit_selfrefresh_delay = 16U; - exmc_sdram_init_struct->timing->row_address_select_delay = 16U; - exmc_sdram_init_struct->timing->auto_refresh_delay = 16U; - exmc_sdram_init_struct->timing->write_recovery_delay = 16U; - exmc_sdram_init_struct->timing->row_precharge_delay = 16U; - exmc_sdram_init_struct->timing->row_to_column_delay = 16U; -} - -/*! - \brief initialize EXMC SDRAM device - \param[in] exmc_sdram_init_struct: configure the EXMC SDRAM parameter - sdram_device: EXMC_SDRAM_DEVICE0,EXMC_SDRAM_DEVICE1 - pipeline_read_delay: EXMC_PIPELINE_DELAY_x_HCLK,x=0..2 - burst_read_switch: ENABLE or DISABLE - sdclock_config: EXMC_SDCLK_DISABLE,EXMC_SDCLK_PERIODS_2_HCLK,EXMC_SDCLK_PERIODS_3_HCLK - write_protection: ENABLE or DISABLE - cas_latency: EXMC_CAS_LATENCY_x_SDCLK,x=1..3 - internal_bank_number: EXMC_SDRAM_2_INTER_BANK,EXMC_SDRAM_4_INTER_BANK - data_width: EXMC_SDRAM_DATABUS_WIDTH_8B,EXMC_SDRAM_DATABUS_WIDTH_16B,EXMC_SDRAM_DATABUS_WIDTH_32B - row_address_width: EXMC_SDRAM_ROW_ADDRESS_x,x=11..13 - column_address_width: EXMC_SDRAM_COW_ADDRESS_x,x=8..11 - timing: exmc_sdram_timing_parameter_struct set the time - row_to_column_delay: 1U~16U - row_precharge_delay: 1U~16U - write_recovery_delay: 1U~16U - auto_refresh_delay: 1U~16U - row_address_select_delay: 1U~16U - exit_selfrefresh_delay: 1U~16U - load_mode_register_delay: 1U~16U - \param[out] none - \retval none -*/ -void exmc_sdram_init(exmc_sdram_parameter_struct *exmc_sdram_init_struct) -{ - uint32_t sdctl0, sdctl1, sdtcfg0, sdtcfg1; - - /* configure EXMC_SDCTL0 or EXMC_SDCTL1 */ - if(EXMC_SDRAM_DEVICE0 == exmc_sdram_init_struct->sdram_device) { - /* configure EXMC_SDCTL0 */ - EXMC_SDCTL(EXMC_SDRAM_DEVICE0) = (uint32_t)(exmc_sdram_init_struct->column_address_width | - exmc_sdram_init_struct->row_address_width | - exmc_sdram_init_struct->data_width | - exmc_sdram_init_struct->internal_bank_number | - exmc_sdram_init_struct->cas_latency | - (exmc_sdram_init_struct->write_protection << SDCTL_WPEN_OFFSET) | - exmc_sdram_init_struct->sdclock_config | - (exmc_sdram_init_struct->burst_read_switch << SDCTL_BRSTRD_OFFSET) | - exmc_sdram_init_struct->pipeline_read_delay); - - /* configure EXMC_SDTCFG0 */ - EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) = (uint32_t)((exmc_sdram_init_struct->timing->load_mode_register_delay) - 1U) | - (((exmc_sdram_init_struct->timing->exit_selfrefresh_delay) - 1U) << SDTCFG_XSRD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_address_select_delay) - 1U) << SDTCFG_RASD_OFFSET) | - (((exmc_sdram_init_struct->timing->auto_refresh_delay) - 1U) << SDTCFG_ARFD_OFFSET) | - (((exmc_sdram_init_struct->timing->write_recovery_delay) - 1U) << SDTCFG_WRD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_precharge_delay) - 1U) << SDTCFG_RPD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_to_column_delay) - 1U) << SDTCFG_RCD_OFFSET); - } else { - /* configure EXMC_SDCTL0 and EXMC_SDCTL1 */ - /* some bits in the EXMC_SDCTL1 register are reserved */ - sdctl0 = EXMC_SDCTL(EXMC_SDRAM_DEVICE0) & (~(EXMC_SDCTL_PIPED | EXMC_SDCTL_BRSTRD | EXMC_SDCTL_SDCLK)); - - sdctl0 |= (uint32_t)(exmc_sdram_init_struct->sdclock_config | - (exmc_sdram_init_struct->burst_read_switch << SDCTL_BRSTRD_OFFSET) | - exmc_sdram_init_struct->pipeline_read_delay); - - sdctl1 = (uint32_t)(exmc_sdram_init_struct->column_address_width | - exmc_sdram_init_struct->row_address_width | - exmc_sdram_init_struct->data_width | - exmc_sdram_init_struct->internal_bank_number | - exmc_sdram_init_struct->cas_latency | - (exmc_sdram_init_struct->write_protection << SDCTL_WPEN_OFFSET)); - - EXMC_SDCTL(EXMC_SDRAM_DEVICE0) = sdctl0; - EXMC_SDCTL(EXMC_SDRAM_DEVICE1) = sdctl1; - - /* configure EXMC_SDTCFG0 and EXMC_SDTCFG1 */ - /* some bits in the EXMC_SDTCFG1 register are reserved */ - sdtcfg0 = EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) & (~(EXMC_SDTCFG_RPD | EXMC_SDTCFG_WRD | EXMC_SDTCFG_ARFD)); - - sdtcfg0 |= (uint32_t)((((exmc_sdram_init_struct->timing->auto_refresh_delay) - 1U) << SDTCFG_ARFD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_precharge_delay) - 1U) << SDTCFG_RPD_OFFSET) | - (((exmc_sdram_init_struct->timing->write_recovery_delay) - 1U) << SDTCFG_WRD_OFFSET)); - - sdtcfg1 = (uint32_t)(((exmc_sdram_init_struct->timing->load_mode_register_delay) - 1U) | - (((exmc_sdram_init_struct->timing->exit_selfrefresh_delay) - 1U) << SDTCFG_XSRD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_address_select_delay) - 1U) << SDTCFG_RASD_OFFSET) | - (((exmc_sdram_init_struct->timing->row_to_column_delay) - 1U) << SDTCFG_RCD_OFFSET)); - - EXMC_SDTCFG(EXMC_SDRAM_DEVICE0) = sdtcfg0; - EXMC_SDTCFG(EXMC_SDRAM_DEVICE1) = sdtcfg1; - } -} - -/*! - \brief initialize exmc_sdram_struct_command_para_init with the default values - \param[in] none - \param[out] the initialized struct exmc_sdram_struct_command_para_init pointer - \retval none -*/ -void exmc_sdram_struct_command_para_init(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct) -{ - /* configure the structure with default value */ - exmc_sdram_command_init_struct->mode_register_content = 0U; - exmc_sdram_command_init_struct->auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK; - exmc_sdram_command_init_struct->bank_select = EXMC_SDRAM_DEVICE0_SELECT; - exmc_sdram_command_init_struct->command = EXMC_SDRAM_NORMAL_OPERATION; -} - -/*! - \brief deinitialize exmc SQPIPSRAM - \param[in] none - \param[out] none - \retval none -*/ -void exmc_sqpipsram_deinit(void) -{ - /* reset the registers */ - EXMC_SINIT = BANK0_SQPI_SINIT_RESET; - EXMC_SRCMD = BANK0_SQPI_SRCMD_RESET; - EXMC_SWCMD = BANK0_SQPI_SWCMD_RESET; - EXMC_SIDL = BANK0_SQPI_SIDL_RESET; - EXMC_SIDH = BANK0_SQPI_SIDH_RESET; -} - -/*! - \brief initialize exmc_sqpipsram_parameter_struct with the default values - \param[in] none - \param[out] the struct exmc_sqpipsram_parameter_struct pointer - \retval none -*/ -void exmc_sqpipsram_struct_para_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct) -{ - /* configure the structure with default values */ - exmc_sqpipsram_init_struct->sample_polarity = EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE; - exmc_sqpipsram_init_struct->id_length = EXMC_SQPIPSRAM_ID_LENGTH_64B; - exmc_sqpipsram_init_struct->address_bits = EXMC_SQPIPSRAM_ADDR_LENGTH_24B; - exmc_sqpipsram_init_struct->command_bits = EXMC_SQPIPSRAM_COMMAND_LENGTH_8B; -} - -/*! - \brief initialize EXMC SQPIPSRAM - \param[in] exmc_sqpipsram_init_struct: configure the EXMC SQPIPSRAM parameter - sample_polarity: EXMC_SQPIPSRAM_SAMPLE_RISING_EDGE,EXMC_SQPIPSRAM_SAMPLE_FALLING_EDGE - id_length: EXMC_SQPIPSRAM_ID_LENGTH_xB,x=8,16,32,64 - address_bits: EXMC_SQPIPSRAM_ADDR_LENGTH_xB,x=1..26 - command_bits: EXMC_SQPIPSRAM_COMMAND_LENGTH_xB,x=4,8,16 - \param[out] none - \retval none -*/ -void exmc_sqpipsram_init(exmc_sqpipsram_parameter_struct *exmc_sqpipsram_init_struct) -{ - /* initialize SQPI controller */ - EXMC_SINIT = (uint32_t)exmc_sqpipsram_init_struct->sample_polarity | - exmc_sqpipsram_init_struct->id_length | - exmc_sqpipsram_init_struct->address_bits | - exmc_sqpipsram_init_struct->command_bits; -} - -/*! - \brief configure consecutive clock - \param[in] clock_mode: specify when the clock is generated - only one parameter can be selected which is shown as below: - \arg EXMC_CLOCK_SYN_MODE: the clock is generated only during synchronous access - \arg EXMC_CLOCK_UNCONDITIONALLY: the clock is generated unconditionally - \param[out] none - \retval none -*/ -void exmc_norsram_consecutive_clock_config(uint32_t clock_mode) -{ - if(EXMC_CLOCK_UNCONDITIONALLY == clock_mode) { - EXMC_SNCTL(EXMC_BANK0_NORSRAM_REGION0) |= EXMC_CLOCK_UNCONDITIONALLY; - } else { - EXMC_SNCTL(EXMC_BANK0_NORSRAM_REGION0) &= ~EXMC_CLOCK_UNCONDITIONALLY; - } -} - -/*! - \brief configure CRAM page size - \param[in] exmc_norsram_region: select the region of bank0 - only one parameter can be selected which is shown as below: - \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) - \param[in] page_size: CRAM page size - only one parameter can be selected which is shown as below: - \arg EXMC_CRAM_AUTO_SPLIT: the clock is generated only during synchronous access - \arg EXMC_CRAM_PAGE_SIZE_128_BYTES: page size is 128 bytes - \arg EXMC_CRAM_PAGE_SIZE_256_BYTES: page size is 256 bytes - \arg EXMC_CRAM_PAGE_SIZE_512_BYTES: page size is 512 bytes - \arg EXMC_CRAM_PAGE_SIZE_1024_BYTES: page size is 1024 bytes - \param[out] none - \retval none -*/ -void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size) -{ - /* reset the bits */ - EXMC_SNCTL(exmc_norsram_region) &= ~EXMC_SNCTL_CPS; - - /* set the CPS bits */ - EXMC_SNCTL(exmc_norsram_region) |= page_size; -} - -/*! - \brief enable or disable the EXMC NAND ECC function - \param[in] exmc_nand_bank: specify the NAND bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANKx_NAND(x=1,2) - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - /* enable the selected NAND bank ECC function */ - EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_ECCEN; - } else { - /* disable the selected NAND bank ECC function */ - EXMC_NPCTL(exmc_nand_bank) &= ~EXMC_NPCTL_ECCEN; - } -} - -/*! - \brief get the EXMC ECC value - \param[in] exmc_nand_bank: specify the NAND bank - only one parameter can be selected which is shown as below: - \arg EXMC_BANKx_NAND(x=1,2) - \param[out] none - \retval the error correction code(ECC) value -*/ -uint32_t exmc_ecc_get(uint32_t exmc_nand_bank) -{ - return(EXMC_NECC(exmc_nand_bank)); -} - -/*! - \brief enable or disable read sample - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void exmc_sdram_readsample_enable(ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - EXMC_SDRSCTL |= EXMC_SDRSCTL_RSEN; - } else { - EXMC_SDRSCTL &= (uint32_t)(~EXMC_SDRSCTL_RSEN); - } -} - -/*! - \brief configure the delayed sample clock of read data - \param[in] delay_cell: SDRAM the delayed sample clock of read data - only one parameter can be selected which is shown as below: - \arg EXMC_SDRAM_x_DELAY_CELL(x=0..15) - \param[in] extra_hclk: sample cycle of read data - only one parameter can be selected which is shown as below: - \arg EXMC_SDRAM_READSAMPLE_x_EXTRAHCLK(x=0,1) - \param[out] none - \retval none -*/ -void exmc_sdram_readsample_config(uint32_t delay_cell, uint32_t extra_hclk) -{ - uint32_t sdrsctl = 0U; - - /* reset the bits */ - sdrsctl = EXMC_SDRSCTL & (~(EXMC_SDRSCTL_SDSC | EXMC_SDRSCTL_SSCR)); - /* set the bits */ - sdrsctl |= (uint32_t)(delay_cell | extra_hclk); - EXMC_SDRSCTL = sdrsctl; -} - -/*! - \brief configure the SDRAM memory command - \param[in] exmc_sdram_command_init_struct: initialize EXMC SDRAM command - mode_register_content: - auto_refresh_number: EXMC_SDRAM_AUTO_REFLESH_x_SDCLK, x=1..15 - bank_select: EXMC_SDRAM_DEVICE0_SELECT, EXMC_SDRAM_DEVICE1_SELECT, EXMC_SDRAM_DEVICE0_1_SELECT - command: EXMC_SDRAM_NORMAL_OPERATION, EXMC_SDRAM_CLOCK_ENABLE, EXMC_SDRAM_PRECHARGE_ALL, - EXMC_SDRAM_AUTO_REFRESH, EXMC_SDRAM_LOAD_MODE_REGISTER, EXMC_SDRAM_SELF_REFRESH, - EXMC_SDRAM_POWERDOWN_ENTRY - \param[out] none - \retval none -*/ -void exmc_sdram_command_config(exmc_sdram_command_parameter_struct *exmc_sdram_command_init_struct) -{ - /* configure command register */ - EXMC_SDCMD = (uint32_t)((exmc_sdram_command_init_struct->command) | - (exmc_sdram_command_init_struct->bank_select) | - ((exmc_sdram_command_init_struct->auto_refresh_number)) | - ((exmc_sdram_command_init_struct->mode_register_content) << SDCMD_MRC_OFFSET)); -} - -/*! - \brief set auto-refresh interval - \param[in] exmc_count: the number SDRAM clock cycles unit between two successive auto-refresh commands, 0x0000~0x1FFF - \param[out] none - \retval none -*/ -void exmc_sdram_refresh_count_set(uint32_t exmc_count) -{ - uint32_t sdari; - sdari = EXMC_SDARI & (~EXMC_SDARI_ARINTV); - EXMC_SDARI = sdari | (uint32_t)((exmc_count << SDARI_ARINTV_OFFSET) & EXMC_SDARI_ARINTV); -} - -/*! - \brief set the number of successive auto-refresh command - \param[in] exmc_number: the number of successive Auto-refresh cycles will be send, 1~15 - \param[out] none - \retval none -*/ -void exmc_sdram_autorefresh_number_set(uint32_t exmc_number) -{ - uint32_t sdcmd; - sdcmd = EXMC_SDCMD & (~EXMC_SDCMD_NARF); - EXMC_SDCMD = sdcmd | (uint32_t)((exmc_number << SDCMD_NARF_OFFSET) & EXMC_SDCMD_NARF) ; -} - -/*! - \brief configure the write protection function - \param[in] exmc_sdram_device: specify the SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_SDRAM_DEVICEx(x=0,1) - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void exmc_sdram_write_protection_config(uint32_t exmc_sdram_device, ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - EXMC_SDCTL(exmc_sdram_device) |= (uint32_t)EXMC_SDCTL_WPEN; - } else { - EXMC_SDCTL(exmc_sdram_device) &= ~((uint32_t)EXMC_SDCTL_WPEN); - } -} - -/*! - \brief get the status of SDRAM device0 or device1 - \param[in] exmc_sdram_device: specify the SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_SDRAM_DEVICEx(x=0,1) - \param[out] none - \retval the status of SDRAM device -*/ -uint32_t exmc_sdram_bankstatus_get(uint32_t exmc_sdram_device) -{ - uint32_t sdstat = 0U; - - if(EXMC_SDRAM_DEVICE0 == exmc_sdram_device) { - sdstat = ((uint32_t)(EXMC_SDSTAT & EXMC_SDSDAT_STA0) >> SDSTAT_STA0_OFFSET); - } else { - sdstat = ((uint32_t)(EXMC_SDSTAT & EXMC_SDSDAT_STA1) >> SDSTAT_STA1_OFFSET); - } - - return sdstat; -} - -/*! - \brief set the read command - \param[in] read_command_mode: configure SPI PSRAM read command mode - only one parameter can be selected which is shown as below: - \arg EXMC_SQPIPSRAM_READ_MODE_DISABLE: not SPI mode - \arg EXMC_SQPIPSRAM_READ_MODE_SPI: SPI mode - \arg EXMC_SQPIPSRAM_READ_MODE_SQPI: SQPI mode - \arg EXMC_SQPIPSRAM_READ_MODE_QPI: QPI mode - \param[in] read_wait_cycle: wait cycle number after address phase,0..15 - \param[in] read_command_code: read command for AHB read transfer - \param[out] none - \retval none -*/ -void exmc_sqpipsram_read_command_set(uint32_t read_command_mode, uint32_t read_wait_cycle, uint32_t read_command_code) -{ - uint32_t srcmd; - - srcmd = (uint32_t) read_command_mode | - ((read_wait_cycle << SRCMD_RWAITCYCLE_OFFSET) & EXMC_SRCMD_RWAITCYCLE) | - ((read_command_code & EXMC_SRCMD_RCMD)); - EXMC_SRCMD = srcmd; -} - -/*! - \brief set the write command - \param[in] write_command_mode: configure SPI PSRAM write command mode - only one parameter can be selected which is shown as below: - \arg EXMC_SQPIPSRAM_WRITE_MODE_DISABLE: not SPI mode - \arg EXMC_SQPIPSRAM_WRITE_MODE_SPI: SPI mode - \arg EXMC_SQPIPSRAM_WRITE_MODE_SQPI: SQPI mode - \arg EXMC_SQPIPSRAM_WRITE_MODE_QPI: QPI mode - \param[in] write_wait_cycle: wait cycle number after address phase,0..15 - \param[in] write_command_code: read command for AHB read transfer - \param[out] none - \retval none -*/ -void exmc_sqpipsram_write_command_set(uint32_t write_command_mode, uint32_t write_wait_cycle, uint32_t write_command_code) -{ - uint32_t swcmd; - - swcmd = (uint32_t) write_command_mode | - ((write_wait_cycle << SWCMD_WWAITCYCLE_OFFSET) & EXMC_SWCMD_WWAITCYCLE) | - ((write_command_code & EXMC_SWCMD_WCMD)); - EXMC_SWCMD = swcmd; -} - -/*! - \brief send SPI read ID command - \param[in] none - \param[out] none - \retval none -*/ -void exmc_sqpipsram_read_id_command_send(void) -{ - EXMC_SRCMD |= EXMC_SRCMD_RDID; -} - -/*! - \brief send SPI special command which does not have address and data phase - \param[in] none - \param[out] none - \retval none -*/ -void exmc_sqpipsram_write_cmd_send(void) -{ - EXMC_SWCMD |= EXMC_SWCMD_SC; -} - -/*! - \brief get the EXMC SPI ID low data - \param[in] none - \param[out] none - \retval the ID low data -*/ -uint32_t exmc_sqpipsram_low_id_get(void) -{ - return (EXMC_SIDL); -} - -/*! - \brief get the EXMC SPI ID high data - \param[in] none - \param[out] none - \retval the ID high data -*/ -uint32_t exmc_sqpipsram_high_id_get(void) -{ - return (EXMC_SIDH); -} - -/*! - \brief get the bit value of EXMC send write command bit or read ID command - \param[in] send_command_flag: the send command flag - only one parameter can be selected which is shown as below: - \arg EXMC_SEND_COMMAND_FLAG_RDID: EXMC_SRCMD_RDID flag bit - \arg EXMC_SEND_COMMAND_FLAG_SC: EXMC_SWCMD_SC flag bit - \param[out] none - \retval the new value of send command flag -*/ -FlagStatus exmc_sqpipsram_send_command_state_get(uint32_t send_command_flag) -{ - uint32_t flag = 0x00000000U; - - if(EXMC_SEND_COMMAND_FLAG_RDID == send_command_flag) { - flag = EXMC_SRCMD; - } else if(EXMC_SEND_COMMAND_FLAG_SC == send_command_flag) { - flag = EXMC_SWCMD; - } else { - } - - if(flag & send_command_flag) { - /* flag is set */ - return SET; - } else { - /* flag is reset */ - return RESET; - } -} - -/*! - \brief enable EXMC interrupt - \param[in] exmc_bank: specify the NAND bank,PC card bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] interrupt: specify EXMC interrupt flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag - \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag - \param[out] none - \retval none -*/ -void exmc_interrupt_enable(uint32_t exmc_bank, uint32_t interrupt) -{ - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1,bank2 or PC card bank3 */ - EXMC_NPINTEN(exmc_bank) |= interrupt; - } else { - /* SDRAM device0 or device1 */ - EXMC_SDARI |= EXMC_SDARI_REIE; - } -} - -/*! - \brief disable EXMC interrupt - \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] interrupt: specify EXMC interrupt flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag - \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag - \param[out] none - \retval none -*/ -void exmc_interrupt_disable(uint32_t exmc_bank, uint32_t interrupt) -{ - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1,bank2 or PC card bank3 */ - EXMC_NPINTEN(exmc_bank) &= ~interrupt; - } else { - /* SDRAM device0 or device1 */ - EXMC_SDARI &= ~EXMC_SDARI_REIE; - } -} - -/*! - \brief get EXMC flag status - \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC Card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] flag: EXMC status and flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status - \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status - \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status - \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag - \arg EXMC_SDRAM_FLAG_REFRESH: refresh error interrupt flag - \arg EXMC_SDRAM_FLAG_NREADY: not ready status - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus exmc_flag_get(uint32_t exmc_bank, uint32_t flag) -{ - uint32_t status = 0x00000000U; - - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1,bank2 or PC card bank3 */ - status = EXMC_NPINTEN(exmc_bank); - } else { - /* SDRAM device0 or device1 */ - status = EXMC_SDSTAT; - } - - if((status & flag) != (uint32_t)flag) { - /* flag is reset */ - return RESET; - } else { - /* flag is set */ - return SET; - } -} - -/*! - \brief clear EXMC flag status - \param[in] exmc_bank: specify the NAND bank , PCCARD bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] flag: EXMC status and flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status - \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status - \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status - \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag - \arg EXMC_SDRAM_FLAG_REFRESH: refresh error interrupt flag - \arg EXMC_SDRAM_FLAG_NREADY: not ready status - \param[out] none - \retval none -*/ -void exmc_flag_clear(uint32_t exmc_bank, uint32_t flag) -{ - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1,bank2 or PC card bank3 */ - EXMC_NPINTEN(exmc_bank) &= ~flag; - } else { - /* SDRAM device0 or device1 */ - EXMC_SDSTAT &= ~flag; - } -} - -/*! - \brief get EXMC interrupt flag - \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] int_flag: EXMC interrupt flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag - \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank, uint32_t int_flag) -{ - uint32_t status = 0x00000000U, interrupt_enable = 0x00000000U, interrupt_state = 0x00000000U; - - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1,bank2 or PC card bank3 */ - status = EXMC_NPINTEN(exmc_bank); - interrupt_state = (status & (int_flag >> INTEN_INTS_OFFSET)); - } else { - /* SDRAM device0 or device1 */ - status = EXMC_SDARI; - interrupt_state = (EXMC_SDSTAT & EXMC_SDSDAT_REIF); - } - - interrupt_enable = (status & int_flag); - - if((interrupt_enable) && (interrupt_state)) { - /* interrupt flag is set */ - return SET; - } else { - /* interrupt flag is reset */ - return RESET; - } -} - -/*! - \brief clear EXMC interrupt flag - \param[in] exmc_bank: specify the NAND bank , PC card bank or SDRAM device - only one parameter can be selected which is shown as below: - \arg EXMC_BANK1_NAND: the NAND bank1 - \arg EXMC_BANK2_NAND: the NAND bank2 - \arg EXMC_BANK3_PCCARD: the PC card bank - \arg EXMC_SDRAM_DEVICE0: the SDRAM device0 - \arg EXMC_SDRAM_DEVICE1: the SDRAM device1 - \param[in] int_flag: EXMC interrupt flag - only one parameter can be selected which is shown as below: - \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag - \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag - \arg EXMC_SDRAM_INT_FLAG_REFRESH: refresh error interrupt and flag - \param[out] none - \retval none -*/ -void exmc_interrupt_flag_clear(uint32_t exmc_bank, uint32_t int_flag) -{ - if((EXMC_BANK1_NAND == exmc_bank) || (EXMC_BANK2_NAND == exmc_bank) || (EXMC_BANK3_PCCARD == exmc_bank)) { - /* NAND bank1, bank2 or PC card bank3 */ - EXMC_NPINTEN(exmc_bank) &= ~(int_flag >> INTEN_INTS_OFFSET); - } else { - /* SDRAM device0 or device1 */ - EXMC_SDARI |= EXMC_SDARI_REC; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c deleted file mode 100644 index 7407e1d79fa..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c +++ /dev/null @@ -1,251 +0,0 @@ -/*! - \file gd32f5xx_exti.c - \brief EXTI driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_exti.h" - -#define EXTI_REG_RESET_VALUE ((uint32_t)0x00000000U) - -/*! - \brief deinitialize the EXTI - \param[in] none - \param[out] none - \retval none -*/ -void exti_deinit(void) -{ - /* reset the value of all the EXTI registers */ - EXTI_INTEN = EXTI_REG_RESET_VALUE; - EXTI_EVEN = EXTI_REG_RESET_VALUE; - EXTI_RTEN = EXTI_REG_RESET_VALUE; - EXTI_FTEN = EXTI_REG_RESET_VALUE; - EXTI_SWIEV = EXTI_REG_RESET_VALUE; -} - -/*! - \brief initialize the EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[in] mode: interrupt or event mode, refer to exti_mode_enum - only one parameter can be selected which is shown as below: - \arg EXTI_INTERRUPT: interrupt mode - \arg EXTI_EVENT: event mode - \param[in] trig_type: interrupt trigger type, refer to exti_trig_type_enum - only one parameter can be selected which is shown as below: - \arg EXTI_TRIG_RISING: rising edge trigger - \arg EXTI_TRIG_FALLING: falling trigger - \arg EXTI_TRIG_BOTH: rising and falling trigger - \arg EXTI_TRIG_NONE: without rising edge or falling edge trigger - \param[out] none - \retval none -*/ -void exti_init(exti_line_enum linex, \ - exti_mode_enum mode, \ - exti_trig_type_enum trig_type) -{ - /* reset the EXTI line x */ - EXTI_INTEN &= ~(uint32_t)linex; - EXTI_EVEN &= ~(uint32_t)linex; - EXTI_RTEN &= ~(uint32_t)linex; - EXTI_FTEN &= ~(uint32_t)linex; - - /* set the EXTI mode and enable the interrupts or events from EXTI line x */ - switch(mode) { - case EXTI_INTERRUPT: - EXTI_INTEN |= (uint32_t)linex; - break; - case EXTI_EVENT: - EXTI_EVEN |= (uint32_t)linex; - break; - default: - break; - } - - /* set the EXTI trigger type */ - switch(trig_type) { - case EXTI_TRIG_RISING: - EXTI_RTEN |= (uint32_t)linex; - EXTI_FTEN &= ~(uint32_t)linex; - break; - case EXTI_TRIG_FALLING: - EXTI_RTEN &= ~(uint32_t)linex; - EXTI_FTEN |= (uint32_t)linex; - break; - case EXTI_TRIG_BOTH: - EXTI_RTEN |= (uint32_t)linex; - EXTI_FTEN |= (uint32_t)linex; - break; - case EXTI_TRIG_NONE: - default: - break; - } -} - -/*! - \brief enable the interrupts from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_interrupt_enable(exti_line_enum linex) -{ - EXTI_INTEN |= (uint32_t)linex; -} - -/*! - \brief disable the interrupt from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_interrupt_disable(exti_line_enum linex) -{ - EXTI_INTEN &= ~(uint32_t)linex; -} - -/*! - \brief enable the events from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_event_enable(exti_line_enum linex) -{ - EXTI_EVEN |= (uint32_t)linex; -} - -/*! - \brief disable the events from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_event_disable(exti_line_enum linex) -{ - EXTI_EVEN &= ~(uint32_t)linex; -} - -/*! - \brief enable the software interrupt event from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_software_interrupt_enable(exti_line_enum linex) -{ - EXTI_SWIEV |= (uint32_t)linex; -} - -/*! - \brief disable the software interrupt event from EXTI line x - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_software_interrupt_disable(exti_line_enum linex) -{ - EXTI_SWIEV &= ~(uint32_t)linex; -} - -/*! - \brief get EXTI line x interrupt pending flag - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval FlagStatus: status of flag (RESET or SET) -*/ -FlagStatus exti_flag_get(exti_line_enum linex) -{ - if(RESET != (EXTI_PD & (uint32_t)linex)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear EXTI line x interrupt pending flag - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_flag_clear(exti_line_enum linex) -{ - EXTI_PD = (uint32_t)linex; -} - -/*! - \brief get EXTI line x interrupt pending flag - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval FlagStatus: status of flag (RESET or SET) -*/ -FlagStatus exti_interrupt_flag_get(exti_line_enum linex) -{ - if(RESET != (EXTI_PD & (uint32_t)linex)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear EXTI line x interrupt pending flag - \param[in] linex: EXTI line number, refer to exti_line_enum - only one parameter can be selected which is shown as below: - \arg EXTI_x (x=0..25): EXTI line x - \param[out] none - \retval none -*/ -void exti_interrupt_flag_clear(exti_line_enum linex) -{ - EXTI_PD = (uint32_t)linex; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c deleted file mode 100644 index ab52f5bf06a..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c +++ /dev/null @@ -1,1592 +0,0 @@ -/*! - \file gd32f5xx_fmc.c - \brief FMC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#include "gd32f5xx_fmc.h" - -/* write protection/CBUS read protection sector mask */ -#define WP0_DRP_LOW_12BITS_MASK ((uint64_t)0x0000000000000FFFU) -#define WP0_DRP_HIGH_8BITS_MASK ((uint64_t)0x00000000000FF000U) -#define WP1_DRP_LOW_12BITS_MASK ((uint64_t)0x00000000FFF00000U) -#define WP1_DRP_HIGH_8BITS_MASK ((uint64_t)0x000000FF00000000U) - -/* write protection/CBUS read protection sector offset */ -#define WP0_DRP_LOW_12BITS_OFFSET ((uint32_t)0x00000000U) -#define WP0_DRP_HIGH_8BITS_OFFSET ((uint32_t)0x0000000CU) -#define WP1_DRP_LOW_12BITS_OFFSET ((uint32_t)0x00000014U) -#define WP1_DRP_HIGH_8BITS_OFFSET ((uint32_t)0x00000020U) - -/* FMC register bit offset */ -#define OBCTL0_WP0_L_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of WP0[11:0] in OBCTL1 */ -#define OBCTL1_WP0_H_OFFSET ((uint32_t)0x00000000U) /*!< bit offset of WP0[19:12] in OBCTL1 */ -#define OBCTL1_WP1_L_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of WP1[11:0] in OBCTL1 */ -#define OBCTL1_WP1_H_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of WP1[19:12] in OBCTL1 */ - -/* EFUSE register bit offset */ -#define EFUSE_ADDR_EFSIZE_OFFSET ((uint32_t)(0x00000008U)) /*!< EFSIZE OFFSET in register EFUSE_ADDR */ - - -/*! - \brief unlock the main FMC operation - \param[in] none - \param[out] none - \retval none -*/ -void fmc_unlock(void) -{ - if((RESET != (FMC_CTL & FMC_CTL_LK))) { - /* write the FMC key */ - FMC_KEY = UNLOCK_KEY0; - FMC_KEY = UNLOCK_KEY1; - } -} - -/*! - \brief lock the main FMC operation - \param[in] none - \param[out] none - \retval none -*/ -void fmc_lock(void) -{ - /* set the LK bit*/ - FMC_CTL |= FMC_CTL_LK; -} - -/*! - \brief FMC erase page - \param[in] page_addr: the page address to be erased. - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_page_erase(uint32_t page_addr) -{ - fmc_state_enum fmc_state = FMC_READY; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - /* unlock page erase operation */ - FMC_PEKEY = UNLOCK_PE_KEY; - - /* start page erase */ - FMC_PECFG = FMC_PECFG_PE_EN | page_addr; - FMC_CTL |= FMC_CTL_SER; - FMC_CTL |= FMC_CTL_START; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - FMC_PECFG &= ~FMC_PECFG_PE_EN; - FMC_CTL &= ~FMC_CTL_SER; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief FMC erase sector - \param[in] fmc_sector: select the sector to erase - only one parameter can be selected which is shown as below: - \arg CTL_SECTOR_NUMBER_x: sector x(x = 0,1,2...53) - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_sector_erase(uint32_t fmc_sector) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - /* start sector erase */ - FMC_CTL &= ~FMC_CTL_SER; - FMC_CTL &= ~(FMC_CTL_SN | FMC_CTL_SN_5); - FMC_CTL |= FMC_CTL_SER | fmc_sector; - FMC_CTL |= FMC_CTL_START; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the SER bit */ - FMC_CTL &= ~FMC_CTL_SER; - FMC_CTL &= ~(FMC_CTL_SN | FMC_CTL_SN_5); - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief FMC erase whole chip - \param[in] none - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_mass_erase(void) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - /* start whole chip erase */ - FMC_CTL |= (FMC_CTL_MER0 | FMC_CTL_MER1); - FMC_CTL |= FMC_CTL_START; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the MER bits */ - FMC_CTL &= ~(FMC_CTL_MER0 | FMC_CTL_MER1); - } - - /* return the fmc state */ - return fmc_state; -} - -/*! - \brief FMC erase whole bank0 - \param[in] none - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_bank0_erase(void) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - /* start FMC bank0 erase */ - FMC_CTL |= FMC_CTL_MER0; - FMC_CTL |= FMC_CTL_START; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the MER0 bit */ - FMC_CTL &= (~FMC_CTL_MER0); - } - - /* return the fmc state */ - return fmc_state; -} - -/*! - \brief FMC erase whole bank1(include bank1_ex) - \param[in] none - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_bank1_erase(void) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - /* start FMC bank1 erase */ - FMC_CTL |= FMC_CTL_MER1; - FMC_CTL |= FMC_CTL_START; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the MER1 bit */ - FMC_CTL &= (~FMC_CTL_MER1); - } - - /* return the fmc state */ - return fmc_state; -} - -/*! - \brief program a doubleword at the corresponding address - \param[in] address: address to program - \param[in] data: doubleword to program(0x0000000000000000 - 0xFFFFFFFFFFFFFFFF) - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_doubleword_program(uint32_t address, uint64_t data) -{ - fmc_state_enum fmc_state = FMC_READY; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - FMC_CTL |= FMC_CTL_DWPGE; - - /* set the PG bit to start program */ - FMC_CTL |= FMC_CTL_PG; - - REG32(address) = (uint32_t)(data & 0xFFFFFFFFU); - REG32(address + 4U) = (uint32_t)((data >> 32U) & 0xFFFFFFFFU); - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the PG bit */ - FMC_CTL &= ~FMC_CTL_PG; - /* reset the DWPGE bit */ - FMC_CTL &= ~FMC_CTL_DWPGE; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief program a word at the corresponding address - \param[in] address: address to program - \param[in] data: word to program(0x00000000 - 0xFFFFFFFF) - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_word_program(uint32_t address, uint32_t data) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - FMC_CTL &= ~FMC_CTL_DWPGE; - FMC_CTL &= ~FMC_CTL_PSZ; - FMC_CTL |= CTL_PSZ_WORD; - - /* set the PG bit to start program */ - FMC_CTL |= FMC_CTL_PG; - - REG32(address) = data; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the PG bit */ - FMC_CTL &= ~FMC_CTL_PG; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief program a half word at the corresponding address - \param[in] address: address to program - \param[in] data: halfword to program(0x0000 - 0xFFFF) - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - FMC_CTL &= ~FMC_CTL_DWPGE; - FMC_CTL &= ~FMC_CTL_PSZ; - FMC_CTL |= CTL_PSZ_HALF_WORD; - - /* set the PG bit to start program */ - FMC_CTL |= FMC_CTL_PG; - - REG16(address) = data; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the PG bit */ - FMC_CTL &= ~FMC_CTL_PG; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief program a byte at the corresponding address - \param[in] address: address to program - \param[in] data: byte to program(0x00 - 0xFF) - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_byte_program(uint32_t address, uint8_t data) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - FMC_CTL &= ~FMC_CTL_DWPGE; - FMC_CTL &= ~FMC_CTL_PSZ; - FMC_CTL |= CTL_PSZ_BYTE; - - /* set the PG bit to start program */ - FMC_CTL |= FMC_CTL_PG; - - REG8(address) = data; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - /* reset the PG bit */ - FMC_CTL &= ~FMC_CTL_PG; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief enable no waiting time area load after system reset - \param[in] none - \param[out] none - \retval none -*/ -void fmc_nwa_enable(void) -{ - FMC_CTL |= FMC_CTL_NWLDE; -} - -/*! - \brief disable no waiting time area load after system reset - \param[in] none - \param[out] none - \retval none -*/ -void fmc_nwa_disable(void) -{ - FMC_CTL &= ~FMC_CTL_NWLDE; -} - -/*! - \brief set OTP1 data block not be read - \param[in] block: specify OTP1 data block x not be read - one or more parameters can be selected which are shown as below: - \arg OTP1_DATA_BLOCK_x: data blcok x(x = 0,1,2...15) - \arg OTP1_DATA_BLOCK_ALL: all data blcok - \param[out] none - \retval none -*/ -void otp1_read_disable(uint32_t block) -{ - FMC_OTP1CFG &= ~block; -} - -/*! - \brief enable read lock block protection for OTP2 - \param[in] none - \param[out] none - \retval none -*/ -void otp2_rlock_enable(void) -{ - FMC_CTL |= FMC_CTL_RLBP; -} - -/*! - \brief unlock the option byte operation - \param[in] none - \param[out] none - \retval none -*/ -void ob_unlock(void) -{ - if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_OB_LK)) { - /* write the FMC key */ - FMC_OBKEY = OB_UNLOCK_KEY0; - FMC_OBKEY = OB_UNLOCK_KEY1; - } -} - -/*! - \brief lock the option byte operation - \param[in] none - \param[out] none - \retval none -*/ -void ob_lock(void) -{ - /* reset the OB_LK bit */ - FMC_OBCTL0 |= FMC_OBCTL0_OB_LK; -} - -/*! - \brief send option byte change command - \param[in] none - \param[out] none - \retval none -*/ -void ob_start(void) -{ - /* set the OB_START bit in OBCTL0 register */ - FMC_OBCTL0 |= FMC_OBCTL0_OB_START; -} - -/*! - \brief erase option byte - \param[in] none - \param[out] none - \retval none -*/ -void ob_erase(void) -{ - uint32_t reg, reg1; - fmc_state_enum fmc_state = FMC_READY; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - reg = FMC_OBCTL0; - reg1 = FMC_OBCTL1; - - if(FMC_READY == fmc_state) { - /* reset the OB_FWDGT, OB_DEEPSLEEP and OB_STDBY, set according to ob_fwdgt, ob_deepsleep and ob_stdby */ - reg |= (FMC_OBCTL0_NWDG_HW | FMC_OBCTL0_NRST_DPSLP | FMC_OBCTL0_NRST_STDBY); - /* reset the BOR level */ - reg |= FMC_OBCTL0_BOR_TH; - /* reset option byte boot bank value */ - reg &= ~FMC_OBCTL0_BB; - /* set option byte eccen value */ - reg |= FMC_OBCTL0_ECCEN; - /* reset drp and wp value */ - reg |= FMC_OBCTL0_WP0; - reg &= (~FMC_OBCTL0_DRP); - /* set option byte nwa value */ - reg |= FMC_OBCTL0_NWA; - FMC_OBCTL0 = reg; - - reg1 |= FMC_OBCTL1_WP0_H | FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H; - FMC_OBCTL1 = reg1; - } -} - -/*! - \brief enable write protection - \param[in] ob_wp: specify sector to be write protected - one or more parameters can be selected which are shown as below: - \arg OB_WP_x(x=0..38):sector x(x = 0,1,2...38) - \arg OB_WP_39_53: sector39~53 - \arg OB_WP_ALL: all sector - \param[out] none - \retval SUCCESS or ERROR -*/ -ErrStatus ob_write_protection_enable(uint64_t ob_wp) -{ - uint32_t reg0 = FMC_OBCTL0; - uint32_t reg1 = FMC_OBCTL1; - uint32_t wp0_low; - uint32_t wp0_high; - uint32_t wp1_low; - uint32_t wp1_high; - fmc_state_enum fmc_state = FMC_READY; - - if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_DRP)) { - return ERROR; - } - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - wp0_low = (uint32_t)(((ob_wp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); - wp0_high = (uint32_t)(((ob_wp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); - wp1_low = (uint32_t)(((ob_wp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); - wp1_high = (uint32_t)(((ob_wp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); - - reg0 &= ~wp0_low; - reg1 &= ~(wp0_high | wp1_low | wp1_high); - FMC_OBCTL0 = reg0; - FMC_OBCTL1 = reg1; - - return SUCCESS; - } else { - return ERROR; - } -} - -/*! - \brief disable write protection - \param[in] ob_wp: specify sector to be write protected - one or more parameters can be selected which are shown as below: - \arg OB_WP_x(x=0..38): sector x(x = 0,1,2...38) - \arg OB_WP_39_53: sector39~53 - \arg OB_WP_ALL: all sector - \param[out] none - \retval SUCCESS or ERROR -*/ -ErrStatus ob_write_protection_disable(uint64_t ob_wp) -{ - uint32_t reg0 = FMC_OBCTL0; - uint32_t reg1 = FMC_OBCTL1; - uint32_t wp0_low; - uint32_t wp0_high; - uint32_t wp1_low; - uint32_t wp1_high; - fmc_state_enum fmc_state = FMC_READY; - - if(RESET != (FMC_OBCTL0 & FMC_OBCTL0_DRP)) { - return ERROR; - } - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - wp0_low = (uint32_t)(((ob_wp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); - wp0_high = (uint32_t)(((ob_wp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); - wp1_low = (uint32_t)(((ob_wp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); - wp1_high = (uint32_t)(((ob_wp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); - - reg0 |= wp0_low; - reg1 |= wp0_high | wp1_low | wp1_high; - - FMC_OBCTL0 = reg0; - FMC_OBCTL1 = reg1; - - return SUCCESS; - } else { - return ERROR; - } -} - -/*! - \brief enable erase/program protection and CBUS read protection - \param[in] ob_drp: enable the WPx bits used as erase/program protection and CBUS read protection of each sector - one or more parameters can be selected which are shown as below: - \arg OB_DRP_x(x=0..38): sector x(x = 0,1,2...38) - \arg OB_DRP_39_53: sector39~53 - \arg OB_DRP_ALL: all sector - \param[out] none - \retval none -*/ -void ob_drp_enable(uint64_t ob_drp) -{ - uint32_t reg0 = FMC_OBCTL0; - uint32_t reg1 = FMC_OBCTL1; - fmc_state_enum fmc_state = FMC_READY; - uint32_t drp_state = FMC_OBCTL0 & FMC_OBCTL0_DRP; - uint32_t drp0_low; - uint32_t drp0_high; - uint32_t drp1_low; - uint32_t drp1_high; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - if(RESET == drp_state) { - reg0 &= ~FMC_OBCTL0_WP0; - reg1 &= ~(FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H | FMC_OBCTL1_WP0_H); - } - - drp0_low = (uint32_t)(((ob_drp & WP0_DRP_LOW_12BITS_MASK) >> WP0_DRP_LOW_12BITS_OFFSET) << OBCTL0_WP0_L_OFFSET); - drp0_high = (uint32_t)(((ob_drp & WP0_DRP_HIGH_8BITS_MASK) >> WP0_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP0_H_OFFSET); - drp1_low = (uint32_t)(((ob_drp & WP1_DRP_LOW_12BITS_MASK) >> WP1_DRP_LOW_12BITS_OFFSET) << OBCTL1_WP1_L_OFFSET); - drp1_high = (uint32_t)(((ob_drp & WP1_DRP_HIGH_8BITS_MASK) >> WP1_DRP_HIGH_8BITS_OFFSET) << OBCTL1_WP1_H_OFFSET); - - reg0 |= drp0_low; - reg0 |= FMC_OBCTL0_DRP; - reg1 |= drp0_high | drp1_low | drp1_high; - - FMC_OBCTL0 = reg0; - FMC_OBCTL1 = reg1; - } -} - -/*! - \brief disable all erase/program protection and CBUS read protection - \param[in] none - \param[out] none - \retval none -*/ -void ob_drp_disable(void) -{ - uint32_t reg0 = FMC_OBCTL0; - uint32_t reg1 = FMC_OBCTL1; - fmc_state_enum fmc_state = FMC_READY; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - if(((uint8_t)(reg0 >> 8U)) == (uint8_t)FMC_NSPC) { - /* security protection should be set as low level protection before disable CBUS read protection */ - reg0 &= ~FMC_OBCTL0_SPC; - reg0 |= ((uint32_t)FMC_LSPC << 8U); - FMC_OBCTL0 = reg0; - - /* set the OB_START bit in OBCTL0 register */ - FMC_OBCTL0 |= FMC_OBCTL0_OB_START; - } - - /* it is necessary to disable the security protection at the same time when CBUS read protection is disabled */ - reg0 &= ~FMC_OBCTL0_SPC; - reg0 |= ((uint32_t)FMC_NSPC << 8U); - reg0 |= FMC_OBCTL0_WP0; - reg0 &= (~FMC_OBCTL0_DRP); - FMC_OBCTL0 = reg0; - - reg1 |= FMC_OBCTL1_WP0_H | FMC_OBCTL1_WP1_L | FMC_OBCTL1_WP1_H; - FMC_OBCTL1 = reg1; - } -} - -/*! - \brief configure security protection level - \param[in] ob_spc: specify security protection level - only one parameter can be selected which is shown as below: - \arg FMC_NSPC: no security protection - \arg FMC_LSPC: low security protection - \arg FMC_HSPC: high security protection - \param[out] none - \retval none -*/ -void ob_security_protection_config(uint8_t ob_spc) -{ - fmc_state_enum fmc_state = FMC_READY; - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - uint32_t reg; - - reg = FMC_OBCTL0; - /* reset the OBCTL0_SPC, set according to ob_spc */ - reg &= ~FMC_OBCTL0_SPC; - reg |= ((uint32_t)ob_spc << 8U); - FMC_OBCTL0 = reg; - } -} - -/*! - \brief program the FMC user option byte - \param[in] ob_fwdgt: option byte watchdog value - only one parameter can be selected which is shown as below: - \arg OB_FWDGT_SW: software free watchdog - \arg OB_FWDGT_HW: hardware free watchdog - \param[in] ob_deepsleep: option byte deepsleep reset value - only one parameter can be selected which is shown as below: - \arg OB_DEEPSLEEP_NRST: no reset when entering deepsleep mode - \arg OB_DEEPSLEEP_RST: generate a reset instead of entering deepsleep mode - \param[in] ob_stdby:option byte standby reset value - only one parameter can be selected which is shown as below: - \arg OB_STDBY_NRST: no reset when entering standby mode - \arg OB_STDBY_RST: generate a reset instead of entering standby mode - \param[out] none - \retval none -*/ -void ob_user_write(uint32_t ob_fwdgt, uint32_t ob_deepsleep, uint32_t ob_stdby) -{ - fmc_state_enum fmc_state = FMC_READY; - - /* wait for the FMC ready */ - fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); - - if(FMC_READY == fmc_state) { - uint32_t reg; - - reg = FMC_OBCTL0; - /* reset the OB_FWDGT, OB_DEEPSLEEP and OB_STDBY, set according to ob_fwdgt ,ob_deepsleep and ob_stdby */ - reg &= ~(FMC_OBCTL0_NWDG_HW | FMC_OBCTL0_NRST_DPSLP | FMC_OBCTL0_NRST_STDBY); - FMC_OBCTL0 = (reg | ob_fwdgt | ob_deepsleep | ob_stdby); - } -} - -/*! - \brief program the option byte BOR threshold value - \param[in] ob_bor_th: user option byte - only one parameter can be selected which is shown as below: - \arg OB_BOR_TH_VALUE3: BOR threshold value 3 - \arg OB_BOR_TH_VALUE2: BOR threshold value 2 - \arg OB_BOR_TH_VALUE1: BOR threshold value 1 - \arg OB_BOR_TH_OFF: no BOR function - \param[out] none - \retval none -*/ -void ob_user_bor_threshold(uint32_t ob_bor_th) -{ - uint32_t reg; - - reg = FMC_OBCTL0; - /* set the BOR level */ - reg &= ~FMC_OBCTL0_BOR_TH; - FMC_OBCTL0 = (reg | ob_bor_th); -} - -/*! - \brief configure the option byte boot bank value - \param[in] boot_mode: specifies the option byte boot bank value - only one parameter can be selected which is shown as below: - \arg OB_BB_DISABLE: boot from bank0 - \arg OB_BB_ENABLE: boot from bank1 or bank0 if bank1 is void - \param[out] none - \retval none -*/ -void ob_boot_mode_config(uint32_t boot_mode) -{ - uint32_t reg; - - reg = FMC_OBCTL0; - - /* set option byte boot bank value */ - reg &= ~FMC_OBCTL0_BB; - FMC_OBCTL0 = (reg | boot_mode); -} - -/*! - \brief configure FMC/SRAM ECC checking, only valid after power reset. - \param[in] ecc_config: specifies the option byte FMC/SRAM ECC checking - only one parameter can be selected which is shown as below: - \arg OB_ECC_DISABLE: disable FMC/SRAM ECC checking - \arg OB_ECC_ENABLE: enable FMC/SRAM ECC checking - \param[out] none - \retval none -*/ -void ob_ecc_config(uint32_t ecc_config) -{ - uint32_t reg; - - reg = FMC_OBCTL0; - - /* set option byte boot bank value */ - reg &= ~FMC_OBCTL0_ECCEN; - FMC_OBCTL0 = (reg | ecc_config); -} - -/*! - \brief select no waiting time area, only valid after power reset, only for 4MB dual bank series. - \param[in] nwa_select: specifies the option byte no waiting time area - only one parameter can be selected which is shown as below: - \arg OB_NWA_BANK1: bank1 is no waiting time area - \arg OB_NWA_BANK0: bank0 is no waiting time area - \param[out] none - \retval none -*/ -void ob_nwa_select(uint32_t nwa_select) -{ - uint32_t reg; - - reg = FMC_OBCTL0; - - /* set option byte boot bank value */ - reg &= ~FMC_OBCTL0_NWA; - FMC_OBCTL0 = (reg | nwa_select); -} - -/*! - \brief get the FMC user option byte - \param[in] none - \param[out] none - \retval the FMC user option byte values: ob_fwdgt(Bit0), ob_deepsleep(Bit1), ob_stdby(Bit2) -*/ -uint8_t ob_user_get(void) -{ - return (uint8_t)((uint8_t)(FMC_OBCTL0 >> 5U) & 0x07U); -} - -/*! - \brief get the FMC option byte write protection of bank0 - \param[in] none - \param[out] none - \retval the FMC write protection option byte value -*/ -uint32_t ob_write_protection0_get(void) -{ - uint32_t wp0_value; - - wp0_value = (uint32_t)(((uint32_t)(FMC_OBCTL0 & FMC_OBCTL0_WP0)) >> OBCTL0_WP0_L_OFFSET); - wp0_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP0_H)) >> OBCTL1_WP0_H_OFFSET) << 12U); - - return wp0_value; -} - -/*! - \brief get the FMC option byte write protection of bank1 - \param[in] none - \param[out] none - \retval the FMC write protection option byte value -*/ -uint32_t ob_write_protection1_get(void) -{ - uint32_t wp1_value; - - wp1_value = (uint32_t)(((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_L)) >> OBCTL1_WP1_L_OFFSET); - wp1_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_H)) >> OBCTL1_WP1_H_OFFSET) << 12U); - - return wp1_value; -} - -/*! - \brief get the FMC erase/program protection and CBUS read protection option bytes value of bank0 - \param[in] none - \param[out] none - \retval the FMC erase/program protection and CBUS read protection option bytes value -*/ -uint32_t ob_drp0_get(void) -{ - uint32_t drp0_value; - - /* return the FMC erase/program protection and CBUS read protection option bytes value */ - if(FMC_OBCTL0 & FMC_OBCTL0_DRP) { - drp0_value = (uint32_t)(((uint32_t)(FMC_OBCTL0 & FMC_OBCTL0_WP0)) >> OBCTL0_WP0_L_OFFSET); - drp0_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP0_H)) >> OBCTL1_WP0_H_OFFSET) << 12U); - } else { - drp0_value = 0U; - } - return drp0_value; -} - -/*! - \brief get the FMC erase/program protection and CBUS read protection option bytes value of bank1 - \param[in] none - \param[out] none - \retval the FMC erase/program protection and CBUS read protection option bytes value -*/ -uint32_t ob_drp1_get(void) -{ - uint32_t drp1_value; - - /* return the FMC erase/program protection and CBUS read protection option bytes value */ - if(FMC_OBCTL0 & FMC_OBCTL0_DRP) { - drp1_value = (uint32_t)(((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_L)) >> OBCTL1_WP1_L_OFFSET); - drp1_value |= (uint32_t)((((uint32_t)(FMC_OBCTL1 & FMC_OBCTL1_WP1_H)) >> OBCTL1_WP1_H_OFFSET) << 12U); - } else { - drp1_value = 0U; - } - return drp1_value; -} - -/*! - \brief get option byte security protection code value - \param[in] none - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus ob_spc_get(void) -{ - FlagStatus spc_state = RESET; - - if(((uint8_t)(FMC_OBCTL0 >> 8U)) != FMC_NSPC) { - spc_state = SET; - } else { - spc_state = RESET; - } - return spc_state; -} - -/*! - \brief get the FMC option byte BOR threshold value - \param[in] none - \param[out] none - \retval the FMC BOR threshold value:OB_BOR_TH_OFF,OB_BOR_TH_VALUE1,OB_BOR_TH_VALUE2,OB_BOR_TH_VALUE3 -*/ -uint32_t ob_user_bor_threshold_get(void) -{ - /* return the FMC BOR threshold value */ - return (FMC_OBCTL0 & FMC_OBCTL0_BOR_TH); -} - -/*! - \brief get the boot mode - \param[in] none - \param[out] none - \retval the FMC boot bank value:OB_BB_DISABLE,OB_BB_ENABLE -*/ -uint32_t ob_boot_mode_get(void) -{ - /* return the boot mode */ - return (FMC_OBCTL0 & FMC_OBCTL0_BB); -} - -/*! - \brief get FMC/SRAM ECC checking - \param[in] none - \param[out] none - \retval the FMC ECCEN value:OB_ECC_DISABLE,OB_ECC_ENABLE -*/ -uint32_t ob_ecc_get(void) -{ - /* return the FMC/SRAM ECC checking */ - return (FMC_OBCTL0 & FMC_OBCTL0_ECCEN); -} - -/*! - \brief get no waiting time area - \param[in] none - \param[out] none - \retval the no waiting time area:OB_NWA_BANK1,OB_NWA_BANK0 -*/ -uint32_t ob_nwa_get(void) -{ - /* return the no waiting time area */ - return (FMC_OBCTL0 & FMC_OBCTL0_NWA); -} - -/*! - \brief get flag set or reset - \param[in] fmc_flag: check FMC flag - only one parameter can be selected which is shown as below: - \arg FMC_FLAG_END: FMC end of operation flag bit - \arg FMC_FLAG_OPERR: FMC operation error flag bit - \arg FMC_FLAG_LDECCDET: FMC multi bit ECC error when load code from flash flag bit - \arg FMC_FLAG_WPERR: FMC Erase/Program protection error flag bit - \arg FMC_FLAG_PGAERR: FMC program alignment error flag bit - \arg FMC_FLAG_PGMERR: FMC program size not match error flag bit - \arg FMC_FLAG_PGSERR: FMC program sequence error flag bit - \arg FMC_FLAG_RDCERR: FMC CBUS data read protection error flag bit - \arg FMC_FLAG_BUSY: FMC busy flag bit - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus fmc_flag_get(uint32_t fmc_flag) -{ - if(FMC_STAT & fmc_flag) { - return SET; - } - /* return the state of corresponding FMC flag */ - return RESET; -} - -/*! - \brief clear the FMC pending flag - \param[in] FMC_flag: clear FMC flag - only one parameter can be selected which is shown as below: - \arg FMC_FLAG_END: FMC end of operation flag bit - \arg FMC_FLAG_OPERR: FMC operation error flag bit - \arg FMC_FLAG_LDECCDET: FMC multi bit ECC error when load code from flash flag bit - \arg FMC_FLAG_WPERR: FMC Erase/Program protection error flag bit - \arg FMC_FLAG_PGAERR: FMC program alignment error flag bit - \arg FMC_FLAG_PGMERR: FMC program size not match error flag bit - \arg FMC_FLAG_PGSERR: FMC program sequence error flag bit - \arg FMC_FLAG_RDCERR: FMC CBUS data read protection error flag bit - \arg FMC_FLAG_BUSY: FMC busy flag bit - \param[out] none - \retval none -*/ -void fmc_flag_clear(uint32_t fmc_flag) -{ - /* clear the flags */ - FMC_STAT = fmc_flag; -} - -/*! - \brief enable FMC interrupt - \param[in] fmc_int: the FMC interrupt source - only one parameter can be selected which is shown as below: - \arg FMC_INT_END: enable FMC end of program interrupt - \arg FMC_INT_ERR: enable FMC error interrupt - \arg FMC_INT_LDECC: enable FMC load code ECC error interrupt - \param[out] none - \retval none -*/ -void fmc_interrupt_enable(uint32_t fmc_int) -{ - FMC_CTL |= fmc_int; -} - -/*! - \brief disable FMC interrupt - \param[in] fmc_int: the FMC interrupt source - only one parameter can be selected which is shown as below: - \arg FMC_INT_END: disable FMC end of program interrupt - \arg FMC_INT_ERR: disable FMC error interrupt - \arg FMC_INT_LDECC: enable FMC load code ECC error interrupt - \param[out] none - \retval none -*/ -void fmc_interrupt_disable(uint32_t fmc_int) -{ - FMC_CTL &= ~fmc_int; -} - -/*! - \brief get FMC interrupt flag set or reset - \param[in] fmc_int_flag: FMC interrupt flag - only one parameter can be selected which is shown as below: - \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag - \arg FMC_INT_FLAG_OPERR: FMC operation error interrupt flag - \arg FMC_INT_FLAG_LDECCDET: FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag - \arg FMC_INT_FLAG_WPERR: FMC Erase/Program protection error interrupt flag - \arg FMC_INT_FLAG_PGAERR: FMC program alignment error interrupt flag - \arg FMC_INT_FLAG_PGMERR: FMC program size not match error interrupt flag - \arg FMC_INT_FLAG_PGSERR: FMC program sequence error interrupt flag - \arg FMC_INT_FLAG_RDCERR: FMC CBUS data read protection error interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus fmc_interrupt_flag_get(uint32_t fmc_int_flag) -{ - if(FMC_FLAG_END == fmc_int_flag) { - /* end of operation interrupt flag */ - if(FMC_CTL & FMC_CTL_ENDIE) { - if(FMC_STAT & fmc_int_flag) { - return SET; - } - } - } else { - /* error interrupt flags */ - if(FMC_CTL & FMC_CTL_ERRIE) { - if(FMC_STAT & fmc_int_flag) { - return SET; - } - } - } - return RESET; -} - -/*! - \brief clear the FMC interrupt flag - \param[in] fmc_int_flag: FMC interrupt flag - only one parameter can be selected which is shown as below: - \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag - \arg FMC_INT_FLAG_OPERR: FMC operation error interrupt flag - \arg FMC_INT_FLAG_LDECCDET: FMC two bits ECC error when load code from flash/OTP1/bootloader interrupt flag - \arg FMC_INT_FLAG_WPERR: FMC Erase/Program protection error interrupt flag - \arg FMC_INT_FLAG_PGAERR: FMC program alignment error interrupt flag - \arg FMC_INT_FLAG_PGMERR: FMC program size not match error interrupt flag - \arg FMC_INT_FLAG_PGSERR: FMC program sequence error interrupt flag - \arg FMC_INT_FLAG_RDCERR: FMC CBUS data read protection error interrupt flag - \param[out] none - \retval none -*/ -void fmc_interrupt_flag_clear(uint32_t fmc_int_flag) -{ - /* clear the interrupt flag */ - FMC_STAT = fmc_int_flag; -} - -/*! - \brief get the FMC state - \param[in] none - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader -*/ -fmc_state_enum fmc_state_get(void) -{ - fmc_state_enum fmc_state = FMC_READY; - uint32_t temp_val = FMC_STAT; - - if(RESET != (temp_val & FMC_FLAG_BUSY)) { - fmc_state = FMC_BUSY; - } else if(RESET != (temp_val & FMC_FLAG_RDCERR)) { - fmc_state = FMC_RDCERR; - } else if(RESET != (temp_val & FMC_FLAG_PGSERR)) { - fmc_state = FMC_PGSERR; - } else if(RESET != (temp_val & FMC_FLAG_PGMERR)) { - fmc_state = FMC_PGMERR; - } else if(RESET != (temp_val & FMC_FLAG_PGAERR)) { - fmc_state = FMC_PGAERR; - } else if(RESET != (temp_val & FMC_FLAG_WPERR)) { - fmc_state = FMC_WPERR; - } else if(RESET != (temp_val & FMC_FLAG_OPERR)) { - fmc_state = FMC_OPERR; - } else if(RESET != (temp_val & FMC_FLAG_LDECCDET)) { - fmc_state = FMC_LDECCDET; - } else { - fmc_state = FMC_READY; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief check whether FMC is ready or not - \param[in] timeout: timeout value - \param[out] none - \retval state of FMC - \arg FMC_READY: the operation has been completed - \arg FMC_BUSY: the operation is in progress - \arg FMC_RDCERR: CBUS data read protection error - \arg FMC_PGSERR: program sequence error - \arg FMC_PGMERR: program size not match error - \arg FMC_PGAERR: program alignment error - \arg FMC_WPERR: erase/program protection error - \arg FMC_OPERR: operation error - \arg FMC_LDECCDET: two bits ECC error when load code from flash/OTP1/bootloader - \arg FMC_TOERR: timeout error -*/ -fmc_state_enum fmc_ready_wait(uint32_t timeout) -{ - fmc_state_enum fmc_state = FMC_BUSY; - - /* wait for FMC ready */ - do { - /* get FMC state */ - fmc_state = fmc_state_get(); - timeout--; - } while((FMC_BUSY == fmc_state) && (0U != timeout)); - - if(0U == timeout) { - fmc_state = FMC_TOERR; - } - - /* return the FMC state */ - return fmc_state; -} - -/*! - \brief unlock the EFUSE_CTL register - \param[in] none - \param[out] none - \retval none -*/ -void efuse_ctrl_unlock(void) -{ - /* clear the LK bit */ - EFUSE_CTL &= ~EFUSE_CTL_LK; -} - -/*! - \brief lock the EFUSE_CTL register - \param[in] none - \param[out] none - \retval none -*/ -void efuse_ctrl_lock(void) -{ - /* set the LK bit */ - EFUSE_CTL |= EFUSE_CTL_LK; -} - -/*! - \brief unlock the EFUSE_USER_DATA register - \param[in] none - \param[out] none - \retval none -*/ -void efuse_user_data_unlock(void) -{ - /* clear the UDLK bit */ - EFUSE_CTL &= ~EFUSE_CTL_UDLK; -} - -/*! - \brief lock the EFUSE_USER_DATA register - \param[in] none - \param[out] none - \retval none -*/ -void efuse_user_data_lock(void) -{ - /* set the UDLK bit */ - EFUSE_CTL |= EFUSE_CTL_UDLK; -} - -/*! - \brief read EFUSE value - \param[in] ef_addr: EFUSE address - \arg EFUSE_CTL_EFADDR: efuse controladdress - \arg USER_DATA_EFADDR: user data address - \param[in] size: byte count to read - \param[out] buf: the buffer for storing read-out EFUSE data - \retval state of EFUSE: - \arg EFUSE_READY: EFUSE operation has been completed - \arg EFUSE_BUSY: EFUSE operation is in progress - \arg EFUSE_OBER: overstep boundary error - \arg EFUSE_TOERR: EFUSE timeout error -*/ -efuse_state_enum efuse_read(uint32_t ef_addr, uint32_t size, uint32_t buf[]) -{ - uint32_t reg_addr = 0U; - efuse_state_enum efuse_state = EFUSE_READY; - - if(1U != size) { - return EFUSE_OBER; - } - - if(EFUSE_CTL_EFADDR == ef_addr) { - /* read efuse control*/ - reg_addr = (uint32_t)(FMC + EFUSE_CTL_OFFSET); - } else if(USER_DATA_EFADDR == ef_addr) { - /* read user data */ - reg_addr = (uint32_t)(FMC + EFUSE_USER_DATA_OFFSET); - } else { - return EFUSE_OBER; - } - - /* clear the RDIF bit if it is SET */ - efuse_flag_clear(EFUSE_RDIC); - - /* make sure no overstep boundary errors */ - if(RESET != efuse_flag_get(EFUSE_OBERIF)) { - return EFUSE_OBER; - } - - /* EFUSE read operation */ - EFUSE_CS &= (~EFUSE_CS_EFRW); - - /* write the desired efuse address and size to the EFUSE_ADDR register */ - EFUSE_ADDR = (uint32_t)((1U << EFUSE_ADDR_EFSIZE_OFFSET) | ef_addr); - - /* start read EFUSE operation */ - EFUSE_CS |= EFUSE_CS_EFSTR; - - /* wait for the operation to complete */ - efuse_state = efuse_ready_wait(EFUSE_RDIF, EFUSE_TIMEOUT_COUNT); - if(EFUSE_READY == efuse_state) { - /* read EFUSE data to buffer */ - buf[0] = REG32(reg_addr); - } - - return efuse_state; -} - -/*! - \brief write EFUSE - \param[in] ef_addr: EFUSE address - \arg EFUSE_CTL_EFADDR: efuse controladdress - \arg USER_DATA_EFADDR: user data address - \param[in] size: byte count to write, (1~1) - \param[in] ef_data: data to write EFUSE - \param[out] none - \retval state of EFUSE: - \arg EFUSE_READY: EFUSE operation has been completed - \arg EFUSE_BUSY: EFUSE operation is in progress - \arg EFUSE_OBER: overstep boundary error - \arg EFUSE_TOERR: EFUSE timeout error -*/ -efuse_state_enum efuse_write(uint32_t ef_addr, uint32_t size, uint8_t ef_data) -{ - uint32_t reg_addr = 0U; - efuse_state_enum efuse_state; - - if(1U != size) { - return EFUSE_OBER; - } - - if(EFUSE_CTL_EFADDR == ef_addr) { - /* program efuse control*/ - reg_addr = (uint32_t)(FMC + EFUSE_CTL_OFFSET); - } else if(USER_DATA_EFADDR == ef_addr) { - /* program user data */ - reg_addr = (uint32_t)(FMC + EFUSE_USER_DATA_OFFSET); - } else { - return EFUSE_OBER; - } - - /* clear the PGIF bit if it is SET */ - efuse_flag_clear(EFUSE_PGIC); - - /* make sure no overstep boundary errors */ - if(RESET != efuse_flag_get(EFUSE_OBERIF)) { - return EFUSE_OBER; - } - - /* EFUSE write operation */ - EFUSE_CS |= EFUSE_CS_EFRW; - - /* write the desired efuse address and size to the EFUSE_ADDR register */ - EFUSE_ADDR = (uint32_t)((size << EFUSE_ADDR_EFSIZE_OFFSET) | ef_addr); - - REG32(reg_addr) = (uint32_t)ef_data; - - /* start array write EFUSE operation */ - EFUSE_CS |= EFUSE_CS_EFSTR; - - /* wait for the operation to complete */ - efuse_state = efuse_ready_wait(EFUSE_PGIF, EFUSE_TIMEOUT_COUNT); - - return efuse_state; -} - -/*! - \brief write control data parameter - \param[in] ef_data: EFUSE data to write - \param[out] none - \retval state of EFUSE: - \arg EFUSE_READY: EFUSE operation has been completed - \arg EFUSE_BUSY: EFUSE operation is in progress - \arg EFUSE_OBER: overstep boundary error - \arg EFUSE_TOERR: EFUSE timeout error -*/ -efuse_state_enum efuse_control_write(uint8_t ef_data) -{ - return efuse_write(EFUSE_CTL_EFADDR, 1UL, ef_data); -} - -/*! - \brief write user data parameter - \param[in] ef_data: EFUSE data to write - \param[out] none - \retval state of EFUSE: - \arg EFUSE_READY: EFUSE operation has been completed - \arg EFUSE_BUSY: EFUSE operation is in progress - \arg EFUSE_OBER: overstep boundary error - \arg EFUSE_TOERR: EFUSE timeout error -*/ -efuse_state_enum efuse_user_data_write(uint8_t ef_data) -{ - return efuse_write(USER_DATA_EFADDR, 1UL, ef_data); -} - -/*! - \brief get EFUSE flag is set or not - \param[in] efuse_flag: specifies to get a flag - only one parameter can be selected which is shown as below: - \arg EFUSE_PGIF: programming operation completion flag - \arg EFUSE_RDIF: read operation completion flag - \arg EFUSE_OBERIF: overstep boundary error flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus efuse_flag_get(uint32_t efuse_flag) -{ - if(EFUSE_CS & efuse_flag) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear EFUSE pending flag - \param[in] flag: specifies to clear a flag - only one parameter can be selected which is shown as below: - \arg EFUSE_PGIC: clear programming operation completion flag - \arg EFUSE_RDIC: clear read operation completion flag - \arg EFUSE_OBERIC: clear overstep boundary error flag - \param[out] none - \retval none -*/ -void efuse_flag_clear(uint32_t efuse_cflag) -{ - EFUSE_CS |= efuse_cflag; -} - -/*! - \brief enable EFUSE interrupt - \param[in] source: specifies an interrupt to enable - one or more parameters can be selected which are shown as below: - \arg EFUSE_INT_PG: programming operation completion interrupt - \arg EFUSE_INT_RD: read operation completion interrupt - \arg EFUSE_INT_OBER: overstep boundary error interrupt - \param[out] none - \retval none -*/ -void efuse_interrupt_enable(uint32_t source) -{ - EFUSE_CS = source; -} - -/*! - \brief disable EFUSE interrupt - \param[in] source: specifies an interrupt to disable - one or more parameters can be selected which are shown as below: - \arg EFUSE_INT_PG: programming operation completion interrupt - \arg EFUSE_INT_RD: read operation completion interrupt - \arg EFUSE_INT_OBER: overstep boundary error interrupt - \param[out] none - \retval none -*/ -void efuse_interrupt_disable(uint32_t source) -{ - EFUSE_CS &= ~source; -} - -/*! - \brief get EFUSE interrupt flag is set or not - \param[in] efuse_flag: specifies to get a flag - only one parameter can be selected which is shown as below: - \arg EFUSE_INT_PGIF: programming operation completion interrupt flag - \arg EFUSE_INT_RDIF: read operation completion interrupt flag - \arg EFUSE_INT_OBERIF: overstep boundary error interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus efuse_interrupt_flag_get(uint32_t int_flag) -{ - if(EFUSE_CS & int_flag) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear EFUSE pending interrupt flag - \param[in] efuse_flag: specifies to clear a flag - only one parameter can be selected which is shown as below: - \arg EFUSE_INT_PGIC: clear programming operation completion interrupt flag - \arg EFUSE_INT_RDIC: clear operation completion interrupt flag - \arg EFUSE_INT_OBERIC: clear overstep boundary error interrupt flag - \param[out] none - \retval none -*/ -void efuse_interrupt_flag_clear(uint32_t int_cflag) -{ - EFUSE_CS |= int_cflag; -} - -/*! - \brief check whether EFUSE is ready or not - \param[in] efuse_flag: specifies to get a flag - only one parameter can be selected which is shown as below: - \arg EFUSE_PGIF: programming operation completion flag - \arg EFUSE_RDIF: read operation completion flag - \arg EFUSE_OBERIF: overstep boundary error flag - \param[in] timeout: timeout value - \param[out] none - \retval state of EFUSE - \arg EFUSE_READY: EFUSE operation has been completed - \arg EFUSE_BUSY: EFUSE operation is in progress - \arg EFUSE_OBER: overstep boundary error - \arg EFUSE_TOERR: EFUSE timeout error -*/ -efuse_state_enum efuse_ready_wait(uint32_t efuse_flag, uint32_t timeout) -{ - efuse_state_enum efuse_state = EFUSE_BUSY; - - /* wait for EFUSE ready */ - do { - /* get EFUSE flag set or not */ - if(EFUSE_CS & (uint32_t)efuse_flag) { - efuse_state = EFUSE_READY; - } else if(EFUSE_CS & EFUSE_CS_OVBERIF) { - efuse_state = EFUSE_OBER; - } else { - - } - timeout--; - } while((EFUSE_BUSY == efuse_state) && (0U != timeout)); - - if(EFUSE_BUSY == efuse_state) { - efuse_state = EFUSE_TOERR; - } - - /* return the EFUSE state */ - return efuse_state; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c deleted file mode 100644 index 773e693f8fb..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c +++ /dev/null @@ -1,229 +0,0 @@ -/*! - \file gd32f5xx_fwdgt.c - \brief FWDGT driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_fwdgt.h" - -/*! - \brief enable write access to FWDGT_PSC and FWDGT_RLD - \param[in] none - \param[out] none - \retval none -*/ -void fwdgt_write_enable(void) -{ - FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; -} - -/*! - \brief disable write access to FWDGT_PSC and FWDGT_RLD - \param[in] none - \param[out] none - \retval none -*/ -void fwdgt_write_disable(void) -{ - FWDGT_CTL = FWDGT_WRITEACCESS_DISABLE; -} - -/*! - \brief start the free watchdog timer counter - \param[in] none - \param[out] none - \retval none -*/ -void fwdgt_enable(void) -{ - FWDGT_CTL = FWDGT_KEY_ENABLE; -} - -/*! - \brief configure the free watchdog timer counter prescaler value - \param[in] prescaler_value: specify prescaler value - only one parameter can be selected which is shown as below: - \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 - \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 - \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 - \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 - \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 - \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 - \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 - \arg FWDGT_PSC_DIV512: FWDGT prescaler set to 512 - \arg FWDGT_PSC_DIV1024: FWDGT prescaler set to 1024 - \arg FWDGT_PSC_DIV2048: FWDGT prescaler set to 2048 - \arg FWDGT_PSC_DIV4096: FWDGT prescaler set to 4096 - \arg FWDGT_PSC_DIV8192: FWDGT prescaler set to 8192 - \arg FWDGT_PSC_DIV16384: FWDGT prescaler set to 16384 - \arg FWDGT_PSC_DIV32768: FWDGT prescaler set to 32768 - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus fwdgt_prescaler_value_config(uint16_t prescaler_value) -{ - uint32_t timeout = FWDGT_PSC_TIMEOUT; - uint32_t flag_status = RESET; - - /* enable write access to FWDGT_PSC */ - FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; - - /* wait until the PUD flag to be reset */ - do { - flag_status = FWDGT_STAT & FWDGT_STAT_PUD; - } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); - - if((uint32_t)RESET != flag_status) { - return ERROR; - } - - /* configure FWDGT */ - FWDGT_PSC = (uint32_t)prescaler_value; - - return SUCCESS; -} - -/*! - \brief configure the free watchdog timer counter reload value - \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus fwdgt_reload_value_config(uint16_t reload_value) -{ - uint32_t timeout = FWDGT_RLD_TIMEOUT; - uint32_t flag_status = RESET; - - /* enable write access to FWDGT_RLD */ - FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; - - /* wait until the RUD flag to be reset */ - do { - flag_status = FWDGT_STAT & FWDGT_STAT_RUD; - } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); - - if((uint32_t)RESET != flag_status) { - return ERROR; - } - - FWDGT_RLD = RLD_RLD(reload_value); - - return SUCCESS; -} - -/*! - \brief reload the counter of FWDGT - \param[in] none - \param[out] none - \retval none -*/ -void fwdgt_counter_reload(void) -{ - FWDGT_CTL = FWDGT_KEY_RELOAD; -} - -/*! - \brief configure counter reload value, and prescaler divider value - \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) - \param[in] prescaler_div: FWDGT prescaler value - only one parameter can be selected which is shown as below: - \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 - \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 - \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 - \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 - \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 - \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 - \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 - \arg FWDGT_PSC_DIV512 : FWDGT prescaler set to 512 - \arg FWDGT_PSC_DIV1024 : FWDGT prescaler set to 1024 - \arg FWDGT_PSC_DIV2048 : FWDGT prescaler set to 2048 - \arg FWDGT_PSC_DIV4096 : FWDGT prescaler set to 4096 - \arg FWDGT_PSC_DIV8192 : FWDGT prescaler set to 8192 - \arg FWDGT_PSC_DIV16384 : FWDGT prescaler set to 16384 - \arg FWDGT_PSC_DIV32768 : FWDGT prescaler set to 32768 - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div) -{ - uint32_t timeout = FWDGT_PSC_TIMEOUT; - uint32_t flag_status = RESET; - - /* enable write access to FWDGT_PSC,and FWDGT_RLD */ - FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; - - /* wait until the PUD flag to be reset */ - do { - flag_status = FWDGT_STAT & FWDGT_STAT_PUD; - } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); - - if((uint32_t)RESET != flag_status) { - return ERROR; - } - - /* configure FWDGT */ - FWDGT_PSC = (uint32_t)prescaler_div; - - timeout = FWDGT_RLD_TIMEOUT; - /* wait until the RUD flag to be reset */ - do { - flag_status = FWDGT_STAT & FWDGT_STAT_RUD; - } while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); - - if((uint32_t)RESET != flag_status) { - return ERROR; - } - - FWDGT_RLD = RLD_RLD(reload_value); - - /* reload the counter */ - FWDGT_CTL = FWDGT_KEY_RELOAD; - - return SUCCESS; -} - -/*! - \brief get flag state of FWDGT - \param[in] flag: flag to get - only one parameter can be selected which is shown as below: - \arg FWDGT_STAT_PUD: a write operation to FWDGT_PSC register is on going - \arg FWDGT_STAT_RUD: a write operation to FWDGT_RLD register is on going - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus fwdgt_flag_get(uint16_t flag) -{ - if(RESET != (FWDGT_STAT & flag)) { - return SET; - } - - return RESET; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c deleted file mode 100644 index 368a37d0435..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c +++ /dev/null @@ -1,431 +0,0 @@ -/*! - \file gd32f5xx_gpio.c - \brief GPIO driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_gpio.h" - -/*! - \brief reset GPIO port - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[out] none - \retval none -*/ -void gpio_deinit(uint32_t gpio_periph) -{ - switch(gpio_periph) { - case GPIOA: - /* reset GPIOA */ - rcu_periph_reset_enable(RCU_GPIOARST); - rcu_periph_reset_disable(RCU_GPIOARST); - break; - case GPIOB: - /* reset GPIOB */ - rcu_periph_reset_enable(RCU_GPIOBRST); - rcu_periph_reset_disable(RCU_GPIOBRST); - break; - case GPIOC: - /* reset GPIOC */ - rcu_periph_reset_enable(RCU_GPIOCRST); - rcu_periph_reset_disable(RCU_GPIOCRST); - break; - case GPIOD: - /* reset GPIOD */ - rcu_periph_reset_enable(RCU_GPIODRST); - rcu_periph_reset_disable(RCU_GPIODRST); - break; - case GPIOE: - /* reset GPIOE */ - rcu_periph_reset_enable(RCU_GPIOERST); - rcu_periph_reset_disable(RCU_GPIOERST); - break; - case GPIOF: - /* reset GPIOF */ - rcu_periph_reset_enable(RCU_GPIOFRST); - rcu_periph_reset_disable(RCU_GPIOFRST); - break; - case GPIOG: - /* reset GPIOG */ - rcu_periph_reset_enable(RCU_GPIOGRST); - rcu_periph_reset_disable(RCU_GPIOGRST); - break; - case GPIOH: - /* reset GPIOH */ - rcu_periph_reset_enable(RCU_GPIOHRST); - rcu_periph_reset_disable(RCU_GPIOHRST); - break; - case GPIOI: - /* reset GPIOI */ - rcu_periph_reset_enable(RCU_GPIOIRST); - rcu_periph_reset_disable(RCU_GPIOIRST); - break; - default: - break; - } -} - -/*! - \brief set GPIO mode - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] mode: GPIO pin mode - \arg GPIO_MODE_INPUT: input mode - \arg GPIO_MODE_OUTPUT: output mode - \arg GPIO_MODE_AF: alternate function mode - \arg GPIO_MODE_ANALOG: analog mode - \param[in] pull_up_down: GPIO pin with pull-up or pull-down resistor - \arg GPIO_PUPD_NONE: floating mode, no pull-up and pull-down resistors - \arg GPIO_PUPD_PULLUP: with pull-up resistor - \arg GPIO_PUPD_PULLDOWN:with pull-down resistor - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) -{ - uint16_t i; - uint32_t ctl, pupd; - - ctl = GPIO_CTL(gpio_periph); - pupd = GPIO_PUD(gpio_periph); - - for(i = 0U; i < 16U; i++) { - if((1U << i) & pin) { - /* clear the specified pin mode bits */ - ctl &= ~GPIO_MODE_MASK(i); - /* set the specified pin mode bits */ - ctl |= GPIO_MODE_SET(i, mode); - - /* clear the specified pin pupd bits */ - pupd &= ~GPIO_PUPD_MASK(i); - /* set the specified pin pupd bits */ - pupd |= GPIO_PUPD_SET(i, pull_up_down); - } - } - - GPIO_CTL(gpio_periph) = ctl; - GPIO_PUD(gpio_periph) = pupd; -} - -/*! - \brief set GPIO output type and speed - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] otype: GPIO pin output mode - \arg GPIO_OTYPE_PP: push pull mode - \arg GPIO_OTYPE_OD: open drain mode - \param[in] speed: GPIO pin output max speed - \arg GPIO_OSPEED_2MHZ: output max speed 2MHz - \arg GPIO_OSPEED_10MHZ: output max speed 10MHz - \arg GPIO_OSPEED_50MHZ: output max speed 50MHz - \arg GPIO_OSPEED_MAX: output max speed more than 50MHz - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin) -{ - uint16_t i; - uint32_t ospeedr; - - if(GPIO_OTYPE_OD == otype) { - GPIO_OMODE(gpio_periph) |= (uint32_t)pin; - } else { - GPIO_OMODE(gpio_periph) &= (uint32_t)(~pin); - } - - /* get the specified pin output speed bits value */ - ospeedr = GPIO_OSPD(gpio_periph); - - for(i = 0U; i < 16U; i++) { - if((1U << i) & pin) { - /* clear the specified pin output speed bits */ - ospeedr &= ~GPIO_OSPEED_MASK(i); - /* set the specified pin output speed bits */ - ospeedr |= GPIO_OSPEED_SET(i, speed); - } - } - GPIO_OSPD(gpio_periph) = ospeedr; -} - -/*! - \brief set GPIO pin bit - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) -{ - GPIO_BOP(gpio_periph) = (uint32_t)pin; -} - -/*! - \brief reset GPIO pin bit - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) -{ - GPIO_BC(gpio_periph) = (uint32_t)pin; -} - -/*! - \brief write data to the specified GPIO pin - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[in] bit_value: SET or RESET - \arg RESET: clear the port pin - \arg SET: set the port pin - \param[out] none - \retval none -*/ -void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) -{ - if(RESET != bit_value) { - GPIO_BOP(gpio_periph) = (uint32_t)pin; - } else { - GPIO_BC(gpio_periph) = (uint32_t)pin; - } -} - -/*! - \brief write data to the specified GPIO port - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] data: specify the value to be written to the port output control register - \param[out] none - \retval none -*/ -void gpio_port_write(uint32_t gpio_periph, uint16_t data) -{ - GPIO_OCTL(gpio_periph) = (uint32_t)data; -} - -/*! - \brief get GPIO pin input status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval input status of GPIO pin: SET or RESET -*/ -FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin) -{ - if((uint32_t)RESET != (GPIO_ISTAT(gpio_periph) & (pin))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief get GPIO all pins input status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[out] none - \retval input status of GPIO all pins -*/ -uint16_t gpio_input_port_get(uint32_t gpio_periph) -{ - return ((uint16_t)GPIO_ISTAT(gpio_periph)); -} - -/*! - \brief get GPIO pin output status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval output status of GPIO pin: SET or RESET -*/ -FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin) -{ - if((uint32_t)RESET != (GPIO_OCTL(gpio_periph) & (pin))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief get GPIO port output status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[out] none - \retval output status of GPIO all pins -*/ -uint16_t gpio_output_port_get(uint32_t gpio_periph) -{ - return ((uint16_t)GPIO_OCTL(gpio_periph)); -} - -/*! - \brief set GPIO alternate function - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] alt_func_num: GPIO pin af function - \arg GPIO_AF_0: SYSTEM - \arg GPIO_AF_1: TIMER0, TIMER1, TIMER7 - \arg GPIO_AF_2: TIMER0, TIMER2, TIMER3, TIMER4 - \arg GPIO_AF_3: TIMER7, TIMER8, TIMER9, TIMER10 - \arg GPIO_AF_4: I2C0, I2C1, I2C2, I2C3, SPI4, TIMER0 - \arg GPIO_AF_5: SPI0, SPI1, SPI2, SPI3, SPI4, SPI5, I2C3 - \arg GPIO_AF_6: SPI1, SPI2, SPI3, SPI4, SAI0, I2C4 - \arg GPIO_AF_7: USART0, USART1, USART2, SPI0, SPI1, SPI2 - \arg GPIO_AF_8: UART3, UART4, USART5, UART6, UART7 - \arg GPIO_AF_9: CAN0, CAN1, TLI, TIMER11, TIMER12, TIMER13, I2C1, I2C2, CTC - \arg GPIO_AF_10: USB_FS, USB_HS - \arg GPIO_AF_11: ENET - \arg GPIO_AF_12: EXMC, SDIO, USB_HS - \arg GPIO_AF_13: DCI - \arg GPIO_AF_14: TLI - \arg GPIO_AF_15: EVENTOUT - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) -{ - uint16_t i; - uint32_t afrl, afrh; - - afrl = GPIO_AFSEL0(gpio_periph); - afrh = GPIO_AFSEL1(gpio_periph); - - for(i = 0U; i < 8U; i++) { - if((1U << i) & pin) { - /* clear the specified pin alternate function bits */ - afrl &= ~GPIO_AFR_MASK(i); - afrl |= GPIO_AFR_SET(i, alt_func_num); - } - } - - for(i = 8U; i < 16U; i++) { - if((1U << i) & pin) { - /* clear the specified pin alternate function bits */ - afrh &= ~GPIO_AFR_MASK(i - 8U); - afrh |= GPIO_AFR_SET(i - 8U, alt_func_num); - } - } - - GPIO_AFSEL0(gpio_periph) = afrl; - GPIO_AFSEL1(gpio_periph) = afrh; -} - -/*! - \brief lock GPIO pin bit - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin) -{ - uint32_t lock = 0x00010000U; - lock |= pin; - - /* lock key writing sequence: write 1->write 0->write 1->read 0->read 1 */ - GPIO_LOCK(gpio_periph) = (uint32_t)lock; - GPIO_LOCK(gpio_periph) = (uint32_t)pin; - GPIO_LOCK(gpio_periph) = (uint32_t)lock; - lock = GPIO_LOCK(gpio_periph); - lock = GPIO_LOCK(gpio_periph); -} - -/*! - \brief toggle GPIO pin status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - \param[in] pin: GPIO pin - one or more parameters can be selected which are shown as below: - \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL - \param[out] none - \retval none -*/ -void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin) -{ - GPIO_TG(gpio_periph) = (uint32_t)pin; -} - -/*! - \brief toggle GPIO port status - \param[in] gpio_periph: GPIO port - only one parameter can be selected which is shown as below: - \arg GPIOx(x = A,B,C,D,E,F,G,H,I) - - \param[out] none - \retval none -*/ -void gpio_port_toggle(uint32_t gpio_periph) -{ - GPIO_TG(gpio_periph) = 0x0000FFFFU; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c deleted file mode 100644 index d95d1440e83..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau.c +++ /dev/null @@ -1,402 +0,0 @@ -/*! - \file gd32f5xx_hau.c - \brief HAU driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_hau.h" - -#define HASH_CONTEXT_INTERNAL_REG 37U -#define HMAC_CONTEXT_INTERNAL_REG 53U - -/*! - \brief reset the HAU peripheral - \param[in] none - \param[out] none - \retval none -*/ -void hau_deinit(void) -{ - /* enable HAU reset state */ - rcu_periph_reset_enable(RCU_HAURST); - /* release HAU from reset state */ - rcu_periph_reset_disable(RCU_HAURST); -} - -/*! - \brief initialize the HAU peripheral parameters - \param[in] none - \param[out] initpara: HAU init parameter struct - members of the structure and the member values are shown as below: - algo: HAU_ALGO_SHA1, HAU_ALGO_SHA224, HAU_ALGO_SHA256, HAU_ALGO_MD5 - mode: HAU_MODE_HASH, HAU_MODE_HMAC - datatype: HAU_SWAPPING_32BIT, HAU_SWAPPING_16BIT, HAU_SWAPPING_8BIT, HAU_SWAPPING_1BIT - keytype: HAU_KEY_SHORTER_64, HAU_KEY_LONGGER_64 - \retval none -*/ -void hau_init(hau_init_parameter_struct* initpara) -{ - /* configure the algorithm, mode and the data type */ - HAU_CTL &= (~(uint32_t)(HAU_CTL_ALGM_0 | HAU_CTL_ALGM_1 | HAU_CTL_DATAM | HAU_CTL_HMS)); - HAU_CTL |= (initpara->algo | initpara->datatype | initpara->mode); - - /* when mode is HMAC, set the key */ - if(HAU_MODE_HMAC == initpara->mode){ - HAU_CTL &= (~(uint32_t)(HAU_CTL_KLM)); - HAU_CTL |= initpara->keytype; - } - - /* start the digest of a new message */ - HAU_CTL |= HAU_CTL_START; -} - -/*! - \brief initialize the sturct hau_initpara - \param[in] initpara: HAU init parameter struct - members of the structure and the member values are shown as below: - algo: HAU_ALGO_SHA1, HAU_ALGO_SHA224, HAU_ALGO_SHA256, HAU_ALGO_MD5 - mode: HAU_MODE_HASH, HAU_MODE_HMAC - datatype: HAU_SWAPPING_32BIT, HAU_SWAPPING_16BIT, HAU_SWAPPING_8BIT, HAU_SWAPPING_1BIT - keytype: HAU_KEY_SHORTER_64, HAU_KEY_LONGGER_64 - \param[out] none - \retval none -*/ -void hau_init_struct_para_init(hau_init_parameter_struct* initpara) -{ - initpara->algo = HAU_ALGO_SHA1; - initpara->mode = HAU_MODE_HASH; - initpara->datatype = HAU_SWAPPING_32BIT; - initpara->keytype = HAU_KEY_SHORTER_64; -} - -/*! - \brief reset the HAU processor core - \param[in] none - \param[out] none - \retval none -*/ -void hau_reset(void) -{ - /* set to 1 to reset the HAU processor core, then it is ready to start the digest calculation */ - HAU_CTL |= HAU_CTL_START; -} - -/*! - \brief configure the number of valid bits in last word of the message - \param[in] valid_num: number of valid bits in last word of the message - only one parameter can be selected which is shown as below: - \arg 0x00: all 32 bits of the last data written are valid - \arg 0x01: only bit [31] of the last data written to HAU_DI after data swapping are valid - \arg 0x02: only bits [31:30] of the last data written to HAU_DI after data swapping are valid - \arg 0x03: only bits [31:29] of the last data written to HAU_DI after data swapping are valid - ... - \arg 0x1F: only bit [0] of the last data written to HAU_DI after data swapping are valid - \param[out] none - \retval none -*/ -void hau_last_word_validbits_num_config(uint32_t valid_num) -{ - HAU_CFG &= (~(uint32_t)(HAU_CFG_VBL)); - HAU_CFG |= CFG_VBL(valid_num); -} - -/*! - \brief write data to the IN FIFO - \param[in] data: data to write - \param[out] none - \retval none -*/ -void hau_data_write(uint32_t data) -{ - HAU_DI = data; -} - -/*! - \brief return the number of words already written into the IN FIFO - \param[in] none - \param[out] none - \retval number of words in the input FIFO -*/ -uint32_t hau_infifo_words_num_get(void) -{ - uint32_t ret = 0U; - ret = GET_CTL_NWIF(HAU_CTL); - return ret; -} - -/*! - \brief read the message digest result - \param[in] none - \param[out] digestpara: HAU digest parameter struct - out[7:0]: message digest result 0-7 - \retval none -*/ -void hau_digest_read(hau_digest_parameter_struct* digestpara) -{ - digestpara->out[0] = HAU_DO0; - digestpara->out[1] = HAU_DO1; - digestpara->out[2] = HAU_DO2; - digestpara->out[3] = HAU_DO3; - digestpara->out[4] = HAU_DO4; - digestpara->out[5] = HAU_DO5; - digestpara->out[6] = HAU_DO6; - digestpara->out[7] = HAU_DO7; -} - -/*! - \brief enable digest calculation - \param[in] none - \param[out] none - \retval none -*/ -void hau_digest_calculation_enable(void) -{ - HAU_CFG |= HAU_CFG_CALEN; -} - -/*! - \brief configure single or multiple DMA is used, and digest calculation at the end of a DMA transfer or not - \param[in] multi_single - only one parameter can be selected which is shown as below - \arg SINGLE_DMA_AUTO_DIGEST: message padding and message digest calculation at the end of a DMA transfer - \arg MULTIPLE_DMA_NO_DIGEST: multiple DMA transfers needed and CALEN bit is not automatically set at the end of a DMA transfer - \param[out] none - \retval none -*/ -void hau_multiple_single_dma_config(uint32_t multi_single) -{ - HAU_CTL &= (~(uint32_t)(HAU_CTL_MDS)); - HAU_CTL |= multi_single; -} - -/*! - \brief enable the HAU DMA interface - \param[in] none - \param[out] none - \retval none -*/ -void hau_dma_enable(void) -{ - HAU_CTL |= HAU_CTL_DMAE; -} - -/*! - \brief disable the HAU DMA interface - \param[in] none - \param[out] none - \retval none -*/ -void hau_dma_disable(void) -{ - HAU_CTL &= (~(uint32_t)(HAU_CTL_DMAE)); -} - -/*! - \brief initialize the struct context - \param[in] context: HAU context parameter struct - \param[out] none - \retval none -*/ -void hau_context_struct_para_init(hau_context_parameter_struct* context) -{ - uint8_t i = 0U; - - /* initialize context parameter struct */ - context->hau_inten_bak = 0U; - context->hau_cfg_bak = 0U; - context->hau_ctl_bak = 0U; - for(i = 0U; i <= HMAC_CONTEXT_INTERNAL_REG; i++){ - context->hau_ctxs_bak[i] = 0U; - } -} - -/*! - \brief save the HAU peripheral context - \param[in] none - \param[out] context_save: pointer to a hau_context structure that contains the repository for current context - \retval none -*/ -void hau_context_save(hau_context_parameter_struct* context_save) -{ - uint8_t i = 0U; - uint8_t i_max = HASH_CONTEXT_INTERNAL_REG; - - hau_context_struct_para_init(context_save); - /* save context registers */ - context_save->hau_inten_bak = HAU_INTEN; - context_save->hau_cfg_bak = HAU_CFG; - context_save->hau_ctl_bak = HAU_CTL; - - if(0U != (HAU_CTL & HAU_CTL_HMS)){ - i_max = HMAC_CONTEXT_INTERNAL_REG; - } - for(i = 0U; i <= i_max; i++){ - context_save->hau_ctxs_bak[i] = HAU_CTXS(i); - } -} - -/*! - \brief restore the HAU peripheral context - \param[in] context_restore: pointer to a hau_context_parameter_struct structure that contains the repository for saved context - \param[out] none - \retval none -*/ -void hau_context_restore(hau_context_parameter_struct* context_restore) -{ - uint8_t i = 0U; - uint8_t i_max = HASH_CONTEXT_INTERNAL_REG; - - /* restore context registers */ - HAU_INTEN = context_restore->hau_inten_bak; - HAU_CFG = context_restore->hau_cfg_bak; - HAU_CTL = context_restore->hau_ctl_bak; - /* Initialize the hash processor */ - HAU_CTL |= HAU_CTL_START; - - /* continue restoring context registers */ - if(0U != (HAU_CTL & HAU_CTL_HMS)){ - i_max = HMAC_CONTEXT_INTERNAL_REG; - } - for(i = 0U; i <= i_max; i++){ - HAU_CTXS(i) = context_restore->hau_ctxs_bak[i]; - } -} - -/*! - \brief get the HAU flag status - \param[in] flag: HAU flag status - only one parameter can be selected which is shown as below: - \arg HAU_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO - \arg HAU_FLAG_CALCULATION_COMPLETE: digest calculation is completed - \arg HAU_FLAG_DMA: DMA is enabled (DMAE =1) or a transfer is processing - \arg HAU_FLAG_BUSY: data block is in process - \arg HAU_FLAG_INFIFO_NO_EMPTY: the input FIFO is not empty - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus hau_flag_get(uint32_t flag) -{ - uint32_t ret = 0U; - FlagStatus ret_flag = RESET; - - /* check if the flag is in HAU_CTL register */ - if(RESET != (flag & HAU_FLAG_INFIFO_NO_EMPTY)){ - ret = HAU_CTL; - }else{ - ret = HAU_STAT; - } - - if (RESET != (ret & flag)){ - ret_flag = SET; - } - - return ret_flag; -} - -/*! - \brief clear the HAU flag status - \param[in] flag: HAU flag status - one or more parameters can be selected which are shown as below - \arg HAU_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO - \arg HAU_FLAG_CALCULATION_COMPLETE: digest calculation is completed - \param[out] none - \retval none -*/ -void hau_flag_clear(uint32_t flag) -{ - HAU_STAT = ~(uint32_t)(flag); -} - -/*! - \brief enable the HAU interrupts - \param[in] interrupt: specify the HAU interrupt source to be enabled - one or more parameters can be selected which are shown as below - \arg HAU_INT_DATA_INPUT: a new block can be entered into the IN buffer - \arg HAU_INT_CALCULATION_COMPLETE: calculation complete - \param[out] none - \retval none -*/ -void hau_interrupt_enable(uint32_t interrupt) -{ - HAU_INTEN |= interrupt; -} - -/*! - \brief disable the HAU interrupts - \param[in] interrupt: specify the HAU interrupt source to be disabled - one or more parameters can be selected which are shown as below - \arg HAU_INT_DATA_INPUT: a new block can be entered into the IN buffer - \arg HAU_INT_CALCULATION_COMPLETE: calculation complete - \param[out] none - \retval none -*/ -void hau_interrupt_disable(uint32_t interrupt) -{ - HAU_INTEN &= ~(uint32_t)(interrupt); -} - -/*! - \brief get the HAU interrupt flag status - \param[in] int_flag: HAU interrupt flag status - only one parameter can be selected which is shown as below - \arg HAU_INT_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO - \arg HAU_INT_FLAG_CALCULATION_COMPLETE: digest calculation is completed - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus hau_interrupt_flag_get(uint32_t int_flag) -{ - uint32_t ret = 0U; - FlagStatus flag = RESET; - - /* return the status of the interrupt */ - ret = HAU_STAT; - - if(RESET != ((HAU_INTEN & ret) & int_flag)){ - flag = SET; - } - - return flag; -} - -/*! - \brief clear the HAU interrupt flag status - \param[in] int_flag: HAU interrupt flag status - one or more parameters can be selected which are shown as below - \arg HAU_INT_FLAG_DATA_INPUT: there is enough space (16 bytes) in the input FIFO - \arg HAU_INT_FLAG_CALCULATION_COMPLETE: digest calculation is completed - \param[out] none - \retval none -*/ -void hau_interrupt_flag_clear(uint32_t int_flag) -{ - HAU_STAT = ~(uint32_t)(int_flag); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c deleted file mode 100644 index 5b75e5d5ede..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_hau_sha_md5.c +++ /dev/null @@ -1,419 +0,0 @@ -/*! - \file gd32f5xx_hau_sha_md5.c - \brief HAU_SHA_MD5 driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_hau.h" - -#define SHAMD5_BSY_TIMEOUT ((uint32_t)0x00010000U) - -/* HAU SHA/MD5 digest read in HASH mode */ -static void hau_sha_md5_digest_read(uint32_t algo, uint8_t *output); -/* HAU digest calculate process in HASH mode */ -static ErrStatus hau_hash_calculate(uint32_t algo, uint8_t *input, uint32_t in_length, uint8_t *output); -/* HAU digest calculate process in HMAC mode */ -static ErrStatus hau_hmac_calculate(uint32_t algo, uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t *output); - -/*! - \brief calculate digest using SHA1 in HASH mode - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hash_sha_1(uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hash_calculate(HAU_ALGO_SHA1, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using SHA1 in HMAC mode - \param[in] key: pointer to the key used for HMAC - \param[in] keysize: length of the key used for HMAC - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hmac_sha_1(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hmac_calculate(HAU_ALGO_SHA1, key, keysize, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using SHA224 in HASH mode - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hash_sha_224(uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hash_calculate(HAU_ALGO_SHA224, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using SHA224 in HMAC mode - \param[in] key: pointer to the key used for HMAC - \param[in] keysize: length of the key used for HMAC - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hmac_sha_224(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hmac_calculate(HAU_ALGO_SHA224, key, keysize, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using SHA256 in HASH mode - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hash_sha_256(uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hash_calculate(HAU_ALGO_SHA256, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using SHA256 in HMAC mode - \param[in] key: pointer to the key used for HMAC - \param[in] keysize: length of the key used for HMAC - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hmac_sha_256(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hmac_calculate(HAU_ALGO_SHA256, key, keysize, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using MD5 in HASH mode - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hash_md5(uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hash_calculate(HAU_ALGO_MD5, input, in_length, output); - return ret; -} - -/*! - \brief calculate digest using MD5 in HMAC mode - \param[in] key: pointer to the key used for HMAC - \param[in] keysize: length of the key used for HMAC - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus hau_hmac_md5(uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t output[]) -{ - ErrStatus ret = ERROR; - ret = hau_hmac_calculate(HAU_ALGO_MD5, key, keysize, input, in_length, output); - return ret; -} - -/*! - \brief HAU SHA/MD5 digest read - \param[in] algo: algorithm selection - \param[out] output: the result digest - \retval none -*/ -static void hau_sha_md5_digest_read(uint32_t algo, uint8_t *output) -{ - hau_digest_parameter_struct digest_para; - uint32_t outputaddr = (uint32_t)output; - - switch(algo){ - case HAU_ALGO_SHA1: - hau_digest_read(&digest_para); - *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); - break; - case HAU_ALGO_SHA224: - hau_digest_read(&digest_para); - *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[5]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[6]); - break; - case HAU_ALGO_SHA256: - hau_digest_read(&digest_para); - *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[4]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[5]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[6]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[7]); - break; - case HAU_ALGO_MD5: - hau_digest_read(&digest_para); - *(uint32_t*)(outputaddr) = __REV(digest_para.out[0]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[1]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[2]); - outputaddr += 4U; - *(uint32_t*)(outputaddr) = __REV(digest_para.out[3]); - break; - default: - break; - } -} - -/*! - \brief HAU digest calculate process in HASH mode - \param[in] algo: algorithm selection - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus hau_hash_calculate(uint32_t algo, uint8_t *input, uint32_t in_length, uint8_t *output) -{ - hau_init_parameter_struct init_para; - - __IO uint32_t num_last_valid = 0U; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - uint32_t inputaddr = (uint32_t)input; - - /* number of valid bits in last word */ - num_last_valid = 8U * (in_length % 4U); - - /* HAU peripheral initialization */ - hau_deinit(); - - /* HAU configuration */ - init_para.algo = algo; - init_para.mode = HAU_MODE_HASH; - init_para.datatype = HAU_SWAPPING_8BIT; - hau_init(&init_para); - - /* configure the number of valid bits in last word of the message */ - hau_last_word_validbits_num_config(num_last_valid); - - /* write data to the IN FIFO */ - for(i = 0U; i < in_length; i += 4U){ - hau_data_write(*(uint32_t*)inputaddr); - inputaddr += 4U; - } - - /* enable digest calculation */ - hau_digest_calculation_enable(); - - /* wait until the busy flag is reset */ - do{ - busystatus = hau_flag_get(HAU_FLAG_BUSY); - counter++; - }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus){ - return ERROR; - }else{ - /* read the message digest */ - hau_sha_md5_digest_read(algo, output); - } - return SUCCESS; -} - -/*! - \brief HAU digest calculate process in HMAC mode - \param[in] algo: algorithm selection - \param[in] key: pointer to the key used for HMAC - \param[in] keysize: length of the key used for HMAC - \param[in] input: pointer to the input buffer - \param[in] in_length: length of the input buffer - \param[in] output: the result digest - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -static ErrStatus hau_hmac_calculate(uint32_t algo, uint8_t *key, uint32_t keysize, uint8_t *input, uint32_t in_length, uint8_t *output) -{ - hau_init_parameter_struct init_para; - - __IO uint16_t num_last_valid = 0U; - __IO uint16_t num_key_valid = 0U; - uint32_t i = 0U; - __IO uint32_t counter = 0U; - uint32_t busystatus = 0U; - uint32_t keyaddr = (uint32_t)key; - uint32_t inputaddr = (uint32_t)input; - - /* number of valid bits in last word of the message */ - num_last_valid = 8U * (uint16_t)(in_length % 4U); - /* number of valid bits in last word of the key */ - num_key_valid = 8U * (uint16_t)(keysize % 4U); - - /* HAU peripheral initialization */ - hau_deinit(); - - /* HAU configuration */ - init_para.algo = algo; - init_para.mode = HAU_MODE_HMAC; - init_para.datatype = HAU_SWAPPING_8BIT; - if(keysize > 64U){ - init_para.keytype = HAU_KEY_LONGGER_64; - }else{ - init_para.keytype = HAU_KEY_SHORTER_64; - } - hau_init(&init_para); - - /* configure the number of valid bits in last word of the key */ - hau_last_word_validbits_num_config((uint32_t)num_key_valid); - - /* write the key */ - for(i = 0U; i < keysize; i += 4U){ - hau_data_write(*(uint32_t*)keyaddr); - keyaddr += 4U; - } - - /* enable digest calculation */ - hau_digest_calculation_enable(); - - /* wait until the busy flag is reset */ - do{ - busystatus = hau_flag_get(HAU_FLAG_BUSY); - counter++; - }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus){ - return ERROR; - }else{ - /* configure the number of valid bits in last word of the message */ - hau_last_word_validbits_num_config((uint32_t)num_last_valid); - - /* write data to the IN FIFO */ - for(i = 0U; i < in_length; i += 4U){ - hau_data_write(*(uint32_t*)inputaddr); - inputaddr += 4U; - } - - /* enable digest calculation */ - hau_digest_calculation_enable(); - - /* wait until the busy flag is reset */ - counter = 0U; - do{ - busystatus = hau_flag_get(HAU_FLAG_BUSY); - counter++; - }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus){ - return ERROR; - }else{ - /* configure the number of valid bits in last word of the key */ - hau_last_word_validbits_num_config((uint32_t)num_key_valid); - - /* write the key */ - keyaddr = (uint32_t)key; - for(i = 0U; i < keysize; i += 4U){ - hau_data_write(*(uint32_t*)keyaddr); - keyaddr += 4U; - } - - /* enable digest calculation */ - hau_digest_calculation_enable(); - - /* wait until the busy flag is reset */ - counter =0U; - do{ - busystatus = hau_flag_get(HAU_FLAG_BUSY); - counter++; - }while((SHAMD5_BSY_TIMEOUT != counter) && (RESET != busystatus)); - - if(RESET != busystatus){ - return ERROR; - }else{ - /* read the message digest */ - hau_sha_md5_digest_read(algo, output); - } - } - } - return SUCCESS; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c deleted file mode 100644 index b4d7fdc3311..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c +++ /dev/null @@ -1,857 +0,0 @@ -/*! - \file gd32f5xx_i2c.c - \brief I2C driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_i2c.h" - -/* I2C register bit mask */ -#define I2CCLK_MAX ((uint32_t)0x00000032U) /*!< i2cclk maximum value */ -#define I2CCLK_MIN ((uint32_t)0x00000002U) /*!< i2cclk minimum value */ -#define I2C_FLAG_MASK ((uint32_t)0x0000FFFFU) /*!< i2c flag mask */ -#define I2C_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ -#define I2C_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ - -/* I2C register bit offset */ -#define STAT1_PECV_OFFSET ((uint32_t)0x00000008U) /* bit offset of PECV in I2C_STAT1 */ - -/*! - \brief reset I2C - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_deinit(uint32_t i2c_periph) -{ - switch(i2c_periph) { - case I2C0: - /* reset I2C0 */ - rcu_periph_reset_enable(RCU_I2C0RST); - rcu_periph_reset_disable(RCU_I2C0RST); - break; - case I2C1: - /* reset I2C1 */ - rcu_periph_reset_enable(RCU_I2C1RST); - rcu_periph_reset_disable(RCU_I2C1RST); - break; - case I2C2: - /* reset I2C2 */ - rcu_periph_reset_enable(RCU_I2C2RST); - rcu_periph_reset_disable(RCU_I2C2RST); - break; - default: - break; - } -} - -/*! - \brief configure I2C clock - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] clkspeed: I2C clock speed, supports standard mode (up to 100 kHz), fast mode (up to 400 kHz) - \param[in] dutycyc: duty cycle in fast mode - only one parameter can be selected which is shown as below: - \arg I2C_DTCY_2: T_low/T_high = 2 in fast mode - \arg I2C_DTCY_16_9: T_low/T_high = 16/9 in fast mode - \param[out] none - \retval none -*/ -void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc) -{ - uint32_t pclk1, clkc, freq, risetime; - uint32_t temp; - - pclk1 = rcu_clock_freq_get(CK_APB1); - /* I2C peripheral clock frequency */ - freq = (uint32_t)(pclk1 / 1000000U); - if(freq >= I2CCLK_MAX) { - freq = I2CCLK_MAX; - } - temp = I2C_CTL1(i2c_periph); - temp &= ~I2C_CTL1_I2CCLK; - temp |= freq; - - I2C_CTL1(i2c_periph) = temp; - - if(100000U >= clkspeed) { - /* the maximum SCL rise time is 1000ns in standard mode */ - risetime = (uint32_t)((pclk1 / 1000000U) + 1U); - if(risetime >= I2CCLK_MAX) { - I2C_RT(i2c_periph) = I2CCLK_MAX; - } else if(risetime <= I2CCLK_MIN) { - I2C_RT(i2c_periph) = I2CCLK_MIN; - } else { - I2C_RT(i2c_periph) = risetime; - } - clkc = (uint32_t)(pclk1 / (clkspeed * 2U)); - if(clkc < 0x04U) { - /* the CLKC in standard mode minmum value is 4 */ - clkc = 0x04U; - } - - I2C_CKCFG(i2c_periph) |= (I2C_CKCFG_CLKC & clkc); - - } else if(400000U >= clkspeed) { - /* the maximum SCL rise time is 300ns in fast mode */ - I2C_RT(i2c_periph) = (uint32_t)(((freq * (uint32_t)300U) / (uint32_t)1000U) + (uint32_t)1U); - if(I2C_DTCY_2 == dutycyc) { - /* I2C duty cycle is 2 */ - clkc = (uint32_t)(pclk1 / (clkspeed * 3U)); - I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; - } else { - /* I2C duty cycle is 16/9 */ - clkc = (uint32_t)(pclk1 / (clkspeed * 25U)); - I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; - } - if(0U == (clkc & I2C_CKCFG_CLKC)) { - /* the CLKC in fast mode minmum value is 1 */ - clkc |= 0x0001U; - } - I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; - I2C_CKCFG(i2c_periph) |= clkc; - } else { - } -} - -/*! - \brief configure I2C address - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] mode: - only one parameter can be selected which is shown as below: - \arg I2C_I2CMODE_ENABLE: I2C mode - \arg I2C_SMBUSMODE_ENABLE: SMBus mode - \param[in] addformat: 7bits or 10bits - only one parameter can be selected which is shown as below: - \arg I2C_ADDFORMAT_7BITS: address format is 7 bits - \arg I2C_ADDFORMAT_10BITS: address format is 10 bits - \param[in] addr: I2C address - \param[out] none - \retval none -*/ -void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr) -{ - /* SMBus/I2C mode selected */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_SMBEN); - ctl |= mode; - I2C_CTL0(i2c_periph) = ctl; - /* configure address */ - addr = addr & I2C_ADDRESS_MASK; - I2C_SADDR0(i2c_periph) = (addformat | addr); -} - -/*! - \brief select SMBus type - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] type: - only one parameter can be selected which is shown as below: - \arg I2C_SMBUS_DEVICE: SMBus mode device type - \arg I2C_SMBUS_HOST: SMBus mode host type - \param[out] none - \retval none -*/ -void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type) -{ - if(I2C_SMBUS_HOST == type) { - I2C_CTL0(i2c_periph) |= I2C_CTL0_SMBSEL; - } else { - I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_SMBSEL); - } -} - -/*! - \brief whether or not to send an ACK - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] ack: - only one parameter can be selected which is shown as below: - \arg I2C_ACK_ENABLE: ACK will be sent - \arg I2C_ACK_DISABLE: ACK will not be sent - \param[out] none - \retval none -*/ -void i2c_ack_config(uint32_t i2c_periph, uint32_t ack) -{ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_ACKEN); - ctl |= ack; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief configure I2C POAP position - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] pos: - only one parameter can be selected which is shown as below: - \arg I2C_ACKPOS_CURRENT: ACKEN bit decides whether or not to send ACK or not for the current byte - \arg I2C_ACKPOS_NEXT: ACKEN bit decides whether or not to send ACK for the next byte - \param[out] none - \retval none -*/ -void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos) -{ - uint32_t ctl = 0U; - /* configure I2C POAP position */ - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_POAP); - ctl |= pos; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief master sends slave address - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] addr: slave address - \param[in] trandirection: transmitter or receiver - only one parameter can be selected which is shown as below: - \arg I2C_TRANSMITTER: transmitter - \arg I2C_RECEIVER: receiver - \param[out] none - \retval none -*/ -void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection) -{ - /* master is a transmitter or a receiver */ - if(I2C_TRANSMITTER == trandirection) { - addr = addr & I2C_TRANSMITTER; - } else { - addr = addr | I2C_RECEIVER; - } - /* send slave address */ - I2C_DATA(i2c_periph) = addr; -} - -/*! - \brief enable dual-address mode - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] addr: the second address in dual-address mode - \param[out] none - \retval none -*/ -void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr) -{ - /* configure address */ - addr = addr & I2C_ADDRESS2_MASK; - I2C_SADDR1(i2c_periph) = (I2C_SADDR1_DUADEN | addr); -} - -/*! - \brief disable dual-address mode - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_dualaddr_disable(uint32_t i2c_periph) -{ - I2C_SADDR1(i2c_periph) &= ~(I2C_SADDR1_DUADEN); -} - -/*! - \brief enable I2C - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_enable(uint32_t i2c_periph) -{ - I2C_CTL0(i2c_periph) |= I2C_CTL0_I2CEN; -} - -/*! - \brief disable I2C - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_disable(uint32_t i2c_periph) -{ - I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_I2CEN); -} - -/*! - \brief generate a START condition on I2C bus - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_start_on_bus(uint32_t i2c_periph) -{ - I2C_CTL0(i2c_periph) |= I2C_CTL0_START; -} - -/*! - \brief generate a STOP condition on I2C bus - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_stop_on_bus(uint32_t i2c_periph) -{ - I2C_CTL0(i2c_periph) |= I2C_CTL0_STOP; -} - -/*! - \brief I2C transmit data function - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] data: data of transmission - \param[out] none - \retval none -*/ -void i2c_data_transmit(uint32_t i2c_periph, uint8_t data) -{ - I2C_DATA(i2c_periph) = DATA_TRANS(data); -} - -/*! - \brief I2C receive data function - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval data of received -*/ -uint8_t i2c_data_receive(uint32_t i2c_periph) -{ - return (uint8_t)DATA_RECV(I2C_DATA(i2c_periph)); -} - -/*! - \brief configure I2C DMA mode - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] dmastate: - only one parameter can be selected which is shown as below: - \arg I2C_DMA_ON: enable DMA mode - \arg I2C_DMA_OFF: disable DMA mode - \param[out] none - \retval none -*/ -void i2c_dma_config(uint32_t i2c_periph, uint32_t dmastate) -{ - /* configure I2C DMA function */ - uint32_t ctl = 0U; - - ctl = I2C_CTL1(i2c_periph); - ctl &= ~(I2C_CTL1_DMAON); - ctl |= dmastate; - I2C_CTL1(i2c_periph) = ctl; -} - -/*! - \brief configure whether next DMA EOT is DMA last transfer or not - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] dmalast: - only one parameter can be selected which is shown as below: - \arg I2C_DMALST_ON: next DMA EOT is the last transfer - \arg I2C_DMALST_OFF: next DMA EOT is not the last transfer - \param[out] none - \retval none -*/ -void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast) -{ - /* configure DMA last transfer */ - uint32_t ctl = 0U; - - ctl = I2C_CTL1(i2c_periph); - ctl &= ~(I2C_CTL1_DMALST); - ctl |= dmalast; - I2C_CTL1(i2c_periph) = ctl; -} - -/*! - \brief configure RBNE clear condition - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] rbnecondition: - only one parameter can be selected which is shown as below: - \arg I2C_CFGRBNE_ON: RBNE can be cleared when RDATA is read - \arg I2C_CFGRBNE_OFF: RBNE can be cleared when RDATA is read and BTC is cleared - \param[out] none - \retval none -*/ -void i2c_rbne_clear_config(uint32_t i2c_periph, uint32_t rbnecondition) -{ - /* configure rbne clear condition */ - uint32_t ctl = 0U; - - ctl = I2C_CTL1(i2c_periph); - ctl &= ~(I2C_CTL1_CFGRBNE); - ctl |= rbnecondition; - I2C_CTL1(i2c_periph) = ctl; -} - -/*! - \brief whether to stretch SCL low when data is not ready in slave mode - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] stretchpara: - only one parameter can be selected which is shown as below: - \arg I2C_SCLSTRETCH_ENABLE: enable SCL stretching - \arg I2C_SCLSTRETCH_DISABLE: disable SCL stretching - \param[out] none - \retval none -*/ -void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara) -{ - /* configure I2C SCL strerching */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_SS); - ctl |= stretchpara; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief whether or not to response to a general call - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] gcallpara: - only one parameter can be selected which is shown as below: - \arg I2C_GCEN_ENABLE: slave will response to a general call - \arg I2C_GCEN_DISABLE: slave will not response to a general call - \param[out] none - \retval none -*/ -void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara) -{ - /* configure slave response to a general call enable or disable */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_GCEN); - ctl |= gcallpara; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief configure software reset of I2C - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] sreset: - only one parameter can be selected which is shown as below: - \arg I2C_SRESET_SET: I2C is under reset - \arg I2C_SRESET_RESET: I2C is not under reset - \param[out] none - \retval none -*/ -void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset) -{ - /* modify CTL0 and configure software reset I2C state */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_SRESET); - ctl |= sreset; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief configure I2C PEC calculation - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] pecstate: - only one parameter can be selected which is shown as below: - \arg I2C_PEC_ENABLE: PEC calculation on - \arg I2C_PEC_DISABLE: PEC calculation off - \param[out] none - \retval none -*/ -void i2c_pec_config(uint32_t i2c_periph, uint32_t pecstate) -{ - /* on/off PEC calculation */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_PECEN); - ctl |= pecstate; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief configure whether to transfer PEC value - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] pecpara: - only one parameter can be selected which is shown as below: - \arg I2C_PECTRANS_ENABLE: transfer PEC value - \arg I2C_PECTRANS_DISABLE: not transfer PEC value - \param[out] none - \retval none -*/ -void i2c_pec_transfer_config(uint32_t i2c_periph, uint32_t pecpara) -{ - /* whether to transfer PEC */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_PECTRANS); - ctl |= pecpara; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief get packet error checking value - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval PEC value -*/ -uint8_t i2c_pec_value_get(uint32_t i2c_periph) -{ - return (uint8_t)((I2C_STAT1(i2c_periph) & I2C_STAT1_PECV) >> STAT1_PECV_OFFSET); -} - -/*! - \brief configure I2C alert through SMBA pin - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] smbuspara: - only one parameter can be selected which is shown as below: - \arg I2C_SALTSEND_ENABLE: issue alert through SMBA pin - \arg I2C_SALTSEND_DISABLE: not issue alert through SMBA pin - \param[out] none - \retval none -*/ -void i2c_smbus_alert_config(uint32_t i2c_periph, uint32_t smbuspara) -{ - /* configure smubus alert through SMBA pin */ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_SALT); - ctl |= smbuspara; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief configure I2C ARP protocol in SMBus - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] arpstate: - only one parameter can be selected which is shown as below: - \arg I2C_ARP_ENABLE: enable ARP - \arg I2C_ARP_DISABLE: disable ARP - \param[out] none - \retval none -*/ -void i2c_smbus_arp_config(uint32_t i2c_periph, uint32_t arpstate) -{ - /* enable or disable I2C ARP protocol*/ - uint32_t ctl = 0U; - - ctl = I2C_CTL0(i2c_periph); - ctl &= ~(I2C_CTL0_ARPEN); - ctl |= arpstate; - I2C_CTL0(i2c_periph) = ctl; -} - -/*! - \brief disable analog noise filter - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_analog_noise_filter_disable(uint32_t i2c_periph) -{ - I2C_FCTL(i2c_periph) |= I2C_FCTL_AFD; -} - -/*! - \brief enable analog noise filter - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_analog_noise_filter_enable(uint32_t i2c_periph) -{ - I2C_FCTL(i2c_periph) &= ~(I2C_FCTL_AFD); -} - -/*! - \brief configure digital noise filter - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] dfilterpara: refer to i2c_digital_filter_enum - only one parameter can be selected which is shown as below: - \arg I2C_DF_DISABLE: disable digital noise filter - \arg I2C_DF_1PCLK: enable digital noise filter and the maximum filtered spiker's length 1 PCLK1 - \arg I2C_DF_2PCLK: enable digital noise filter and the maximum filtered spiker's length 2 PCLK1 - \arg I2C_DF_3PCLK: enable digital noise filter and the maximum filtered spiker's length 3 PCLK1 - \arg I2C_DF_4PCLK: enable digital noise filter and the maximum filtered spiker's length 4 PCLK1 - \arg I2C_DF_5PCLK: enable digital noise filter and the maximum filtered spiker's length 5 PCLK1 - \arg I2C_DF_6PCLK: enable digital noise filter and the maximum filtered spiker's length 6 PCLK1 - \arg I2C_DF_7PCLK: enable digital noise filter and the maximum filtered spiker's length 7 PCLK1 - \arg I2C_DF_8PCLK: enable digital noise filter and the maximum filtered spiker's length 8 PCLK1 - \arg I2C_DF_9PCLK: enable digital noise filter and the maximum filtered spiker's length 9 PCLK1 - \arg I2C_DF_10PCLK: enable digital noise filter and the maximum filtered spiker's length 10 PCLK1 - \arg I2C_DF_11CLK: enable digital noise filter and the maximum filtered spiker's length 11 PCLK1 - \arg I2C_DF_12CLK: enable digital noise filter and the maximum filtered spiker's length 12 PCLK1 - \arg I2C_DF_13PCLK: enable digital noise filter and the maximum filtered spiker's length 13 PCLK1 - \arg I2C_DF_14PCLK: enable digital noise filter and the maximum filtered spiker's length 14 PCLK1 - \arg I2C_DF_15PCLK: enable digital noise filter and the maximum filtered spiker's length 15 PCLK1 - \param[out] none - \retval none -*/ -void i2c_digital_noise_filter_config(uint32_t i2c_periph, i2c_digital_filter_enum dfilterpara) -{ - I2C_FCTL(i2c_periph) |= dfilterpara; -} - -/*! - \brief enable SAM_V interface - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_sam_enable(uint32_t i2c_periph) -{ - I2C_SAMCS(i2c_periph) |= I2C_SAMCS_SAMEN; -} - -/*! - \brief disable SAM_V interface - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_sam_disable(uint32_t i2c_periph) -{ - I2C_SAMCS(i2c_periph) &= ~(I2C_SAMCS_SAMEN); -} - -/*! - \brief enable SAM_V interface timeout detect - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_sam_timeout_enable(uint32_t i2c_periph) -{ - I2C_SAMCS(i2c_periph) |= I2C_SAMCS_STOEN; -} - -/*! - \brief disable SAM_V interface timeout detect - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[out] none - \retval none -*/ -void i2c_sam_timeout_disable(uint32_t i2c_periph) -{ - I2C_SAMCS(i2c_periph) &= ~(I2C_SAMCS_STOEN); -} - -/*! - \brief get I2C flag status - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] flag: I2C flags, refer to i2c_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_FLAG_SBSEND: start condition sent out in master mode - \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode - \arg I2C_FLAG_BTC: byte transmission finishes - \arg I2C_FLAG_ADD10SEND: header of 10-bit address is sent in master mode - \arg I2C_FLAG_STPDET: stop condition detected in slave mode - \arg I2C_FLAG_RBNE: I2C_DATA is not empty during receiving - \arg I2C_FLAG_TBE: I2C_DATA is empty during transmitting - \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus - \arg I2C_FLAG_LOSTARB: arbitration lost in master mode - \arg I2C_FLAG_AERR: acknowledge error - \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode - \arg I2C_FLAG_PECERR: PEC error when receiving data - \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode - \arg I2C_FLAG_SMBALT: SMBus alert status - \arg I2C_FLAG_MASTER: a flag indicating whether I2C block is in master or slave mode - \arg I2C_FLAG_I2CBSY: busy flag - \arg I2C_FLAG_TR: whether the I2C is a transmitter or a receiver - \arg I2C_FLAG_RXGC: general call address (00h) received - \arg I2C_FLAG_DEFSMB: default address of SMBus device - \arg I2C_FLAG_HSTSMB: SMBus host header detected in slave mode - \arg I2C_FLAG_DUMOD: dual flag in slave mode indicating which address is matched in dual-address mode - \arg I2C_FLAG_TFF: txframe fall flag - \arg I2C_FLAG_TFR: txframe rise flag - \arg I2C_FLAG_RFF: rxframe fall flag - \arg I2C_FLAG_RFR: rxframe rise flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag) -{ - if(RESET != (I2C_REG_VAL(i2c_periph, flag) & BIT(I2C_BIT_POS(flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear I2C flag status - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] flag: I2C flags, refer to i2c_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_FLAG_SMBALT: SMBus alert status - \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode - \arg I2C_FLAG_PECERR: PEC error when receiving data - \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode - \arg I2C_FLAG_AERR: acknowledge error - \arg I2C_FLAG_LOSTARB: arbitration lost in master mode - \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus - \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode - \arg I2C_FLAG_TFF: txframe fall flag - \arg I2C_FLAG_TFR: txframe rise flag - \arg I2C_FLAG_RFF: rxframe fall flag - \arg I2C_FLAG_RFR: rxframe rise flag - \param[out] none - \retval none -*/ -void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag) -{ - if(I2C_FLAG_ADDSEND == flag) { - /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ - I2C_STAT0(i2c_periph); - I2C_STAT1(i2c_periph); - } else { - I2C_REG_VAL(i2c_periph, flag) &= ~BIT(I2C_BIT_POS(flag)); - } -} - -/*! - \brief enable I2C interrupt - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum - only one parameter can be selected which is shown as below: - \arg I2C_INT_ERR: error interrupt - \arg I2C_INT_EV: event interrupt - \arg I2C_INT_BUF: buffer interrupt - \arg I2C_INT_TFF: txframe fall interrupt - \arg I2C_INT_TFR: txframe rise interrupt - \arg I2C_INT_RFF: rxframe fall interrupt - \arg I2C_INT_RFR: rxframe rise interrupt - \param[out] none - \retval none -*/ -void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) -{ - I2C_REG_VAL(i2c_periph, interrupt) |= BIT(I2C_BIT_POS(interrupt)); -} - -/*! - \brief disable I2C interrupt - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum - only one parameter can be selected which is shown as below: - \arg I2C_INT_ERR: error interrupt - \arg I2C_INT_EV: event interrupt - \arg I2C_INT_BUF: buffer interrupt - \arg I2C_INT_TFF: txframe fall interrupt - \arg I2C_INT_TFR: txframe rise interrupt - \arg I2C_INT_RFF: rxframe fall interrupt - \arg I2C_INT_RFR: rxframe rise interrupt - \param[out] none - \retval none -*/ -void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) -{ - I2C_REG_VAL(i2c_periph, interrupt) &= ~BIT(I2C_BIT_POS(interrupt)); -} - -/*! - \brief get I2C interrupt flag status - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_INT_FLAG_SBSEND: start condition sent out in master mode interrupt flag - \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag - \arg I2C_INT_FLAG_BTC: byte transmission finishes interrupt flag - \arg I2C_INT_FLAG_ADD10SEND: header of 10-bit address is sent in master mode interrupt flag - \arg I2C_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag - \arg I2C_INT_FLAG_RBNE: I2C_DATA is not Empty during receiving interrupt flag - \arg I2C_INT_FLAG_TBE: I2C_DATA is empty during transmitting interrupt flag - \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag - \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag - \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag - \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag - \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag - \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag - \arg I2C_INT_FLAG_SMBALT: SMBus alert status interrupt flag - \arg I2C_INT_FLAG_TFF: txframe fall interrupt flag - \arg I2C_INT_FLAG_TFR: txframe rise interrupt flag - \arg I2C_INT_FLAG_RFF: rxframe fall interrupt flag - \arg I2C_INT_FLAG_RFR: rxframe rise interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) -{ - uint32_t intenable = 0U, flagstatus = 0U, bufie; - - /* check BUFIE */ - bufie = I2C_CTL1(i2c_periph)&I2C_CTL1_BUFIE; - - /* get the interrupt enable bit status */ - intenable = (I2C_REG_VAL(i2c_periph, int_flag) & BIT(I2C_BIT_POS(int_flag))); - /* get the corresponding flag bit status */ - flagstatus = (I2C_REG_VAL2(i2c_periph, int_flag) & BIT(I2C_BIT_POS2(int_flag))); - - if((I2C_INT_FLAG_RBNE == int_flag) || (I2C_INT_FLAG_TBE == int_flag)) { - if(intenable && bufie) { - intenable = 1U; - } else { - intenable = 0U; - } - } - if((0U != flagstatus) && (0U != intenable)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear I2C interrupt flag status - \param[in] i2c_periph: I2Cx(x=0,1,2) - \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag - \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag - \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag - \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag - \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag - \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag - \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag - \arg I2C_INT_FLAG_SMBALT: SMBus alert status interrupt flag - \arg I2C_INT_FLAG_TFF: txframe fall interrupt flag - \arg I2C_INT_FLAG_TFR: txframe rise interrupt flag - \arg I2C_INT_FLAG_RFF: rxframe fall interrupt flag - \arg I2C_INT_FLAG_RFR: rxframe rise interrupt flag - \param[out] none - \retval none -*/ -void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) -{ - if(I2C_INT_FLAG_ADDSEND == int_flag) { - /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ - I2C_STAT0(i2c_periph); - I2C_STAT1(i2c_periph); - } else { - I2C_REG_VAL2(i2c_periph, int_flag) &= ~BIT(I2C_BIT_POS2(int_flag)); - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c deleted file mode 100644 index 504c4360591..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c_add.c +++ /dev/null @@ -1,978 +0,0 @@ -/*! - \file gd32f5xx_i2c.c - \brief I2C driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_i2c_add.h" - -/* I2C register bit mask */ -#define I2C_ADD_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ -#define I2C_ADD_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ - -/* I2C register bit offset */ -#define CTL0_DNF_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of DNF in I2C_ADD_CTL0 */ -#define CTL1_BYTENUM_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of BYTENUM in I2C_ADD_CTL1 */ -#define STAT_READDR_OFFSET ((uint32_t)0x00000011U) /*!< bit offset of READDR in I2C_ADD_STAT */ -#define TIMING_SCLL_OFFSET ((uint32_t)0x00000000U) /*!< bit offset of SCLL in I2C_ADD_TIMING */ -#define TIMING_SCLH_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of SCLH in I2C_ADD_TIMING */ -#define TIMING_SDADELY_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of SDADELY in I2C_ADD_TIMING */ -#define TIMING_SCLDELY_OFFSET ((uint32_t)0x00000014U) /*!< bit offset of SCLDELY in I2C_ADD_TIMING */ -#define TIMING_PSC_OFFSET ((uint32_t)0x0000001CU) /*!< bit offset of PSC in I2C_ADD_TIMING */ -#define SADDR1_ADDMSK_OFFSET ((uint32_t)0x00000008U) /*!< bit offset of ADDMSK in I2C_ADD_SADDR1 */ -#define TIMEOUT_BUSTOB_OFFSET ((uint32_t)0x00000010U) /*!< bit offset of BUSTOB in I2C_ADD_TIMEOUT */ - -/*! - \brief reset I2C - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_deinit(uint32_t i2c_add_periph) -{ - switch(i2c_add_periph) { - /* reset I2C3 */ - case I2C3: - rcu_periph_reset_enable(RCU_I2C3RST); - rcu_periph_reset_disable(RCU_I2C3RST); - break; - /* reset I2C4 */ - case I2C4: - rcu_periph_reset_enable(RCU_I2C4RST); - rcu_periph_reset_disable(RCU_I2C4RST); - break; - /* reset I2C5 */ - case I2C5: - rcu_periph_reset_enable(RCU_I2C5RST); - rcu_periph_reset_disable(RCU_I2C5RST); - break; - default: - break; - } -} - -/*! - \brief configure the timing parameters - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] psc: 0-0x0000000F, timing prescaler - \param[in] scl_dely: 0-0x0000000F, data setup time - \param[in] sda_dely: 0-0x0000000F, data hold time - \param[out] none - \retval none -*/ -void i2c_add_timing_config(uint32_t i2c_add_periph, uint32_t psc, uint32_t scl_dely, uint32_t sda_dely) -{ - /* clear PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ - I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_PSC; - I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLDELY; - I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SDADELY; - /* mask PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ - psc = (uint32_t)(psc << TIMING_PSC_OFFSET) & I2C_ADD_TIMING_PSC; - scl_dely = (uint32_t)(scl_dely << TIMING_SCLDELY_OFFSET) & I2C_ADD_TIMING_SCLDELY; - sda_dely = (uint32_t)(sda_dely << TIMING_SDADELY_OFFSET) & I2C_ADD_TIMING_SDADELY; - /* write PSC, SCLDELY, SDADELY bits in I2C_ADD_TIMING register */ - I2C_ADD_TIMING(i2c_add_periph) |= (psc | scl_dely | sda_dely); -} - -/*! - \brief configure digital noise filter - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] filter_length: the length of filter spikes - only one parameter can be selected which is shown as below: - \arg FILTER_DISABLE: digital filter is disabled - \arg FILTER_LENGTH_1: digital filter is enabled and filter spikes with a length of up to 1 tI2CCLK - \arg FILTER_LENGTH_2: digital filter is enabled and filter spikes with a length of up to 2 tI2CCLK - \arg FILTER_LENGTH_3: digital filter is enabled and filter spikes with a length of up to 3 tI2CCLK - \arg FILTER_LENGTH_4: digital filter is enabled and filter spikes with a length of up to 4 tI2CCLK - \arg FILTER_LENGTH_5: digital filter is enabled and filter spikes with a length of up to 5 tI2CCLK - \arg FILTER_LENGTH_6: digital filter is enabled and filter spikes with a length of up to 6 tI2CCLK - \arg FILTER_LENGTH_7: digital filter is enabled and filter spikes with a length of up to 7 tI2CCLK - \arg FILTER_LENGTH_8: digital filter is enabled and filter spikes with a length of up to 8 tI2CCLK - \arg FILTER_LENGTH_9: digital filter is enabled and filter spikes with a length of up to 9 tI2CCLK - \arg FILTER_LENGTH_10: digital filter is enabled and filter spikes with a length of up to 10 tI2CCLK - \arg FILTER_LENGTH_11: digital filter is enabled and filter spikes with a length of up to 11 tI2CCLK - \arg FILTER_LENGTH_12: digital filter is enabled and filter spikes with a length of up to 12 tI2CCLK - \arg FILTER_LENGTH_13: digital filter is enabled and filter spikes with a length of up to 13 tI2CCLK - \arg FILTER_LENGTH_14: digital filter is enabled and filter spikes with a length of up to 14 tI2CCLK - \arg FILTER_LENGTH_15: digital filter is enabled and filter spikes with a length of up to 15 tI2CCLK - \param[out] none - \retval none -*/ -void i2c_add_digital_noise_filter_config(uint32_t i2c_add_periph, uint32_t filter_length) -{ - I2C_ADD_CTL0(i2c_add_periph) &= (uint32_t)(~I2C_ADD_CTL0_DNF); - I2C_ADD_CTL0(i2c_add_periph) |= (uint32_t)(filter_length << CTL0_DNF_OFFSET); -} - -/*! - \brief enable analog noise filter - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_analog_noise_filter_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_ANOFF; -} - -/*! - \brief disable analog noise filter - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_analog_noise_filter_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_ANOFF; -} - -/*! - \brief configure the SCL high and low period of clock in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] sclh: 0-0x000000FF, SCL high period - \param[in] scll: 0-0x000000FF, SCL low period - \param[out] none - \retval none -*/ -void i2c_add_master_clock_config(uint32_t i2c_add_periph, uint32_t sclh, uint32_t scll) -{ - /* clear SCLH, SCLL bits in I2C_ADD_TIMING register */ - I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLH; - I2C_ADD_TIMING(i2c_add_periph) &= ~I2C_ADD_TIMING_SCLL; - /* mask SCLH, SCLL bits in I2C_ADD_TIMING register */ - sclh = (uint32_t)(sclh << TIMING_SCLH_OFFSET) & I2C_ADD_TIMING_SCLH; - scll = (uint32_t)(scll << TIMING_SCLL_OFFSET) & I2C_ADD_TIMING_SCLL; - /* write SCLH, SCLL bits in I2C_ADD_TIMING register */ - I2C_ADD_TIMING(i2c_add_periph) |= (sclh | scll); -} - -/*! - \brief configure i2c slave address and transfer direction in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] address: 0-0x3FF except reserved address, I2C slave address to be sent - \param[in] trans_direction: I2C transfer direction in master mode - only one parameter can be selected which is shown as below: - \arg I2C_ADD_MASTER_TRANSMIT: master transmit - \arg I2C_ADD_MASTER_RECEIVE: master receive - \param[out] none - \retval none -*/ -void i2c_add_master_addressing(uint32_t i2c_add_periph, uint32_t address, uint32_t trans_direction) -{ - /* configure slave address */ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_SADDRESS; - I2C_ADD_CTL1(i2c_add_periph) |= address; - /* configure transfer direction */ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_TRDIR; - I2C_ADD_CTL1(i2c_add_periph) |= trans_direction; -} - -/*! - \brief 10-bit address header executes read direction only in master receive mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_address10_header_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_HEAD10R; -} - -/*! - \brief 10-bit address header executes complete sequence in master receive mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_address10_header_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_HEAD10R; -} - -/*! - \brief enable 10-bit addressing mode in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_address10_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_ADD10EN; -} - -/*! - \brief disable 10-bit addressing mode in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_address10_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_ADD10EN; -} - -/*! - \brief enable I2C automatic end mode in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_automatic_end_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_AUTOEND; -} - -/*! - \brief disable I2C automatic end mode in master mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_automatic_end_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_AUTOEND; -} - -/*! - \brief enable the response to a general call - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_slave_response_to_gcall_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_GCEN; -} - -/*! - \brief disable the response to a general call - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_slave_response_to_gcall_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_GCEN; -} - -/*! - \brief enable to stretch SCL low when data is not ready in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_stretch_scl_low_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SS; -} - -/*! - \brief disable to stretch SCL low when data is not ready in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_stretch_scl_low_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SS; -} - -/*! - \brief configure i2c slave address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] address: I2C address - \param[in] addr_format: 7bits or 10bits - only one parameter can be selected which is shown as below: - \arg I2C_ADD_ADDFORMAT_7BITS: 7bits - \arg I2C_ADD_ADDFORMAT_10BITS: 10bits - \param[out] none - \retval none -*/ -void i2c_add_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_format) -{ - /* configure ADDRESS[7:1] and address format */ - address = address & I2C_ADD_ADDRESS_MASK; - I2C_ADD_SADDR0(i2c_add_periph) = (addr_format | address); - /* enable i2c address in slave mode */ - I2C_ADD_SADDR0(i2c_add_periph) |= I2C_ADD_SADDR0_ADDRESSEN; -} - -/*! - \brief define which bits of ADDRESS[7:1] need to compare with the incoming address byte - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] compare_bits: the bits need to compare - one or more parameters can be selected which are shown as below: - \arg ADDRESS_BIT1_COMPARE: address bit1 needs compare - \arg ADDRESS_BIT2_COMPARE: address bit2 needs compare - \arg ADDRESS_BIT3_COMPARE: address bit3 needs compare - \arg ADDRESS_BIT4_COMPARE: address bit4 needs compare - \arg ADDRESS_BIT5_COMPARE: address bit5 needs compare - \arg ADDRESS_BIT6_COMPARE: address bit6 needs compare - \arg ADDRESS_BIT7_COMPARE: address bit7 needs compare - \param[out] none - \retval none -*/ -void i2c_add_address_bit_compare_config(uint32_t i2c_add_periph, uint32_t compare_bits) -{ - I2C_ADD_CTL2(i2c_add_periph) &= ~I2C_ADD_CTL2_ADDM; - I2C_ADD_CTL2(i2c_add_periph) |= compare_bits; -} - -/*! - \brief disable i2c address in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_address_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_SADDR0(i2c_add_periph) &= ~I2C_ADD_SADDR0_ADDRESSEN; -} - -/*! - \brief configure i2c second slave address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] address: I2C address - \param[in] addr_mask: the bits not need to compare - one or more parameters can be selected which are shown as below: - \arg ADDRESS2_NO_MASK: no mask, all the bits must be compared - \arg ADDRESS2_MASK_BIT1: ADDRESS2[1] is masked, only ADDRESS2[7:2] are compared - \arg ADDRESS2_MASK_BIT1_2: ADDRESS2[2:1] is masked, only ADDRESS2[7:3] are compared - \arg ADDRESS2_MASK_BIT1_3: ADDRESS2[3:1] is masked, only ADDRESS2[7:4] are compared - \arg ADDRESS2_MASK_BIT1_4: ADDRESS2[4:1] is masked, only ADDRESS2[7:5] are compared - \arg ADDRESS2_MASK_BIT1_5: ADDRESS2[5:1] is masked, only ADDRESS2[7:6] are compared - \arg ADDRESS2_MASK_BIT1_6: ADDRESS2[6:1] is masked, only ADDRESS2[7] are compared - \arg ADDRESS2_MASK_ALL: all the ADDRESS2[7:1] bits are masked - \param[out] none - \retval none -*/ -void i2c_add_second_address_config(uint32_t i2c_add_periph, uint32_t address, uint32_t addr_mask) -{ - /* configure ADDRESS2[7:1] */ - address = address & I2C_ADD_ADDRESS2_MASK; - I2C_ADD_SADDR1(i2c_add_periph) |= address; - /* configure ADDRESS2[7:1] mask */ - I2C_ADD_SADDR1(i2c_add_periph) &= ~I2C_ADD_SADDR1_ADDMSK2; - I2C_ADD_SADDR1(i2c_add_periph) |= (uint32_t)(addr_mask << SADDR1_ADDMSK_OFFSET); - /* enable i2c second address in slave mode */ - I2C_ADD_SADDR1(i2c_add_periph) |= I2C_ADD_SADDR1_ADDRESS2EN; -} - -/*! - \brief disable i2c second address in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_second_address_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_SADDR1(i2c_add_periph) &= ~I2C_ADD_SADDR1_ADDRESS2EN; -} - -/*! - \brief get received match address in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval received match address -*/ -uint32_t i2c_add_recevied_address_get(uint32_t i2c_add_periph) -{ - return (uint32_t)((I2C_ADD_STAT(i2c_add_periph) & I2C_ADD_STAT_READDR) >> STAT_READDR_OFFSET); -} - -/*! - \brief enable slave byte control - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_slave_byte_control_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SBCTL; -} - -/*! - \brief disable slave byte control - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_slave_byte_control_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SBCTL; -} - -/*! - \brief generate a NACK in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_nack_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_NACKEN; -} - -/*! - \brief generate an ACK in slave mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_nack_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_NACKEN; -} - -/*! - \brief enable wakeup from deep-sleep mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_wakeup_from_deepsleep_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_WUEN; -} - -/*! - \brief disable wakeup from deep-sleep mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_wakeup_from_deepsleep_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_WUEN; -} - -/*! - \brief enable I2C - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_I2CEN; -} - -/*! - \brief disable I2C - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_I2CEN; -} - -/*! - \brief generate a START condition on I2C bus - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_start_on_bus(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_START; -} - -/*! - \brief generate a STOP condition on I2C bus - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_stop_on_bus(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_STOP; -} - -/*! - \brief I2C transmit data - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] data: data to be transmitted - \param[out] none - \retval none -*/ -void i2c_add_data_transmit(uint32_t i2c_add_periph, uint32_t data) -{ - I2C_ADD_TDATA(i2c_add_periph) = (I2C_ADD_TDATA_TDATA & data); -} - -/*! - \brief I2C receive data - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval received data -*/ -uint32_t i2c_add_data_receive(uint32_t i2c_add_periph) -{ - return (I2C_ADD_RDATA(i2c_add_periph) & I2C_ADD_RDATA_RDATA); -} - -/*! - \brief enable I2C reload mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_reload_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_RELOAD; -} - -/*! - \brief disable I2C reload mode - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_reload_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) &= ~I2C_ADD_CTL1_RELOAD; -} - -/*! - \brief configure number of bytes to be transferred - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] byte_number: 0x0-0xFF, number of bytes to be transferred - \param[out] none - \retval none -*/ -void i2c_add_transfer_byte_number_config(uint32_t i2c_add_periph, uint32_t byte_number) -{ - I2C_ADD_CTL1(i2c_add_periph) &= (uint32_t)(~I2C_ADD_CTL1_BYTENUM); - I2C_ADD_CTL1(i2c_add_periph) |= (uint32_t)(byte_number << CTL1_BYTENUM_OFFSET); -} - -/*! - \brief enable I2C DMA for transmission or reception - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] dma: I2C DMA - only one parameter can be selected which is shown as below: - \arg I2C_ADD_DMA_TRANSMIT: transmit data using DMA - \arg I2C_ADD_DMA_RECEIVE: receive data using DMA - \param[out] none - \retval none -*/ -void i2c_add_dma_enable(uint32_t i2c_add_periph, uint8_t dma) -{ - if(I2C_ADD_DMA_TRANSMIT == dma) { - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_DENT; - } else { - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_DENR; - } -} - -/*! - \brief disable I2C DMA for transmission or reception - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] dma: I2C DMA - only one parameter can be selected which is shown as below: - \arg I2C_ADD_DMA_TRANSMIT: transmit data using DMA - \arg I2C_ADD_DMA_RECEIVE: receive data using DMA - \param[out] none - \retval none -*/ -void i2c_add_dma_disable(uint32_t i2c_add_periph, uint8_t dma) -{ - if(I2C_ADD_DMA_TRANSMIT == dma) { - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_DENT; - } else { - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_DENR; - } -} - -/*! - \brief I2C transfers PEC value - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_pec_transfer(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL1(i2c_add_periph) |= I2C_ADD_CTL1_PECTRANS; -} - -/*! - \brief enable I2C PEC calculation - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_pec_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_PECEN; -} - -/*! - \brief disable I2C PEC calculation - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_pec_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_PECEN; -} - -/*! - \brief get packet error checking value - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval PEC value -*/ -uint32_t i2c_add_pec_value_get(uint32_t i2c_add_periph) -{ - return (I2C_ADD_PEC(i2c_add_periph) & I2C_ADD_PEC_PECV); -} - -/*! - \brief enable SMBus alert - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_alert_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBALTEN; -} - -/*! - \brief disable SMBus alert - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_alert_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBALTEN; -} - -/*! - \brief enable SMBus device default address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_default_addr_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBDAEN; -} - -/*! - \brief disable SMBus device default address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_default_addr_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBDAEN; -} - -/*! - \brief enable SMBus Host address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_host_addr_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) |= I2C_ADD_CTL0_SMBHAEN; -} - -/*! - \brief disable SMBus Host address - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] none - \param[out] none - \retval none -*/ -void i2c_add_smbus_host_addr_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~I2C_ADD_CTL0_SMBHAEN; -} - -/*! - \brief enable extended clock timeout detection - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_extented_clock_timeout_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) |= I2C_ADD_TIMEOUT_EXTOEN; -} - -/*! - \brief disable extended clock timeout detection - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_extented_clock_timeout_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_EXTOEN; -} - -/*! - \brief enable clock timeout detection - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_clock_timeout_enable(uint32_t i2c_add_periph) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) |= I2C_ADD_TIMEOUT_TOEN; -} - -/*! - \brief disable clock timeout detection - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[out] none - \retval none -*/ -void i2c_add_clock_timeout_disable(uint32_t i2c_add_periph) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_TOEN; -} - -/*! - \brief configure bus timeout B - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] timeout: bus timeout B - \param[out] none - \retval none -*/ -void i2c_add_bus_timeout_b_config(uint32_t i2c_add_periph, uint32_t timeout) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_BUSTOB; - I2C_ADD_TIMEOUT(i2c_add_periph) |= (uint32_t)(timeout << TIMEOUT_BUSTOB_OFFSET); -} - -/*! - \brief configure bus timeout A - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] timeout: bus timeout A - \param[out] none - \retval none -*/ -void i2c_add_bus_timeout_a_config(uint32_t i2c_add_periph, uint32_t timeout) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_BUSTOA; - I2C_ADD_TIMEOUT(i2c_add_periph) |= timeout; -} - -/*! - \brief configure idle clock timeout detection - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] timeout: bus timeout A - \arg BUSTOA_DETECT_SCL_LOW: BUSTOA is used to detect SCL low timeout - \arg BUSTOA_DETECT_IDLE: BUSTOA is used to detect both SCL and SDA high timeout when the bus is idle - \param[out] none - \retval none -*/ -void i2c_add_idle_clock_timeout_config(uint32_t i2c_add_periph, uint32_t timeout) -{ - I2C_ADD_TIMEOUT(i2c_add_periph) &= ~I2C_ADD_TIMEOUT_TOIDLE; - I2C_ADD_TIMEOUT(i2c_add_periph) |= timeout; -} - -/*! - \brief get I2C flag status - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] flag: I2C flags - only one parameter can be selected which is shown as below: - \arg I2C_ADD_FLAG_TBE: I2C_ADD_TDATA is empty during transmitting - \arg I2C_ADD_FLAG_TI: transmit interrupt - \arg I2C_ADD_FLAG_RBNE: I2C_ADD_RDATA is not empty during receiving - \arg I2C_ADD_FLAG_ADDSEND: address received matches in slave mode - \arg I2C_ADD_FLAG_NACK: not acknowledge flag - \arg I2C_ADD_FLAG_STPDET: STOP condition detected in slave mode - \arg I2C_ADD_FLAG_TC: transfer complete in master mode - \arg I2C_ADD_FLAG_TCR: transfer complete reload - \arg I2C_ADD_FLAG_BERR: bus error - \arg I2C_ADD_FLAG_LOSTARB: arbitration Lost - \arg I2C_ADD_FLAG_OUERR: overrun/underrun error in slave mode - \arg I2C_ADD_FLAG_PECERR: PEC error - \arg I2C_ADD_FLAG_TIMEOUT: timeout flag - \arg I2C_ADD_FLAG_SMBALT: SMBus Alert - \arg I2C_ADD_FLAG_I2CBSY: busy flag - \arg I2C_ADD_FLAG_TR: whether the I2C is a transmitter or a receiver in slave mode - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus i2c_add_flag_get(uint32_t i2c_add_periph, uint32_t flag) -{ - if(RESET != (I2C_ADD_STAT(i2c_add_periph) & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear I2C flag status - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] flag: I2C flags - one or more parameters can be selected which are shown as below: - \arg I2C_ADD_FLAG_ADDSEND: address received matches in slave mode - \arg I2C_ADD_FLAG_NACK: not acknowledge flag - \arg I2C_ADD_FLAG_STPDET: STOP condition detected in slave mode - \arg I2C_ADD_FLAG_BERR: bus error - \arg I2C_ADD_FLAG_LOSTARB: arbitration Lost - \arg I2C_ADD_FLAG_OUERR: overrun/underrun error in slave mode - \arg I2C_ADD_FLAG_PECERR: PEC error - \arg I2C_ADD_FLAG_TIMEOUT: timeout flag - \arg I2C_ADD_FLAG_SMBALT: SMBus Alert - \param[out] none - \retval none -*/ -void i2c_add_flag_clear(uint32_t i2c_add_periph, uint32_t flag) -{ - I2C_ADD_STATC(i2c_add_periph) |= flag; -} - -/*! - \brief enable I2C interrupt - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] interrupt: I2C interrupts - one or more parameters can be selected which are shown as below: - \arg I2C_ADD_INT_ERR: error interrupt - \arg I2C_ADD_INT_TC: transfer complete interrupt - \arg I2C_ADD_INT_STPDET: stop detection interrupt - \arg I2C_ADD_INT_NACK: not acknowledge received interrupt - \arg I2C_ADD_INT_ADDM: address match interrupt - \arg I2C_ADD_INT_RBNE: receive interrupt - \arg I2C_ADD_INT_TI: transmit interrupt - \param[out] none - \retval none -*/ -void i2c_add_interrupt_enable(uint32_t i2c_add_periph, uint32_t interrupt) -{ - I2C_ADD_CTL0(i2c_add_periph) |= interrupt; -} - -/*! - \brief disable I2C interrupt - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] interrupt: I2C interrupts - one or more parameters can be selected which are shown as below: - \arg I2C_ADD_INT_ERR: error interrupt - \arg I2C_ADD_INT_TC: transfer complete interrupt - \arg I2C_ADD_INT_STPDET: stop detection interrupt - \arg I2C_ADD_INT_NACK: not acknowledge received interrupt - \arg I2C_ADD_INT_ADDM: address match interrupt - \arg I2C_ADD_INT_RBNE: receive interrupt - \arg I2C_ADD_INT_TI: transmit interrupt - \param[out] none - \retval none -*/ -void i2c_add_interrupt_disable(uint32_t i2c_add_periph, uint32_t interrupt) -{ - I2C_ADD_CTL0(i2c_add_periph) &= ~interrupt; -} - -/*! - \brief get I2C interrupt flag status - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] int_flag: I2C interrupt flags, refer to i2c_add_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_ADD_INT_FLAG_TI: transmit interrupt flag - \arg I2C_ADD_INT_FLAG_RBNE: I2C_ADD_RDATA is not empty during receiving interrupt flag - \arg I2C_ADD_INT_FLAG_ADDSEND: address received matches in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_NACK: not acknowledge interrupt flag - \arg I2C_ADD_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_TC: transfer complete in master mode interrupt flag - \arg I2C_ADD_INT_FLAG_TCR: transfer complete reload interrupt flag - \arg I2C_ADD_INT_FLAG_BERR: bus error interrupt flag - \arg I2C_ADD_INT_FLAG_LOSTARB: arbitration lost interrupt flag - \arg I2C_ADD_INT_FLAG_OUERR: overrun/underrun error in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_PECERR: PEC error interrupt flag - \arg I2C_ADD_INT_FLAG_TIMEOUT: timeout interrupt flag - \arg I2C_ADD_INT_FLAG_SMBALT: SMBus Alert interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus i2c_add_interrupt_flag_get(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag) -{ - uint32_t ret1 = RESET; - uint32_t ret2 = RESET; - - /* get the status of interrupt enable bit */ - ret1 = (I2C_ADD_REG_VAL(i2c_add_periph, int_flag) & BIT(I2C_ADD_BIT_POS(int_flag))); - /* get the status of interrupt flag */ - ret2 = (I2C_ADD_REG_VAL2(i2c_add_periph, int_flag) & BIT(I2C_ADD_BIT_POS2(int_flag))); - if(ret1 && ret2) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear I2C interrupt flag status - \param[in] i2c_add_periph: I2Cx(x=3,4,5) - \param[in] int_flag: I2C interrupt flags, refer to i2c_add_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg I2C_ADD_INT_FLAG_ADDSEND: address received matches in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_NACK: not acknowledge interrupt flag - \arg I2C_ADD_INT_FLAG_STPDET: stop condition detected in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_BERR: bus error interrupt flag - \arg I2C_ADD_INT_FLAG_LOSTARB: arbitration lost interrupt flag - \arg I2C_ADD_INT_FLAG_OUERR: overrun/underrun error in slave mode interrupt flag - \arg I2C_ADD_INT_FLAG_PECERR: PEC error interrupt flag - \arg I2C_ADD_INT_FLAG_TIMEOUT: timeout interrupt flag - \arg I2C_ADD_INT_FLAG_SMBALT: SMBus Alert interrupt flag - \param[out] none - \retval none -*/ -void i2c_add_interrupt_flag_clear(uint32_t i2c_add_periph, i2c_add_interrupt_flag_enum int_flag) -{ - I2C_ADD_STATC(i2c_add_periph) |= BIT(I2C_ADD_BIT_POS2(int_flag)); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c deleted file mode 100644 index 96de074d9fe..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_ipa.c +++ /dev/null @@ -1,636 +0,0 @@ -/*! - \file gd32f5xx_ipa.c - \brief IPA driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_ipa.h" - -#define IPA_DEFAULT_VALUE 0x00000000U - -/*! - \brief deinitialize IPA registers - \param[in] none - \param[out] none - \retval none -*/ -void ipa_deinit(void) -{ - rcu_periph_reset_enable(RCU_IPARST); - rcu_periph_reset_disable(RCU_IPARST); -} - -/*! - \brief enable IPA transfer - \param[in] none - \param[out] none - \retval none -*/ -void ipa_transfer_enable(void) -{ - IPA_CTL |= IPA_CTL_TEN; -} - -/*! - \brief enable IPA transfer hang up - \param[in] none - \param[out] none - \retval none -*/ -void ipa_transfer_hangup_enable(void) -{ - IPA_CTL |= IPA_CTL_THU; -} - -/*! - \brief disable IPA transfer hang up - \param[in] none - \param[out] none - \retval none -*/ -void ipa_transfer_hangup_disable(void) -{ - IPA_CTL &= ~(IPA_CTL_THU); -} - -/*! - \brief enable IPA transfer stop - \param[in] none - \param[out] none - \retval none -*/ -void ipa_transfer_stop_enable(void) -{ - IPA_CTL |= IPA_CTL_TST; -} - -/*! - \brief disable IPA transfer stop - \param[in] none - \param[out] none - \retval none -*/ -void ipa_transfer_stop_disable(void) -{ - IPA_CTL &= ~(IPA_CTL_TST); -} -/*! - \brief enable IPA foreground LUT loading - \param[in] none - \param[out] none - \retval none -*/ -void ipa_foreground_lut_loading_enable(void) -{ - IPA_FPCTL |= IPA_FPCTL_FLLEN; -} - -/*! - \brief enable IPA background LUT loading - \param[in] none - \param[out] none - \retval none -*/ -void ipa_background_lut_loading_enable(void) -{ - IPA_BPCTL |= IPA_BPCTL_BLLEN; -} - -/*! - \brief set pixel format convert mode, the function is invalid when the IPA transfer is enabled - \param[in] pfcm: pixel format convert mode - only one parameter can be selected which is shown as below: - \arg IPA_FGTODE: foreground memory to destination memory without pixel format convert - \arg IPA_FGTODE_PF_CONVERT: foreground memory to destination memory with pixel format convert - \arg IPA_FGBGTODE: blending foreground and background memory to destination memory - \arg IPA_FILL_UP_DE: fill up destination memory with specific color - \param[out] none - \retval none -*/ -void ipa_pixel_format_convert_mode_set(uint32_t pfcm) -{ - IPA_CTL &= ~(IPA_CTL_PFCM); - IPA_CTL |= pfcm; -} - -/*! - \brief initialize the structure of IPA foreground parameter struct with the default values, it is - suggested that call this function after an ipa_foreground_parameter_struct structure is defined - \param[in] none - \param[out] foreground_struct: the data needed to initialize foreground - foreground_memaddr: foreground memory base address - foreground_lineoff: foreground line offset - foreground_prealpha: foreground pre-defined alpha value - foreground_alpha_algorithm: IPA_FG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 - foreground_pf: foreground pixel format(FOREGROUND_PPF_ARGB8888,FOREGROUND_PPF_RGB888,FOREGROUND_PPF_RGB565, - FOREGROUND_PPF_ARG1555,FOREGROUND_PPF_ARGB4444,FOREGROUND_PPF_L8,FOREGROUND_PPF_AL44, - FOREGROUND_PPF_AL88,FOREGROUND_PPF_L4,FOREGROUND_PPF_A8,FOREGROUND_PPF_A4) - foreground_prered: foreground pre-defined red value - foreground_pregreen: foreground pre-defined green value - foreground_preblue: foreground pre-defined blue value - \retval none -*/ -void ipa_foreground_struct_para_init(ipa_foreground_parameter_struct *foreground_struct) -{ - /* initialize the struct parameters with default values */ - foreground_struct->foreground_memaddr = IPA_DEFAULT_VALUE; - foreground_struct->foreground_lineoff = IPA_DEFAULT_VALUE; - foreground_struct->foreground_prealpha = IPA_DEFAULT_VALUE; - foreground_struct->foreground_alpha_algorithm = IPA_FG_ALPHA_MODE_0; - foreground_struct->foreground_pf = FOREGROUND_PPF_ARGB8888; - foreground_struct->foreground_prered = IPA_DEFAULT_VALUE; - foreground_struct->foreground_pregreen = IPA_DEFAULT_VALUE; - foreground_struct->foreground_preblue = IPA_DEFAULT_VALUE; -} - -/*! - \brief initialize foreground parameters - \param[in] foreground_struct: the data needed to initialize foreground - foreground_memaddr: foreground memory base address - foreground_lineoff: foreground line offset - foreground_prealpha: foreground pre-defined alpha value - foreground_alpha_algorithm: IPA_FG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 - foreground_pf: foreground pixel format(FOREGROUND_PPF_ARGB8888,FOREGROUND_PPF_RGB888,FOREGROUND_PPF_RGB565, - FOREGROUND_PPF_ARG1555,FOREGROUND_PPF_ARGB4444,FOREGROUND_PPF_L8,FOREGROUND_PPF_AL44, - FOREGROUND_PPF_AL88,FOREGROUND_PPF_L4,FOREGROUND_PPF_A8,FOREGROUND_PPF_A4) - foreground_prered: foreground pre-defined red value - foreground_pregreen: foreground pre-defined green value - foreground_preblue: foreground pre-defined blue value - \param[out] none - \retval none -*/ -void ipa_foreground_init(ipa_foreground_parameter_struct *foreground_struct) -{ - FlagStatus tempflag = RESET; - if(RESET != (IPA_CTL & IPA_CTL_TEN)) { - tempflag = SET; - /* reset the TEN in order to configure the following bits */ - IPA_CTL &= ~IPA_CTL_TEN; - } - - /* foreground memory base address configuration */ - IPA_FMADDR &= ~(IPA_FMADDR_FMADDR); - IPA_FMADDR = foreground_struct->foreground_memaddr; - /* foreground line offset configuration */ - IPA_FLOFF &= ~(IPA_FLOFF_FLOFF); - IPA_FLOFF = foreground_struct->foreground_lineoff; - /* foreground pixel format pre-defined alpha, alpha calculation algorithm configuration */ - IPA_FPCTL &= ~(IPA_FPCTL_FPDAV | IPA_FPCTL_FAVCA | IPA_FPCTL_FPF); - IPA_FPCTL |= (foreground_struct->foreground_prealpha << 24U); - IPA_FPCTL |= foreground_struct->foreground_alpha_algorithm; - IPA_FPCTL |= foreground_struct->foreground_pf; - /* foreground pre-defined red green blue configuration */ - IPA_FPV &= ~(IPA_FPV_FPDRV | IPA_FPV_FPDGV | IPA_FPV_FPDBV); - IPA_FPV |= ((foreground_struct->foreground_prered << 16U) | (foreground_struct->foreground_pregreen << 8U) - | (foreground_struct->foreground_preblue)); - - if(SET == tempflag) { - /* restore the state of TEN */ - IPA_CTL |= IPA_CTL_TEN; - } -} - -/*! - \brief initialize the structure of IPA background parameter struct with the default values, it is - suggested that call this function after an ipa_background_parameter_struct structure is defined - \param[in] none - \param[out] background_struct: the data needed to initialize background - background_memaddr: background memory base address - background_lineoff: background line offset - background_prealpha: background pre-defined alpha value - background_alpha_algorithm: IPA_BG_ALPHA_MODE_0,IPA_BG_ALPHA_MODE_1,IPA_BG_ALPHA_MODE_2 - background_pf: background pixel format(BACKGROUND_PPF_ARGB8888,BACKGROUND_PPF_RGB888,BACKGROUND_PPF_RGB565, - BACKGROUND_PPF_ARG1555,BACKGROUND_PPF_ARGB4444,BACKGROUND_PPF_L8,BACKGROUND_PPF_AL44, - BACKGROUND_PPF_AL88,BACKGROUND_PPF_L4,BACKGROUND_PPF_A8,BACKGROUND_PPF_A4) - background_prered: background pre-defined red value - background_pregreen: background pre-defined green value - background_preblue: background pre-defined blue value - \retval none -*/ -void ipa_background_struct_para_init(ipa_background_parameter_struct *background_struct) -{ - /* initialize the struct parameters with default values */ - background_struct->background_memaddr = IPA_DEFAULT_VALUE; - background_struct->background_lineoff = IPA_DEFAULT_VALUE; - background_struct->background_prealpha = IPA_DEFAULT_VALUE; - background_struct->background_alpha_algorithm = IPA_BG_ALPHA_MODE_0; - background_struct->background_pf = BACKGROUND_PPF_ARGB8888; - background_struct->background_prered = IPA_DEFAULT_VALUE; - background_struct->background_pregreen = IPA_DEFAULT_VALUE; - background_struct->background_preblue = IPA_DEFAULT_VALUE; -} - -/*! - \brief initialize background parameters - \param[in] background_struct: the data needed to initialize background - background_memaddr: background memory base address - background_lineoff: background line offset - background_prealpha: background pre-defined alpha value - background_alpha_algorithm: IPA_BG_ALPHA_MODE_0,IPA_FG_ALPHA_MODE_1,IPA_FG_ALPHA_MODE_2 - background_pf: background pixel format(BACKGROUND_PPF_ARGB8888,BACKGROUND_PPF_RGB888,BACKGROUND_PPF_RGB565, - BACKGROUND_PPF_ARG1555,BACKGROUND_PPF_ARGB4444,BACKGROUND_PPF_L8,BACKGROUND_PPF_AL44, - BACKGROUND_PPF_AL88,BACKGROUND_PPF_L4,BACKGROUND_PPF_A8,BACKGROUND_PPF_A4) - background_prered: background pre-defined red value - background_pregreen: background pre-defined green value - background_preblue: background pre-defined blue value - \param[out] none - \retval none -*/ -void ipa_background_init(ipa_background_parameter_struct *background_struct) -{ - FlagStatus tempflag = RESET; - if(RESET != (IPA_CTL & IPA_CTL_TEN)) { - tempflag = SET; - /* reset the TEN in order to configure the following bits */ - IPA_CTL &= ~IPA_CTL_TEN; - } - - /* background memory base address configuration */ - IPA_BMADDR &= ~(IPA_BMADDR_BMADDR); - IPA_BMADDR = background_struct->background_memaddr; - /* background line offset configuration */ - IPA_BLOFF &= ~(IPA_BLOFF_BLOFF); - IPA_BLOFF = background_struct->background_lineoff; - /* background pixel format pre-defined alpha, alpha calculation algorithm configuration */ - IPA_BPCTL &= ~(IPA_BPCTL_BPDAV | IPA_BPCTL_BAVCA | IPA_BPCTL_BPF); - IPA_BPCTL |= (background_struct->background_prealpha << 24U); - IPA_BPCTL |= background_struct->background_alpha_algorithm; - IPA_BPCTL |= background_struct->background_pf; - /* background pre-defined red green blue configuration */ - IPA_BPV &= ~(IPA_BPV_BPDRV | IPA_BPV_BPDGV | IPA_BPV_BPDBV); - IPA_BPV |= ((background_struct->background_prered << 16U) | (background_struct->background_pregreen << 8U) - | (background_struct->background_preblue)); - - if(SET == tempflag) { - /* restore the state of TEN */ - IPA_CTL |= IPA_CTL_TEN; - } -} - -/*! - \brief initialize the structure of IPA destination parameter struct with the default values, it is - suggested that call this function after an ipa_destination_parameter_struct structure is defined - \param[in] none - \param[out] destination_struct: the data needed to initialize destination parameter - destination_pf: IPA_DPF_ARGB8888,IPA_DPF_RGB888,IPA_DPF_RGB565,IPA_DPF_ARGB1555, - IPA_DPF_ARGB4444,refer to ipa_dpf_enum - destination_lineoff: destination line offset - destination_prealpha: destination pre-defined alpha value - destination_prered: destination pre-defined red value - destination_pregreen: destination pre-defined green value - destination_preblue: destination pre-defined blue value - destination_memaddr: destination memory base address - image_width: width of the image to be processed - image_height: height of the image to be processed - \retval none -*/ -void ipa_destination_struct_para_init(ipa_destination_parameter_struct *destination_struct) -{ - /* initialize the struct parameters with default values */ - destination_struct->destination_pf = IPA_DPF_ARGB8888; - destination_struct->destination_lineoff = IPA_DEFAULT_VALUE; - destination_struct->destination_prealpha = IPA_DEFAULT_VALUE; - destination_struct->destination_prered = IPA_DEFAULT_VALUE; - destination_struct->destination_pregreen = IPA_DEFAULT_VALUE; - destination_struct->destination_preblue = IPA_DEFAULT_VALUE; - destination_struct->destination_memaddr = IPA_DEFAULT_VALUE; - destination_struct->image_width = IPA_DEFAULT_VALUE; - destination_struct->image_height = IPA_DEFAULT_VALUE; -} - -/*! - \brief initialize destination parameters - \param[in] destination_struct: the data needed to initialize destination parameters - destination_pf: IPA_DPF_ARGB8888,IPA_DPF_RGB888,IPA_DPF_RGB565,IPA_DPF_ARGB1555, - IPA_DPF_ARGB4444,refer to ipa_dpf_enum - destination_lineoff: destination line offset - destination_prealpha: destination pre-defined alpha value - destination_prered: destination pre-defined red value - destination_pregreen: destination pre-defined green value - destination_preblue: destination pre-defined blue value - destination_memaddr: destination memory base address - image_width: width of the image to be processed - image_height: height of the image to be processed - \param[out] none - \retval none -*/ -void ipa_destination_init(ipa_destination_parameter_struct *destination_struct) -{ - uint32_t destination_pixelformat; - FlagStatus tempflag = RESET; - if(RESET != (IPA_CTL & IPA_CTL_TEN)) { - tempflag = SET; - /* reset the TEN in order to configure the following bits */ - IPA_CTL &= ~IPA_CTL_TEN; - } - - /* destination pixel format configuration */ - IPA_DPCTL &= ~(IPA_DPCTL_DPF); - IPA_DPCTL = destination_struct->destination_pf; - destination_pixelformat = destination_struct->destination_pf; - /* destination pixel format ARGB8888 */ - switch(destination_pixelformat) { - case IPA_DPF_ARGB8888: - IPA_DPV &= ~(IPA_DPV_DPDBV_0 | (IPA_DPV_DPDGV_0) | (IPA_DPV_DPDRV_0) | (IPA_DPV_DPDAV_0)); - IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 8U) - | (destination_struct->destination_prered << 16U) - | (destination_struct->destination_prealpha << 24U)); - break; - /* destination pixel format RGB888 */ - case IPA_DPF_RGB888: - IPA_DPV &= ~(IPA_DPV_DPDBV_1 | (IPA_DPV_DPDGV_1) | (IPA_DPV_DPDRV_1)); - IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 8U) - | (destination_struct->destination_prered << 16U)); - break; - /* destination pixel format RGB565 */ - case IPA_DPF_RGB565: - IPA_DPV &= ~(IPA_DPV_DPDBV_2 | (IPA_DPV_DPDGV_2) | (IPA_DPV_DPDRV_2)); - IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 5U) - | (destination_struct->destination_prered << 11U)); - break; - /* destination pixel format ARGB1555 */ - case IPA_DPF_ARGB1555: - IPA_DPV &= ~(IPA_DPV_DPDBV_3 | (IPA_DPV_DPDGV_3) | (IPA_DPV_DPDRV_3) | (IPA_DPV_DPDAV_3)); - IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 5U) - | (destination_struct->destination_prered << 10U) - | (destination_struct->destination_prealpha << 15U)); - break; - /* destination pixel format ARGB4444 */ - case IPA_DPF_ARGB4444: - IPA_DPV &= ~(IPA_DPV_DPDBV_4 | (IPA_DPV_DPDGV_4) | (IPA_DPV_DPDRV_4) | (IPA_DPV_DPDAV_4)); - IPA_DPV = (destination_struct->destination_preblue | (destination_struct->destination_pregreen << 4U) - | (destination_struct->destination_prered << 8U) - | (destination_struct->destination_prealpha << 12U)); - break; - default: - break; - } - /* destination memory base address configuration */ - IPA_DMADDR &= ~(IPA_DMADDR_DMADDR); - IPA_DMADDR = destination_struct->destination_memaddr; - /* destination line offset configuration */ - IPA_DLOFF &= ~(IPA_DLOFF_DLOFF); - IPA_DLOFF = destination_struct->destination_lineoff; - /* image size configuration */ - IPA_IMS &= ~(IPA_IMS_HEIGHT | IPA_IMS_WIDTH); - IPA_IMS |= ((destination_struct->image_width << 16U) | (destination_struct->image_height)); - - if(SET == tempflag) { - /* restore the state of TEN */ - IPA_CTL |= IPA_CTL_TEN; - } -} - -/*! - \brief initialize IPA foreground LUT parameters - \param[in] fg_lut_num: foreground LUT number of pixel - \param[in] fg_lut_pf: foreground LUT pixel format(IPA_LUT_PF_ARGB8888, IPA_LUT_PF_RGB888) - \param[in] fg_lut_addr: foreground LUT memory base address - \param[out] none - \retval none -*/ -void ipa_foreground_lut_init(uint8_t fg_lut_num, uint8_t fg_lut_pf, uint32_t fg_lut_addr) -{ - FlagStatus tempflag = RESET; - if(RESET != (IPA_FPCTL & IPA_FPCTL_FLLEN)) { - tempflag = SET; - /* reset the FLLEN in order to configure the following bits */ - IPA_FPCTL &= ~IPA_FPCTL_FLLEN; - } - - /* foreground LUT number of pixel configuration */ - IPA_FPCTL |= ((uint32_t)fg_lut_num << 8U); - /* foreground LUT pixel format configuration */ - if(IPA_LUT_PF_RGB888 == fg_lut_pf) { - IPA_FPCTL |= IPA_FPCTL_FLPF; - } else { - IPA_FPCTL &= ~(IPA_FPCTL_FLPF); - } - /* foreground LUT memory base address configuration */ - IPA_FLMADDR &= ~(IPA_FLMADDR_FLMADDR); - IPA_FLMADDR = fg_lut_addr; - - if(SET == tempflag) { - /* restore the state of FLLEN */ - IPA_FPCTL |= IPA_FPCTL_FLLEN; - } -} - -/*! - \brief initialize IPA background LUT parameters - \param[in] bg_lut_num: background LUT number of pixel - \param[in] bg_lut_pf: background LUT pixel format(IPA_LUT_PF_ARGB8888, IPA_LUT_PF_RGB888) - \param[in] bg_lut_addr: background LUT memory base address - \param[out] none - \retval none -*/ -void ipa_background_lut_init(uint8_t bg_lut_num, uint8_t bg_lut_pf, uint32_t bg_lut_addr) -{ - FlagStatus tempflag = RESET; - if(RESET != (IPA_BPCTL & IPA_BPCTL_BLLEN)) { - tempflag = SET; - /* reset the BLLEN in order to configure the following bits */ - IPA_BPCTL &= ~IPA_BPCTL_BLLEN; - } - - /* background LUT number of pixel configuration */ - IPA_BPCTL |= ((uint32_t)bg_lut_num << 8U); - /* background LUT pixel format configuration */ - if(IPA_LUT_PF_RGB888 == bg_lut_pf) { - IPA_BPCTL |= IPA_BPCTL_BLPF; - } else { - IPA_BPCTL &= ~(IPA_BPCTL_BLPF); - } - /* background LUT memory base address configuration */ - IPA_BLMADDR &= ~(IPA_BLMADDR_BLMADDR); - IPA_BLMADDR = bg_lut_addr; - - if(SET == tempflag) { - /* restore the state of BLLEN */ - IPA_BPCTL |= IPA_BPCTL_BLLEN; - } -} - -/*! - \brief configure IPA line mark - \param[in] line_num: line number - \param[out] none - \retval none -*/ -void ipa_line_mark_config(uint16_t line_num) -{ - IPA_LM &= ~(IPA_LM_LM); - IPA_LM = line_num; -} - -/*! - \brief inter-timer enable or disable - \param[in] timer_cfg: IPA_INTER_TIMER_ENABLE,IPA_INTER_TIMER_DISABLE - \param[out] none - \retval none -*/ -void ipa_inter_timer_config(uint8_t timer_cfg) -{ - if(IPA_INTER_TIMER_ENABLE == timer_cfg) { - IPA_ITCTL |= IPA_ITCTL_ITEN; - } else { - IPA_ITCTL &= ~(IPA_ITCTL_ITEN); - } -} - -/*! - \brief configure the number of clock cycles interval - \param[in] clk_num: the number of clock cycles - \param[out] none - \retval none -*/ -void ipa_interval_clock_num_config(uint8_t clk_num) -{ - /* NCCI[7:0] bits have no meaning if ITEN is '0' */ - IPA_ITCTL &= ~(IPA_ITCTL_NCCI); - IPA_ITCTL |= ((uint32_t)clk_num << 8U); -} - -/*! - \brief get IPA flag status in IPA_INTF register - \param[in] flag: IPA flags - one or more parameters can be selected which are shown as below: - \arg IPA_FLAG_TAE: transfer access error interrupt flag - \arg IPA_FLAG_FTF: full transfer finish interrupt flag - \arg IPA_FLAG_TLM: transfer line mark interrupt flag - \arg IPA_FLAG_LAC: LUT access conflict interrupt flag - \arg IPA_FLAG_LLF: LUT loading finish interrupt flag - \arg IPA_FLAG_WCF: wrong configuration interrupt flag - \param[out] none - \retval none -*/ -FlagStatus ipa_flag_get(uint32_t flag) -{ - if(RESET != (IPA_INTF & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear IPA flag in IPA_INTF register - \param[in] flag: IPA flags - one or more parameters can be selected which are shown as below: - \arg IPA_FLAG_TAE: transfer access error interrupt flag - \arg IPA_FLAG_FTF: full transfer finish interrupt flag - \arg IPA_FLAG_TLM: transfer line mark interrupt flag - \arg IPA_FLAG_LAC: LUT access conflict interrupt flag - \arg IPA_FLAG_LLF: LUT loading finish interrupt flag - \arg IPA_FLAG_WCF: wrong configuration interrupt flag - \param[out] none - \retval none -*/ -void ipa_flag_clear(uint32_t flag) -{ - IPA_INTC |= (flag); -} - -/*! - \brief enable IPA interrupt - \param[in] int_flag: IPA interrupt flags - one or more parameters can be selected which are shown as below: - \arg IPA_INT_TAE: transfer access error interrupt - \arg IPA_INT_FTF: full transfer finish interrupt - \arg IPA_INT_TLM: transfer line mark interrupt - \arg IPA_INT_LAC: LUT access conflict interrupt - \arg IPA_INT_LLF: LUT loading finish interrupt - \arg IPA_INT_WCF: wrong configuration interrupt - \param[out] none - \retval none -*/ -void ipa_interrupt_enable(uint32_t int_flag) -{ - IPA_CTL |= (int_flag); -} - -/*! - \brief disable IPA interrupt - \param[in] int_flag: IPA interrupt flags - one or more parameters can be selected which are shown as below: - \arg IPA_INT_TAE: transfer access error interrupt - \arg IPA_INT_FTF: full transfer finish interrupt - \arg IPA_INT_TLM: transfer line mark interrupt - \arg IPA_INT_LAC: LUT access conflict interrupt - \arg IPA_INT_LLF: LUT loading finish interrupt - \arg IPA_INT_WCF: wrong configuration interrupt - \param[out] none - \retval none -*/ -void ipa_interrupt_disable(uint32_t int_flag) -{ - IPA_CTL &= ~(int_flag); -} - -/*! - \brief get IPA interrupt flag - \param[in] int_flag: IPA interrupt flag flags - one or more parameters can be selected which are shown as below: - \arg IPA_INT_FLAG_TAE: transfer access error interrupt flag - \arg IPA_INT_FLAG_FTF: full transfer finish interrupt flag - \arg IPA_INT_FLAG_TLM: transfer line mark interrupt flag - \arg IPA_INT_FLAG_LAC: LUT access conflict interrupt flag - \arg IPA_INT_FLAG_LLF: LUT loading finish interrupt flag - \arg IPA_INT_FLAG_WCF: wrong configuration interrupt flag - \param[out] none - \retval none -*/ -FlagStatus ipa_interrupt_flag_get(uint32_t int_flag) -{ - if(0U != (IPA_INTF & int_flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear IPA interrupt flag - \param[in] int_flag: IPA interrupt flag flags - one or more parameters can be selected which are shown as below: - \arg IPA_INT_FLAG_TAE: transfer access error interrupt flag - \arg IPA_INT_FLAG_FTF: full transfer finish interrupt flag - \arg IPA_INT_FLAG_TLM: transfer line mark interrupt flag - \arg IPA_INT_FLAG_LAC: LUT access conflict interrupt flag - \arg IPA_INT_FLAG_LLF: LUT loading finish interrupt flag - \arg IPA_INT_FLAG_WCF: wrong configuration interrupt flag - \param[out] none - \retval none -*/ -void ipa_interrupt_flag_clear(uint32_t int_flag) -{ - IPA_INTC |= (int_flag); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c deleted file mode 100644 index ce139fb14f7..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_iref.c +++ /dev/null @@ -1,124 +0,0 @@ -/*! - \file gd32f5xx_iref.c - \brief IREF driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_iref.h" - -/*! - \brief deinitialize IREF - \param[in] none - \param[out] none - \retval none -*/ -void iref_deinit(void) -{ - rcu_periph_reset_enable(RCU_IREFRST); - rcu_periph_reset_disable(RCU_IREFRST); -} - -/*! - \brief enable IREF - \param[in] none - \param[out] none - \retval none -*/ -void iref_enable(void) -{ - IREF_CTL |= IREF_CTL_CREN; -} - -/*! - \brief disable IREF - \param[in] none - \param[out] none - \retval none -*/ -void iref_disable(void) -{ - IREF_CTL &= ~IREF_CTL_CREN; -} - -/*! - \brief set IREF mode - \param[in] step - \arg IREF_MODE_LOW_POWER: 1uA step - \arg IREF_MODE_HIGH_CURRENT: 8uA step - \param[out] none - \retval none -*/ -void iref_mode_set(uint32_t step) -{ - IREF_CTL &= ~IREF_CTL_SSEL; - IREF_CTL |= step; -} - -/*! - \brief set IREF current precision trim value - \param[in] precisiontrim - \arg IREF_CUR_PRECISION_TRIM_X(x=0..31): (-15+ x)% - \param[out] none - \retval none -*/ -void iref_precision_trim_value_set(uint32_t precisiontrim) -{ - IREF_CTL &= ~IREF_CTL_CPT; - IREF_CTL |= precisiontrim; -} - -/*! - \brief set IREF sink current mode - \param[in] sinkmode - \arg IREF_SOURCE_CURRENT : source current. - \arg IREF_SINK_CURRENT: sink current - \param[out] none - \retval none -*/ -void iref_sink_set(uint32_t sinkmode) -{ - IREF_CTL &= ~IREF_CTL_SCMOD; - IREF_CTL |= sinkmode; -} - -/*! - \brief set IREF step data - \param[in] stepdata - \arg IREF_CUR_STEP_DATA_X:(x=0..63): step*x - \param[out] none - \retval none -*/ - -void iref_step_data_config(uint32_t stepdata) -{ - IREF_CTL &= ~IREF_CTL_CSDT; - IREF_CTL |= stepdata; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c deleted file mode 100644 index 1c4f51d5162..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c +++ /dev/null @@ -1,184 +0,0 @@ -/*! - \file gd32f5xx_misc.c - \brief MISC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_misc.h" - -/*! - \brief set the priority group - \param[in] nvic_prigroup: the NVIC priority group - \arg NVIC_PRIGROUP_PRE0_SUB4:0 bits for pre-emption priority 4 bits for subpriority - \arg NVIC_PRIGROUP_PRE1_SUB3:1 bits for pre-emption priority 3 bits for subpriority - \arg NVIC_PRIGROUP_PRE2_SUB2:2 bits for pre-emption priority 2 bits for subpriority - \arg NVIC_PRIGROUP_PRE3_SUB1:3 bits for pre-emption priority 1 bits for subpriority - \arg NVIC_PRIGROUP_PRE4_SUB0:4 bits for pre-emption priority 0 bits for subpriority - \param[out] none - \retval none -*/ -void nvic_priority_group_set(uint32_t nvic_prigroup) -{ - /* set the priority group value */ - SCB->AIRCR = NVIC_AIRCR_VECTKEY_MASK | nvic_prigroup; -} - -/*! - \brief enable NVIC interrupt request - \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type - \param[in] nvic_irq_pre_priority: the pre-emption priority needed to set - \param[in] nvic_irq_sub_priority: the subpriority needed to set - \param[out] none - \retval none -*/ -void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, - uint8_t nvic_irq_sub_priority) -{ - uint32_t temp_priority = 0x00U, temp_pre = 0x00U, temp_sub = 0x00U; - /* use the priority group value to get the temp_pre and the temp_sub */ - if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE0_SUB4) { - temp_pre = 0x0U; - temp_sub = 0x4U; - } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE1_SUB3) { - temp_pre = 0x1U; - temp_sub = 0x3U; - } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE2_SUB2) { - temp_pre = 0x2U; - temp_sub = 0x2U; - } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE3_SUB1) { - temp_pre = 0x3U; - temp_sub = 0x1U; - } else if(((SCB->AIRCR) & (uint32_t)0x700U) == NVIC_PRIGROUP_PRE4_SUB0) { - temp_pre = 0x4U; - temp_sub = 0x0U; - } else { - nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); - temp_pre = 0x2U; - temp_sub = 0x2U; - } - /* get the temp_priority to fill the NVIC->IP register */ - temp_priority = (uint32_t)nvic_irq_pre_priority << (0x4U - temp_pre); - temp_priority |= nvic_irq_sub_priority & (0x0FU >> (0x4U - temp_sub)); - temp_priority = temp_priority << 0x04U; - NVIC->IPR[nvic_irq] = (uint8_t)temp_priority; - /* enable the selected IRQ */ - NVIC->ISER[nvic_irq >> 0x05U] = (uint32_t)0x01U << (nvic_irq & (uint8_t)0x1FU); -} - -/*! - \brief disable NVIC interrupt request - \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type - \param[out] none - \retval none -*/ -void nvic_irq_disable(uint8_t nvic_irq) -{ - /* disable the selected IRQ.*/ - NVIC->ICER[nvic_irq >> 0x05] = (uint32_t)0x01 << (nvic_irq & (uint8_t)0x1F); -} - -/*! - \brief initiates a system reset request to reset the MCU - \param[in] none - \param[out] none - \retval none -*/ -void nvic_system_reset(void) -{ - NVIC_SystemReset(); -} - -/*! - \brief set the NVIC vector table base address - \param[in] nvic_vict_tab: the RAM or FLASH base address - \arg NVIC_VECTTAB_RAM: RAM base address - \are NVIC_VECTTAB_FLASH: Flash base address - \param[in] offset: Vector Table offset - \param[out] none - \retval none -*/ -void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset) -{ - SCB->VTOR = nvic_vict_tab | (offset & NVIC_VECTTAB_OFFSET_MASK); - __DSB(); -} - -/*! - \brief set the state of the low power mode - \param[in] lowpower_mode: the low power mode state - \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system always enter low power - mode by exiting from ISR - \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the DEEPSLEEP mode - \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode can be woke up - by all the enable and disable interrupts - \param[out] none - \retval none -*/ -void system_lowpower_set(uint8_t lowpower_mode) -{ - SCB->SCR |= (uint32_t)lowpower_mode; -} - -/*! - \brief reset the state of the low power mode - \param[in] lowpower_mode: the low power mode state - \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system will exit low power - mode by exiting from ISR - \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the SLEEP mode - \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode only can be - woke up by the enable interrupts - \param[out] none - \retval none -*/ -void system_lowpower_reset(uint8_t lowpower_mode) -{ - SCB->SCR &= (~(uint32_t)lowpower_mode); -} - -/*! - \brief set the systick clock source - \param[in] systick_clksource: the systick clock source needed to choose - \arg SYSTICK_CLKSOURCE_HCLK: systick clock source is from HCLK - \arg SYSTICK_CLKSOURCE_HCLK_DIV8: systick clock source is from HCLK/8 - \param[out] none - \retval none -*/ - -void systick_clksource_set(uint32_t systick_clksource) -{ - if(SYSTICK_CLKSOURCE_HCLK == systick_clksource) { - /* set the systick clock source from HCLK */ - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } else { - /* set the systick clock source from HCLK/8 */ - SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c deleted file mode 100644 index aa07d5de682..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pkcau.c +++ /dev/null @@ -1,1270 +0,0 @@ -/*! - \file gd32f5xx_pkcau.c - \brief PKCAU driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_pkcau.h" - -/* read result from PKCAU RAM */ -static void pkcau_memcpy_value(uint32_t offset, uint32_t value); -/* copy operand with EOS or ROS to PKCAU RAM */ -static void pkcau_memcpy_operand(uint32_t offset, const uint8_t operand[], uint32_t size); -/* read result from PKCAU RAM */ -static void pkcau_memread(uint32_t offset, uint8_t buf[], uint32_t size); - -/*! - \brief reset PKCAU - \param[in] none - \param[out] none - \retval none -*/ -void pkcau_deinit(void) -{ - rcu_periph_reset_enable(RCU_PKCAURST); - rcu_periph_reset_disable(RCU_PKCAURST); -} - -/*! - \brief initialize montgomery parameter structure with a default value - \param[in] none - \param[out] init_para: initialize montgomery parameter struct - \retval none -*/ -void pkcau_mont_struct_para_init(pkcau_mont_parameter_struct *init_para) -{ - /* initialize the member of montgomery parameter structure with the default value */ - init_para->modulus_n = 0U; - init_para->modulus_n_len = 0U; -} - -/*! - \brief initialize modular parameter structure with a default value - \param[in] none - \param[out] init_para: initialize modular parameter struct - \retval none -*/ -void pkcau_mod_struct_para_init(pkcau_mod_parameter_struct *init_para) -{ - /* initialize the member of modular parameter structure with the default value */ - init_para->oprd_a = 0U; - init_para->oprd_a_len = 0U; - init_para->oprd_b = 0U; - init_para->oprd_b_len = 0U; - init_para->modulus_n = 0U; - init_para->modulus_n_len = 0U; -} - -/*! - \brief initialize modular exponentiation parameter structure with a default value - \param[in] none - \param[out] init_para: initialize modular exponentiation parameter struct - \retval none -*/ -void pkcau_mod_exp_struct_para_init(pkcau_mod_exp_parameter_struct *init_para) -{ - /* initialize the member of modular exponentiation parameter structure with the default value */ - init_para->oprd_a = 0U; - init_para->oprd_a_len = 0U; - init_para->exp_e = 0U; - init_para->e_len = 0U; - init_para->modulus_n = 0U; - init_para->modulus_n_len = 0U; - init_para->mont_para = 0U; - init_para->mont_para_len = 0U; -} - -/*! - \brief initialize arithmetic parameter structure with a default value - \param[in] none - \param[out] init_para: initialize arithmetic parameter struct - \retval none -*/ -void pkcau_arithmetic_struct_para_init(pkcau_arithmetic_parameter_struct *init_para) -{ - /* initialize the member of arithmetic parameter structure with the default value */ - init_para->oprd_a = 0U; - init_para->oprd_a_len = 0U; - init_para->oprd_b = 0U; - init_para->oprd_b_len = 0U; -} - -/*! - \brief initialize CRT parameter structure with a default value - \param[in] none - \param[out] init_para: initialize CRT parameter struct - \retval none -*/ -void pkcau_crt_struct_para_init(pkcau_crt_parameter_struct *init_para) -{ - /* initialize the member of arithmetic parameter structure with the default value */ - init_para->oprd_a = 0U; - init_para->oprd_a_len = 0U; - init_para->oprd_dp = 0U; - init_para->oprd_dp_len = 0U; - init_para->oprd_dq = 0U; - init_para->oprd_dq_len = 0U; - init_para->oprd_qinv = 0U; - init_para->oprd_qinv_len = 0U; - init_para->oprd_p = 0U; - init_para->oprd_p_len = 0U; - init_para->oprd_q = 0U; - init_para->oprd_q_len = 0U; -} - -/*! - \brief initialize ECC curve parameter structure with a default value - \param[in] none - \param[out] init_para: initialize ECC curve parameter struct - \retval none -*/ -void pkcau_ec_group_struct_para_init(pkcau_ec_group_parameter_struct *init_para) -{ - /* initialize the member of ECC curve parameter structure with the default value */ - init_para->modulus_p = 0U; - init_para->modulus_p_len = 0U; - init_para->coff_a = 0U; - init_para->coff_a_len = 0U; - init_para->coff_b = 0U; - init_para->coff_b_len = 0U; - init_para->base_point_x = 0U; - init_para->base_point_x_len = 0U; - init_para->base_point_y = 0U; - init_para->base_point_y_len = 0U; - init_para->order_n = 0U; - init_para->order_n_len = 0U; - init_para->a_sign = 0U; - init_para->multi_k = 0U; - init_para->multi_k_len = 0U; - init_para->integer_k = 0U; - init_para->integer_k_len = 0U; - init_para->private_key_d = 0U; - init_para->private_key_d_len = 0U; - init_para->mont_para = 0U; - init_para->mont_para_len = 0U; -} - -/*! - \brief initialize point parameter structure with a default value - \param[in] none - \param[out] init_para: initialize point parameter struct - \retval none -*/ -void pkcau_point_struct_para_init(pkcau_point_parameter_struct *init_para) -{ - /* initialize the member of point parameter structure with the default value */ - init_para->point_x = 0U; - init_para->point_x_len = 0U; - init_para->point_y = 0U; - init_para->point_y_len = 0U; -} - -/*! - \brief initialize signature parameter structure with a default value - \param[in] none - \param[out] init_para: initialize signature parameter struct - \retval none -*/ -void pkcau_signature_struct_para_init(pkcau_signature_parameter_struct *init_para) -{ - /* initialize the member of signature parameter structure with the default value */ - init_para->sign_r = 0U; - init_para->sign_r_len = 0U; - init_para->sign_s = 0U; - init_para->sign_s_len = 0U; -} - -/*! - \brief initialize hash parameter structure with a default value - \param[in] none - \param[out] init_para: initialize hash parameter struct - \retval none -*/ -void pkcau_hash_struct_para_init(pkcau_hash_parameter_struct *init_para) -{ - /* initialize the member of hash parameter structure with the default value */ - init_para->hash_z = 0U; - init_para->hash_z_len = 0U; -} - -/*! - \brief initialize ECC out parameter structure with a default value - \param[in] none - \param[out] init_para: initialize ECC out parameter struct - \retval none -*/ -void pkcau_ecc_out_struct_para_init(pkcau_ecc_out_struct *init_para) -{ - /* initialize ecc output parameter structure with a default value */ - init_para->sign_extra = 0U; - init_para->point_x = 0U; - init_para->point_y = 0U; - init_para->sign_r = 0U; - init_para->sign_s = 0U; -} - -/*! - \brief enable PKCAU - \param[in] none - \param[out] none - \retval none -*/ -void pkcau_enable(void) -{ - PKCAU_CTL |= PKCAU_CTL_PKCAUEN; -} - -/*! - \brief disable PKCAU - \param[in] none - \param[out] none - \retval none -*/ -void pkcau_disable(void) -{ - PKCAU_CTL &= ~PKCAU_CTL_PKCAUEN; -} - -/*! - \brief start operation - \param[in] none - \param[out] none - \retval none -*/ -void pkcau_start(void) -{ - PKCAU_CTL |= PKCAU_CTL_START; -} - -/*! - \brief configure the PKCAU operation mode - \param[in] mode: PKCAU operation mode - only one parameter can be selected which is shown as below: - \arg PKCAU_MODE_MOD_EXP: Montgomery parameter computation then modular exponentiation - \arg PKCAU_MODE_MONT_PARAM: Montgomery parameter computation only - \arg PKCAU_MODE_MOD_EXP_FAST: modular exponentiation only - \arg PKCAU_MODE_CRT_EXP: RSA CRT exponentiation - \arg PKCAU_MODE_MOD_INVERSION: modular inversion - \arg PKCAU_MODE_ARITHMETIC_ADD: arithmetic addition - \arg PKCAU_MODE_ARITHMETIC_SUB: arithmetic subtraction - \arg PKCAU_MODE_ARITHMETIC_MUL: arithmetic multiplication - \arg PKCAU_MODE_ARITHMETIC_COMP: arithmetic comparison - \arg PKCAU_MODE_MOD_REDUCTION: modular reduction - \arg PKCAU_MODE_MOD_ADD: modular addition - \arg PKCAU_MODE_MOD_SUB: modular subtraction - \arg PKCAU_MODE_MONT_MUL: Montgomery multiplication - \arg PKCAU_MODE_ECC_MUL: Montgomery parameter computation then ECC scalar multiplication - \arg PKCAU_MODE_ECC_MUL_FAST: ECC scalar multiplication only - \arg PKCAU_MODE_ECDSA_SIGN: ECDSA sign - \arg PKCAU_MODE_ECDSA_VERIFICATION: ECDSA verification - \arg PKCAU_MODE_POINT_CHECK: point on elliptic curve Fp check - \retval none -*/ -void pkcau_mode_set(uint32_t mode) -{ - PKCAU_CTL &= ~PKCAU_CTL_MODESEL; - PKCAU_CTL |= mode; -} - -/*! - \brief execute montgomery parameter operation - This function can only be used when interrupt is not enabled - \param[in] mont_para: PKCAU montgomery parameter struct - modulus_n: modulus value n - modulus_n_len: modulus length in byte - \param[out] results: output buffer - \retval none -*/ -void pkcau_mont_param_operation(pkcau_mont_parameter_struct *mont_para, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (mont_para->modulus_n_len << 3)); - - /* write the modulus value n to PKCAU RAM */ - pkcau_memcpy_operand(0x00000D5CU, mont_para->modulus_n, mont_para->modulus_n_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_MONT_PARAM); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x594U, (uint8_t *)results, mont_para->modulus_n_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute modular operation, include modular addition, modular subtraction and montgomery multiplication - This function can only be used when interrupt is not enabled - \param[in] mod_para: PKCAU modular parameter struct - oprd_a: operand A - oprd_a_len: operand A length in byte - oprd_b: operand B - oprd_b_len: operand B length in byte - modulus_n: modulus value n - modulus_n_len: modulus length in byte - \param[in] mode: modular operation mode - only one parameter can be selected which is shown as below: - \arg PKCAU_MODE_MOD_ADD: modular addition - \arg PKCAU_MODE_MOD_SUB: modular subtraction - \arg PKCAU_MODE_MONT_MUL: Montgomery multiplication - \param[out] results: output buffer - \retval none -*/ -void pkcau_mod_operation(pkcau_mod_parameter_struct *mod_para, uint32_t mode, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (mod_para->modulus_n_len << 3)); - - /* write the operand A, operand B and modulus value n to PKCAU RAM */ - pkcau_memcpy_operand(0x000008B4U, mod_para->oprd_a, mod_para->oprd_a_len); - pkcau_memcpy_operand(0x00000A44U, mod_para->oprd_b, mod_para->oprd_b_len); - pkcau_memcpy_operand(0x00000D5CU, mod_para->modulus_n, mod_para->modulus_n_len); - /* configure the operation mode */ - pkcau_mode_set(mode); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0xBD0U, (uint8_t *)results, mod_para->modulus_n_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute modular exponentiation operation - This function can only be used when interrupt is not enabled - \param[in] mod_exp_para: PKCAU exponentiation parameter struct for fast mode - oprd_a: operand A - oprd_a_len: operand A length in byte - exp_e: exponent e - e_len: exponent length in byte - modulus_n: modulus value n - modulus_n_len: modulus length in byte - mont_para: exponentiation parameter R2 mod n - mont_para_len: montgomery parameter length in byte - \param[in] mode: modular exponentiation operation mode - only one parameter can be selected which is shown as below: - \arg PKCAU_MODE_MOD_EXP_FAST: montgomery parameter computation then modular exponentiation - \arg PKCAU_MODE_MOD_EXP: modular exponentiation only - \param[out] results: output buffer - \retval none -*/ -void pkcau_mod_exp_operation(pkcau_mod_exp_parameter_struct *mod_exp_para, uint32_t mode, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the exponent length and modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000400U, (mod_exp_para->e_len << 3)); - pkcau_memcpy_value(0x00000404U, (mod_exp_para->modulus_n_len << 3)); - - /* write the operand A, exponent e and modulus value n to PKCAU RAM */ - pkcau_memcpy_operand(0x00000A44U, mod_exp_para->oprd_a, mod_exp_para->oprd_a_len); - pkcau_memcpy_operand(0x00000BD0U, mod_exp_para->exp_e, mod_exp_para->e_len); - pkcau_memcpy_operand(0x00000D5CU, mod_exp_para->modulus_n, mod_exp_para->modulus_n_len); - /* write the montgomery parameter to PKCAU RAM */ - if(mode == PKCAU_MODE_MOD_EXP_FAST) { - pkcau_memcpy_operand(0x00000594U, mod_exp_para->mont_para, mod_exp_para->mont_para_len); - } - /* configure the operation mode */ - pkcau_mode_set(mode); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x724U, (uint8_t *)results, mod_exp_para->modulus_n_len); - - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute modular inversion operation - This function can only be used when interrupt is not enabled - \param[in] mod_inver_para: PKCAU modular inversion parameter struct - oprd_a: operand A - oprd_a_len: operand A length in byte - modulus_n: modulus value n - modulus_n_len: modulus length in byte - \param[out] results: output buffer - \retval none -*/ -void pkcau_mod_inver_operation(pkcau_mod_parameter_struct *mod_inver_para, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (mod_inver_para->modulus_n_len) << 3); - - /* write the operand A and modulus value n to PKCAU RAM */ - pkcau_memcpy_operand(0x000008B4U, mod_inver_para->oprd_a, mod_inver_para->oprd_a_len); - pkcau_memcpy_operand(0x00000A44U, mod_inver_para->modulus_n, mod_inver_para->modulus_n_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_MOD_INVERSION); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0xBD0U, (uint8_t *)results, mod_inver_para->modulus_n_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute modular reduction operation - This function can only be used when interrupt is not enabled - \param[in] mod_reduc_para: PKCAU modular reduction parameter struct - oprd_a: operand A - oprd_a_len: length of operand A in byte - modulus_n: modulus value n - modulus_n_len: modulus length in byte - \param[out] results: output buffer - \retval none -*/ -void pkcau_mod_reduc_operation(pkcau_mod_parameter_struct *mod_reduc_para, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length and length of operand A in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000400U, (mod_reduc_para->oprd_a_len) << 3); - pkcau_memcpy_value(0x00000404U, (mod_reduc_para->modulus_n_len) << 3); - - /* write the operand A and modulus value n to PKCAU RAM */ - pkcau_memcpy_operand(0x000008B4U, mod_reduc_para->oprd_a, mod_reduc_para->oprd_a_len); - pkcau_memcpy_operand(0x00000A44U, mod_reduc_para->modulus_n, mod_reduc_para->modulus_n_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_MOD_REDUCTION); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0xBD0U, (uint8_t *)results, mod_reduc_para->modulus_n_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute arithmetic operation - This function can only be used when interrupt is not enabled - \param[in] arithmetic_para: PKCAU arithmetic parameter struct - oprd_a: operand A - oprd_a_len: length of operand A in byte - oprd_b: operand B - oprd_b_len: length of operand B in byte - \param[in] mode: arithmetic operation mode - only one parameter can be selected which is shown as below: - \arg PKCAU_MODE_ARITHMETIC_ADD: arithmetic addition - \arg PKCAU_MODE_ARITHMETIC_SUB: arithmetic subtraction - \arg PKCAU_MODE_ARITHMETIC_MUL: arithmetic multiplication - \arg PKCAU_MODE_ARITHMETIC_COMP: arithmetic comparison - \param[out] results: output buffer - \retval none -*/ -void pkcau_arithmetic_operation(pkcau_arithmetic_parameter_struct *arithmetic_para, uint32_t mode, uint8_t *results) -{ - uint32_t size = 0U; - - uint32_t max_len = (arithmetic_para->oprd_a_len > arithmetic_para->oprd_b_len) ? \ - arithmetic_para->oprd_a_len : arithmetic_para->oprd_b_len; - - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* calculate number of byte to read */ - switch(mode) { - case PKCAU_MODE_ARITHMETIC_ADD: - size = max_len + 1U; - break; - case PKCAU_MODE_ARITHMETIC_SUB: - size = max_len; - break; - case PKCAU_MODE_ARITHMETIC_MUL: - size = arithmetic_para->oprd_a_len + arithmetic_para->oprd_b_len; - break; - case PKCAU_MODE_ARITHMETIC_COMP: - size = 1U; - break; - default: - break; - } - - /* write the length of operand in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, max_len << 3); - - /* write the operand A and operand B to PKCAU RAM */ - pkcau_memcpy_operand(0x000008B4U, arithmetic_para->oprd_a, arithmetic_para->oprd_a_len); - pkcau_memcpy_operand(0x00000A44U, arithmetic_para->oprd_b, arithmetic_para->oprd_b_len); - /* configure the operation mode */ - pkcau_mode_set(mode); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0xBD0U, (uint8_t *)results, size); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute RSA CRT exponentiation operation - This function can only be used when interrupt is not enabled - \param[in] crt_para: PKCAU modular CRT parameter struct - oprd_a: operand A - oprd_a_len: length of operand A in byte - oprd_dp: operand dp - oprd_dp_len: length of operand dp in byte - oprd_dq:operand dq - oprd_dq_len: length of operand dq in byte - oprd_qinv: operand qinv - oprd_qinv_len: length of operand qinv in byte - oprd_p: prime operand p - oprd_p_len: length of operand p in byte - oprd_q: prime operand q - oprd_q_len: length of operand q in byte - \param[out] results: output buffer - \retval none -*/ -void pkcau_crt_exp_operation(pkcau_crt_parameter_struct *crt_para, uint8_t *results) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (crt_para->oprd_a_len << 3)); - - /* write the operand dp, dq, qinv, p and q to PKCAU RAM */ - pkcau_memcpy_operand(0x0000065CU, crt_para->oprd_dp, crt_para->oprd_dp_len); - pkcau_memcpy_operand(0x00000BD0U, crt_para->oprd_dq, crt_para->oprd_dq_len); - pkcau_memcpy_operand(0x000007ECU, crt_para->oprd_qinv, crt_para->oprd_qinv_len); - pkcau_memcpy_operand(0x0000097CU, crt_para->oprd_p, crt_para->oprd_p_len); - pkcau_memcpy_operand(0x00000D5CU, crt_para->oprd_q, crt_para->oprd_q_len); - /* write the operand A to PKCAU RAM */ - pkcau_memcpy_operand(0x00000EECU, crt_para->oprd_a, crt_para->oprd_a_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_CRT_EXP); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x724U, (uint8_t *)results, crt_para->oprd_a_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute point check operation - This function can only be used when interrupt is not enabled - \param[in] point_para: PKCAU point struct - point_x: point coordinate x - point_x_len: point coordinate x length in byte - point_y: point coordinate y - point_y_len: point coordinate y length in byte - \param[in] curve_group_para: PKCAU ECC curve parameter struct - modulus_p: curve modulus p - modulus_p_len: curve modulus p length in byte - coff_a: curve coefficient a - coff_a_len: curve coefficient a length in byte - coff_b: curve coefficient b - coff_b_len: curve coefficient b length in byte - base_point_x: curve base point coordinate x - base_point_x_len: curve base point coordinate x length in byte - base_point_y: curve base point coordinate y - base_point_y_len: curve base point coordinate y length in byte - order_n: curve prime order n - order_n_len: curve prime order n length in byte - a_sign: curve coefficient a sign - multi_k: scalar multiplier k - multi_k_len: scalar multiplier k length in byte - integer_k: integer k length in byte - integer_k_len: integer k length in byte - private_key_d: private key d - private_key_d_len: private key d length in byte - mont_para: montgomery parameter R2 mod n - mont_para_len: montgomery parameter R2 mod n length in byte - \param[out] none - \retval flag indicating whether the point is on an elliptic curve or not -*/ -uint8_t pkcau_point_check_operation(pkcau_point_parameter_struct *point_para, - const pkcau_ec_group_parameter_struct *curve_group_para) -{ - uint8_t res = 1U; - - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the modulus length in bit to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); - /* write the sign of curve coefficient a to PKCAU RAM */ - pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); - - /* write the curve coefficient a, curve coefficient b and curve modulus p to PKCAU RAM */ - pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); - pkcau_memcpy_operand(0x000007FCU, curve_group_para->coff_b, curve_group_para->coff_b_len); - pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); - /* write the point coordinate x and point coordinate y to PKCAU RAM */ - pkcau_memcpy_operand(0x0000055CU, point_para->point_x, point_para->point_x_len); - pkcau_memcpy_operand(0x000005B0U, point_para->point_y, point_para->point_y_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_POINT_CHECK); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x400U, (uint8_t *)&res, 1U); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); - - return res; -} - -/*! - \brief execute point multiplication operation - This function can only be used when interrupt is not enabled - \param[in] point_para: PKCAU point struct - point_x: point coordinate x - point_x_len: point coordinate x length in byte - point_y: point coordinate y - point_y_len: point coordinate y length in byte - \param[in] curve_group_para: PKCAU ECC curve parameter struct - modulus_p: curve modulus p - modulus_p_len: curve modulus p length in byte - coff_a: curve coefficient a - coff_a_len: curve coefficient a length in byte - coff_b: curve coefficient b - coff_b_len: curve coefficient b length in byte - base_point_x: curve base point coordinate x - base_point_x_len: curve base point coordinate x length in byte - base_point_y: curve base point coordinate y - base_point_y_len: curve base point coordinate y length in byte - order_n: curve prime order n - order_n_len: curve prime order n length in byte - a_sign: curve coefficient a sign - - multi_k: scalar multiplier k - multi_k_len: scalar multiplier k length in byte - integer_k: integer k length in byte - integer_k_len: integer k length in byte - private_key_d: private key d - private_key_d_len: private key d length in byte - mont_para: montgomery parameter R2 mod n - mont_para_len: montgomery parameter R2 mod n length in byte - \param[in] mode: point multiplication operation mode - only one parameter can be selected which is shown as below: - \arg PKCAU_MODE_ECC_SCALAR_MUL_FAST: montgomery parameter computation then ECC scalar multiplication - \arg PKCAU_MODE_ECC_SCALAR_MUL: ECC scalar multiplication only - \param[out] result: ecdsa signature, ecc scalar multiplication output structure - sign_extra: flag of extended ECDSA sign (extra outputs) - sign_r: pointer to signature part r - sign_s: pointer to signature part s - point_x: pointer to point kP coordinate x - point_y: pointer to point kP coordinate y - \retval none -*/ -void pkcau_point_mul_operation(pkcau_point_parameter_struct *point_para, - const pkcau_ec_group_parameter_struct *curve_group_para, \ - uint32_t mode, pkcau_ecc_out_struct *result) -{ - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the length of scalar multiplier k, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ - pkcau_memcpy_value(0x00000400U, (curve_group_para->multi_k_len << 3)); - pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); - pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); - - /* write the curve coefficient a, curve modulus p, scalar multiplier k, point coordinate x and point coordinate y to PKCAU RAM */ - pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); - pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); - pkcau_memcpy_operand(0x00000508U, curve_group_para->multi_k, curve_group_para->multi_k_len); - pkcau_memcpy_operand(0x0000055CU, point_para->point_x, point_para->point_x_len); - pkcau_memcpy_operand(0x000005B0U, point_para->point_y, point_para->point_y_len); - if(mode == PKCAU_MODE_ECC_SCALAR_MUL_FAST) { - pkcau_memcpy_operand(0x000004B4U, curve_group_para->mont_para, curve_group_para->mont_para_len); - } - /* configure the operation mode */ - pkcau_mode_set(mode); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x55CU, (uint8_t *)result->point_x, curve_group_para->modulus_p_len); - pkcau_memread(0x5B0U, (uint8_t *)result->point_y, curve_group_para->modulus_p_len); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); -} - -/*! - \brief execute ECDSA sign operation - This function can only be used when interrupt is not enabled - \param[in] hash_para: hash struct - hash_z: hash value z - hash_z_len: hash value z length in byte - \param[in] curve_group_para: PKCAU ECC curve paramter struct - modulus_p: curve modulus p - modulus_p_len: curve modulus p length in byte - coff_a: curve coefficient a - coff_a_len: curve coefficient a length in byte - coff_b: curve coefficient b - coff_b_len: curve coefficient b length in byte - base_point_x: curve base point coordinate x - base_point_x_len: curve base point coordinate x length in byte - base_point_y: curve base point coordinate y - base_point_y_len: curve base point coordinate y length in byte - order_n: curve prime order n - order_n_len: curve prime order n length in byte - a_sign: curve coefficient a sign - multi_k: scalar multiplier k - multi_k_len: scalar multiplier k length in byte - integer_k: integer k length in byte - integer_k_len: integer k length in byte - private_key_d: private key d - private_key_d_len: private key d length in byte - mont_para: montgomery parameter R2 mod n - mont_para_len: montgomery parameter R2 mod n length in byte - \param[out] result: ecdsa signature, ecc scalar multiplication output structure - sign_extra: flag of extended ECDSA sign (extra outputs) - sign_r: pointer to signature part r - sign_s: pointer to signature part s - point_x: pointer to point kP coordinate x - point_y: pointer to point kP coordinate y - \retval flag indicating whether the signature operation was successful -*/ -uint8_t pkcau_ecdsa_sign_operation(pkcau_hash_parameter_struct *hash_para, \ - const pkcau_ec_group_parameter_struct *curve_group_para, \ - pkcau_ecc_out_struct *result) -{ - uint8_t res = 2U; - - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - - /* write the curve prime order n length, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ - pkcau_memcpy_value(0x00000400U, (curve_group_para->order_n_len << 3)); - pkcau_memcpy_value(0x00000404U, (curve_group_para->modulus_p_len << 3)); - pkcau_memcpy_value(0x00000408U, curve_group_para->a_sign); - - /* write the curve coefficient a to PKCAU RAM */ - pkcau_memcpy_operand(0x0000040CU, curve_group_para->coff_a, curve_group_para->coff_a_len); - /* write the curve modulus p to PKCAU RAM */ - pkcau_memcpy_operand(0x00000460U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); - /* write the integer k to PKCAU RAM */ - pkcau_memcpy_operand(0x00000508U, curve_group_para->integer_k, curve_group_para->integer_k_len); - /* write the curve base point coordinate x to PKCAU RAM */ - pkcau_memcpy_operand(0x0000055CU, curve_group_para->base_point_x, curve_group_para->base_point_x_len); - /* write the curve base point coordinate y to PKCAU RAM */ - pkcau_memcpy_operand(0x000005B0U, curve_group_para->base_point_y, curve_group_para->base_point_y_len); - /* write the hash value z and hash value z length in byte to PKCAU RAM */ - pkcau_memcpy_operand(0x00000DE8U, hash_para->hash_z, hash_para->hash_z_len); - /* write the private key d to PKCAU RAM */ - pkcau_memcpy_operand(0x00000E3CU, curve_group_para->private_key_d, curve_group_para->private_key_d_len); - /* write the curve prime order n to PKCAU RAM */ - pkcau_memcpy_operand(0x00000E94U, curve_group_para->order_n, curve_group_para->order_n_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_ECDSA_SIGN); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - /* read results from RAM address */ - pkcau_memread(0x700U, (uint8_t *)result->sign_r, curve_group_para->order_n_len); - pkcau_memread(0x754U, (uint8_t *)result->sign_s, curve_group_para->order_n_len); - pkcau_memread(0xEE8U, (uint8_t *)&res, 1U); - if(0U != result->sign_extra) { - pkcau_memread(0x103CU, (uint8_t *)result->point_x, curve_group_para->order_n_len); - pkcau_memread(0x1090U, (uint8_t *)result->point_y, curve_group_para->order_n_len); - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); - - return res; -} - -/*! - \brief execute ECDSA verification operation - This function can only be used when interrupt is not enabled - \param[in] point_para: PKCAU point struct - point_x: point coordinate x - point_x_len: point coordinate x length in byte - point_y: point coordinate y - point_y_len: point coordinate y length in byte - \param[in] hash_para: hash struct - hash_z: hash value z - hash_z_len: hash value z length in byte - \param[in] signature_para: signature struct - sign_r: signature part r - sign_r_len: signature part r lnegth in byte - sign_s: signature part s - sign_s_len: signature part s lnegth in byte - \param[in] curve_group_para: PKCAU ECC curve paramter struct - modulus_p: curve modulus p - modulus_p_len: curve modulus p length in byte - coff_a: curve coefficient a - coff_a_len: curve coefficient a length in byte - coff_b: curve coefficient b - coff_b_len: curve coefficient b length in byte - base_point_x: curve base point coordinate x - base_point_x_len: curve base point coordinate x length in byte - base_point_y: curve base point coordinate y - base_point_y_len: curve base point coordinate y length in byte - order_n: curve prime order n - order_n_len: curve prime order n length in byte - a_sign: curve coefficient a sign - - multi_k: scalar multiplier k - multi_k_len: scalar multiplier k length in byte - integer_k: integer k length in byte - integer_k_len: integer k length in byte - private_key_d: private key d - private_key_d_len: private key d length in byte - mont_para: montgomery parameter R2 mod n - mont_para_len: montgomery parameter R2 mod n length in byte - \param[out] none - \retval flag indicating whether the signature verification operation was successful -*/ -uint8_t pkcau_ecdsa_verification_operation(pkcau_point_parameter_struct *point_para, \ - pkcau_hash_parameter_struct *hash_para, \ - pkcau_signature_parameter_struct *signature_para, \ - const pkcau_ec_group_parameter_struct *curve_group_para) -{ - uint8_t res = 1U; - - /* reset PKCAU */ - pkcau_deinit(); - /* enable PKCAU */ - pkcau_enable(); - /* wait for PKCAU busy flag to reset */ - while(RESET != pkcau_flag_get(PKCAU_FLAG_BUSY)){ - } - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - - /* write the curve prime order n length, curve modulus p length in bit and curve coefficient a sign to PKCAU RAM */ - pkcau_memcpy_value(0x00000404U, (curve_group_para->order_n_len << 3)); - pkcau_memcpy_value(0x000004B4U, (curve_group_para->modulus_p_len << 3)); - pkcau_memcpy_value(0x0000045CU, curve_group_para->a_sign); - - /* write the curve coefficient a to PKCAU RAM */ - pkcau_memcpy_operand(0x00000460U, curve_group_para->coff_a, curve_group_para->coff_a_len); - /* write the curve modulus p to PKCAU RAM */ - pkcau_memcpy_operand(0x000004B8U, curve_group_para->modulus_p, curve_group_para->modulus_p_len); - /* write the curve base point coordinate x to PKCAU RAM */ - pkcau_memcpy_operand(0x000005E8U, curve_group_para->base_point_x, curve_group_para->base_point_x_len); - /* write the curve base point coordinate y to PKCAU RAM */ - pkcau_memcpy_operand(0x0000063CU, curve_group_para->base_point_y, curve_group_para->base_point_y_len); - /* write the point coordinate x to PKCAU RAM */ - pkcau_memcpy_operand(0x00000F40U, point_para->point_x, point_para->point_x_len); - /* write the point coordinate y to PKCAU RAM */ - pkcau_memcpy_operand(0x00000F94U, point_para->point_y, point_para->point_y_len); - /* write the signature part r to PKCAU RAM */ - pkcau_memcpy_operand(0x000001098U, signature_para->sign_r, signature_para->sign_r_len); - /* write the signature part s to PKCAU RAM */ - pkcau_memcpy_operand(0x00000A44U, signature_para->sign_s, signature_para->sign_s_len); - /* write the hash value z and hash value z length in byte to PKCAU RAM */ - pkcau_memcpy_operand(0x00000FE8U, hash_para->hash_z, hash_para->hash_z_len); - /* write the curve prime order n to PKCAU RAM */ - pkcau_memcpy_operand(0x00000D5CU, curve_group_para->order_n, curve_group_para->order_n_len); - /* configure the operation mode */ - pkcau_mode_set(PKCAU_MODE_ECDSA_VERIFICATION); - /* start computation */ - pkcau_start(); - - /* wait for PKCAU operation completed */ - while(SET != pkcau_flag_get(PKCAU_FLAG_END)){ - } - pkcau_memread(0x5B0U, (uint8_t *)&res, 1U); - /* clear end flag */ - pkcau_flag_clear(PKCAU_FLAG_END); - /* disable PKCAU */ - pkcau_disable(); - - return res; -} - -/*! - \brief get PKCAU flag status - \param[in] flag: PKCAU flags - only one parameter can be selected which is shown as below: - \arg PKCAU_FLAG_ADDRERR: address error flag - \arg PKCAU_FLAG_RAMERR: PKCAU RAM error flag - \arg PKCAU_FLAG_END: end of PKCAU operation flag - \arg PKCAU_FLAG_BUSY: busy flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus pkcau_flag_get(uint32_t flag) -{ - if(RESET != (PKCAU_STAT & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear PKCAU flag status - \param[in] flag: PKCAU flags - one or more parameters can be selected which is shown as below: - \arg PKCAU_FLAG_ADDRERR: address error flag - \arg PKCAU_FLAG_RAMERR: PKCAU RAM error flag - \arg PKCAU_FLAG_END: end of PKCAU operation flag - \param[out] none - \retval none -*/ -void pkcau_flag_clear(uint32_t flag) -{ - switch(flag) { - /* clear address error flag */ - case PKCAU_FLAG_ADDRERR: - PKCAU_STATC |= PKCAU_STATC_ADDRERRC; - break; - /* clear PKCAU RAM error flag */ - case PKCAU_FLAG_RAMERR: - PKCAU_STATC |= PKCAU_STATC_RAMERRC; - break; - /* clear end of PKCAU operation flag */ - case PKCAU_FLAG_END: - PKCAU_STATC |= PKCAU_STATC_ENDFC; - break; - default : - break; - } -} - -/*! - \brief enable PKCAU interrupt - \param[in] interrupt: interrupt type - one or more parameters can be selected which is shown as below: - \arg PKCAU_INT_ADDRERR: address error interrupt - \arg PKCAU_INT_RAMERR: PKCAU RAM error interrupt - \arg PKCAU_INT_END: end of PKCAU operation interrupt - \param[out] none - \retval none -*/ -void pkcau_interrupt_enable(uint32_t interrupt) -{ - PKCAU_CTL |= interrupt; -} - -/*! - \brief disable PKCAU interrupt - \param[in] interrupt: interrupt type - one or more parameters can be selected which is shown as below: - \arg PKCAU_INT_ADDRERR: address error interrupt - \arg PKCAU_INT_RAMERR: PKCAU RAM error interrupt - \arg PKCAU_INT_END: end of PKCAU operation interrupt - \param[out] none - \retval none -*/ -void pkcau_interrupt_disable(uint32_t interrupt) -{ - PKCAU_CTL &= ~(interrupt); -} - -/*! - \brief get PKCAU interrupt flag status - \param[in] int_flag: PKCAU interrupt flags - only one parameter can be selected which is shown as below: - \arg PKCAU_INT_FLAG_ADDRERR: address error interrupt flag - \arg PKCAU_INT_FLAG_RAMERR: PKCAU RAM error interrupt flag - \arg PKCAU_INT_FLAG_END: end of PKCAU operation interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus pkcau_interrupt_flag_get(uint32_t int_flag) -{ - uint32_t reg1 = PKCAU_CTL; - uint32_t reg2 = PKCAU_STAT; - - switch(int_flag) { - /* clear address error interrupt flag */ - case PKCAU_INT_FLAG_ADDRERR: - reg1 = reg1 & PKCAU_CTL_ADDRERRIE; - reg2 = reg2 & PKCAU_STAT_ADDRERR; - break; - /* clear RAM error interrupt flag */ - case PKCAU_INT_FLAG_RAMERR: - reg1 = reg1 & PKCAU_CTL_RAMERRIE; - reg2 = reg2 & PKCAU_STAT_RAMERR; - break; - /* clear end of PKCAU operation interrupt flag */ - case PKCAU_INT_FLAG_ENDF: - reg1 = reg1 & PKCAU_CTL_ENDIE; - reg2 = reg2 & PKCAU_STAT_ENDF; - break; - default : - break; - } - /*get PKCAU interrupt flag status */ - if(reg1 && reg2) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear PKCAU interrupt flag status - \param[in] int_flag: PKCAU interrupt flags - only one parameter can be selected which is shown as below: - \arg PKCAU_INT_FLAG_ADDRERR: address error interrupt flag - \arg PKCAU_INT_FLAG_RAMERR: PKCAU RAM error interrupt flag - \arg PKCAU_INT_FLAG_END: end of PKCAU operation interrupt flag - \param[out] none - \retval none -*/ -void pkcau_interrupt_flag_clear(uint32_t int_flag) -{ - switch(int_flag) { - /* clear address error interrupt flag */ - case PKCAU_INT_FLAG_ADDRERR: - PKCAU_STATC |= PKCAU_STATC_ADDRERRC; - break; - /* clear PKCAU RAM error interrupt flag */ - case PKCAU_INT_FLAG_RAMERR: - PKCAU_STATC |= PKCAU_STATC_RAMERRC; - break; - /* clear end of PKCAU operation interrupt flag */ - case PKCAU_INT_FLAG_ENDF: - PKCAU_STATC |= PKCAU_STATC_ENDFC; - break; - default: - break; - } -} - -/*! - \brief copy normal 32-bit value to PKCAU RAM - \param[in] offset: RAM address offset to PKCAU base address - \param[in] value: the value needed to write into PKCAU RAM - \param[out] none - \retval none -*/ -static void pkcau_memcpy_value(uint32_t offset, uint32_t value) -{ - uint32_t *addr = (uint32_t *)((uint32_t)(PKCAU_BASE + offset)); - *addr = value; -} - -/*! - \brief copy operand with EOS or ROS to PKCAU RAM - \param[in] offset: RAM address offset to PKCAU base address - \param[in] operand: the big endian operand vector, the left most byte of the value should be in the first element of the vector. - If input data is little endian, please flip it in application code. - \param[in] size: operand vector length in byte - \retval none -*/ -static void pkcau_memcpy_operand(uint32_t offset, const uint8_t operand[], uint32_t size) -{ - uint32_t data = 0U, i = 0U, j = 0U; - - while(size >= 4U) { - /* convert the big endian operand vector to little endian parameter to input to PKCAU RAM */ - data = (uint32_t)((uint32_t)operand[size - 1U] | ((uint32_t)operand[size - 2U] << 8U) | (( - uint32_t)operand[size - 3U] << 16U) | ((uint32_t)operand[size - 4U] << 24U)); - *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = data; - i = i + 4U; - size -= 4U; - } - /* convert the big endian operand vector to little endian parameter to input to PKCAU RAM which is not a multiple of four */ - if(size > 0U) { - data = 0U; - for(j = 0U; j < size; j++) { - data = (uint32_t)((data << 8U) | (uint32_t)operand[j]); - } - *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = data; - i = i + 4U; - } - - /* an additional word 0x00000000 is expected by the PKCAU */ - *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)) = 0x00000000U; -} - -/*! - \brief read result from PKCAU RAM - \param[in] offset: RAM address offset to PKCAU base address - \param[out] buf: big endian result buffer, the left most byte from the PKCAU should be in the first element of buffer - If need output data is little endian, please flip it in application code. - \param[in] size: number of byte to read - \retval none -*/ -static void pkcau_memread(uint32_t offset, uint8_t buf[], uint32_t size) -{ - uint32_t data = 0U, i = 0U, j = 0U; - - /* read data from PKCAU RAM */ - while(size >= 4U) { - data = *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)); - i = i + 4U; - - /* data in PKCAU RAM is big endian */ - buf[size - 1U] = (uint8_t)(data & 0xffU); - buf[size - 2U] = (uint8_t)((data >> 8U) & 0xffU); - buf[size - 3U] = (uint8_t)((data >> 16U) & 0xffU); - buf[size - 4U] = (uint8_t)((data >> 24U) & 0xffU); - size -= 4U; - } - /* read data from PKCAU RAM which is not a multiple of four */ - if(size > 0U) { - data = *(uint32_t *)((uint32_t)(PKCAU_BASE + offset + i)); - for(j = 0U; j < size; j++) { - buf[j] = (uint8_t)((data >> ((size - 1U - j) * 8U)) & 0xffU); - } - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c deleted file mode 100644 index 440161dbc17..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c +++ /dev/null @@ -1,394 +0,0 @@ -/*! - \file gd32f5xx_pmu.c - \brief PMU driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_pmu.h" - -/*! - \brief reset PMU registers - \param[in] none - \param[out] none - \retval none -*/ -void pmu_deinit(void) -{ - /* reset PMU */ - rcu_periph_reset_enable(RCU_PMURST); - rcu_periph_reset_disable(RCU_PMURST); -} - -/*! - \brief select low voltage detector threshold - \param[in] lvdt_n: - \arg PMU_LVDT_0: voltage threshold is 2.1V - \arg PMU_LVDT_1: voltage threshold is 2.3V - \arg PMU_LVDT_2: voltage threshold is 2.4V - \arg PMU_LVDT_3: voltage threshold is 2.6V - \arg PMU_LVDT_4: voltage threshold is 2.7V - \arg PMU_LVDT_5: voltage threshold is 2.9V - \arg PMU_LVDT_6: voltage threshold is 3.0V - \arg PMU_LVDT_7: voltage threshold is 3.1V - \param[out] none - \retval none -*/ -void pmu_lvd_select(uint32_t lvdt_n) -{ - /* disable LVD */ - PMU_CTL &= ~PMU_CTL_LVDEN; - /* clear LVDT bits */ - PMU_CTL &= ~PMU_CTL_LVDT; - /* set LVDT bits according to pmu_lvdt_n */ - PMU_CTL |= lvdt_n; - /* enable LVD */ - PMU_CTL |= PMU_CTL_LVDEN; -} - -/*! - \brief disable PMU lvd - \param[in] none - \param[out] none - \retval none -*/ -void pmu_lvd_disable(void) -{ - /* disable LVD */ - PMU_CTL &= ~PMU_CTL_LVDEN; -} - -/*! - \brief select LDO output voltage - this bit set by software when the main PLL closed, before closing PLL, change the system clock to IRC16M or HXTAL - \param[in] ldo_output: - \arg PMU_LDOVS_LOW: low-driver mode enable in deep-sleep mode - \arg PMU_LDOVS_MID: mid-driver mode disable in deep-sleep mode - \arg PMU_LDOVS_HIGH: high-driver mode disable in deep-sleep mode - \param[out] none - \retval none -*/ -void pmu_ldo_output_select(uint32_t ldo_output) -{ - PMU_CTL &= ~PMU_CTL_LDOVS; - PMU_CTL |= ldo_output; -} - -/*! - \brief enable high-driver mode - this bit set by software only when IRC16M or HXTAL used as system clock - \param[in] none - \param[out] none - \retval none -*/ -void pmu_highdriver_mode_enable(void) -{ - PMU_CTL |= PMU_CTL_HDEN; -} - -/*! - \brief disable high-driver mode - \param[in] none - \param[out] none - \retval none -*/ -void pmu_highdriver_mode_disable(void) -{ - PMU_CTL &= ~PMU_CTL_HDEN; -} - -/*! - \brief switch high-driver mode - this bit set by software only when IRC16M or HXTAL used as system clock - \param[in] highdr_switch: - \arg PMU_HIGHDR_SWITCH_NONE: disable high-driver mode switch - \arg PMU_HIGHDR_SWITCH_EN: enable high-driver mode switch - \param[out] none - \retval none -*/ -void pmu_highdriver_switch_select(uint32_t highdr_switch) -{ - /* wait for HDRF flag set */ - while(SET != pmu_flag_get(PMU_FLAG_HDRF)) { - } - PMU_CTL &= ~PMU_CTL_HDS; - PMU_CTL |= highdr_switch; -} - -/*! - \brief enable low-driver mode in deep-sleep - \param[in] none - \param[out] none - \retval none -*/ -void pmu_lowdriver_mode_enable(void) -{ - PMU_CTL |= PMU_CTL_LDEN; -} - -/*! - \brief disable low-driver mode in deep-sleep - \param[in] none - \param[out] none - \retval none -*/ -void pmu_lowdriver_mode_disable(void) -{ - PMU_CTL &= ~PMU_CTL_LDEN; -} - -/*! - \brief in deep-sleep mode, driver mode when use low power LDO - \param[in] mode: - \arg PMU_NORMALDR_LOWPWR: normal driver when use low power LDO - \arg PMU_LOWDR_LOWPWR: low-driver mode enabled when LDEN is 11 and use low power LDO - \param[out] none - \retval none -*/ -void pmu_lowpower_driver_config(uint32_t mode) -{ - PMU_CTL &= ~PMU_CTL_LDLP; - PMU_CTL |= mode; -} - -/*! - \brief in deep-sleep mode, driver mode when use normal power LDO - \param[in] mode: - \arg PMU_NORMALDR_NORMALPWR: normal driver when use normal power LDO - \arg PMU_LOWDR_NORMALPWR: low-driver mode enabled when LDEN is 11 and use normal power LDO - \param[out] none - \retval none -*/ -void pmu_normalpower_driver_config(uint32_t mode) -{ - PMU_CTL &= ~PMU_CTL_LDNP; - PMU_CTL |= mode; -} - -/*! - \brief PMU work in sleep mode - \param[in] sleepmodecmd: - \arg WFI_CMD: use WFI command - \arg WFE_CMD: use WFE command - \param[out] none - \retval none -*/ -void pmu_to_sleepmode(uint8_t sleepmodecmd) -{ - /* clear sleepdeep bit of Cortex-M33 system control register */ - SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - /* select WFI or WFE command to enter sleep mode */ - if(WFI_CMD == sleepmodecmd) { - __WFI(); - } else { - __WFE(); - __WFE(); - } -} - -/*! - \brief PMU work in deep-sleep mode - \param[in] ldo - \arg PMU_LDO_NORMAL: LDO normal work when pmu enter deep-sleep mode - \arg PMU_LDO_LOWPOWER: LDO work at low power mode when pmu enter deep-sleep mode - \param[in] lowdrive: - only one parameter can be selected which is shown as below: - \arg PMU_LOWDRIVER_DISABLE: Low-driver mode disable in deep-sleep mode - \arg PMU_LOWDRIVER_ENABLE: Low-driver mode enable in deep-sleep mode - \param[in] deepsleepmodecmd: - \arg WFI_CMD: use WFI command - \arg WFE_CMD: use WFE command - \param[out] none - \retval none -*/ -void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd) -{ - /* clear stbmod and ldolp bits */ - PMU_CTL &= ~((uint32_t)(PMU_CTL_STBMOD | PMU_CTL_LDOLP | PMU_CTL_LDEN | PMU_CTL_LDNP | PMU_CTL_LDLP)); - - /* set ldolp bit according to pmu_ldo */ - PMU_CTL |= ldo; - - /* configure low drive mode in deep-sleep mode */ - if(PMU_LOWDRIVER_ENABLE == lowdrive) { - if(PMU_LDO_NORMAL == ldo) { - PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDNP); - } else { - PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDLP); - } - } - /* set sleepdeep bit of Cortex-M33 system control register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* select WFI or WFE command to enter deep-sleep mode */ - if(WFI_CMD == deepsleepmodecmd) { - __WFI(); - } else { - __SEV(); - __WFE(); - __WFE(); - } - - /* reset sleepdeep bit of Cortex-M33 system control register */ - SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); -} - -/*! - \brief pmu work in standby mode - \param[in] none - \param[out] none - \retval none -*/ -void pmu_to_standbymode(void) -{ - /* set stbmod bit */ - PMU_CTL |= PMU_CTL_STBMOD; - - /* reset wakeup flag */ - PMU_CTL |= PMU_CTL_WURST; - - /* set sleepdeep bit of Cortex-M33 system control register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - REG32(0xE000E010U) &= 0x00010004U; - REG32(0xE000E180U) = 0XFFFFFFF3U; - REG32(0xE000E184U) = 0XFFFFFDFFU; - REG32(0xE000E188U) = 0xFFFFFFFFU; - REG32(0xE000E18CU) = 0xFFFFFFFFU; - - /* select WFI command to enter standby mode */ - __WFI(); -} - -/*! - \brief enable PMU wakeup pin - \param[in] none - \param[out] none - \retval none -*/ -void pmu_wakeup_pin_enable(void) -{ - PMU_CS |= PMU_CS_WUPEN; -} - -/*! - \brief disable PMU wakeup pin - \param[in] none - \param[out] none - \retval none -*/ -void pmu_wakeup_pin_disable(void) -{ - PMU_CS &= ~PMU_CS_WUPEN; -} - -/*! - \brief backup SRAM LDO on - \param[in] bkp_ldo: - \arg PMU_BLDOON_OFF: backup SRAM LDO closed - \arg PMU_BLDOON_ON: open the backup SRAM LDO - \param[out] none - \retval none -*/ -void pmu_backup_ldo_config(uint32_t bkp_ldo) -{ - PMU_CS &= ~PMU_CS_BLDOON; - PMU_CS |= bkp_ldo; -} - -/*! - \brief enable write access to the registers in backup domain - \param[in] none - \param[out] none - \retval none -*/ -void pmu_backup_write_enable(void) -{ - PMU_CTL |= PMU_CTL_BKPWEN; -} - -/*! - \brief disable write access to the registers in backup domain - \param[in] none - \param[out] none - \retval none -*/ -void pmu_backup_write_disable(void) -{ - PMU_CTL &= ~PMU_CTL_BKPWEN; -} - -/*! - \brief get flag state - \param[in] flag: - \arg PMU_FLAG_WAKEUP: wakeup flag - \arg PMU_FLAG_STANDBY: standby flag - \arg PMU_FLAG_LVD: lvd flag - \arg PMU_FLAG_BLDORF: backup SRAM LDO ready flag - \arg PMU_FLAG_LDOVSRF: LDO voltage select ready flag - \arg PMU_FLAG_HDRF: high-driver ready flag - \arg PMU_FLAG_HDSRF: high-driver switch ready flag - \arg PMU_FLAG_LDRF: low-driver mode ready flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus pmu_flag_get(uint32_t flag) -{ - if(PMU_CS & flag) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear flag bit - \param[in] flag: - \arg PMU_FLAG_RESET_WAKEUP: reset wakeup flag - \arg PMU_FLAG_RESET_STANDBY: reset standby flag - \param[out] none - \retval none -*/ -void pmu_flag_clear(uint32_t flag) -{ - switch(flag) { - case PMU_FLAG_RESET_WAKEUP: - /* reset wakeup flag */ - PMU_CTL |= PMU_CTL_WURST; - break; - case PMU_FLAG_RESET_STANDBY: - /* reset standby flag */ - PMU_CTL |= PMU_CTL_STBRST; - break; - default : - break; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c deleted file mode 100644 index 56ddebbfb23..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c +++ /dev/null @@ -1,1473 +0,0 @@ -/*! - \file gd32f5xx_rcu.c - \brief RCU driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_rcu.h" - -/* define clock source */ -#define SEL_IRC16M ((uint16_t)0U) /* IRC16M is selected as CK_SYS */ -#define SEL_HXTAL ((uint16_t)1U) /* HXTAL is selected as CK_SYS */ -#define SEL_PLLP ((uint16_t)2U) /* PLLP is selected as CK_SYS */ -/* define startup timeout count */ -#define OSC_STARTUP_TIMEOUT ((uint32_t)0x000fffffU) -#define LXTAL_STARTUP_TIMEOUT ((uint32_t)0x0fffffffU) - -/* RCU IRC16M adjust value mask and offset*/ -#define RCU_IRC16M_ADJUST_MASK ((uint8_t)0x1FU) -#define RCU_IRC16M_ADJUST_OFFSET ((uint32_t)3U) - -/*! - \brief deinitialize the RCU - \param[in] none - \param[out] none - \retval none -*/ -void rcu_deinit(void) -{ - /* enable IRC16M */ - RCU_CTL |= RCU_CTL_IRC16MEN; - rcu_osci_stab_wait(RCU_IRC16M); - RCU_CFG0 &= ~RCU_CFG0_SCS; - - /* reset CTL register */ - RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN | RCU_CTL_PLLI2SEN - | RCU_CTL_PLLSAIEN); - RCU_CTL &= ~(RCU_CTL_HXTALBPS); - /* reset CFG0 register */ - RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | - RCU_CFG0_RTCDIV | RCU_CFG0_CKOUT0SEL | RCU_CFG0_I2SSEL | RCU_CFG0_CKOUT0DIV | - RCU_CFG0_CKOUT1DIV | RCU_CFG0_CKOUT1SEL); - /* reset PLL register */ - RCU_PLL = 0x24003010U; - /* reset PLLI2S register */ - RCU_PLLI2S = 0x24003000U; - /* reset PLLSAI register */ - RCU_PLLSAI = 0x24003010U; - /* reset INT register */ - RCU_INT = 0x00000000U; - /* reset CFG1 register */ - RCU_CFG1 &= ~(RCU_CFG1_PLLSAIRDIV | RCU_CFG1_TIMERSEL); -} - -/*! - \brief enable the peripherals clock - \param[in] periph: RCU peripherals, refer to rcu_periph_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOx (x = A, B, C, D, E, F, G, H, I): GPIO ports clock - \arg RCU_CRC: CRC clock - \arg RCU_BKPSRAM: BKPSRAM clock - \arg RCU_TCMSRAM: TCMSRAM clock - \arg RCU_DMAx (x=0,1): DMA clock - \arg RCU_IPA: IPA clock - \arg RCU_ENET: ENET clock - \arg RCU_ENETTX: ENETTX clock - \arg RCU_ENETRX: ENETRX clock - \arg RCU_ENETPTP: ENETPTP clock - \arg RCU_USBHS: USBHS clock - \arg RCU_USBHSULPI: USBHSULPI clock - \arg RCU_DCI: DCI clock - \arg RCU_PKCAU: PKCAU clock - \arg RCU_CAU: CAU clock - \arg RCU_HAU: HAU clock - \arg RCU_TRNG: TRNG clock - \arg RCU_USBFS: USBFS clock - \arg RCU_EXMC: EXMC clock - \arg RCU_TIMERx (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock - \arg RCU_WWDGT: WWDGT clock - \arg RCU_SPIx (x = 0, 1, 2, 3, 4, 5): SPI clock - \arg RCU_SAI: SAI clock - \arg RCU_USARTx (x = 0, 1, 2, 5): USART clock - \arg RCU_UARTx (x = 3, 4, 6, 7): UART clock - \arg RCU_I2Cx (x = 0, 1, 2, 3, 4, 5): I2C clock - \arg RCU_CANx (x = 0, 1): CAN clock - \arg RCU_PMU: PMU clock - \arg RCU_DAC: DAC clock - \arg RCU_RTC: RTC clock - \arg RCU_ADCx (x = 0, 1, 2): ADC clock - \arg RCU_SDIO: SDIO clock - \arg RCU_SYSCFG: SYSCFG clock - \arg RCU_TLI: TLI clock - \arg RCU_CTC: CTC clock - \arg RCU_IREF: IREF clock - \param[out] none - \retval none -*/ -void rcu_periph_clock_enable(rcu_periph_enum periph) -{ - RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); -} - -/*! - \brief disable the peripherals clock - \param[in] periph: RCU peripherals, refer to rcu_periph_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOx (x = A, B, C, D, E, F, G, H, I): GPIO ports clock - \arg RCU_CRC: CRC clock - \arg RCU_BKPSRAM: BKPSRAM clock - \arg RCU_TCMSRAM: TCMSRAM clock - \arg RCU_DMAx (x=0,1): DMA clock - \arg RCU_IPA: IPA clock - \arg RCU_ENET: ENET clock - \arg RCU_ENETTX: ENETTX clock - \arg RCU_ENETRX: ENETRX clock - \arg RCU_ENETPTP: ENETPTP clock - \arg RCU_USBHS: USBHS clock - \arg RCU_USBHSULPI: USBHSULPI clock - \arg RCU_DCI: DCI clock - \arg RCU_PKCAU: PKCAU clock - \arg RCU_CAU: CAU clock - \arg RCU_HAU: HAU clock - \arg RCU_TRNG: TRNG clock - \arg RCU_USBFS: USBFS clock - \arg RCU_EXMC: EXMC clock - \arg RCU_TIMERx (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock - \arg RCU_WWDGT: WWDGT clock - \arg RCU_SPIx (x = 0, 1, 2, 3, 4, 5): SPI clock - \arg RCU_SAI: SAI clock - \arg RCU_USARTx (x = 0, 1, 2, 5): USART clock - \arg RCU_UARTx (x = 3, 4, 6, 7): UART clock - \arg RCU_I2Cx (x = 0, 1, 2, 3, 4, 5): I2C clock - \arg RCU_CANx (x = 0, 1): CAN clock - \arg RCU_PMU: PMU clock - \arg RCU_DAC: DAC clock - \arg RCU_RTC: RTC clock - \arg RCU_ADCx (x = 0, 1, 2): ADC clock - \arg RCU_SDIO: SDIO clock - \arg RCU_SYSCFG: SYSCFG clock - \arg RCU_TLI: TLI clock - \arg RCU_CTC: CTC clock - \arg RCU_IREF: IREF clock - \param[out] none - \retval none -*/ -void rcu_periph_clock_disable(rcu_periph_enum periph) -{ - RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); -} - -/*! - \brief enable the peripherals clock when sleep mode - \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOx_SLP (x = A, B, C, D, E, F, G, H, I): GPIO ports clock - \arg RCU_CRC_SLP: CRC clock - \arg RCU_FMC_SLP: FMC clock - \arg RCU_SRAM0_SLP: SRAM0 clock - \arg RCU_SRAM1_SLP: SRAM1 clock - \arg RCU_BKPSRAM: BKPSRAM clock - \arg RCU_SRAM2_SLP: SRAM2 clock - \arg RCU_DMAx_SLP (x=0,1): DMA clock - \arg RCU_IPA_SLP: IPA clock - \arg RCU_ENET_SLP: ENET clock - \arg RCU_ENETTX_SLP: ENETTX clock - \arg RCU_ENETRX_SLP: ENETRX clock - \arg RCU_ENETPTP_SLP: ENETPTP clock - \arg RCU_USBHS_SLP: USBHS clock - \arg RCU_USBHSULPI_SLP: USBHSULPI clock - \arg RCU_DCI_SLP: DCI clock - \arg RCU_PKCAU_SLP: PKCAU clock - \arg RCU_CAU_SLP: CAU clock - \arg RCU_HAU_SLP: HAU clock - \arg RCU_TRNG_SLP: TRNG clock - \arg RCU_USBFS_SLP: USBFS clock - \arg RCU_EXMC_SLP: EXMC clock - \arg RCU_TIMERx_SLP (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock - \arg RCU_WWDGT_SLP: WWDGT clock - \arg RCU_SPIx_SLP (x = 0, 1, 2, 3, 4, 5): SPI clock - \arg RCU_SAI_SLP: SAI clock - \arg RCU_USARTx_SLP (x = 0, 1, 2, 5): USART clock - \arg RCU_UARTx_SLP (x = 3, 4, 6, 7): UART clock - \arg RCU_I2Cx_SLP (x = 0, 1, 2, 3, 4, 5): I2C clock - \arg RCU_CANx_SLP (x = 0, 1): CAN clock - \arg RCU_PMU_SLP: PMU clock - \arg RCU_DAC_SLP: DAC clock - \arg RCU_RTC_SLP: RTC clock - \arg RCU_ADCx_SLP (x = 0, 1, 2): ADC clock - \arg RCU_SDIO_SLP: SDIO clock - \arg RCU_SYSCFG_SLP: SYSCFG clock - \arg RCU_TLI_SLP: TLI clock - \arg RCU_CTC_SLP: CTC clock - \arg RCU_IREF_SLP: IREF clock - \param[out] none - \retval none -*/ -void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph) -{ - RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); -} - -/*! - \brief disable the peripherals clock when sleep mode - \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOx_SLP (x = A, B, C, D, E, F, G, H, I): GPIO ports clock - \arg RCU_CRC_SLP: CRC clock - \arg RCU_FMC_SLP: FMC clock - \arg RCU_SRAM0_SLP: SRAM0 clock - \arg RCU_SRAM1_SLP: SRAM1 clock - \arg RCU_BKPSRAM: BKPSRAM clock - \arg RCU_SRAM2_SLP: SRAM2 clock - \arg RCU_DMAx_SLP (x=0,1): DMA clock - \arg RCU_IPA_SLP: IPA clock - \arg RCU_ENET_SLP: ENET clock - \arg RCU_ENETTX_SLP: ENETTX clock - \arg RCU_ENETRX_SLP: ENETRX clock - \arg RCU_ENETPTP_SLP: ENETPTP clock - \arg RCU_USBHS_SLP: USBHS clock - \arg RCU_USBHSULPI_SLP: USBHSULPI clock - \arg RCU_DCI_SLP: DCI clock - \arg RCU_PKCAU_SLP: PKCAU clock - \arg RCU_CAU_SLP: CAU clock - \arg RCU_HAU_SLP: HAU clock - \arg RCU_TRNG_SLP: TRNG clock - \arg RCU_USBFS_SLP: USBFS clock - \arg RCU_EXMC_SLP: EXMC clock - \arg RCU_TIMERx_SLP (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): TIMER clock - \arg RCU_WWDGT_SLP: WWDGT clock - \arg RCU_SPIx_SLP (x = 0, 1, 2, 3, 4, 5): SPI clock - \arg RCU_SAI_SLP: SAI clock - \arg RCU_USARTx_SLP (x = 0, 1, 2, 5): USART clock - \arg RCU_UARTx_SLP (x = 3, 4, 6, 7): UART clock - \arg RCU_I2Cx_SLP (x = 0, 1, 2, 3, 4, 5): I2C clock - \arg RCU_CANx_SLP (x = 0, 1): CAN clock - \arg RCU_PMU_SLP: PMU clock - \arg RCU_DAC_SLP: DAC clock - \arg RCU_RTC_SLP: RTC clock - \arg RCU_ADCx_SLP (x = 0, 1, 2): ADC clock - \arg RCU_SDIO_SLP: SDIO clock - \arg RCU_SYSCFG_SLP: SYSCFG clock - \arg RCU_TLI_SLP: TLI clock - \arg RCU_CTC_SLP: CTC clock - \arg RCU_IREF_SLP: IREF clock - \param[out] none - \retval none -*/ -void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph) -{ - RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); -} - -/*! - \brief reset the peripherals - \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOxRST (x = A, B, C, D, E, F, G, H, I): reset GPIO ports - \arg RCU_CRCRST: reset CRC - \arg RCU_DMAxRST (x=0,1): reset DMA - \arg RCU_IPARST: reset IPA - \arg RCU_ENETRST: reset ENET - \arg RCU_USBHSRST: reset USBHS - \arg RCU_DCIRST: reset DCI - \arg RCU_PKCAURST: reset PKCAU - \arg RCU_CAURST: reset CAU - \arg RCU_HAURST: reset HAU - \arg RCU_TRNGRST: reset TRNG - \arg RCU_USBFSRST: reset USBFS - \arg RCU_EXMCRST: reset EXMC - \arg RCU_TIMERxRST (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): reset TIMER - \arg RCU_WWDGTRST: reset WWDGT - \arg RCU_SPIxRST (x = 0, 1, 2, 3, 4, 5): reset SPI - \arg RCU_SAIRST (x = 0, 1, 2, 3, 4, 5): reset SAI - \arg RCU_USARTxRST (x = 0, 1, 2, 5): reset USART - \arg RCU_UARTxRST (x = 3, 4, 6, 7): reset UART - \arg RCU_I2CxRST (x = 0, 1, 2, 3, 4, 5): reset I2C - \arg RCU_CANxRST (x = 0, 1): reset CAN - \arg RCU_PMURST: reset PMU - \arg RCU_DACRST: reset DAC - \arg RCU_ADCRST (x = 0, 1, 2): reset ADC - \arg RCU_SDIORST: reset SDIO - \arg RCU_SYSCFGRST: reset SYSCFG - \arg RCU_TLIRST: reset TLI - \arg RCU_CTCRST: reset CTC - \arg RCU_IREFRST: reset IREF - \param[out] none - \retval none -*/ -void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset) -{ - RCU_REG_VAL(periph_reset) |= BIT(RCU_BIT_POS(periph_reset)); -} - -/*! - \brief disable reset the peripheral - \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum - only one parameter can be selected which is shown as below: - \arg RCU_GPIOxRST (x = A, B, C, D, E, F, G, H, I): reset GPIO ports - \arg RCU_CRCRST: reset CRC - \arg RCU_DMAxRST (x=0,1): reset DMA - \arg RCU_IPARST: reset IPA - \arg RCU_ENETRST: reset ENET - \arg RCU_USBHSRST: reset USBHS - \arg RCU_DCIRST: reset DCI - \arg RCU_PKCAURST: reset PKCAU - \arg RCU_CAURST: reset CAU - \arg RCU_HAURST: reset HAU - \arg RCU_TRNGRST: reset TRNG - \arg RCU_USBFSRST: reset USBFS - \arg RCU_EXMCRST: reset EXMC - \arg RCU_TIMERxRST (x = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13): reset TIMER - \arg RCU_WWDGTRST: reset WWDGT - \arg RCU_SPIxRST (x = 0, 1, 2, 3, 4, 5): reset SPI - \arg RCU_SAIRST (x = 0, 1, 2, 3, 4, 5): reset SAI - \arg RCU_USARTxRST (x = 0, 1, 2, 5): reset USART - \arg RCU_UARTxRST (x = 3, 4, 6, 7): reset UART - \arg RCU_I2CxRST (x = 0, 1, 2, 3, 4, 5): reset I2C - \arg RCU_CANxRST (x = 0, 1): reset CAN - \arg RCU_PMURST: reset PMU - \arg RCU_DACRST: reset DAC - \arg RCU_ADCRST (x = 0, 1, 2): reset ADC - \arg RCU_SDIORST: reset SDIO - \arg RCU_SYSCFGRST: reset SYSCFG - \arg RCU_TLIRST: reset TLI - \arg RCU_CTCRST: reset CTC - \arg RCU_IREFRST: reset IREF - \param[out] none - \retval none -*/ -void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset) -{ - RCU_REG_VAL(periph_reset) &= ~BIT(RCU_BIT_POS(periph_reset)); -} - -/*! - \brief reset the BKP - \param[in] none - \param[out] none - \retval none -*/ -void rcu_bkp_reset_enable(void) -{ - RCU_BDCTL |= RCU_BDCTL_BKPRST; -} - -/*! - \brief disable the BKP reset - \param[in] none - \param[out] none - \retval none -*/ -void rcu_bkp_reset_disable(void) -{ - RCU_BDCTL &= ~RCU_BDCTL_BKPRST; -} - -/*! - \brief configure the system clock source - \param[in] ck_sys: system clock source select - only one parameter can be selected which is shown as below: - \arg RCU_CKSYSSRC_IRC16M: select CK_IRC16M as the CK_SYS source - \arg RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source - \arg RCU_CKSYSSRC_PLLP: select CK_PLLP as the CK_SYS source - \param[out] none - \retval none -*/ -void rcu_system_clock_source_config(uint32_t ck_sys) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the SCS bits and set according to ck_sys */ - reg &= ~RCU_CFG0_SCS; - RCU_CFG0 = (reg | ck_sys); -} - -/*! - \brief get the system clock source - \param[in] none - \param[out] none - \retval which clock is selected as CK_SYS source - \arg RCU_SCSS_IRC16M: CK_IRC16M is selected as the CK_SYS source - \arg RCU_SCSS_HXTAL: CK_HXTAL is selected as the CK_SYS source - \arg RCU_SCSS_PLLP: CK_PLLP is selected as the CK_SYS source -*/ -uint32_t rcu_system_clock_source_get(void) -{ - return (RCU_CFG0 & RCU_CFG0_SCSS); -} - -/*! - \brief configure the AHB clock prescaler selection - \param[in] ck_ahb: AHB clock prescaler selection - only one parameter can be selected which is shown as below: - \arg RCU_AHB_CKSYS_DIVx (x = 1, 2, 4, 8, 16, 64, 128, 256, 512): select CK_SYS / x as CK_AHB - \param[out] none - \retval none -*/ -void rcu_ahb_clock_config(uint32_t ck_ahb) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the AHBPSC bits and set according to ck_ahb */ - reg &= ~RCU_CFG0_AHBPSC; - RCU_CFG0 = (reg | ck_ahb); -} - -/*! - \brief configure the APB1 clock prescaler selection - \param[in] ck_apb1: APB1 clock prescaler selection - only one parameter can be selected which is shown as below: - \arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1 - \arg RCU_APB1_CKAHB_DIV2: select CK_AHB / 2 as CK_APB1 - \arg RCU_APB1_CKAHB_DIV4: select CK_AHB / 4 as CK_APB1 - \arg RCU_APB1_CKAHB_DIV8: select CK_AHB / 8 as CK_APB1 - \arg RCU_APB1_CKAHB_DIV16: select CK_AHB / 16 as CK_APB1 - \param[out] none - \retval none -*/ -void rcu_apb1_clock_config(uint32_t ck_apb1) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the APB1PSC and set according to ck_apb1 */ - reg &= ~RCU_CFG0_APB1PSC; - RCU_CFG0 = (reg | ck_apb1); -} - -/*! - \brief configure the APB2 clock prescaler selection - \param[in] ck_apb2: APB2 clock prescaler selection - only one parameter can be selected which is shown as below: - \arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2 - \arg RCU_APB2_CKAHB_DIV2: select CK_AHB / 2 as CK_APB2 - \arg RCU_APB2_CKAHB_DIV4: select CK_AHB / 4 as CK_APB2 - \arg RCU_APB2_CKAHB_DIV8: select CK_AHB / 8 as CK_APB2 - \arg RCU_APB2_CKAHB_DIV16: select CK_AHB / 16 as CK_APB2 - \param[out] none - \retval none -*/ -void rcu_apb2_clock_config(uint32_t ck_apb2) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the APB2PSC and set according to ck_apb2 */ - reg &= ~RCU_CFG0_APB2PSC; - RCU_CFG0 = (reg | ck_apb2); -} - -/*! - \brief configure the CK_OUT0 clock source and divider - \param[in] ckout0_src: CK_OUT0 clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_CKOUT0SRC_IRC16M: IRC16M selected - \arg RCU_CKOUT0SRC_LXTAL: LXTAL selected - \arg RCU_CKOUT0SRC_HXTAL: HXTAL selected - \arg RCU_CKOUT0SRC_PLLP: PLLP selected - \param[in] ckout0_div: CK_OUT0 divider - \arg RCU_CKOUT0_DIVx(x = 1, 2, 3, 4, 5): CK_OUT0 is divided by x - \param[out] none - \retval none -*/ -void rcu_ckout0_config(uint32_t ckout0_src, uint32_t ckout0_div) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the CKOUT0SRC, CKOUT0DIV and set according to ckout0_src and ckout0_div */ - reg &= ~(RCU_CFG0_CKOUT0SEL | RCU_CFG0_CKOUT0DIV); - RCU_CFG0 = (reg | ckout0_src | ckout0_div); -} - -/*! - \brief configure the CK_OUT1 clock source and divider - \param[in] ckout1_src: CK_OUT1 clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_CKOUT1SRC_SYSTEMCLOCK: system clock selected - \arg RCU_CKOUT1SRC_PLLI2SR: PLLI2SR selected - \arg RCU_CKOUT1SRC_HXTAL: HXTAL selected - \arg RCU_CKOUT1SRC_PLLP: PLLP selected - \param[in] ckout1_div: CK_OUT1 divider - \arg RCU_CKOUT1_DIVx(x = 1, 2, 3, 4, 5): CK_OUT1 is divided by x - \param[out] none - \retval none -*/ -void rcu_ckout1_config(uint32_t ckout1_src, uint32_t ckout1_div) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the CKOUT1SRC, CKOUT1DIV and set according to ckout1_src and ckout1_div */ - reg &= ~(RCU_CFG0_CKOUT1SEL | RCU_CFG0_CKOUT1DIV); - RCU_CFG0 = (reg | ckout1_src | ckout1_div); -} - -/*! - \brief configure the main PLL clock - \param[in] pll_src: PLL clock source selection - \arg RCU_PLLSRC_IRC16M: select IRC16M as PLL source clock - \arg RCU_PLLSRC_HXTAL: select HXTAL as PLL source clock - \param[in] pll_psc: the PLL VCO source clock prescaler - \arg this parameter should be selected between 2 and 63 - \param[in] pll_n: the PLL VCO clock multi factor - \arg this parameter should be selected between 64 and 500 - \param[in] pll_p: the PLLP output frequency division factor from PLL VCO clock - \arg this parameter should be selected 2,4,6,8 - \param[in] pll_q: the PLL Q output frequency division factor from PLL VCO clock - \arg this parameter should be selected between 2 and 15 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_pll_config(uint32_t pll_src, uint32_t pll_psc, uint32_t pll_n, uint32_t pll_p, uint32_t pll_q) -{ - uint32_t ss_modulation_inc; - uint32_t ss_modulation_reg; - - ss_modulation_inc = 0U; - ss_modulation_reg = RCU_PLLSSCTL; - - /* calculate the minimum factor of PLLN */ - if((ss_modulation_reg & RCU_PLLSSCTL_SSCGON) == RCU_PLLSSCTL_SSCGON) { - if((ss_modulation_reg & RCU_SS_TYPE_DOWN) == RCU_SS_TYPE_DOWN) { - ss_modulation_inc += RCU_SS_MODULATION_DOWN_INC; - } else { - ss_modulation_inc += RCU_SS_MODULATION_CENTER_INC; - } - } - - /* check the function parameter */ - if(CHECK_PLL_PSC_VALID(pll_psc) && CHECK_PLL_N_VALID(pll_n, ss_modulation_inc) && - CHECK_PLL_P_VALID(pll_p) && CHECK_PLL_Q_VALID(pll_q)) { - RCU_PLL = pll_psc | (pll_n << 6) | (((pll_p >> 1) - 1U) << 16) | - (pll_src) | (pll_q << 24); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the PLLI2S_Q clock - \param[in] plli2s_n: the PLLI2S VCO clock multi factor - \arg this parameter should be selected between 50 and 500 - \param[in] plli2s_q: the PLLI2S Q output frequency division factor from PLLI2S VCO clock - \arg this parameter should be selected between 2 and 15 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_plli2s_q_config(uint32_t plli2s_n, uint32_t plli2s_q) -{ - /* check the function parameter */ - if(CHECK_PLLI2S_N_VALID(plli2s_n) && CHECK_PLLI2S_Q_VALID(plli2s_q)) { - RCU_PLLI2S = (plli2s_n << 6) | (plli2s_q << 24); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the PLLI2S_R clock - \param[in] plli2s_n: the PLLI2S VCO clock multi factor - \arg this parameter should be selected between 50 and 500 - \param[in] plli2s_r: the PLLI2S R output frequency division factor from PLLI2S VCO clock - \arg this parameter should be selected between 2 and 7 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_plli2s_r_config(uint32_t plli2s_n, uint32_t plli2s_r) -{ - /* check the function parameter */ - if(CHECK_PLLI2S_N_VALID(plli2s_n) && CHECK_PLLI2S_R_VALID(plli2s_r)) { - RCU_PLLI2S = (plli2s_n << 6) | (plli2s_r << 28); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the PLLSAI_P clock - \param[in] pllsai_n: the PLLSAI VCO clock multi factor - \arg this parameter should be selected between 50 and 500 - \param[in] pllsai_p: the PLLSAI P output frequency division factor from PLL VCO clock - \arg this parameter should be selected 2,4,6,8 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_pllsai_p_config(uint32_t pllsai_n, uint32_t pllsai_p) -{ - /* check the function parameter */ - if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_P_VALID(pllsai_p)) { - RCU_PLLSAI = (pllsai_n << 6U) | (((pllsai_p >> 1U) - 1U) << 16U); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the PLLSAI_Q clock - \param[in] pllsai_n: the PLLSAI VCO clock multi factor - \arg this parameter should be selected between 50 and 500 - \param[in] pllsai_q: the PLLSAI Q output frequency division factor from PLL VCO clock - \arg this parameter should be selected between 2 and 15 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_pllsai_q_config(uint32_t pllsai_n, uint32_t pllsai_q) -{ - /* check the function parameter */ - if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_Q_VALID(pllsai_q)) { - RCU_PLLSAI = (pllsai_n << 6U) | (pllsai_q << 24U); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the PLLSAI_R clock - \param[in] pllsai_n: the PLLSAI VCO clock multi factor - \arg this parameter should be selected between 50 and 500 - \param[in] pllsai_r: the PLLSAI R output frequency division factor from PLL VCO clock - \arg this parameter should be selected between 2 and 7 - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_pllsai_r_config(uint32_t pllsai_n, uint32_t pllsai_r) -{ - /* check the function parameter */ - if(CHECK_PLLSAI_N_VALID(pllsai_n) && CHECK_PLLSAI_R_VALID(pllsai_r)) { - RCU_PLLSAI = (pllsai_n << 6U) | (pllsai_r << 28U); - } else { - /* return status */ - return ERROR; - } - - /* return status */ - return SUCCESS; -} - -/*! - \brief configure the RTC clock source selection - \param[in] rtc_clock_source: RTC clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_RTCSRC_NONE: no clock selected - \arg RCU_RTCSRC_LXTAL: CK_LXTAL selected as RTC source clock - \arg RCU_RTCSRC_IRC32K: CK_IRC32K selected as RTC source clock - \arg RCU_RTCSRC_HXTAL_DIV_RTCDIV: CK_HXTAL / RTCDIV selected as RTC source clock - \param[out] none - \retval none -*/ -void rcu_rtc_clock_config(uint32_t rtc_clock_source) -{ - uint32_t reg; - - reg = RCU_BDCTL; - /* reset the RTCSRC bits and set according to rtc_clock_source */ - reg &= ~RCU_BDCTL_RTCSRC; - RCU_BDCTL = (reg | rtc_clock_source); -} - -/*! - \brief configure the frequency division of RTC clock when HXTAL was selected as its clock source - \param[in] rtc_div: RTC clock frequency division - only one parameter can be selected which is shown as below: - \arg RCU_RTC_HXTAL_NONE: no clock for RTC - \arg RCU_RTC_HXTAL_DIVx: RTCDIV clock select CK_HXTAL / x, x = 2....31 - \param[out] none - \retval none -*/ -void rcu_rtc_div_config(uint32_t rtc_div) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the RTCDIV bits and set according to rtc_div value */ - reg &= ~RCU_CFG0_RTCDIV; - RCU_CFG0 = (reg | rtc_div); -} - - -/*! - \brief configure the I2S clock source selection - \param[in] i2s_clock_source: I2S clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_I2SSRC_PLLI2S: CK_PLLI2S selected as I2S source clock - \arg RCU_I2SSRC_I2S_CKIN: external i2s_ckin pin selected as I2S source clock - \param[out] none - \retval none -*/ -void rcu_i2s_clock_config(uint32_t i2s_clock_source) -{ - uint32_t reg; - - reg = RCU_CFG0; - /* reset the I2SSEL bit and set according to i2s_clock_source */ - reg &= ~RCU_CFG0_I2SSEL; - RCU_CFG0 = (reg | i2s_clock_source); -} - -/*! - \brief configure the I2Cx(x=3,4,5) clock source selection - \param[in] i2c_idx: IDX_I2Cx(x=3,4,5) - \param[in] ck_i2c: I2C clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_I2CSRC_CKAPB1: CK_I2C select CK_APB1 - \arg RCU_I2CSRC_PLLSAIR: CK_I2C select CK_PLLSAIR - \arg RCU_I2CSRC_IRC16M: CK_I2C select IRC16M - \param[out] none - \retval none -*/ -void rcu_i2c_clock_config(i2c_idx_enum i2c_idx, uint32_t ck_i2c) -{ - switch(i2c_idx) { - case IDX_I2C3: - /* reset the I2C3SEL bits and set according to ck_i2c */ - RCU_CFG2 &= ~RCU_CFG2_I2C3SEL; - RCU_CFG2 |= ck_i2c; - break; - case IDX_I2C4: - /* reset the I2C4SEL bits and set according to ck_i2c */ - RCU_CFG2 &= ~RCU_CFG2_I2C4SEL; - RCU_CFG2 |= (uint32_t)ck_i2c << 2U; - break; - case IDX_I2C5: - /* reset the I2C5SEL bits and set according to ck_i2c */ - RCU_CFG2 &= ~RCU_CFG2_I2C5SEL; - RCU_CFG2 |= (uint32_t)ck_i2c << 4U; - break; - default: - break; - } -} - -/*! - \brief configure the SAI clock source selection - \param[in] sai_clock_source: SAI clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_SAISRC_PLLSAIQ: CK_PLLSAIQ selected as SAI source clock - \arg RCU_SAISRC_PLLI2SQ: CK_PLLI2SQ selected as SAI source clock - \arg RCU_SAISRC_I2S_CKIN: CK_I2S_CKIN selected as SAI source clock - \param[out] none - \retval none -*/ -void rcu_sai_clock_config(uint32_t sai_clock_source) -{ - - uint32_t reg; - - reg = RCU_CFG1; - /* reset the SAISEL bit and set according to sai_clock_source */ - reg &= ~RCU_CFG1_SAISEL; - RCU_CFG1 = (reg | sai_clock_source); -} - -/*! - \brief configure the CK48M clock source selection - \param[in] ck48m_clock_source: CK48M clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_CK48MSRC_PLL48M: CK_PLL48M selected as CK48M source clock - \arg RCU_CK48MSRC_IRC48M: CK_IRC48M selected as CK48M source clock - \param[out] none - \retval none -*/ -void rcu_ck48m_clock_config(uint32_t ck48m_clock_source) -{ - uint32_t reg; - - reg = RCU_ADDCTL; - /* reset the CK48MSEL bit and set according to i2s_clock_source */ - reg &= ~RCU_ADDCTL_CK48MSEL; - RCU_ADDCTL = (reg | ck48m_clock_source); -} - -/*! - \brief configure the PLL48M clock source selection - \param[in] pll48m_clock_source: PLL48M clock source selection - only one parameter can be selected which is shown as below: - \arg RCU_PLL48MSRC_PLLQ: CK_PLLQ selected as PLL48M source clock - \arg RCU_PLL48MSRC_PLLSAIP: CK_PLLSAIP selected as PLL48M source clock - \param[out] none - \retval none -*/ -void rcu_pll48m_clock_config(uint32_t pll48m_clock_source) -{ - uint32_t reg; - - reg = RCU_ADDCTL; - /* reset the PLL48MSEL bit and set according to pll48m_clock_source */ - reg &= ~RCU_ADDCTL_PLL48MSEL; - RCU_ADDCTL = (reg | pll48m_clock_source); -} - -/*! - \brief configure the TIMER clock prescaler selection - \param[in] timer_clock_prescaler: TIMER clock selection - only one parameter can be selected which is shown as below: - \arg RCU_TIMER_PSC_MUL2: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB) - or 0b100(CK_APBx = CK_AHB/2), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). - or else, the TIMER clock is twice the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 2 x CK_APB1; - TIMER in APB2 domain: CK_TIMERx = 2 x CK_APB2) - \arg RCU_TIMER_PSC_MUL4: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB), - 0b100(CK_APBx = CK_AHB/2), or 0b101(CK_APBx = CK_AHB/4), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB). - or else, the TIMER clock is four timers the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 4 x CK_APB1; - TIMER in APB2 domain: CK_TIMERx = 4 x CK_APB2) - \param[out] none - \retval none -*/ -void rcu_timer_clock_prescaler_config(uint32_t timer_clock_prescaler) -{ - /* configure the TIMERSEL bit and select the TIMER clock prescaler */ - if(timer_clock_prescaler == RCU_TIMER_PSC_MUL2) { - RCU_CFG1 &= timer_clock_prescaler; - } else { - RCU_CFG1 |= timer_clock_prescaler; - } -} - -/*! - \brief configure the PLLSAIR divider used as input of TLI - \param[in] pllsai_r_div: PLLSAIR divider used as input of TLI - only one parameter can be selected which is shown as below: - \arg RCU_PLLSAIR_DIVx(x=2,4,8,16): PLLSAIR divided x used as input of TLI - \param[out] none - \retval none -*/ -void rcu_tli_clock_div_config(uint32_t pllsai_r_div) -{ - uint32_t reg; - - reg = RCU_CFG1; - /* reset the PLLSAIRDIV bit and set according to pllsai_r_div */ - reg &= ~RCU_CFG1_PLLSAIRDIV; - RCU_CFG1 = (reg | pllsai_r_div); -} - -/*! - \brief configure the LXTAL drive capability - \param[in] lxtal_dricap: drive capability of LXTAL - only one parameter can be selected which is shown as below: - \arg RCU_LXTALDRI_LOWER_DRIVE: lower driving capability - \arg RCU_LXTALDRI_HIGHER_DRIVE: higher driving capability - \param[out] none - \retval none -*/ -void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap) -{ - uint32_t reg; - - reg = RCU_BDCTL; - - /* reset the LXTALDRI bits and set according to lxtal_dricap */ - reg &= ~RCU_BDCTL_LXTALDRI; - RCU_BDCTL = (reg | lxtal_dricap); -} - -/*! - \brief wait for oscillator stabilization flags is SET or oscillator startup is timeout - \param[in] osci: oscillator types, refer to rcu_osci_type_enum - only one parameter can be selected which is shown as below: - \arg RCU_HXTAL: HXTAL - \arg RCU_LXTAL: LXTAL - \arg RCU_IRC16M: IRC16M - \arg RCU_IRC48M: IRC48M - \arg RCU_IRC32K: IRC32K - \arg RCU_PLL_CK: PLL - \arg RCU_PLLI2S_CK: PLLI2S - \arg RCU_PLLSAI_CK: PLLSAI - \param[out] none - \retval ErrStatus: SUCCESS or ERROR -*/ -ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci) -{ - uint32_t stb_cnt = 0U; - ErrStatus reval = ERROR; - FlagStatus osci_stat = RESET; - - switch(osci) { - /* wait HXTAL stable */ - case RCU_HXTAL: - while((RESET == osci_stat) && (HXTAL_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_HXTALSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_HXTALSTB)) { - reval = SUCCESS; - } - break; - /* wait LXTAL stable */ - case RCU_LXTAL: - while((RESET == osci_stat) && (LXTAL_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_LXTALSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_LXTALSTB)) { - reval = SUCCESS; - } - break; - /* wait IRC16M stable */ - case RCU_IRC16M: - while((RESET == osci_stat) && (IRC16M_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_IRC16MSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_IRC16MSTB)) { - reval = SUCCESS; - } - break; - /* wait IRC48M stable */ - case RCU_IRC48M: - while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_IRC48MSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_IRC48MSTB)) { - reval = SUCCESS; - } - break; - /* wait IRC32K stable */ - case RCU_IRC32K: - while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_IRC32KSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_IRC32KSTB)) { - reval = SUCCESS; - } - break; - /* wait PLL stable */ - case RCU_PLL_CK: - while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_PLLSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_PLLSTB)) { - reval = SUCCESS; - } - break; - /* wait PLLI2S stable */ - case RCU_PLLI2S_CK: - while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_PLLI2SSTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_PLLI2SSTB)) { - reval = SUCCESS; - } - break; - /* wait PLLSAI stable */ - case RCU_PLLSAI_CK: - while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)) { - osci_stat = rcu_flag_get(RCU_FLAG_PLLSAISTB); - stb_cnt++; - } - - /* check whether flag is set */ - if(RESET != rcu_flag_get(RCU_FLAG_PLLSAISTB)) { - reval = SUCCESS; - } - break; - - default: - break; - } - - /* return value */ - return reval; -} - -/*! - \brief turn on the oscillator - \param[in] osci: oscillator types, refer to rcu_osci_type_enum - only one parameter can be selected which is shown as below: - \arg RCU_HXTAL: HXTAL - \arg RCU_LXTAL: LXTAL - \arg RCU_IRC16M: IRC16M - \arg RCU_IRC48M: IRC48M - \arg RCU_IRC32K: IRC32K - \arg RCU_PLL_CK: PLL - \arg RCU_PLLI2S_CK: PLLI2S - \arg RCU_PLLSAI_CK: PLLSAI - \param[out] none - \retval none -*/ -void rcu_osci_on(rcu_osci_type_enum osci) -{ - RCU_REG_VAL(osci) |= BIT(RCU_BIT_POS(osci)); -} - -/*! - \brief turn off the oscillator - \param[in] osci: oscillator types, refer to rcu_osci_type_enum - only one parameter can be selected which is shown as below: - \arg RCU_HXTAL: HXTAL - \arg RCU_LXTAL: LXTAL - \arg RCU_IRC16M: IRC16M - \arg RCU_IRC48M: IRC48M - \arg RCU_IRC32K: IRC32K - \arg RCU_PLL_CK: PLL - \arg RCU_PLLI2S_CK: PLLI2S - \arg RCU_PLLSAI_CK: PLLSAI - \param[out] none - \retval none -*/ -void rcu_osci_off(rcu_osci_type_enum osci) -{ - RCU_REG_VAL(osci) &= ~BIT(RCU_BIT_POS(osci)); -} - -/*! - \brief enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it - \param[in] osci: oscillator types, refer to rcu_osci_type_enum - only one parameter can be selected which is shown as below: - \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) - \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) - \param[out] none - \retval none -*/ -void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci) -{ - uint32_t reg; - - switch(osci) { - /* enable HXTAL to bypass mode */ - case RCU_HXTAL: - reg = RCU_CTL; - RCU_CTL &= ~RCU_CTL_HXTALEN; - RCU_CTL = (reg | RCU_CTL_HXTALBPS); - break; - /* enable LXTAL to bypass mode */ - case RCU_LXTAL: - reg = RCU_BDCTL; - RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; - RCU_BDCTL = (reg | RCU_BDCTL_LXTALBPS); - break; - case RCU_IRC16M: - case RCU_IRC48M: - case RCU_IRC32K: - case RCU_PLL_CK: - case RCU_PLLI2S_CK: - case RCU_PLLSAI_CK: - break; - default: - break; - } -} - -/*! - \brief disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it - \param[in] osci: oscillator types, refer to rcu_osci_type_enum - only one parameter can be selected which is shown as below: - \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) - \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) - \param[out] none - \retval none -*/ -void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci) -{ - uint32_t reg; - - switch(osci) { - /* disable HXTAL to bypass mode */ - case RCU_HXTAL: - reg = RCU_CTL; - RCU_CTL &= ~RCU_CTL_HXTALEN; - RCU_CTL = (reg & ~RCU_CTL_HXTALBPS); - break; - /* disable LXTAL to bypass mode */ - case RCU_LXTAL: - reg = RCU_BDCTL; - RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; - RCU_BDCTL = (reg & ~RCU_BDCTL_LXTALBPS); - break; - case RCU_IRC16M: - case RCU_IRC48M: - case RCU_IRC32K: - case RCU_PLL_CK: - case RCU_PLLI2S_CK: - case RCU_PLLSAI_CK: - break; - default: - break; - } -} - -/*! - \brief set the IRC16M adjust value - \param[in] irc16m_adjval: IRC16M adjust value, must be between 0 and 0x1F - \arg 0x00 - 0x1F - \param[out] none - \retval none -*/ -void rcu_irc16m_adjust_value_set(uint32_t irc16m_adjval) -{ - uint32_t reg; - - reg = RCU_CTL; - /* reset the IRC16MADJ bits and set according to irc16m_adjval */ - reg &= ~RCU_CTL_IRC16MADJ; - RCU_CTL = (reg | ((irc16m_adjval & RCU_IRC16M_ADJUST_MASK) << RCU_IRC16M_ADJUST_OFFSET)); -} - -/*! - \brief configure the spread spectrum modulation for the main PLL clock - \param[in] spread_spectrum_type: PLL spread spectrum modulation type select - \arg RCU_SS_TYPE_CENTER: center spread type is selected - \arg RCU_SS_TYPE_DOWN: down spread type is selected - \param[in] modstep: configure PLL spread spectrum modulation profile amplitude and frequency - \arg This parameter should be selected between 0 and 7FFF.The following criteria must be met: MODSTEP*MODCNT <=2^15-1 - \param[in] modcnt: configure PLL spread spectrum modulation profile amplitude and frequency - \arg This parameter should be selected between 0 and 1FFF.The following criteria must be met: MODSTEP*MODCNT <=2^15-1 - \param[out] none - \retval none -*/ -void rcu_spread_spectrum_config(uint32_t spread_spectrum_type, uint32_t modstep, uint32_t modcnt) -{ - uint32_t reg; - - reg = RCU_PLLSSCTL; - /* reset the RCU_PLLSSCTL register bits */ - reg &= ~(RCU_PLLSSCTL_MODCNT | RCU_PLLSSCTL_MODSTEP | RCU_PLLSSCTL_SS_TYPE); - RCU_PLLSSCTL = (reg | spread_spectrum_type | modstep << 13 | modcnt); -} - -/*! - \brief enable the spread spectrum modulation for the main PLL clock - \param[in] none - \param[out] none - \retval none -*/ -void rcu_spread_spectrum_enable(void) -{ - RCU_PLLSSCTL |= RCU_PLLSSCTL_SSCGON; -} - -/*! - \brief disable the spread spectrum modulation for the main PLL clock - \param[in] none - \param[out] none - \retval none -*/ -void rcu_spread_spectrum_disable(void) -{ - RCU_PLLSSCTL &= ~RCU_PLLSSCTL_SSCGON; -} - -/*! - \brief enable the HXTAL clock monitor - \param[in] none - \param[out] none - \retval none -*/ -void rcu_hxtal_clock_monitor_enable(void) -{ - RCU_CTL |= RCU_CTL_CKMEN; -} - -/*! - \brief disable the HXTAL clock monitor - \param[in] none - \param[out] none - \retval none -*/ -void rcu_hxtal_clock_monitor_disable(void) -{ - RCU_CTL &= ~RCU_CTL_CKMEN; -} - -/*! - \brief unlock the voltage key - \param[in] none - \param[out] none - \retval none -*/ -void rcu_voltage_key_unlock(void) -{ - RCU_VKEY = RCU_VKEY_UNLOCK; -} - -/*! - \brief set the deep sleep mode voltage - \param[in] dsvol: deep sleep mode voltage - only one parameter can be selected which is shown as below: - \arg RCU_DEEPSLEEP_V_0: the core voltage is default value - \arg RCU_DEEPSLEEP_V_1: the core voltage is (default value-0.1)V(customers are not recommended to use it) - \arg RCU_DEEPSLEEP_V_2: the core voltage is (default value-0.2)V(customers are not recommended to use it) - \arg RCU_DEEPSLEEP_V_3: the core voltage is (default value-0.3)V(customers are not recommended to use it) - \param[out] none - \retval none -*/ -void rcu_deepsleep_voltage_set(uint32_t dsvol) -{ - dsvol &= RCU_DSV_DSLPVS; - RCU_DSV = dsvol; -} - -/*! - \brief get the system clock, bus and peripheral clock frequency - \param[in] clock: the clock frequency which to get - only one parameter can be selected which is shown as below: - \arg CK_SYS: system clock frequency - \arg CK_AHB: AHB clock frequency - \arg CK_APB1: APB1 clock frequency - \arg CK_APB2: APB2 clock frequency - \param[out] none - \retval clock frequency of system, AHB, APB1, APB2 -*/ -uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock) -{ - uint32_t sws, ck_freq = 0U; - uint32_t cksys_freq, ahb_freq, apb1_freq, apb2_freq; - uint32_t pllpsc, plln, pllsel, pllp, ck_src, idx, clk_exp; - - /* exponent of AHB, APB1 and APB2 clock divider */ - const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t apb1_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - const uint8_t apb2_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - - sws = GET_BITS(RCU_CFG0, 2, 3); - switch(sws) { - /* IRC16M is selected as CK_SYS */ - case SEL_IRC16M: - cksys_freq = IRC16M_VALUE; - break; - /* HXTAL is selected as CK_SYS */ - case SEL_HXTAL: - cksys_freq = HXTAL_VALUE; - break; - /* PLLP is selected as CK_SYS */ - case SEL_PLLP: - /* get the value of PLLPSC[5:0] */ - pllpsc = GET_BITS(RCU_PLL, 0U, 5U); - plln = GET_BITS(RCU_PLL, 6U, 14U); - pllp = (GET_BITS(RCU_PLL, 16U, 17U) + 1U) * 2U; - /* PLL clock source selection, HXTAL or IRC16M/2 */ - pllsel = (RCU_PLL & RCU_PLL_PLLSEL); - if(RCU_PLLSRC_HXTAL == pllsel) { - ck_src = HXTAL_VALUE; - } else { - ck_src = IRC16M_VALUE; - } - cksys_freq = ((ck_src / pllpsc) * plln) / pllp; - break; - /* IRC16M is selected as CK_SYS */ - default: - cksys_freq = IRC16M_VALUE; - break; - } - /* calculate AHB clock frequency */ - idx = GET_BITS(RCU_CFG0, 4, 7); - clk_exp = ahb_exp[idx]; - ahb_freq = cksys_freq >> clk_exp; - - /* calculate APB1 clock frequency */ - idx = GET_BITS(RCU_CFG0, 10, 12); - clk_exp = apb1_exp[idx]; - apb1_freq = ahb_freq >> clk_exp; - - /* calculate APB2 clock frequency */ - idx = GET_BITS(RCU_CFG0, 13, 15); - clk_exp = apb2_exp[idx]; - apb2_freq = ahb_freq >> clk_exp; - - /* return the clocks frequency */ - switch(clock) { - case CK_SYS: - ck_freq = cksys_freq; - break; - case CK_AHB: - ck_freq = ahb_freq; - break; - case CK_APB1: - ck_freq = apb1_freq; - break; - case CK_APB2: - ck_freq = apb2_freq; - break; - default: - break; - } - return ck_freq; -} - -/*! - \brief get the clock stabilization and periphral reset flags - \param[in] flag: the clock stabilization and periphral reset flags, refer to rcu_flag_enum - only one parameter can be selected which is shown as below: - \arg RCU_FLAG_IRC16MSTB: IRC16M stabilization flag - \arg RCU_FLAG_HXTALSTB: HXTAL stabilization flag - \arg RCU_FLAG_PLLSTB: PLL stabilization flag - \arg RCU_FLAG_PLLI2SSTB: PLLI2S stabilization flag - \arg RCU_FLAG_PLLSAISTB: PLLSAI stabilization flag - \arg RCU_FLAG_LXTALSTB: LXTAL stabilization flag - \arg RCU_FLAG_IRC32KSTB: IRC32K stabilization flag - \arg RCU_FLAG_IRC48MSTB: IRC48M stabilization flag - \arg RCU_FLAG_BORRST: BOR reset flags - \arg RCU_FLAG_EPRST: external PIN reset flag - \arg RCU_FLAG_PORRST: Power reset flag - \arg RCU_FLAG_SWRST: software reset flag - \arg RCU_FLAG_FWDGTRST: free watchdog timer reset flag - \arg RCU_FLAG_WWDGTRST: window watchdog timer reset flag - \arg RCU_FLAG_LPRST: low-power reset flag - \param[out] none - \retval none -*/ -FlagStatus rcu_flag_get(rcu_flag_enum flag) -{ - /* get the rcu flag */ - if(RESET != (RCU_REG_VAL(flag) & BIT(RCU_BIT_POS(flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear all the reset flag - \param[in] none - \param[out] none - \retval none -*/ -void rcu_all_reset_flag_clear(void) -{ - RCU_RSTSCK |= RCU_RSTSCK_RSTFC; -} - -/*! - \brief get the clock stabilization interrupt and ckm flags - \param[in] int_flag: interrupt and ckm flags, refer to rcu_int_flag_enum - only one parameter can be selected which is shown as below: - \arg RCU_INT_FLAG_IRC32KSTB: IRC32K stabilization interrupt flag - \arg RCU_INT_FLAG_LXTALSTB: LXTAL stabilization interrupt flag - \arg RCU_INT_FLAG_IRC16MSTB: IRC16M stabilization interrupt flag - \arg RCU_INT_FLAG_HXTALSTB: HXTAL stabilization interrupt flag - \arg RCU_INT_FLAG_PLLSTB: PLL stabilization interrupt flag - \arg RCU_INT_FLAG_PLLI2SSTB: PLLI2S stabilization interrupt flag - \arg RCU_INT_FLAG_PLLSAISTB: PLLSAI stabilization interrupt flag - \arg RCU_INT_FLAG_CKM: HXTAL clock stuck interrupt flag - \arg RCU_INT_FLAG_IRC48MSTB: IRC48M stabilization interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag) -{ - /* get the rcu interrupt flag */ - if(RESET != (RCU_REG_VAL(int_flag) & BIT(RCU_BIT_POS(int_flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear the interrupt flags - \param[in] int_flag: clock stabilization and stuck interrupt flags clear, refer to rcu_int_flag_clear_enum - only one parameter can be selected which is shown as below: - \arg RCU_INT_FLAG_IRC32KSTB_CLR: IRC32K stabilization interrupt flag clear - \arg RCU_INT_FLAG_LXTALSTB_CLR: LXTAL stabilization interrupt flag clear - \arg RCU_INT_FLAG_IRC16MSTB_CLR: IRC16M stabilization interrupt flag clear - \arg RCU_INT_FLAG_HXTALSTB_CLR: HXTAL stabilization interrupt flag clear - \arg RCU_INT_FLAG_PLLSTB_CLR: PLL stabilization interrupt flag clear - \arg RCU_INT_FLAG_PLLI2SSTB_CLR: PLLI2S stabilization interrupt flag clear - \arg RCU_INT_FLAG_PLLSAISTB_CLR: PLLSAI stabilization interrupt flag clear - \arg RCU_INT_FLAG_CKM_CLR: clock stuck interrupt flag clear - \arg RCU_INT_FLAG_IRC48MSTB_CLR: IRC48M stabilization interrupt flag clear - \param[out] none - \retval none -*/ -void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag) -{ - RCU_REG_VAL(int_flag) |= BIT(RCU_BIT_POS(int_flag)); -} - -/*! - \brief enable the stabilization interrupt - \param[in] interrupt: clock stabilization interrupt, refer to rcu_int_enum - Only one parameter can be selected which is shown as below: - \arg RCU_INT_IRC32KSTB: IRC32K stabilization interrupt enable - \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable - \arg RCU_INT_IRC16MSTB: IRC16M stabilization interrupt enable - \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable - \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable - \arg RCU_INT_PLLI2SSTB: PLLI2S stabilization interrupt enable - \arg RCU_INT_PLLSAISTB: PLLSAI stabilization interrupt enable - \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt enable - \param[out] none - \retval none -*/ -void rcu_interrupt_enable(rcu_int_enum interrupt) -{ - RCU_REG_VAL(interrupt) |= BIT(RCU_BIT_POS(interrupt)); -} - -/*! - \brief disable the stabilization interrupt - \param[in] interrupt: clock stabilization interrupt, refer to rcu_int_enum - only one parameter can be selected which is shown as below: - \arg RCU_INT_IRC32KSTB: IRC32K stabilization interrupt disable - \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt disable - \arg RCU_INT_IRC16MSTB: IRC16M stabilization interrupt disable - \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt disable - \arg RCU_INT_PLLSTB: PLL stabilization interrupt disable - \arg RCU_INT_PLLI2SSTB: PLLI2S stabilization interrupt disable - \arg RCU_INT_PLLSAISTB: PLLSAI stabilization interrupt disable - \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt disable - \param[out] none - \retval none -*/ -void rcu_interrupt_disable(rcu_int_enum interrupt) -{ - RCU_REG_VAL(interrupt) &= ~BIT(RCU_BIT_POS(interrupt)); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c deleted file mode 100644 index 1df977fc062..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c +++ /dev/null @@ -1,1289 +0,0 @@ -/*! - \file gd32f5xx_rtc.c - \brief RTC driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#include "gd32f5xx_rtc.h" - -/* RTC timeout value */ -#define RTC_WTWF_TIMEOUT ((uint32_t)0x00004000U) /*!< wakeup timer can be write flag timeout */ -#define RTC_INITM_TIMEOUT ((uint32_t)0x00004000U) /*!< initialization state flag timeout */ -#define RTC_RSYNF_TIMEOUT ((uint32_t)0x00008000U) /*!< register synchronization flag timeout */ -#define RTC_HRFC_TIMEOUT ((uint32_t)0x20000000U) /*!< recalibration pending flag timeout */ -#define RTC_SHIFTCTL_TIMEOUT ((uint32_t)0x00001000U) /*!< shift function operation pending flag timeout */ -#define RTC_ALRMXWF_TIMEOUT ((uint32_t)0x00008000U) /*!< alarm configuration can be write flag timeout */ - -/*! - \brief reset most of the RTC registers - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_deinit(void) -{ - ErrStatus error_status = ERROR; - volatile uint32_t time_index = RTC_WTWF_TIMEOUT; - uint32_t flag_status = RESET; - /* RTC_TAMP register is not under write protection */ - RTC_TAMP = RTC_REGISTER_RESET; - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - /* reset RTC_CTL register, but RTC_CTL[2:0] */ - RTC_CTL &= (RTC_REGISTER_RESET | RTC_CTL_WTCS); - /* before reset RTC_TIME and RTC_DATE, BPSHAD bit in RTC_CTL should be reset as the condition. - in order to read calendar from shadow register, not the real registers being reset */ - RTC_TIME = RTC_REGISTER_RESET; - RTC_DATE = RTC_DATE_RESET; - - RTC_PSC = RTC_PSC_RESET; - /* only when RTC_CTL_WTEN=0 and RTC_STAT_WTWF=1 can write RTC_CTL[2:0] */ - /* wait until the WTWF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_WTWF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET == flag_status) { - error_status = ERROR; - } else { - RTC_CTL &= RTC_REGISTER_RESET; - RTC_WUT = RTC_WUT_RESET; - RTC_COSC = RTC_REGISTER_RESET; - /* to write RTC_ALRMxSS register, ALRMxEN bit in RTC_CTL register should be reset as the condition */ - RTC_ALRM0TD = RTC_REGISTER_RESET; - RTC_ALRM1TD = RTC_REGISTER_RESET; - RTC_ALRM0SS = RTC_REGISTER_RESET; - RTC_ALRM1SS = RTC_REGISTER_RESET; - /* reset RTC_STAT register, also exit init mode. - at the same time, RTC_STAT_SOPF bit is reset, as the condition to reset RTC_SHIFTCTL register later */ - RTC_STAT = RTC_STAT_RESET; - /* reset RTC_SHIFTCTL and RTC_HRFC register, this can be done without the init mode */ - RTC_SHIFTCTL = RTC_REGISTER_RESET; - RTC_HRFC = RTC_REGISTER_RESET; - error_status = rtc_register_sync_wait(); - } - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief initialize RTC registers - \param[in] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains - parameters for initialization of the rtc peripheral - members of the structure and the member values are shown as below: - year: 0x0 - 0x99(BCD format) - month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, - RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC - date: 0x1 - 0x31(BCD format) - day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY - RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY - hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format chose - minute: 0x0 - 0x59(BCD format) - second: 0x0 - 0x59(BCD format) - factor_asyn: 0x0 - 0x7F - factor_syn: 0x0 - 0x7FFF - am_pm: RTC_AM, RTC_PM - display_format: RTC_24HOUR, RTC_12HOUR - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_init(rtc_parameter_struct *rtc_initpara_struct) -{ - ErrStatus error_status = ERROR; - uint32_t reg_time = 0U, reg_date = 0U; - - reg_date = (DATE_YR(rtc_initpara_struct->year) | \ - DATE_DOW(rtc_initpara_struct->day_of_week) | \ - DATE_MON(rtc_initpara_struct->month) | \ - DATE_DAY(rtc_initpara_struct->date)); - - reg_time = (rtc_initpara_struct->am_pm | \ - TIME_HR(rtc_initpara_struct->hour) | \ - TIME_MN(rtc_initpara_struct->minute) | \ - TIME_SC(rtc_initpara_struct->second)); - - /* 1st: disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* 2nd: enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - RTC_PSC = (uint32_t)(PSC_FACTOR_A(rtc_initpara_struct->factor_asyn) | \ - PSC_FACTOR_S(rtc_initpara_struct->factor_syn)); - - RTC_TIME = (uint32_t)reg_time; - RTC_DATE = (uint32_t)reg_date; - - RTC_CTL &= (uint32_t)(~RTC_CTL_CS); - RTC_CTL |= rtc_initpara_struct->display_format; - - /* 3rd: exit init mode */ - rtc_init_mode_exit(); - - /* 4th: wait the RSYNF flag to set */ - error_status = rtc_register_sync_wait(); - } - - /* 5th: enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief enter RTC init mode - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_init_mode_enter(void) -{ - volatile uint32_t time_index = RTC_INITM_TIMEOUT; - uint32_t flag_status = RESET; - ErrStatus error_status = ERROR; - - /* check whether it has been in init mode */ - if((uint32_t)RESET == (RTC_STAT & RTC_STAT_INITF)) { - RTC_STAT |= RTC_STAT_INITM; - - /* wait until the INITF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_INITF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET != flag_status) { - error_status = SUCCESS; - } - } else { - error_status = SUCCESS; - } - return error_status; -} - -/*! - \brief exit RTC init mode - \param[in] none - \param[out] none - \retval none -*/ -void rtc_init_mode_exit(void) -{ - RTC_STAT &= (uint32_t)(~RTC_STAT_INITM); -} - -/*! - \brief wait until RTC_TIME and RTC_DATE registers are synchronized with APB clock, and the shadow - registers are updated - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_register_sync_wait(void) -{ - volatile uint32_t time_index = RTC_RSYNF_TIMEOUT; - uint32_t flag_status = RESET; - ErrStatus error_status = ERROR; - - if((uint32_t)RESET == (RTC_CTL & RTC_CTL_BPSHAD)) { - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* firstly clear RSYNF flag */ - RTC_STAT &= (uint32_t)(~RTC_STAT_RSYNF); - - /* wait until RSYNF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_RSYNF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET != flag_status) { - error_status = SUCCESS; - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - } else { - error_status = SUCCESS; - } - - return error_status; -} - -/*! - \brief get current time and date - \param[in] none - \param[out] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains - parameters for initialization of the rtc peripheral - members of the structure and the member values are shown as below: - year: 0x0 - 0x99(BCD format) - month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, - RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC - date: 0x1 - 0x31(BCD format) - day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY - RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY - hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format chose - minute: 0x0 - 0x59(BCD format) - second: 0x0 - 0x59(BCD format) - factor_asyn: 0x0 - 0x7F - factor_syn: 0x0 - 0x7FFF - am_pm: RTC_AM, RTC_PM - display_format: RTC_24HOUR, RTC_12HOUR - \retval none -*/ -void rtc_current_time_get(rtc_parameter_struct *rtc_initpara_struct) -{ - uint32_t temp_tr = 0U, temp_dr = 0U, temp_pscr = 0U, temp_ctlr = 0U; - - temp_tr = (uint32_t)RTC_TIME; - temp_dr = (uint32_t)RTC_DATE; - temp_pscr = (uint32_t)RTC_PSC; - temp_ctlr = (uint32_t)RTC_CTL; - - /* get current time and construct rtc_parameter_struct structure */ - rtc_initpara_struct->year = (uint8_t)GET_DATE_YR(temp_dr); - rtc_initpara_struct->month = (uint8_t)GET_DATE_MON(temp_dr); - rtc_initpara_struct->date = (uint8_t)GET_DATE_DAY(temp_dr); - rtc_initpara_struct->day_of_week = (uint8_t)GET_DATE_DOW(temp_dr); - rtc_initpara_struct->hour = (uint8_t)GET_TIME_HR(temp_tr); - rtc_initpara_struct->minute = (uint8_t)GET_TIME_MN(temp_tr); - rtc_initpara_struct->second = (uint8_t)GET_TIME_SC(temp_tr); - rtc_initpara_struct->factor_asyn = (uint16_t)GET_PSC_FACTOR_A(temp_pscr); - rtc_initpara_struct->factor_syn = (uint16_t)GET_PSC_FACTOR_S(temp_pscr); - rtc_initpara_struct->am_pm = (uint32_t)(temp_tr & RTC_TIME_PM); - rtc_initpara_struct->display_format = (uint32_t)(temp_ctlr & RTC_CTL_CS); -} - -/*! - \brief get current subsecond value - \param[in] none - \param[out] none - \retval current subsecond value -*/ -uint32_t rtc_subsecond_get(void) -{ - uint32_t reg = 0U; - /* if BPSHAD bit is reset, reading RTC_SS will lock RTC_TIME and RTC_DATE automatically */ - reg = (uint32_t)RTC_SS; - /* read RTC_DATE to unlock the 3 shadow registers */ - (void)(RTC_DATE); - - return reg; -} - -/*! - \brief configure RTC alarm - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[in] rtc_alarm_time: pointer to a rtc_alarm_struct structure which contains - parameters for RTC alarm configuration - members of the structure and the member values are shown as below: - alarm_mask: RTC_ALARM_NONE_MASK, RTC_ALARM_DATE_MASK, RTC_ALARM_HOUR_MASK - RTC_ALARM_MINUTE_MASK, RTC_ALARM_SECOND_MASK, RTC_ALARM_ALL_MASK - weekday_or_date: RTC_ALARM_DATE_SELECTED, RTC_ALARM_WEEKDAY_SELECTED - alarm_day: 1) 0x1 - 0x31(BCD format) if RTC_ALARM_DATE_SELECTED is set - 2) RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, - RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set - alarm_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format - alarm_minute: 0x0 - 0x59(BCD format) - alarm_second: 0x0 - 0x59(BCD format) - am_pm: RTC_AM, RTC_PM - \param[out] none - \retval none -*/ -void rtc_alarm_config(uint8_t rtc_alarm, rtc_alarm_struct *rtc_alarm_time) -{ - uint32_t reg_alrmtd = 0U; - - reg_alrmtd = (rtc_alarm_time->alarm_mask | \ - rtc_alarm_time->weekday_or_date | \ - rtc_alarm_time->am_pm | \ - ALRMTD_DAY(rtc_alarm_time->alarm_day) | \ - ALRMTD_HR(rtc_alarm_time->alarm_hour) | \ - ALRMTD_MN(rtc_alarm_time->alarm_minute) | \ - ALRMTD_SC(rtc_alarm_time->alarm_second)); - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - if(RTC_ALARM0 == rtc_alarm) { - RTC_ALRM0TD = (uint32_t)reg_alrmtd; - - } else { - RTC_ALRM1TD = (uint32_t)reg_alrmtd; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief configure subsecond of RTC alarm - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[in] mask_subsecond: alarm subsecond mask - \arg RTC_MASKSSC_0_14: mask alarm subsecond configuration - \arg RTC_MASKSSC_1_14: mask RTC_ALRMXSS_SSC[14:1], and RTC_ALRMXSS_SSC[0] is to be compared - \arg RTC_MASKSSC_2_14: mask RTC_ALRMXSS_SSC[14:2], and RTC_ALRMXSS_SSC[1:0] is to be compared - \arg RTC_MASKSSC_3_14: mask RTC_ALRMXSS_SSC[14:3], and RTC_ALRMXSS_SSC[2:0] is to be compared - \arg RTC_MASKSSC_4_14: mask RTC_ALRMXSS_SSC[14:4]], and RTC_ALRMXSS_SSC[3:0] is to be compared - \arg RTC_MASKSSC_5_14: mask RTC_ALRMXSS_SSC[14:5], and RTC_ALRMXSS_SSC[4:0] is to be compared - \arg RTC_MASKSSC_6_14: mask RTC_ALRMXSS_SSC[14:6], and RTC_ALRMXSS_SSC[5:0] is to be compared - \arg RTC_MASKSSC_7_14: mask RTC_ALRMXSS_SSC[14:7], and RTC_ALRMXSS_SSC[6:0] is to be compared - \arg RTC_MASKSSC_8_14: mask RTC_ALRMXSS_SSC[14:8], and RTC_ALRMXSS_SSC[7:0] is to be compared - \arg RTC_MASKSSC_9_14: mask RTC_ALRMXSS_SSC[14:9], and RTC_ALRMXSS_SSC[8:0] is to be compared - \arg RTC_MASKSSC_10_14: mask RTC_ALRMXSS_SSC[14:10], and RTC_ALRMXSS_SSC[9:0] is to be compared - \arg RTC_MASKSSC_11_14: mask RTC_ALRMXSS_SSC[14:11], and RTC_ALRMXSS_SSC[10:0] is to be compared - \arg RTC_MASKSSC_12_14: mask RTC_ALRMXSS_SSC[14:12], and RTC_ALRMXSS_SSC[11:0] is to be compared - \arg RTC_MASKSSC_13_14: mask RTC_ALRMXSS_SSC[14:13], and RTC_ALRMXSS_SSC[12:0] is to be compared - \arg RTC_MASKSSC_14: mask RTC_ALRMXSS_SSC[14], and RTC_ALRMXSS_SSC[13:0] is to be compared - \arg RTC_MASKSSC_NONE: mask none, and RTC_ALRMXSS_SSC[14:0] is to be compared - \param[in] subsecond: alarm subsecond value(0x0000 - 0x7FFF) - \param[out] none - \retval none -*/ -void rtc_alarm_subsecond_config(uint8_t rtc_alarm, uint32_t mask_subsecond, uint32_t subsecond) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - if(RTC_ALARM0 == rtc_alarm) { - RTC_ALRM0SS = mask_subsecond | subsecond; - } else { - RTC_ALRM1SS = mask_subsecond | subsecond; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief get RTC alarm - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[out] rtc_alarm_time: pointer to a rtc_alarm_struct structure which contains - parameters for RTC alarm configuration - members of the structure and the member values are shown as below: - alarm_mask: RTC_ALARM_NONE_MASK, RTC_ALARM_DATE_MASK, RTC_ALARM_HOUR_MASK - RTC_ALARM_MINUTE_MASK, RTC_ALARM_SECOND_MASK, RTC_ALARM_ALL_MASK - weekday_or_date: RTC_ALARM_DATE_SELECTED, RTC_ALARM_WEEKDAY_SELECTED - alarm_day: 1) 0x1 - 0x31(BCD format) if RTC_ALARM_DATE_SELECTED is set - 2) RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, - RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set - alarm_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format - alarm_minute: 0x0 - 0x59(BCD format) - alarm_second: 0x0 - 0x59(BCD format) - am_pm: RTC_AM, RTC_PM - \retval none -*/ -void rtc_alarm_get(uint8_t rtc_alarm, rtc_alarm_struct *rtc_alarm_time) -{ - uint32_t reg_alrmtd = 0U; - - /* get the value of RTC_ALRM0TD register */ - if(RTC_ALARM0 == rtc_alarm) { - reg_alrmtd = RTC_ALRM0TD; - } else { - reg_alrmtd = RTC_ALRM1TD; - } - /* get alarm parameters and construct the rtc_alarm_struct structure */ - rtc_alarm_time->alarm_mask = reg_alrmtd & RTC_ALARM_ALL_MASK; - rtc_alarm_time->am_pm = (uint32_t)(reg_alrmtd & RTC_ALRMXTD_PM); - rtc_alarm_time->weekday_or_date = (uint32_t)(reg_alrmtd & RTC_ALRMXTD_DOWS); - rtc_alarm_time->alarm_day = (uint8_t)GET_ALRMTD_DAY(reg_alrmtd); - rtc_alarm_time->alarm_hour = (uint8_t)GET_ALRMTD_HR(reg_alrmtd); - rtc_alarm_time->alarm_minute = (uint8_t)GET_ALRMTD_MN(reg_alrmtd); - rtc_alarm_time->alarm_second = (uint8_t)GET_ALRMTD_SC(reg_alrmtd); -} - -/*! - \brief get RTC alarm subsecond - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[out] none - \retval RTC alarm subsecond value -*/ -uint32_t rtc_alarm_subsecond_get(uint8_t rtc_alarm) -{ - if(RTC_ALARM0 == rtc_alarm) { - return ((uint32_t)(RTC_ALRM0SS & RTC_ALRM0SS_SSC)); - } else { - return ((uint32_t)(RTC_ALRM1SS & RTC_ALRM1SS_SSC)); - } -} - -/*! - \brief enable RTC alarm - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[out] none - \retval none -*/ -void rtc_alarm_enable(uint8_t rtc_alarm) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - if(RTC_ALARM0 == rtc_alarm) { - RTC_CTL |= RTC_CTL_ALRM0EN; - } else { - RTC_CTL |= RTC_CTL_ALRM1EN; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief disable RTC alarm - \param[in] rtc_alarm: RTC_ALARM0 or RTC_ALARM1 - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_alarm_disable(uint8_t rtc_alarm) -{ - volatile uint32_t time_index = RTC_ALRMXWF_TIMEOUT; - ErrStatus error_status = ERROR; - uint32_t flag_status = RESET; - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* clear the state of alarm */ - if(RTC_ALARM0 == rtc_alarm) { - RTC_CTL &= (uint32_t)(~RTC_CTL_ALRM0EN); - /* wait until ALRM0WF flag to be set after the alarm is disabled */ - do { - flag_status = RTC_STAT & RTC_STAT_ALRM0WF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - } else { - RTC_CTL &= (uint32_t)(~RTC_CTL_ALRM1EN); - /* wait until ALRM1WF flag to be set after the alarm is disabled */ - do { - flag_status = RTC_STAT & RTC_STAT_ALRM1WF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - } - - if((uint32_t)RESET != flag_status) { - error_status = SUCCESS; - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief enable RTC time-stamp - \param[in] edge: specify which edge to detect of time-stamp - \arg RTC_TIMESTAMP_RISING_EDGE: rising edge is valid event edge for timestamp event - \arg RTC_TIMESTAMP_FALLING_EDGE: falling edge is valid event edge for timestamp event - \param[out] none - \retval none -*/ -void rtc_timestamp_enable(uint32_t edge) -{ - uint32_t reg_ctl = 0U; - - /* clear the bits to be configured in RTC_CTL */ - reg_ctl = (uint32_t)(RTC_CTL & (uint32_t)(~(RTC_CTL_TSEG | RTC_CTL_TSEN))); - - /* new configuration */ - reg_ctl |= (uint32_t)(edge | RTC_CTL_TSEN); - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL = (uint32_t)reg_ctl; - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief disable RTC time-stamp - \param[in] none - \param[out] none - \retval none -*/ -void rtc_timestamp_disable(void) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* clear the TSEN bit */ - RTC_CTL &= (uint32_t)(~ RTC_CTL_TSEN); - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief get RTC timestamp time and date - \param[in] none - \param[out] rtc_timestamp: pointer to a rtc_timestamp_struct structure which contains - parameters for RTC time-stamp configuration - members of the structure and the member values are shown as below: - timestamp_month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN, - RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC - timestamp_date: 0x1 - 0x31(BCD format) - timestamp_day: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY, RTC_FRIDAY, - RTC_SATURDAY, RTC_SUNDAY if RTC_ALARM_WEEKDAY_SELECTED is set - timestamp_hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format - timestamp_minute: 0x0 - 0x59(BCD format) - timestamp_second: 0x0 - 0x59(BCD format) - am_pm: RTC_AM, RTC_PM - \retval none -*/ -void rtc_timestamp_get(rtc_timestamp_struct *rtc_timestamp) -{ - uint32_t temp_tts = 0U, temp_dts = 0U; - - /* get the value of time_stamp registers */ - temp_tts = (uint32_t)RTC_TTS; - temp_dts = (uint32_t)RTC_DTS; - - /* get timestamp time and construct the rtc_timestamp_struct structure */ - rtc_timestamp->am_pm = (uint32_t)(temp_tts & RTC_TTS_PM); - rtc_timestamp->timestamp_month = (uint8_t)GET_DTS_MON(temp_dts); - rtc_timestamp->timestamp_date = (uint8_t)GET_DTS_DAY(temp_dts); - rtc_timestamp->timestamp_day = (uint8_t)GET_DTS_DOW(temp_dts); - rtc_timestamp->timestamp_hour = (uint8_t)GET_TTS_HR(temp_tts); - rtc_timestamp->timestamp_minute = (uint8_t)GET_TTS_MN(temp_tts); - rtc_timestamp->timestamp_second = (uint8_t)GET_TTS_SC(temp_tts); -} - -/*! - \brief get RTC time-stamp subsecond - \param[in] none - \param[out] none - \retval RTC time-stamp subsecond value -*/ -uint32_t rtc_timestamp_subsecond_get(void) -{ - return ((uint32_t)RTC_SSTS); -} - -/*! - \brief RTC time-stamp mapping - \param[in] rtc_af: - \arg RTC_AF0_TIMESTAMP: RTC_AF0 use for timestamp - \arg RTC_AF1_TIMESTAMP: RTC_AF1 use for timestamp - \param[out] none - \retval none -*/ -void rtc_timestamp_pin_map(uint32_t rtc_af) -{ - RTC_TAMP &= ~RTC_TAMP_TSSEL; - RTC_TAMP |= rtc_af; -} - -/*! - \brief enable RTC tamper - \param[in] rtc_tamper: pointer to a rtc_tamper_struct structure which contains - parameters for RTC tamper configuration - members of the structure and the member values are shown as below: - detecting tamper event can using edge mode or level mode - (1) using edge mode configuration: - tamper_source: RTC_TAMPER0, RTC_TAMPER1 - tamper_trigger: RTC_TAMPER_TRIGGER_EDGE_RISING, RTC_TAMPER_TRIGGER_EDGE_FALLING - tamper_filter: RTC_FLT_EDGE - tamper_with_timestamp: DISABLE, ENABLE - (2) using level mode configuration: - tamper_source: RTC_TAMPER0, RTC_TAMPER1 - tamper_trigger:RTC_TAMPER_TRIGGER_LEVEL_LOW, RTC_TAMPER_TRIGGER_LEVEL_HIGH - tamper_filter: RTC_FLT_2S, RTC_FLT_4S, RTC_FLT_8S - tamper_sample_frequency: RTC_FREQ_DIV32768, RTC_FREQ_DIV16384, RTC_FREQ_DIV8192, - RTC_FREQ_DIV4096, RTC_FREQ_DIV2048, RTC_FREQ_DIV1024, - RTC_FREQ_DIV512, RTC_FREQ_DIV256 - tamper_precharge_enable: DISABLE, ENABLE - tamper_precharge_time: RTC_PRCH_1C, RTC_PRCH_2C, RTC_PRCH_4C, RTC_PRCH_8C - tamper_with_timestamp: DISABLE, ENABLE - \param[out] none - \retval none -*/ -void rtc_tamper_enable(rtc_tamper_struct *rtc_tamper) -{ - /* disable tamper */ - RTC_TAMP &= (uint32_t)~(rtc_tamper->tamper_source); - - /* tamper filter must be used when the tamper source is voltage level detection */ - RTC_TAMP &= (uint32_t)~RTC_TAMP_FLT; - - /* the tamper source is voltage level detection */ - if((uint32_t)(rtc_tamper->tamper_filter) != RTC_FLT_EDGE) { - RTC_TAMP &= (uint32_t)~(RTC_TAMP_DISPU | RTC_TAMP_PRCH | RTC_TAMP_FREQ | RTC_TAMP_FLT); - - /* check if the tamper pin need precharge, if need, then configure the precharge time */ - if(DISABLE == rtc_tamper->tamper_precharge_enable) { - RTC_TAMP |= (uint32_t)RTC_TAMP_DISPU; - } else { - RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_precharge_time); - } - - RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_sample_frequency); - RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_filter); - - /* configure the tamper trigger */ - RTC_TAMP &= ((uint32_t)~((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS)); - if(RTC_TAMPER_TRIGGER_LEVEL_LOW != rtc_tamper->tamper_trigger) { - RTC_TAMP |= (uint32_t)((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS); - } - } else { - /* configure the tamper trigger */ - RTC_TAMP &= ((uint32_t)~((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS)); - if(RTC_TAMPER_TRIGGER_EDGE_RISING != rtc_tamper->tamper_trigger) { - RTC_TAMP |= (uint32_t)((rtc_tamper->tamper_source) << RTC_TAMPER_TRIGGER_POS); - } - } - - RTC_TAMP &= (uint32_t)~RTC_TAMP_TPTS; - if(DISABLE != rtc_tamper->tamper_with_timestamp) { - /* the tamper event also cause a time-stamp event */ - RTC_TAMP |= (uint32_t)RTC_TAMP_TPTS; - } - /* enable tamper */ - RTC_TAMP |= (uint32_t)(rtc_tamper->tamper_source); -} - -/*! - \brief disable RTC tamper - \param[in] source: specify which tamper source to be disabled - \arg RTC_TAMPER0 - \arg RTC_TAMPER1 - \param[out] none - \retval none -*/ -void rtc_tamper_disable(uint32_t source) -{ - /* disable tamper */ - RTC_TAMP &= (uint32_t)~source; -} - -/*! - \brief RTC tamper0 mapping - \param[in] rtc_af: - \arg RTC_AF0_TAMPER0: RTC_AF0 use for tamper0 - \arg RTC_AF1_TAMPER0: RTC_AF1 use for tamper0 - \param[out] none - \retval none -*/ -void rtc_tamper0_pin_map(uint32_t rtc_af) -{ - RTC_TAMP &= ~(RTC_TAMP_TP0EN | RTC_TAMP_TP0SEL); - RTC_TAMP |= rtc_af; -} - -/*! - \brief enable specified RTC interrupt - \param[in] interrupt: specify which interrupt source to be enabled - \arg RTC_INT_TIMESTAMP: timestamp interrupt - \arg RTC_INT_ALARM0: alarm0 interrupt - \arg RTC_INT_ALARM1: alarm1 interrupt - \arg RTC_INT_TAMP: tamper detection interrupt - \arg RTC_INT_WAKEUP: wakeup timer interrupt - \param[out] none - \retval none -*/ -void rtc_interrupt_enable(uint32_t interrupt) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* enable the interrupts in RTC_CTL register */ - RTC_CTL |= (uint32_t)(interrupt & (uint32_t)~RTC_TAMP_TPIE); - /* enable the interrupts in RTC_TAMP register */ - RTC_TAMP |= (uint32_t)(interrupt & RTC_TAMP_TPIE); - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief disble specified RTC interrupt - \param[in] interrupt: specify which interrupt source to be disabled - \arg RTC_INT_TIMESTAMP: timestamp interrupt - \arg RTC_INT_ALARM0: alarm interrupt - \arg RTC_INT_ALARM1: alarm interrupt - \arg RTC_INT_TAMP: tamper detection interrupt - \arg RTC_INT_WAKEUP: wakeup timer interrupt - \param[out] none - \retval none -*/ -void rtc_interrupt_disable(uint32_t interrupt) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* disable the interrupts in RTC_CTL register */ - RTC_CTL &= (uint32_t)~(interrupt & (uint32_t)~RTC_TAMP_TPIE); - /* disable the interrupts in RTC_TAMP register */ - RTC_TAMP &= (uint32_t)~(interrupt & RTC_TAMP_TPIE); - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief check specified flag - \param[in] flag: specify which flag to check - \arg RTC_STAT_SCP: smooth calibration pending flag - \arg RTC_FLAG_TP1: RTC tamper 1 detected flag - \arg RTC_FLAG_TP0: RTC tamper 0 detected flag - \arg RTC_FLAG_TSOVR: time-stamp overflow flag - \arg RTC_FLAG_TS: time-stamp flag - \arg RTC_FLAG_ALRM0: alarm0 occurs flag - \arg RTC_FLAG_ALRM1: alarm1 occurs flag - \arg RTC_FLAG_WT: wakeup timer occurs flag - \arg RTC_FLAG_INIT: initialization state flag - \arg RTC_FLAG_RSYN: register synchronization flag - \arg RTC_FLAG_YCM: year configuration mark status flag - \arg RTC_FLAG_SOP: shift function operation pending flag - \arg RTC_FLAG_ALRM0W: alarm0 configuration can be write flag - \arg RTC_FLAG_ALRM1W: alarm1 configuration can be write flag - \arg RTC_FLAG_WTW: wakeup timer can be write flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus rtc_flag_get(uint32_t flag) -{ - FlagStatus flag_state = RESET; - - if((uint32_t)RESET != (RTC_STAT & flag)) { - flag_state = SET; - } - return flag_state; -} - -/*! - \brief clear specified flag - \arg RTC_FLAG_TP1: RTC tamper 1 detected flag - \arg RTC_FLAG_TP0: RTC tamper 0 detected flag - \arg RTC_FLAG_TSOVR: time-stamp overflow flag - \arg RTC_FLAG_TS: time-stamp flag - \arg RTC_FLAG_WT: wakeup timer occurs flag - \arg RTC_FLAG_ALARM0: alarm0 occurs flag - \arg RTC_FLAG_ALARM1: alarm1 occurs flag - \arg RTC_FLAG_RSYN: register synchronization flag - \param[out] none - \retval none -*/ -void rtc_flag_clear(uint32_t flag) -{ - RTC_STAT &= (uint32_t)(~flag); -} - -/*! - \brief configure rtc alarm output source - \param[in] source: specify signal to output - \arg RTC_ALARM0_HIGH: when the alarm0 flag is set, the output pin is high - \arg RTC_ALARM0_LOW: when the alarm0 flag is set, the output pin is low - \arg RTC_ALARM1_HIGH: when the alarm1 flag is set, the output pin is high - \arg RTC_ALARM1_LOW: when the alarm1 flag is set, the output pin is low - \arg RTC_WAKEUP_HIGH: when the wakeup flag is set, the output pin is high - \arg RTC_WAKEUP_LOW: when the wakeup flag is set, the output pin is low - \param[in] mode: specify the output pin mode when output alarm signal - \arg RTC_ALARM_OUTPUT_OD: open drain mode - \arg RTC_ALARM_OUTPUT_PP: push pull mode - \param[out] none - \retval none -*/ -void rtc_alarm_output_config(uint32_t source, uint32_t mode) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL &= ~(RTC_CTL_OS | RTC_CTL_OPOL); - RTC_TAMP &= ~RTC_TAMP_AOT; - - RTC_CTL |= (uint32_t)(source); - /* alarm output */ - RTC_TAMP |= (uint32_t)(mode); - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief configure rtc calibration output source - \param[in] source: specify signal to output - \arg RTC_CALIBRATION_512HZ: when the LSE freqency is 32768Hz and the RTC_PSC - is the default value, output 512Hz signal - \arg RTC_CALIBRATION_1HZ: when the LSE freqency is 32768Hz and the RTC_PSC - is the default value, output 1Hz signal - \param[out] none - \retval none -*/ -void rtc_calibration_output_config(uint32_t source) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL &= (uint32_t)~(RTC_CTL_COEN | RTC_CTL_COS); - - RTC_CTL |= (uint32_t)(source); - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief adjust the daylight saving time by adding or substracting one hour from the current time - \param[in] operation: hour adjustment operation - \arg RTC_CTL_A1H: add one hour - \arg RTC_CTL_S1H: substract one hour - \param[out] none - \retval none -*/ -void rtc_hour_adjust(uint32_t operation) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL |= (uint32_t)(operation); - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief adjust RTC second or subsecond value of current time - \param[in] add: add 1s to current time or not - \arg RTC_SHIFT_ADD1S_RESET: no effect - \arg RTC_SHIFT_ADD1S_SET: add 1s to current time - \param[in] minus: number of subsecond to minus from current time(0x0 - 0x7FFF) - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_second_adjust(uint32_t add, uint32_t minus) -{ - volatile uint32_t time_index = RTC_SHIFTCTL_TIMEOUT; - ErrStatus error_status = ERROR; - uint32_t flag_status = RESET; - uint32_t temp = 0U; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* check if a shift operation is ongoing */ - do { - flag_status = RTC_STAT & RTC_STAT_SOPF; - } while((--time_index > 0U) && ((uint32_t)RESET != flag_status)); - - /* check if the function of reference clock detection is disabled */ - temp = RTC_CTL & RTC_CTL_REFEN; - if((RESET == flag_status) && (RESET == temp)) { - RTC_SHIFTCTL = (uint32_t)(add | SHIFTCTL_SFS(minus)); - error_status = rtc_register_sync_wait(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief enable RTC bypass shadow registers function - \param[in] none - \param[out] none - \retval none -*/ -void rtc_bypass_shadow_enable(void) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL |= RTC_CTL_BPSHAD; - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief disable RTC bypass shadow registers function - \param[in] none - \param[out] none - \retval none -*/ -void rtc_bypass_shadow_disable(void) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL &= ~RTC_CTL_BPSHAD; - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief enable RTC reference clock detection function - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_refclock_detection_enable(void) -{ - ErrStatus error_status = ERROR; - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - RTC_CTL |= (uint32_t)RTC_CTL_REFEN; - /* exit init mode */ - rtc_init_mode_exit(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief disable RTC reference clock detection function - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_refclock_detection_disable(void) -{ - ErrStatus error_status = ERROR; - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - RTC_CTL &= (uint32_t)~RTC_CTL_REFEN; - /* exit init mode */ - rtc_init_mode_exit(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief enable RTC auto wakeup function - \param[in] none - \param[out] none - \retval none -*/ -void rtc_wakeup_enable(void) -{ - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - RTC_CTL |= RTC_CTL_WTEN; - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; -} - -/*! - \brief disable RTC auto wakeup function - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_wakeup_disable(void) -{ - ErrStatus error_status = ERROR; - volatile uint32_t time_index = RTC_WTWF_TIMEOUT; - uint32_t flag_status = RESET; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - RTC_CTL &= ~RTC_CTL_WTEN; - /* wait until the WTWF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_WTWF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET == flag_status) { - error_status = ERROR; - } else { - error_status = SUCCESS; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - return error_status; -} - -/*! - \brief set RTC auto wakeup timer clock - \param[in] wakeup_clock: - \arg WAKEUP_RTCCK_DIV16: RTC auto wakeup timer clock is RTC clock divided by 16 - \arg WAKEUP_RTCCK_DIV8: RTC auto wakeup timer clock is RTC clock divided by 8 - \arg WAKEUP_RTCCK_DIV4: RTC auto wakeup timer clock is RTC clock divided by 4 - \arg WAKEUP_RTCCK_DIV2: RTC auto wakeup timer clock is RTC clock divided by 2 - \arg WAKEUP_CKSPRE: RTC auto wakeup timer clock is ckspre - \arg WAKEUP_CKSPRE_2EXP16: RTC auto wakeup timer clock is ckspre and wakeup timer add 2exp16 - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_wakeup_clock_set(uint8_t wakeup_clock) -{ - ErrStatus error_status = ERROR; - volatile uint32_t time_index = RTC_WTWF_TIMEOUT; - uint32_t flag_status = RESET; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - /* only when RTC_CTL_WTEN=0 and RTC_STAT_WTWF=1 can write RTC_CTL[2��0] */ - /* wait until the WTWF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_WTWF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET == flag_status) { - error_status = ERROR; - } else { - RTC_CTL &= (uint32_t)~ RTC_CTL_WTCS; - RTC_CTL |= (uint32_t)wakeup_clock; - error_status = SUCCESS; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief set wakeup timer value - \param[in] wakeup_timer: 0x0000-0xffff - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_wakeup_timer_set(uint16_t wakeup_timer) -{ - ErrStatus error_status = ERROR; - volatile uint32_t time_index = RTC_WTWF_TIMEOUT; - uint32_t flag_status = RESET; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - /* wait until the WTWF flag to be set */ - do { - flag_status = RTC_STAT & RTC_STAT_WTWF; - } while((--time_index > 0U) && ((uint32_t)RESET == flag_status)); - - if((uint32_t)RESET == flag_status) { - error_status = ERROR; - } else { - RTC_WUT = (uint32_t)wakeup_timer; - error_status = SUCCESS; - } - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - return error_status; -} - -/*! - \brief get wakeup timer value - \param[in] none - \param[out] none - \retval wakeup timer value -*/ -uint16_t rtc_wakeup_timer_get(void) -{ - return (uint16_t)RTC_WUT; -} - -/*! - \brief configure RTC smooth calibration - \param[in] window: select calibration window - \arg RTC_CALIBRATION_WINDOW_32S: 2exp20 RTCCLK cycles, 32s if RTCCLK = 32768 Hz - \arg RTC_CALIBRATION_WINDOW_16S: 2exp19 RTCCLK cycles, 16s if RTCCLK = 32768 Hz - \arg RTC_CALIBRATION_WINDOW_8S: 2exp18 RTCCLK cycles, 8s if RTCCLK = 32768 Hz - \param[in] plus: add RTC clock or not - \arg RTC_CALIBRATION_PLUS_SET: add one RTC clock every 2048 rtc clock - \arg RTC_CALIBRATION_PLUS_RESET: no effect - \param[in] minus: the RTC clock to minus during the calibration window(0x0 - 0x1FF) - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_smooth_calibration_config(uint32_t window, uint32_t plus, uint32_t minus) -{ - volatile uint32_t time_index = RTC_HRFC_TIMEOUT; - ErrStatus error_status = ERROR; - uint32_t flag_status = RESET; - - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* check if a smooth calibration operation is ongoing */ - do { - flag_status = RTC_STAT & RTC_STAT_SCPF; - } while((--time_index > 0U) && ((uint32_t)RESET != flag_status)); - - if((uint32_t)RESET == flag_status) { - RTC_HRFC = (uint32_t)(window | plus | HRFC_CMSK(minus)); - error_status = SUCCESS; - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} - -/*! - \brief enable RTC coarse calibration - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_coarse_calibration_enable(void) -{ - ErrStatus error_status = ERROR; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - RTC_CTL |= (uint32_t)RTC_CTL_CCEN; - /* exit init mode */ - rtc_init_mode_exit(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - return error_status; -} - -/*! - \brief disable RTC coarse calibration - \param[in] none - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_coarse_calibration_disable(void) -{ - ErrStatus error_status = ERROR; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - RTC_CTL &= (uint32_t)~RTC_CTL_CCEN; - /* exit init mode */ - rtc_init_mode_exit(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - return error_status; -} - -/*! - \brief config coarse calibration direction and step - \param[in] direction: CALIB_INCREASE or CALIB_DECREASE - \param[in] step: 0x00-0x1F - COSD=0: - 0x00:+0 PPM - 0x01:+4 PPM - 0x02:+8 PPM - .... - 0x1F:+126 PPM - COSD=1: - 0x00:-0 PPM - 0x01:-2 PPM - 0x02:-4 PPM - .... - 0x1F:-63 PPM - \param[out] none - \retval ErrStatus: ERROR or SUCCESS -*/ -ErrStatus rtc_coarse_calibration_config(uint8_t direction, uint8_t step) -{ - ErrStatus error_status = ERROR; - /* disable the write protection */ - RTC_WPK = RTC_UNLOCK_KEY1; - RTC_WPK = RTC_UNLOCK_KEY2; - - /* enter init mode */ - error_status = rtc_init_mode_enter(); - - if(ERROR != error_status) { - if(CALIB_DECREASE == direction) { - RTC_COSC |= (uint32_t)RTC_COSC_COSD; - } else { - RTC_COSC &= (uint32_t)~RTC_COSC_COSD; - } - RTC_COSC &= ~RTC_COSC_COSS; - RTC_COSC |= (uint32_t)((uint32_t)step & 0x1FU); - /* exit init mode */ - rtc_init_mode_exit(); - } - - /* enable the write protection */ - RTC_WPK = RTC_LOCK_KEY; - - return error_status; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c deleted file mode 100644 index 34d9271b08e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sai.c +++ /dev/null @@ -1,609 +0,0 @@ -/*! - \file gd32f5xx_sai.c - \brief SAI driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_sai.h" - -/*!< bit offset of MTFCNT in SAI_CFG1 */ -#define CFG1_MTFCNT_OFFSET ((uint32_t)0x00000007U) - -/*! - \brief reset SAI - \param[in] none - \param[out] none - \retval none -*/ -void sai_deinit(void) -{ - /* reset SAI */ - rcu_periph_reset_enable(RCU_SAIRST); - rcu_periph_reset_disable(RCU_SAIRST); -} - -/*! - \brief initialize the parameter of SAI structure with a default value - \param[in] none - \param[out] sai_init_stuct: the initialization data needed to initialize SAI - \retval none -*/ -void sai_struct_para_init(sai_parameter_struct *sai_init_stuct) -{ - /* initialize the initpara struct member with the default value */ - sai_init_stuct->operating_mode = SAI_MASTER_TRANSMITTER; - sai_init_stuct->protocol = SAI_PROTOCOL_POLYMORPHIC; - sai_init_stuct->data_width = SAI_DATAWIDTH_32BIT; - sai_init_stuct->shift_dir = SAI_SHIFT_MSB; - sai_init_stuct->sample_edge = SAI_SAMPEDGE_FALLING; - sai_init_stuct->sync_mode = SAI_SYNCMODE_ASYNC; - sai_init_stuct->output_drive = SAI_OUTPUT_WITH_SAIEN; - sai_init_stuct->clk_div_bypass = SAI_CLKDIV_BYPASS_OFF; - sai_init_stuct->mclk_div = SAI_MCLKDIV_1; - sai_init_stuct->mclk_oversampling = SAI_MCLK_OVERSAMP_256; - sai_init_stuct->mclk_enable = SAI_MCLK_DISABLE; - sai_init_stuct->fifo_threshold = SAI_FIFOTH_EMPTY; -} - -/*! - \brief initialize the parameter of SAI frame structure with a default value - \param[in] none - \param[out] sai_frame_init_struct: the initialization data needed to initialize SAI frame - \retval none -*/ -void sai_frame_struct_para_init(sai_frame_parameter_struct *sai_frame_init_struct) -{ - /* initialize the initpara struct member with the default value */ - sai_frame_init_struct->frame_width = 256U; - sai_frame_init_struct->frame_sync_width = 128U; - sai_frame_init_struct->frame_sync_function = SAI_FS_FUNC_START; - sai_frame_init_struct->frame_sync_polarity = SAI_FS_POLARITY_LOW; - sai_frame_init_struct->frame_sync_offset = SAI_FS_OFFSET_BEGINNING; -} - -/*! - \brief initialize the parameter of SAI slot structure with a default value - \param[in] none - \param[out] sai_slot_init_struct: the initialization data needed to initialize SAI slot - \retval none -*/ -void sai_slot_struct_para_init(sai_slot_parameter_struct *sai_slot_init_struct) -{ - /* initialize the initpara struct member with the default value */ - sai_slot_init_struct->slot_number = 16U; - sai_slot_init_struct->slot_width = SAI_SLOT_WIDTH_DATA; - sai_slot_init_struct->data_offset = 0U; - sai_slot_init_struct->slot_active = SAI_SLOT_ACTIVE_NONE; -} - -/*! - \brief initialize SAI - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x = 0,1) - \param[in] sai_struct: SAI parameter initialization stuct members of the structure - and the member values are shown as below: - operating_mode: SAI_MASTER_TRANSMITTER, SAI_MASTER_RECEIVER, SAI_SLAVE_TRANSMITTER, SAI_SLAVE_RECEIVER; - protocol: SAI_PROTOCOL_POLYMORPHIC, SAI_PROTOCOL_SPDIF, SAI_PROTOCOL_AC97 - data_width: SAI_DATA_WIDTH_xBIT (x = 8, 10, 16, 20, 24, 32) - shift_dir: SAI_SHIFT_MSB, SAI_SHIFT_LSB - sample_edge: SAI_SAMPEDGE_FALLING, SAI_SAMPEDGE_RISING - sync_mode: SAI_SYNCMODE_ASYNC, SAI_SYNCMODE_OTHERBLOCK, SAI_SYNCMODE_EXTERNALSAI - output_drive: SAI_OUTPUT_WITH_SAIEN, SAI_OUTPUT_NOW - clk_div_bypass: SAI_CLKDIV_BYPASS_OFF, SAI_CLKDIV_BYPASS_ON - mck_div: SAI_MCLKDIV_x (x = 1,2,..,63) - mck_oversampling: SAI_MASTERCLK_OVERSAMP_256, SAI_MASTERCLK_OVERSAMP_512 - mck_enable: SAI_MASTERCLK_DISABLE, SAI_MASTERCLK_ENABLE - fifo_threshold: SAI_FIFOTH_EMPTY, SAI_FIFOTH_QUARTER, SAI_FIFOTH_HALF, SAI_FIFOTH_THREE_QUARTER, SAI_FIFOTH_FULL - \param[out] none - \retval none -*/ -void sai_init(uint32_t block, sai_parameter_struct *sai_struct) -{ - uint32_t reg = 0U; - - /* configure the SAI CFGR0 value */ - reg = SAI_CFG0(block); - reg &= ~(SAI_CFG0_OPTMOD | SAI_CFG0_PROT | \ - SAI_CFG0_DATAWD | SAI_CFG0_SHIFTDIR | \ - SAI_CFG0_SAMPEDGE | SAI_CFG0_SYNCMOD | \ - SAI_CFG0_ODRIV | SAI_CFG0_BYPASS | \ - SAI_CFG0_MDIV | SAI_CFG0_MOSPR | \ - SAI_CFG0_MCLKEN | SAI_CFG0_SAIEN); - - reg |= (uint32_t)(sai_struct->operating_mode | sai_struct->protocol | \ - sai_struct->data_width | sai_struct->shift_dir | \ - sai_struct->sample_edge | sai_struct->sync_mode | \ - sai_struct->output_drive | sai_struct->clk_div_bypass | \ - sai_struct->mclk_div | sai_struct->mclk_oversampling | \ - sai_struct->mclk_enable); - SAI_CFG0(block) = reg; - - /* configure the SAI CFGR1 FIFO threshold */ - reg = SAI_CFG1(block); - reg &= ~SAI_CFG1_FFTH; - reg |= (uint32_t)(sai_struct->fifo_threshold); - SAI_CFG1(block) = reg; -} - -/*! - \brief initialize SAI frame - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] sai_frame_struct: SAI frame parameter initialization stuct members of the structure - and the member values are shown as below: - frame_width: 1~256, frame width - frame_sync_width: 1~128, frame synchronization active width - frame_sync_function: SAI_FS_FUNC_START, SAI_FS_FUNC_START_CHANNEL - frame_sync_polarity: SAI_FS_POLARITY_LOW, SAI_FS_POLARITY_HIGH - frame_sync_offset: SAI_FS_OFFSET_BEGINNING, SAI_FS_OFFSET_ONEBITBEFORE - \param[out] none - \retval none -*/ -void sai_frame_init(uint32_t block, sai_frame_parameter_struct *sai_frame_struct) -{ - uint32_t reg = 0U; - reg = SAI_FCFG(block); - reg &= ~(SAI_FCFG_FWD | SAI_FCFG_FSAWD | SAI_FCFG_FSFUNC | \ - SAI_FCFG_FSPL | SAI_FCFG_FSOST); - reg |= (uint32_t)(sai_frame_struct->frame_sync_offset | \ - sai_frame_struct->frame_sync_polarity | \ - sai_frame_struct->frame_sync_function | \ - ((sai_frame_struct->frame_sync_width - 1U) << 8U) | \ - (sai_frame_struct->frame_width - 1U)); - /* configure the SAI frame */ - SAI_FCFG(block) = reg; -} - -/*! - \brief initialize SAI slot - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] sai_slot_struct: SAI slot parameter initialization stuct members of the structure - and the member values are shown as below: - slot_number: 1~16, slot number - slot_width: SAI_SLOTWIDTH_DATA, SAI_SLOTWIDTH_16BIT, SAI_SLOTWIDTH_32BIT - data_offset: 0~31, data offset - slot_active: one or more parameters can be selected, SAI_SLOT_ACTIVE_NONE, SAI_SLOT_ACTIVE_x(x=0..15), SAI_SLOT_ACTIVE_ALL - \param[out] none - \retval none -*/ -void sai_slot_init(uint32_t block, sai_slot_parameter_struct *sai_slot_struct) -{ - uint32_t reg = 0U; - reg = SAI_SCFG(block); - reg &= ~(SAI_SCFG_DATAOST | SAI_SCFG_SLOTWD | SAI_SCFG_SLOTNUM | SAI_SCFG_SLOTAV); - reg = (uint32_t)(((sai_slot_struct->slot_number - 1U) << 8U) | \ - sai_slot_struct->slot_width | \ - sai_slot_struct->data_offset | \ - sai_slot_struct->slot_active); - /* configure the SAI slot */ - SAI_SCFG(block) = reg; -} - -/*! - \brief SAI enable - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[out] none - \retval none -*/ -void sai_enable(uint32_t block) -{ - SAI_CFG0(block) |= SAI_CFG0_SAIEN; -} - -/*! - \brief SAI disable - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[out] none - \retval none -*/ -void sai_disable(uint32_t block) -{ - SAI_CFG0(block) &= ~SAI_CFG0_SAIEN; -} - -/*! - \brief SAI serial data near inactive slot output management - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] sdout: serial data output management - only one parameter can be selected which is shown as below: - \arg SAI_SDLINE_DRIVE: SD line output is driven entirely during the audio frame - \arg SAI_SDLINE_RELEASE: SD line output is released near inactive slots - \param[out] none - \retval none -*/ -void sai_sdoutput_config(uint32_t block, uint32_t sdout) -{ - SAI_CFG1(block) &= ~SAI_CFG1_SDOM; - SAI_CFG1(block) |= sdout; -} - -/*! - \brief configure SAI mono mode - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[in] mono: stereo and mono mode selection - only one parameter can be selected which is shown as below: - \arg SAI_STEREO_MODE: stereo mode - \arg SAI_MONO_MODE: mono mode - \param[out] none - \retval none -*/ -void sai_monomode_config(uint32_t block, uint32_t mono) -{ - SAI_CFG0(block) &= ~SAI_CFG0_MONO; - SAI_CFG0(block) |= mono; -} - -/*! - \brief configure SAI companding mode - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[in] compander: compander mode - only one parameter can be selected which is shown as below: - \arg SAI_COMPANDER_OFF: no compansion applies - \arg SAI_COMPANDER_ULAW: u-law algorithm - \arg SAI_COMPANDER_ALAW: A-law algorithm - \param[in] complement:complement mode - only one parameter can be selected which is shown as below: - \arg SAI_COMPLEMENT_1S: data represented in 1's complement form - \arg SAI_COMPLEMENT_2S: data represented in 2's complement form - \param[out] none - \retval none -*/ -void sai_companding_config(uint32_t block, uint32_t compander, uint32_t complement) -{ - uint32_t reg = 0U; - reg = SAI_CFG1(block); - reg &= ~(SAI_CFG1_CPLMOD | SAI_CFG1_CPAMOD); - reg |= (compander | complement); - SAI_CFG1(block) = reg; -} - -/*! - \brief SAI mute detected enable or mute send enable - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval none -*/ -void sai_mute_enable(uint32_t block) -{ - SAI_CFG1(block) |= SAI_CFG1_MT; -} - -/*! - \brief SAI mute detected disable or mute send disable - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval none -*/ -void sai_mute_disable(uint32_t block) -{ - SAI_CFG1(block) &= ~SAI_CFG1_MT; -} - -/*! - \brief configure SAI mute value - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[in] value: mute value - only one parameter can be selected which are shown as below: - \arg SAI_MUTESENT_0: 0 is sent via the serial data line when mute is on - \arg SAI_MUTESENT_LASTFREAM: If SLOTNUM is less or equals to two, last frame is sent via the serial data line - \param[out] none - \retval none -*/ -void sai_mute_value_config(uint32_t block, uint32_t value) -{ - SAI_CFG1(block) &= ~SAI_CFG1_MTVAL; - SAI_CFG1(block) |= value; -} - -/*! - \brief configure SAI mute frame count - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[in] count: 0~63, mute frame count - \param[out] none - \retval none -*/ -void sai_mute_count_config(uint32_t block, uint32_t count) -{ - uint32_t reg = 0U; - reg = SAI_CFG1(block); - reg &= ~SAI_CFG1_MTFCNT; - reg |= count << CFG1_MTFCNT_OFFSET; - SAI_CFG1(block) = reg; -} - -/*! - \brief SAI transmit data - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[in] data: 32-bit data - \param[out] none - \retval none -*/ -void sai_data_transmit(uint32_t block, uint32_t data) -{ - SAI_DATA(block) = data; -} - -/*! - \brief SAI receive data - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval received data -*/ -uint32_t sai_data_receive(uint32_t block) -{ - return SAI_DATA(block); -} - -/*! - \brief get SAI fifo status - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval state of fifo - \arg FIFO_EMPTY: empty - \arg FIFO_EMPTY_TO_1_4_FULL: empty < fifo_level <= 1/4_full - \arg FIFO_1_4_FULL_TO_1_2_FULL: 1/4_full < fifo_level <= 1/2_full - \arg FIFO_1_2_FULL_TO_3_4_FULL: 1/2_full < fifo_level <= 3/4_full - \arg FIFO_3_4_FULL_TO_FULL: 3/4_full < fifo_level < full - \arg FIFO_FULL: full -*/ -sai_fifo_state_enum sai_fifo_status_get(uint32_t block) -{ - sai_fifo_state_enum sai_fifo_state = FIFO_EMPTY; - - if(SAI_FIFO_STAT_EMPTY == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { - sai_fifo_state = FIFO_EMPTY; - } else if(SAI_FIFO_STAT_QUARTER == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { - sai_fifo_state = FIFO_EMPTY_TO_1_4_FULL; - } else if(SAI_FIFO_STAT_HALF == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { - sai_fifo_state = FIFO_1_4_FULL_TO_1_2_FULL; - } else if(SAI_FIFO_STAT_THREE_QUARTER == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { - sai_fifo_state = FIFO_1_2_FULL_TO_3_4_FULL; - } else if(SAI_FIFO_STAT_NEARFULL == (SAI_STAT(block) & SAI_STAT_FFSTAT)) { - sai_fifo_state = FIFO_3_4_FULL_TO_FULL; - } else { - sai_fifo_state = FIFO_FULL; - } - - return sai_fifo_state; -} - -/*! - \brief SAI fifo flush - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval none -*/ -void sai_fifo_flush(uint32_t block) -{ - SAI_CFG1(block) = SAI_CFG1_FLUSH; -} - -/*! - \brief enable SAI dma - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval none -*/ -void sai_dma_enable(uint32_t block) -{ - SAI_CFG0(block) |= SAI_CFG0_DMAEN; -} - -/*! - \brief disable SAI dma - - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx (x=0,1) - \param[out] none - \retval none -*/ -void sai_dma_disable(uint32_t block) -{ - SAI_CFG0(block) &= ~SAI_CFG0_DMAEN; -} - -/*! - \brief enable the SAI interrupt - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] interrupt: specify which interrupt to enable - one or more parameters can be selected which are shown as below: - \arg SAI_INT_OUERR: FIFO overrun or underrun interrupt enable - \arg SAI_INT_MTDET: mute detection interrupt enable - \arg SAI_INT_ERRCK: error clock interrupt enable - \arg SAI_INT_FFREQ: FIFO request interrupt enable - \arg SAI_INT_ACNRDY: audio codec not ready interrupt enable - \arg SAI_INT_FSADET: frame synchronization advanced detection interrupt enable - \arg SAI_INT_FSPDET: frame synchronization postpone detection interrupt enable - \param[out] none - \retval none -*/ -void sai_interrupt_enable(uint32_t block, uint32_t interrupt) -{ - SAI_INTEN(block) |= interrupt; -} - -/*! - \brief disable the SAI interrupt - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] interrupt: specify which interrupt to disable - one or more parameters can be selected which are shown as below: - \arg SAI_INT_OUERR: FIFO overrun or underrun interrupt - \arg SAI_INT_MTDET: mute detection interrupt - \arg SAI_INT_ERRCK: error clock interrupt - \arg SAI_INT_FFREQ: FIFO request interrupt - \arg SAI_INT_ACNRDY: audio codec not ready interrupt - \arg SAI_INT_FSADET: frame synchronization advanced detection interrupt - \arg SAI_INT_FSPDET: frame synchronization postpone detection interrupt - \param[out] none - \retval none -*/ -void sai_interrupt_disable(uint32_t block, uint32_t interrupt) -{ - SAI_INTEN(block) &= ~interrupt; -} - -/*! - \brief get the SAI interrupt flag - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] interrupt: specify which interrupt flag to get - only one parameter can be selected which are shown as below: - \arg SAI_FLAG_OUERR: FIFO overrun or underrun interrupt flag - \arg SAI_FLAG_MTDET: mute detection interrupt flag - \arg SAI_FLAG_ERRCK: error clock interrupt flag - \arg SAI_FLAG_FFREQ: FIFO request interrupt flag - \arg SAI_FLAG_ACNRDY: audio codec not ready interrupt flag - \arg SAI_FLAG_FSADET: frame synchronization advanced detection interrupt flag - \arg SAI_FLAG_FSPDET: frame synchronization postpone detection interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus sai_interrupt_flag_get(uint32_t block, uint32_t interrupt) -{ - uint32_t inten = 0U; - inten = SAI_INTEN(block) & interrupt; - if((RESET != (SAI_STAT(block) & interrupt)) && (RESET != inten)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear the SAI interrupt flag - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] interrupt: specify which interrupt flag to clear - one or more parameters can be selected which are shown as below: - \arg SAI_FLAG_OUERR: FIFO overrun or underrun interrupt flag - \arg SAI_FLAG_MTDET: mute detection interrupt flag - \arg SAI_FLAG_ERRCK: error clock interrupt flag - \arg SAI_FLAG_ACNRDY: audio codec not ready interrupt flag - \arg SAI_FLAG_FSADET: frame synchronization advanced detection interrupt flag - \arg SAI_FLAG_FSPDET: frame synchronization postpone detection interrupt flag - \param[out] none - \retval none -*/ -void sai_interrupt_flag_clear(uint32_t block, uint32_t interrupt) -{ - SAI_INTC(block) = interrupt; -} - -/*! - \brief get the SAI flag - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] flag: specify which flag to get - only one parameter can be selected which are shown as below: - \arg SAI_FLAG_OUERR: FIFO overrun or underrun flag - \arg SAI_FLAG_MTDET: mute detection flag - \arg SAI_FLAG_ERRCK: error clock flag - \arg SAI_FLAG_FFREQ: FIFO request flag - \arg SAI_FLAG_ACNRDY: audio codec not ready flag - \arg SAI_FLAG_FSADET: frame synchronization advanced detection flag - \arg SAI_FLAG_FSPDET: frame synchronization postpone detection flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus sai_flag_get(uint32_t block, uint32_t flag) -{ - if(RESET != (SAI_STAT(block) & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear the SAI flag - \param[in] block: specify which bolck is initialized - only one parameter can be selected which is shown as below: - \arg SAI_BLOCKx(x=0,1) - \param[in] flag: specify which flag to clear - one or more parameters can be selected which are shown as below: - \arg SAI_FLAG_OUERR: FIFO overrun or underrun flag - \arg SAI_FLAG_MTDET: mute detection flag - \arg SAI_FLAG_ERRCK: error clock flag - \arg SAI_FLAG_ACNRDY: audio codec not ready flag - \arg SAI_FLAG_FSADET: frame synchronization advanced detection flag - \arg SAI_FLAG_FSPDET: frame synchronization postpone detection flag - \param[out] none - \retval none -*/ -void sai_flag_clear(uint32_t block, uint32_t flag) -{ - SAI_INTC(block) = flag; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c deleted file mode 100644 index d4d574e9b5c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c +++ /dev/null @@ -1,801 +0,0 @@ -/*! - \file gd32f5xx_sdio.c - \brief SDIO driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_sdio.h" - -/*! - \brief deinitialize the SDIO - \param[in] none - \param[out] none - \retval none -*/ -void sdio_deinit(void) -{ - rcu_periph_reset_enable(RCU_SDIORST); - rcu_periph_reset_disable(RCU_SDIORST); -} - -/*! - \brief configure the SDIO clock - \param[in] clock_edge: SDIO_CLK clock edge - only one parameter can be selected which is shown as below: - \arg SDIO_SDIOCLKEDGE_RISING: select the rising edge of the SDIOCLK to generate SDIO_CLK - \arg SDIO_SDIOCLKEDGE_FALLING: select the falling edge of the SDIOCLK to generate SDIO_CLK - \param[in] clock_bypass: clock bypass - only one parameter can be selected which is shown as below: - \arg SDIO_CLOCKBYPASS_ENABLE: clock bypass - \arg SDIO_CLOCKBYPASS_DISABLE: no bypass - \param[in] clock_powersave: SDIO_CLK clock dynamic switch on/off for power saving - only one parameter can be selected which is shown as below: - \arg SDIO_CLOCKPWRSAVE_ENABLE: SDIO_CLK closed when bus is idle - \arg SDIO_CLOCKPWRSAVE_DISABLE: SDIO_CLK clock is always on - \param[in] clock_division: clock division, less than 512 - \param[out] none - \retval none -*/ -void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division) -{ - uint32_t clock_config = 0U; - clock_config = SDIO_CLKCTL; - /* reset the CLKEDGE, CLKBYP, CLKPWRSAV, DIV */ - clock_config &= ~(SDIO_CLKCTL_CLKEDGE | SDIO_CLKCTL_CLKBYP | SDIO_CLKCTL_CLKPWRSAV | SDIO_CLKCTL_DIV8 | SDIO_CLKCTL_DIV); - /* if the clock division is greater or equal to 256, set the DIV[8] */ - if(clock_division >= 256U) { - clock_config |= SDIO_CLKCTL_DIV8; - clock_division -= 256U; - } - /* configure the SDIO_CLKCTL according to the parameters */ - clock_config |= (clock_edge | clock_bypass | clock_powersave | clock_division); - SDIO_CLKCTL = clock_config; -} - -/*! - \brief enable hardware clock control - \param[in] none - \param[out] none - \retval none -*/ -void sdio_hardware_clock_enable(void) -{ - SDIO_CLKCTL |= SDIO_CLKCTL_HWCLKEN; -} - -/*! - \brief disable hardware clock control - \param[in] none - \param[out] none - \retval none -*/ -void sdio_hardware_clock_disable(void) -{ - SDIO_CLKCTL &= ~SDIO_CLKCTL_HWCLKEN; -} - -/*! - \brief set different SDIO card bus mode - \param[in] bus_mode: SDIO card bus mode - only one parameter can be selected which is shown as below: - \arg SDIO_BUSMODE_1BIT: 1-bit SDIO card bus mode - \arg SDIO_BUSMODE_4BIT: 4-bit SDIO card bus mode - \arg SDIO_BUSMODE_8BIT: 8-bit SDIO card bus mode - \param[out] none - \retval none -*/ -void sdio_bus_mode_set(uint32_t bus_mode) -{ - /* reset the SDIO card bus mode bits and set according to bus_mode */ - SDIO_CLKCTL &= ~SDIO_CLKCTL_BUSMODE; - SDIO_CLKCTL |= bus_mode; -} - -/*! - \brief set the SDIO power state - \param[in] power_state: SDIO power state - only one parameter can be selected which is shown as below: - \arg SDIO_POWER_ON: SDIO power on - \arg SDIO_POWER_OFF: SDIO power off - \param[out] none - \retval none -*/ -void sdio_power_state_set(uint32_t power_state) -{ - SDIO_PWRCTL = power_state; -} - -/*! - \brief get the SDIO power state - \param[in] none - \param[out] none - \retval SDIO power state - \arg SDIO_POWER_ON: SDIO power on - \arg SDIO_POWER_OFF: SDIO power off -*/ -uint32_t sdio_power_state_get(void) -{ - return SDIO_PWRCTL; -} - -/*! - \brief enable SDIO_CLK clock output - \param[in] none - \param[out] none - \retval none -*/ -void sdio_clock_enable(void) -{ - SDIO_CLKCTL |= SDIO_CLKCTL_CLKEN; -} - -/*! - \brief disable SDIO_CLK clock output - \param[in] none - \param[out] none - \retval none -*/ -void sdio_clock_disable(void) -{ - SDIO_CLKCTL &= ~SDIO_CLKCTL_CLKEN; -} - -/*! - \brief configure the command and response - \param[in] cmd_index: command index, refer to the related specifications - \param[in] cmd_argument: command argument, refer to the related specifications - \param[in] response_type: response type - only one parameter can be selected which is shown as below: - \arg SDIO_RESPONSETYPE_NO: no response - \arg SDIO_RESPONSETYPE_SHORT: short response - \arg SDIO_RESPONSETYPE_LONG: long response - \param[out] none - \retval none -*/ -void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type) -{ - uint32_t cmd_config = 0U; - /* disable the CSM */ - SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN; - /* reset the command index, command argument and response type */ - SDIO_CMDAGMT &= ~SDIO_CMDAGMT_CMDAGMT; - SDIO_CMDAGMT = cmd_argument; - cmd_config = SDIO_CMDCTL; - cmd_config &= ~(SDIO_CMDCTL_CMDIDX | SDIO_CMDCTL_CMDRESP); - /* configure SDIO_CMDCTL and SDIO_CMDAGMT according to the parameters */ - cmd_config |= (cmd_index | response_type); - SDIO_CMDCTL = cmd_config; -} - -/*! - \brief set the command state machine wait type - \param[in] wait_type: wait type - only one parameter can be selected which is shown as below: - \arg SDIO_WAITTYPE_NO: not wait interrupt - \arg SDIO_WAITTYPE_INTERRUPT: wait interrupt - \arg SDIO_WAITTYPE_DATAEND: wait the end of data transfer - \param[out] none - \retval none -*/ -void sdio_wait_type_set(uint32_t wait_type) -{ - /* reset INTWAIT and WAITDEND */ - SDIO_CMDCTL &= ~(SDIO_CMDCTL_INTWAIT | SDIO_CMDCTL_WAITDEND); - /* set the wait type according to wait_type */ - SDIO_CMDCTL |= wait_type; -} - -/*! - \brief enable the CSM(command state machine) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_csm_enable(void) -{ - SDIO_CMDCTL |= SDIO_CMDCTL_CSMEN; -} - -/*! - \brief disable the CSM(command state machine) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_csm_disable(void) -{ - SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN; -} - -/*! - \brief get the last response command index - \param[in] none - \param[out] none - \retval last response command index -*/ -uint8_t sdio_command_index_get(void) -{ - return (uint8_t)SDIO_RSPCMDIDX; -} - -/*! - \brief get the response for the last received command - \param[in] sdio_responsex: SDIO response - only one parameter can be selected which is shown as below: - \arg SDIO_RESPONSE0: card response[31:0]/card response[127:96] - \arg SDIO_RESPONSE1: card response[95:64] - \arg SDIO_RESPONSE2: card response[63:32] - \arg SDIO_RESPONSE3: card response[31:1], plus bit 0 - \param[out] none - \retval response for the last received command -*/ -uint32_t sdio_response_get(uint32_t sdio_responsex) -{ - uint32_t resp_content = 0U; - switch(sdio_responsex) { - case SDIO_RESPONSE0: - resp_content = SDIO_RESP0; - break; - case SDIO_RESPONSE1: - resp_content = SDIO_RESP1; - break; - case SDIO_RESPONSE2: - resp_content = SDIO_RESP2; - break; - case SDIO_RESPONSE3: - resp_content = SDIO_RESP3; - break; - default: - break; - } - return resp_content; -} - -/*! - \brief configure the data timeout, data length and data block size - \param[in] data_timeout: data timeout period in card bus clock periods - \param[in] data_length: number of data bytes to be transferred - \param[in] data_blocksize: size of data block for block transfer - only one parameter can be selected which is shown as below: - \arg SDIO_DATABLOCKSIZE_1BYTE: block size = 1 byte - \arg SDIO_DATABLOCKSIZE_2BYTES: block size = 2 bytes - \arg SDIO_DATABLOCKSIZE_4BYTES: block size = 4 bytes - \arg SDIO_DATABLOCKSIZE_8BYTES: block size = 8 bytes - \arg SDIO_DATABLOCKSIZE_16BYTES: block size = 16 bytes - \arg SDIO_DATABLOCKSIZE_32BYTES: block size = 32 bytes - \arg SDIO_DATABLOCKSIZE_64BYTES: block size = 64 bytes - \arg SDIO_DATABLOCKSIZE_128BYTES: block size = 128 bytes - \arg SDIO_DATABLOCKSIZE_256BYTES: block size = 256 bytes - \arg SDIO_DATABLOCKSIZE_512BYTES: block size = 512 bytes - \arg SDIO_DATABLOCKSIZE_1024BYTES: block size = 1024 bytes - \arg SDIO_DATABLOCKSIZE_2048BYTES: block size = 2048 bytes - \arg SDIO_DATABLOCKSIZE_4096BYTES: block size = 4096 bytes - \arg SDIO_DATABLOCKSIZE_8192BYTES: block size = 8192 bytes - \arg SDIO_DATABLOCKSIZE_16384BYTES: block size = 16384 bytes - \param[out] none - \retval none -*/ -void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize) -{ - /* reset data timeout, data length and data block size */ - SDIO_DATATO &= ~SDIO_DATATO_DATATO; - SDIO_DATALEN &= ~SDIO_DATALEN_DATALEN; - SDIO_DATACTL &= ~SDIO_DATACTL_BLKSZ; - /* configure the related parameters of data */ - SDIO_DATATO = data_timeout; - SDIO_DATALEN = data_length; - SDIO_DATACTL |= data_blocksize; -} - -/*! - \brief configure the data transfer mode and direction - \param[in] transfer_mode: mode of data transfer - only one parameter can be selected which is shown as below: - \arg SDIO_TRANSMODE_BLOCK: block transfer - \arg SDIO_TRANSMODE_STREAM: stream transfer or SDIO multibyte transfer - \param[in] transfer_direction: data transfer direction, read or write - only one parameter can be selected which is shown as below: - \arg SDIO_TRANSDIRECTION_TOCARD: write data to card - \arg SDIO_TRANSDIRECTION_TOSDIO: read data from card - \param[out] none - \retval none -*/ -void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction) -{ - uint32_t data_trans = 0U; - /* reset the data transfer mode, transfer direction and set according to the parameters */ - data_trans = SDIO_DATACTL; - data_trans &= ~(SDIO_DATACTL_TRANSMOD | SDIO_DATACTL_DATADIR); - data_trans |= (transfer_mode | transfer_direction); - SDIO_DATACTL = data_trans; -} - -/*! - \brief enable the DSM(data state machine) for data transfer - \param[in] none - \param[out] none - \retval none -*/ -void sdio_dsm_enable(void) -{ - SDIO_DATACTL |= SDIO_DATACTL_DATAEN; -} - -/*! - \brief disable the DSM(data state machine) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_dsm_disable(void) -{ - SDIO_DATACTL &= ~SDIO_DATACTL_DATAEN; -} - -/*! - \brief write data(one word) to the transmit FIFO - \param[in] data: 32-bit data write to card - \param[out] none - \retval none -*/ -void sdio_data_write(uint32_t data) -{ - SDIO_FIFO = data; -} - -/*! - \brief read data(one word) from the receive FIFO - \param[in] none - \param[out] none - \retval received data -*/ -uint32_t sdio_data_read(void) -{ - return SDIO_FIFO; -} - -/*! - \brief get the number of remaining data bytes to be transferred to card - \param[in] none - \param[out] none - \retval number of remaining data bytes to be transferred -*/ -uint32_t sdio_data_counter_get(void) -{ - return SDIO_DATACNT; -} - -/*! - \brief get the number of words remaining to be written or read from FIFO - \param[in] none - \param[out] none - \retval remaining number of words -*/ -uint32_t sdio_fifo_counter_get(void) -{ - return SDIO_FIFOCNT; -} - -/*! - \brief enable the DMA request for SDIO - \param[in] none - \param[out] none - \retval none -*/ -void sdio_dma_enable(void) -{ - SDIO_DATACTL |= SDIO_DATACTL_DMAEN; -} - -/*! - \brief disable the DMA request for SDIO - \param[in] none - \param[out] none - \retval none -*/ -void sdio_dma_disable(void) -{ - SDIO_DATACTL &= ~SDIO_DATACTL_DMAEN; -} - -/*! - \brief get the flags state of SDIO - \param[in] flag: flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag - \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag - \arg SDIO_FLAG_CMDTMOUT: command response timeout flag - \arg SDIO_FLAG_DTTMOUT: data timeout flag - \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag - \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag - \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag - \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag - \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag - \arg SDIO_FLAG_STBITE: start bit error in the bus flag - \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag - \arg SDIO_FLAG_CMDRUN: command transmission in progress flag - \arg SDIO_FLAG_TXRUN: data transmission in progress flag - \arg SDIO_FLAG_RXRUN: data reception in progress flag - \arg SDIO_FLAG_TFH: transmit FIFO is half empty flag: at least 8 words can be written into the FIFO - \arg SDIO_FLAG_RFH: receive FIFO is half full flag: at least 8 words can be read in the FIFO - \arg SDIO_FLAG_TFF: transmit FIFO is full flag - \arg SDIO_FLAG_RFF: receive FIFO is full flag - \arg SDIO_FLAG_TFE: transmit FIFO is empty flag - \arg SDIO_FLAG_RFE: receive FIFO is empty flag - \arg SDIO_FLAG_TXDTVAL: data is valid in transmit FIFO flag - \arg SDIO_FLAG_RXDTVAL: data is valid in receive FIFO flag - \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag - \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus sdio_flag_get(uint32_t flag) -{ - FlagStatus temp_flag = RESET; - if(RESET != (SDIO_STAT & flag)) { - temp_flag = SET; - } - return temp_flag; -} - -/*! - \brief clear the pending flags of SDIO - \param[in] flag: flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag - \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag - \arg SDIO_FLAG_CMDTMOUT: command response timeout flag - \arg SDIO_FLAG_DTTMOUT: data timeout flag - \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag - \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag - \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag - \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag - \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag - \arg SDIO_FLAG_STBITE: start bit error in the bus flag - \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag - \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag - \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag - \param[out] none - \retval none -*/ -void sdio_flag_clear(uint32_t flag) -{ - SDIO_INTC = flag; -} - -/*! - \brief enable the SDIO interrupt - \param[in] int_flag: interrupt flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt - \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt - \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt - \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt - \arg SDIO_INT_TXURE: SDIO TXURE interrupt - \arg SDIO_INT_RXORE: SDIO RXORE interrupt - \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt - \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt - \arg SDIO_INT_DTEND: SDIO DTEND interrupt - \arg SDIO_INT_STBITE: SDIO STBITE interrupt - \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt - \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt - \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt - \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt - \arg SDIO_INT_TFH: SDIO TFH interrupt - \arg SDIO_INT_RFH: SDIO RFH interrupt - \arg SDIO_INT_TFF: SDIO TFF interrupt - \arg SDIO_INT_RFF: SDIO RFF interrupt - \arg SDIO_INT_TFE: SDIO TFE interrupt - \arg SDIO_INT_RFE: SDIO RFE interrupt - \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt - \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt - \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt - \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt - \param[out] none - \retval none -*/ -void sdio_interrupt_enable(uint32_t int_flag) -{ - SDIO_INTEN |= int_flag; -} - -/*! - \brief disable the SDIO interrupt - \param[in] int_flag: interrupt flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt - \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt - \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt - \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt - \arg SDIO_INT_TXURE: SDIO TXURE interrupt - \arg SDIO_INT_RXORE: SDIO RXORE interrupt - \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt - \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt - \arg SDIO_INT_DTEND: SDIO DTEND interrupt - \arg SDIO_INT_STBITE: SDIO STBITE interrupt - \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt - \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt - \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt - \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt - \arg SDIO_INT_TFH: SDIO TFH interrupt - \arg SDIO_INT_RFH: SDIO RFH interrupt - \arg SDIO_INT_TFF: SDIO TFF interrupt - \arg SDIO_INT_RFF: SDIO RFF interrupt - \arg SDIO_INT_TFE: SDIO TFE interrupt - \arg SDIO_INT_RFE: SDIO RFE interrupt - \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt - \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt - \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt - \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt - \param[out] none - \retval none -*/ -void sdio_interrupt_disable(uint32_t int_flag) -{ - SDIO_INTEN &= ~int_flag; -} - -/*! - \brief get the interrupt flags state of SDIO - \param[in] int_flag: interrupt flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_INT_FLAG_CCRCERR: SDIO CCRCERR interrupt flag - \arg SDIO_INT_FLAG_DTCRCERR: SDIO DTCRCERR interrupt flag - \arg SDIO_INT_FLAG_CMDTMOUT: SDIO CMDTMOUT interrupt flag - \arg SDIO_INT_FLAG_DTTMOUT: SDIO DTTMOUT interrupt flag - \arg SDIO_INT_FLAG_TXURE: SDIO TXURE interrupt flag - \arg SDIO_INT_FLAG_RXORE: SDIO RXORE interrupt flag - \arg SDIO_INT_FLAG_CMDRECV: SDIO CMDRECV interrupt flag - \arg SDIO_INT_FLAG_CMDSEND: SDIO CMDSEND interrupt flag - \arg SDIO_INT_FLAG_DTEND: SDIO DTEND interrupt flag - \arg SDIO_INT_FLAG_STBITE: SDIO STBITE interrupt flag - \arg SDIO_INT_FLAG_DTBLKEND: SDIO DTBLKEND interrupt flag - \arg SDIO_INT_FLAG_CMDRUN: SDIO CMDRUN interrupt flag - \arg SDIO_INT_FLAG_TXRUN: SDIO TXRUN interrupt flag - \arg SDIO_INT_FLAG_RXRUN: SDIO RXRUN interrupt flag - \arg SDIO_INT_FLAG_TFH: SDIO TFH interrupt flag - \arg SDIO_INT_FLAG_RFH: SDIO RFH interrupt flag - \arg SDIO_INT_FLAG_TFF: SDIO TFF interrupt flag - \arg SDIO_INT_FLAG_RFF: SDIO RFF interrupt flag - \arg SDIO_INT_FLAG_TFE: SDIO TFE interrupt flag - \arg SDIO_INT_FLAG_RFE: SDIO RFE interrupt flag - \arg SDIO_INT_FLAG_TXDTVAL: SDIO TXDTVAL interrupt flag - \arg SDIO_INT_FLAG_RXDTVAL: SDIO RXDTVAL interrupt flag - \arg SDIO_INT_FLAG_SDIOINT: SDIO SDIOINT interrupt flag - \arg SDIO_INT_FLAG_ATAEND: SDIO ATAEND interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus sdio_interrupt_flag_get(uint32_t int_flag) -{ - FlagStatus temp_flag = RESET; - if(RESET != (SDIO_STAT & int_flag)) { - temp_flag = SET; - } - return temp_flag; -} - -/*! - \brief clear the interrupt pending flags of SDIO - \param[in] int_flag: interrupt flags state of SDIO - one or more parameters can be selected which are shown as below: - \arg SDIO_INT_FLAG_CCRCERR: command response received (CRC check failed) flag - \arg SDIO_INT_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag - \arg SDIO_INT_FLAG_CMDTMOUT: command response timeout flag - \arg SDIO_INT_FLAG_DTTMOUT: data timeout flag - \arg SDIO_INT_FLAG_TXURE: transmit FIFO underrun error occurs flag - \arg SDIO_INT_FLAG_RXORE: received FIFO overrun error occurs flag - \arg SDIO_INT_FLAG_CMDRECV: command response received (CRC check passed) flag - \arg SDIO_INT_FLAG_CMDSEND: command sent (no response required) flag - \arg SDIO_INT_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag - \arg SDIO_INT_FLAG_STBITE: start bit error in the bus flag - \arg SDIO_INT_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag - \arg SDIO_INT_FLAG_SDIOINT: SD I/O interrupt received flag - \arg SDIO_INT_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag - \param[out] none - \retval none -*/ -void sdio_interrupt_flag_clear(uint32_t int_flag) -{ - SDIO_INTC = int_flag; -} - -/*! - \brief enable the read wait mode(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_readwait_enable(void) -{ - SDIO_DATACTL |= SDIO_DATACTL_RWEN; -} - -/*! - \brief disable the read wait mode(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_readwait_disable(void) -{ - SDIO_DATACTL &= ~SDIO_DATACTL_RWEN; -} - -/*! - \brief enable the function that stop the read wait process(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_stop_readwait_enable(void) -{ - SDIO_DATACTL |= SDIO_DATACTL_RWSTOP; -} - -/*! - \brief disable the function that stop the read wait process(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_stop_readwait_disable(void) -{ - SDIO_DATACTL &= ~SDIO_DATACTL_RWSTOP; -} - -/*! - \brief set the read wait type(SD I/O only) - \param[in] readwait_type: SD I/O read wait type - only one parameter can be selected which is shown as below: - \arg SDIO_READWAITTYPE_CLK: read wait control by stopping SDIO_CLK - \arg SDIO_READWAITTYPE_DAT2: read wait control using SDIO_DAT[2] - \param[out] none - \retval none -*/ -void sdio_readwait_type_set(uint32_t readwait_type) -{ - if(SDIO_READWAITTYPE_CLK == readwait_type) { - SDIO_DATACTL |= SDIO_DATACTL_RWTYPE; - } else { - SDIO_DATACTL &= ~SDIO_DATACTL_RWTYPE; - } -} - -/*! - \brief enable the SD I/O mode specific operation(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_operation_enable(void) -{ - SDIO_DATACTL |= SDIO_DATACTL_IOEN; -} - -/*! - \brief disable the SD I/O mode specific operation(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_operation_disable(void) -{ - SDIO_DATACTL &= ~SDIO_DATACTL_IOEN; -} - -/*! - \brief enable the SD I/O suspend operation(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_suspend_enable(void) -{ - SDIO_CMDCTL |= SDIO_CMDCTL_SUSPEND; -} - -/*! - \brief disable the SD I/O suspend operation(SD I/O only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_suspend_disable(void) -{ - SDIO_CMDCTL &= ~SDIO_CMDCTL_SUSPEND; -} - -/*! - \brief enable the CE-ATA command(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_command_enable(void) -{ - SDIO_CMDCTL |= SDIO_CMDCTL_ATAEN; -} - -/*! - \brief disable the CE-ATA command(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_command_disable(void) -{ - SDIO_CMDCTL &= ~SDIO_CMDCTL_ATAEN; -} - -/*! - \brief enable the CE-ATA interrupt(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_interrupt_enable(void) -{ - SDIO_CMDCTL &= ~SDIO_CMDCTL_NINTEN; -} - -/*! - \brief disable the CE-ATA interrupt(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_interrupt_disable(void) -{ - SDIO_CMDCTL |= SDIO_CMDCTL_NINTEN; -} - -/*! - \brief enable the CE-ATA command completion signal(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_command_completion_enable(void) -{ - SDIO_CMDCTL |= SDIO_CMDCTL_ENCMDC; -} - -/*! - \brief disable the CE-ATA command completion signal(CE-ATA only) - \param[in] none - \param[out] none - \retval none -*/ -void sdio_ceata_command_completion_disable(void) -{ - SDIO_CMDCTL &= ~SDIO_CMDCTL_ENCMDC; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c deleted file mode 100644 index 2e112973133..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c +++ /dev/null @@ -1,877 +0,0 @@ -/*! - \file gd32f5xx_spi.c - \brief SPI driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - - -#include "gd32f5xx_spi.h" -#include "gd32f5xx_rcu.h" - -/* SPI/I2S parameter initialization mask */ -#define SPI_INIT_MASK ((uint32_t)0x00003040U) /*!< SPI parameter initialization mask */ -#define I2S_INIT_MASK ((uint32_t)0x0000F047U) /*!< I2S parameter initialization mask */ -#define I2S_FULL_DUPLEX_MASK ((uint32_t)0x00000480U) /*!< I2S full duples mode configure parameter initialization mask */ - -/* default value */ -#define SPI_I2SPSC_DEFAULT_VALUE ((uint32_t)0x00000002U) /*!< default value of SPI_I2SPSC register */ - -/*! - \brief deinitialize SPI and I2S - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5),include I2S1_ADD and I2S2_ADD - \param[out] none - \retval none -*/ -void spi_i2s_deinit(uint32_t spi_periph) -{ - switch(spi_periph) { - case SPI0: - /* reset SPI0 */ - rcu_periph_reset_enable(RCU_SPI0RST); - rcu_periph_reset_disable(RCU_SPI0RST); - break; - case SPI1: - /* reset SPI1,I2S1 and I2S1_ADD */ - rcu_periph_reset_enable(RCU_SPI1RST); - rcu_periph_reset_disable(RCU_SPI1RST); - break; - case SPI2: - /* reset SPI2,I2S2 and I2S2_ADD */ - rcu_periph_reset_enable(RCU_SPI2RST); - rcu_periph_reset_disable(RCU_SPI2RST); - break; - case SPI3: - /* reset SPI3 */ - rcu_periph_reset_enable(RCU_SPI3RST); - rcu_periph_reset_disable(RCU_SPI3RST); - break; - case SPI4: - /* reset SPI4 */ - rcu_periph_reset_enable(RCU_SPI4RST); - rcu_periph_reset_disable(RCU_SPI4RST); - break; - case SPI5: - /* reset SPI5 */ - rcu_periph_reset_enable(RCU_SPI5RST); - rcu_periph_reset_disable(RCU_SPI5RST); - break; - default : - break; - } -} - -/*! - \brief initialize the parameters of SPI struct with default values - \param[in] none - \param[out] spi_parameter_struct: the initialized struct spi_parameter_struct pointer - \retval none -*/ -void spi_struct_para_init(spi_parameter_struct *spi_struct) -{ - /* configure the structure with default value */ - spi_struct->device_mode = SPI_SLAVE; - spi_struct->trans_mode = SPI_TRANSMODE_FULLDUPLEX; - spi_struct->frame_size = SPI_FRAMESIZE_8BIT; - spi_struct->nss = SPI_NSS_HARD; - spi_struct->clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; - spi_struct->prescale = SPI_PSC_2; - spi_struct->endian = SPI_ENDIAN_MSB; -} -/*! - \brief initialize SPI parameter - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_struct: SPI parameter initialization stuct members of the structure - and the member values are shown as below: - device_mode: SPI_MASTER, SPI_SLAVE. - trans_mode: SPI_TRANSMODE_FULLDUPLEX, SPI_TRANSMODE_RECEIVEONLY, - SPI_TRANSMODE_BDRECEIVE, SPI_TRANSMODE_BDTRANSMIT - frame_size: SPI_FRAMESIZE_16BIT, SPI_FRAMESIZE_8BIT - nss: SPI_NSS_SOFT, SPI_NSS_HARD - endian: SPI_ENDIAN_MSB, SPI_ENDIAN_LSB - clock_polarity_phase: SPI_CK_PL_LOW_PH_1EDGE, SPI_CK_PL_HIGH_PH_1EDGE - SPI_CK_PL_LOW_PH_2EDGE, SPI_CK_PL_HIGH_PH_2EDGE - prescale: SPI_PSC_n (n=2,4,8,16,32,64,128,256) - \param[out] none - \retval none -*/ -void spi_init(uint32_t spi_periph, spi_parameter_struct *spi_struct) -{ - uint32_t reg = 0U; - reg = SPI_CTL0(spi_periph); - reg &= SPI_INIT_MASK; - - /* select SPI as master or slave */ - reg |= spi_struct->device_mode; - /* select SPI transfer mode */ - reg |= spi_struct->trans_mode; - /* select SPI frame size */ - reg |= spi_struct->frame_size; - /* select SPI nss use hardware or software */ - reg |= spi_struct->nss; - /* select SPI LSB or MSB */ - reg |= spi_struct->endian; - /* select SPI polarity and phase */ - reg |= spi_struct->clock_polarity_phase; - /* select SPI prescale to adjust transmit speed */ - reg |= spi_struct->prescale; - - /* write to SPI_CTL0 register */ - SPI_CTL0(spi_periph) = (uint32_t)reg; - - SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SSEL); -} - -/*! - \brief enable SPI - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_enable(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SPIEN; -} - -/*! - \brief disable SPI - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_disable(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SPIEN); -} - -/*! - \brief initialize I2S parameter - \param[in] spi_periph: SPIx(x=1,2) - \param[in] i2s_mode: I2S operation mode - only one parameter can be selected which is shown as below: - \arg I2S_MODE_SLAVETX : I2S slave transmit mode - \arg I2S_MODE_SLAVERX : I2S slave receive mode - \arg I2S_MODE_MASTERTX : I2S master transmit mode - \arg I2S_MODE_MASTERRX : I2S master receive mode - \param[in] i2s_standard: I2S standard - only one parameter can be selected which is shown as below: - \arg I2S_STD_PHILIPS : I2S philips standard - \arg I2S_STD_MSB : I2S MSB standard - \arg I2S_STD_LSB : I2S LSB standard - \arg I2S_STD_PCMSHORT : I2S PCM short standard - \arg I2S_STD_PCMLONG : I2S PCM long standard - \param[in] i2s_ckpl: I2S idle state clock polarity - only one parameter can be selected which is shown as below: - \arg I2S_CKPL_LOW : I2S clock polarity low level - \arg I2S_CKPL_HIGH : I2S clock polarity high level - \param[out] none - \retval none -*/ -void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl) -{ - uint32_t reg = 0U; - reg = SPI_I2SCTL(spi_periph); - reg &= I2S_INIT_MASK; - - /* enable I2S mode */ - reg |= (uint32_t)SPI_I2SCTL_I2SSEL; - /* select I2S mode */ - reg |= (uint32_t)i2s_mode; - /* select I2S standard */ - reg |= (uint32_t)i2s_standard; - /* select I2S polarity */ - reg |= (uint32_t)i2s_ckpl; - - /* write to SPI_I2SCTL register */ - SPI_I2SCTL(spi_periph) = (uint32_t)reg; -} - -/*! - \brief configure I2S prescale - \param[in] spi_periph: SPIx(x=1,2) - \param[in] i2s_audiosample: I2S audio sample rate - only one parameter can be selected which is shown as below: - \arg I2S_AUDIOSAMPLE_8K: audio sample rate is 8KHz - \arg I2S_AUDIOSAMPLE_11K: audio sample rate is 11KHz - \arg I2S_AUDIOSAMPLE_16K: audio sample rate is 16KHz - \arg I2S_AUDIOSAMPLE_22K: audio sample rate is 22KHz - \arg I2S_AUDIOSAMPLE_32K: audio sample rate is 32KHz - \arg I2S_AUDIOSAMPLE_44K: audio sample rate is 44KHz - \arg I2S_AUDIOSAMPLE_48K: audio sample rate is 48KHz - \arg I2S_AUDIOSAMPLE_96K: audio sample rate is 96KHz - \arg I2S_AUDIOSAMPLE_192K: audio sample rate is 192KHz - \param[in] i2s_frameformat: I2S data length and channel length - only one parameter can be selected which is shown as below: - \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit - \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit - \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit - \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit - \param[in] i2s_mckout: I2S master clock output - only one parameter can be selected which is shown as below: - \arg I2S_MCKOUT_ENABLE: I2S master clock output enable - \arg I2S_MCKOUT_DISABLE: I2S master clock output disable - \param[out] none - \retval none -*/ -void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout) -{ - uint32_t i2sdiv = 2U, i2sof = 0U; - uint32_t clks = 0U; - uint32_t i2sclock = 0U; - -#ifndef I2S_EXTERNAL_CLOCK_IN - uint32_t plli2sm = 0U, plli2sn = 0U, plli2sr = 0U; -#endif /* I2S_EXTERNAL_CLOCK_IN */ - - /* deinit SPI_I2SPSC register */ - SPI_I2SPSC(spi_periph) = SPI_I2SPSC_DEFAULT_VALUE; - -#ifdef I2S_EXTERNAL_CLOCK_IN - rcu_i2s_clock_config(RCU_I2SSRC_I2S_CKIN); - - /* set the I2S clock to the external clock input value */ - i2sclock = I2S_EXTERNAL_CLOCK_IN; -#else - - /* turn on the oscillator HXTAL */ - rcu_osci_on(RCU_HXTAL); - /* wait for oscillator stabilization flags is SET */ - rcu_osci_stab_wait(RCU_HXTAL); - /* turn on the PLLI2S */ - rcu_osci_on(RCU_PLLI2S_CK); - /* wait for PLLI2S flags is SET */ - rcu_osci_stab_wait(RCU_PLLI2S_CK); - /* configure the I2S clock source selection */ - rcu_i2s_clock_config(RCU_I2SSRC_PLLI2S); - - /* get the RCU_PLL_PLLPSC value */ - plli2sm = (uint32_t)(RCU_PLL & RCU_PLL_PLLPSC); - /* get the RCU_PLLI2S_PLLI2SN value */ - plli2sn = (uint32_t)((RCU_PLLI2S & RCU_PLLI2S_PLLI2SN) >> 6); - /* get the RCU_PLLI2S_PLLI2SR value */ - plli2sr = (uint32_t)((RCU_PLLI2S & RCU_PLLI2S_PLLI2SR) >> 28); - - if((RCU_PLL & RCU_PLL_PLLSEL) == RCU_PLLSRC_HXTAL) { - /* get the I2S source clock value */ - i2sclock = (uint32_t)(((HXTAL_VALUE / plli2sm) * plli2sn) / plli2sr); - } else { - /* get the I2S source clock value */ - i2sclock = (uint32_t)(((IRC16M_VALUE / plli2sm) * plli2sn) / plli2sr); - } -#endif /* I2S_EXTERNAL_CLOCK_IN */ - - /* config the prescaler depending on the mclk output state, the frame format and audio sample rate */ - if(I2S_MCKOUT_ENABLE == i2s_mckout) { - clks = (uint32_t)(((i2sclock / 256U) * 10U) / i2s_audiosample); - } else { - if(I2S_FRAMEFORMAT_DT16B_CH16B == i2s_frameformat) { - clks = (uint32_t)(((i2sclock / 32U) * 10U) / i2s_audiosample); - } else { - clks = (uint32_t)(((i2sclock / 64U) * 10U) / i2s_audiosample); - } - } - /* remove the floating point */ - clks = (clks + 5U) / 10U; - i2sof = (clks & 0x00000001U); - i2sdiv = ((clks - i2sof) / 2U); - i2sof = (i2sof << 8U); - - /* set the default values */ - if((i2sdiv < 2U) || (i2sdiv > 255U)) { - i2sdiv = 2U; - i2sof = 0U; - } - - /* configure SPI_I2SPSC */ - SPI_I2SPSC(spi_periph) = (uint32_t)(i2sdiv | i2sof | i2s_mckout); - - /* clear SPI_I2SCTL_DTLEN and SPI_I2SCTL_CHLEN bits */ - SPI_I2SCTL(spi_periph) &= (uint32_t)(~(SPI_I2SCTL_DTLEN | SPI_I2SCTL_CHLEN)); - /* configure data frame format */ - SPI_I2SCTL(spi_periph) |= (uint32_t)i2s_frameformat; -} - -/*! - \brief enable I2S - \param[in] spi_periph: SPIx(x=1,2) - \param[out] none - \retval none -*/ -void i2s_enable(uint32_t spi_periph) -{ - SPI_I2SCTL(spi_periph) |= (uint32_t)SPI_I2SCTL_I2SEN; -} - -/*! - \brief disable I2S - \param[in] spi_periph: SPIx(x=1,2) - \param[out] none - \retval none -*/ -void i2s_disable(uint32_t spi_periph) -{ - SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SEN); -} - -/*! - \brief enable SPI nss output - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_nss_output_enable(uint32_t spi_periph) -{ - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV; -} - -/*! - \brief disable SPI nss output - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_nss_output_disable(uint32_t spi_periph) -{ - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSDRV); -} - -/*! - \brief SPI nss pin high level in software mode - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_nss_internal_high(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SWNSS; -} - -/*! - \brief SPI nss pin low level in software mode - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_nss_internal_low(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SWNSS); -} - -/*! - \brief enable SPI DMA send or receive - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_dma: SPI DMA mode - only one parameter can be selected which is shown as below: - \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA - \arg SPI_DMA_RECEIVE: SPI receive data use DMA - \param[out] none - \retval none -*/ -void spi_dma_enable(uint32_t spi_periph, uint8_t spi_dma) -{ - if(SPI_DMA_TRANSMIT == spi_dma) { - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMATEN; - } else { - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMAREN; - } -} - -/*! - \brief diable SPI DMA send or receive - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_dma: SPI DMA mode - only one parameter can be selected which is shown as below: - \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA - \arg SPI_DMA_RECEIVE: SPI receive data use DMA - \param[out] none - \retval none -*/ -void spi_dma_disable(uint32_t spi_periph, uint8_t spi_dma) -{ - if(SPI_DMA_TRANSMIT == spi_dma) { - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMATEN); - } else { - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMAREN); - } -} - -/*! - \brief configure SPI/I2S data frame format - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] frame_format: SPI frame size - only one parameter can be selected which is shown as below: - \arg SPI_FRAMESIZE_16BIT: SPI frame size is 16 bits - \arg SPI_FRAMESIZE_8BIT: SPI frame size is 8 bits - \param[out] none - \retval none -*/ -void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format) -{ - /* clear SPI_CTL0_FF16 bit */ - SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_FF16); - /* configure SPI_CTL0_FF16 bit */ - SPI_CTL0(spi_periph) |= (uint32_t)frame_format; -} - -/*! - \brief SPI transmit data - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] data: 16-bit data - \param[out] none - \retval none -*/ -void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data) -{ - SPI_DATA(spi_periph) = (uint32_t)data; -} - -/*! - \brief SPI receive data - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval 16-bit data -*/ -uint16_t spi_i2s_data_receive(uint32_t spi_periph) -{ - return ((uint16_t)SPI_DATA(spi_periph)); -} - -/*! - \brief configure SPI bidirectional transfer direction - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] transfer_direction: SPI transfer direction - only one parameter can be selected which is shown as below: - \arg SPI_BIDIRECTIONAL_TRANSMIT: SPI work in transmit-only mode - \arg SPI_BIDIRECTIONAL_RECEIVE: SPI work in receive-only mode - \retval none -*/ -void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction) -{ - if(SPI_BIDIRECTIONAL_TRANSMIT == transfer_direction) { - /* set the transmit only mode */ - SPI_CTL0(spi_periph) |= (uint32_t)SPI_BIDIRECTIONAL_TRANSMIT; - } else { - /* set the receive only mode */ - SPI_CTL0(spi_periph) &= SPI_BIDIRECTIONAL_RECEIVE; - } -} - -/*! - \brief set SPI CRC polynomial - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] crc_poly: CRC polynomial value - \param[out] none - \retval none -*/ -void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly) -{ - /* set SPI CRC polynomial */ - SPI_CRCPOLY(spi_periph) = (uint32_t)crc_poly; -} - -/*! - \brief get SPI CRC polynomial - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval 16-bit CRC polynomial -*/ -uint16_t spi_crc_polynomial_get(uint32_t spi_periph) -{ - return ((uint16_t)SPI_CRCPOLY(spi_periph)); -} - -/*! - \brief turn on SPI CRC function - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_crc_on(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCEN; -} - -/*! - \brief turn off SPI CRC function - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_crc_off(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_CRCEN); -} - -/*! - \brief SPI next data is CRC value - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_crc_next(uint32_t spi_periph) -{ - SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCNT; -} - -/*! - \brief get SPI CRC send value or receive value - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_crc: SPI crc value - only one parameter can be selected which is shown as below: - \arg SPI_CRC_TX: get transmit crc value - \arg SPI_CRC_RX: get receive crc value - \param[out] none - \retval 16-bit CRC value -*/ -uint16_t spi_crc_get(uint32_t spi_periph, uint8_t spi_crc) -{ - if(SPI_CRC_TX == spi_crc) { - return ((uint16_t)(SPI_TCRC(spi_periph))); - } else { - return ((uint16_t)(SPI_RCRC(spi_periph))); - } -} - -/*! - \brief enable SPI TI mode - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_ti_mode_enable(uint32_t spi_periph) -{ - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TMOD; -} - -/*! - \brief disable SPI TI mode - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_ti_mode_disable(uint32_t spi_periph) -{ - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TMOD); -} - -/*! - \brief configure i2s full duplex mode - \param[in] i2s_add_periph: I2Sx_ADD(x=1,2) - \param[in] i2s_mode: - \arg I2S_MODE_SLAVETX : I2S slave transmit mode - \arg I2S_MODE_SLAVERX : I2S slave receive mode - \arg I2S_MODE_MASTERTX : I2S master transmit mode - \arg I2S_MODE_MASTERRX : I2S master receive mode - \param[in] i2s_standard: - \arg I2S_STD_PHILIPS : I2S philips standard - \arg I2S_STD_MSB : I2S MSB standard - \arg I2S_STD_LSB : I2S LSB standard - \arg I2S_STD_PCMSHORT : I2S PCM short standard - \arg I2S_STD_PCMLONG : I2S PCM long standard - \param[in] i2s_ckpl: - \arg I2S_CKPL_LOW : I2S clock polarity low level - \arg I2S_CKPL_HIGH : I2S clock polarity high level - \param[in] i2s_frameformat: - \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit - \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit - \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit - \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit - \param[out] none - \retval none -*/ -void i2s_full_duplex_mode_config(uint32_t i2s_add_periph, uint32_t i2s_mode, uint32_t i2s_standard, - uint32_t i2s_ckpl, uint32_t i2s_frameformat) -{ - uint32_t reg = 0U, tmp = 0U; - - reg = I2S_ADD_I2SCTL(i2s_add_periph); - reg &= I2S_FULL_DUPLEX_MASK; - - /* get the mode of the extra I2S module I2Sx_ADD */ - if((I2S_MODE_MASTERTX == i2s_mode) || (I2S_MODE_SLAVETX == i2s_mode)) { - tmp = I2S_MODE_SLAVERX; - } else { - tmp = I2S_MODE_SLAVETX; - } - - /* enable I2S mode */ - reg |= (uint32_t)SPI_I2SCTL_I2SSEL; - /* select I2S mode */ - reg |= (uint32_t)tmp; - /* select I2S standard */ - reg |= (uint32_t)i2s_standard; - /* select I2S polarity */ - reg |= (uint32_t)i2s_ckpl; - /* configure data frame format */ - reg |= (uint32_t)i2s_frameformat; - - /* write to SPI_I2SCTL register */ - I2S_ADD_I2SCTL(i2s_add_periph) = (uint32_t)reg; -} - -/*! - \brief enable quad wire SPI - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_enable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QMOD; -} - -/*! - \brief disable quad wire SPI - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_disable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QMOD); -} - -/*! - \brief enable quad wire SPI write - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_write_enable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QRD); -} - -/*! - \brief enable quad wire SPI read - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_read_enable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QRD; -} - -/*! - \brief enable SPI_IO2 and SPI_IO3 pin output - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_io23_output_enable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_IO23_DRV; -} - -/*! - \brief disable SPI_IO2 and SPI_IO3 pin output - \param[in] spi_periph: SPIx(only x=5) - \param[out] none - \retval none -*/ -void spi_quad_io23_output_disable(uint32_t spi_periph) -{ - SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_IO23_DRV); -} - -/*! - \brief enable SPI and I2S interrupt - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_i2s_int: SPI/I2S interrupt - only one parameter can be selected which is shown as below: - \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt - \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt - \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, - transmission underrun error and format error interrupt - \param[out] none - \retval none -*/ -void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t spi_i2s_int) -{ - switch(spi_i2s_int) { - /* SPI/I2S transmit buffer empty interrupt */ - case SPI_I2S_INT_TBE: - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TBEIE; - break; - /* SPI/I2S receive buffer not empty interrupt */ - case SPI_I2S_INT_RBNE: - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_RBNEIE; - break; - /* SPI/I2S error */ - case SPI_I2S_INT_ERR: - SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_ERRIE; - break; - default: - break; - } -} - -/*! - \brief disable SPI and I2S interrupt - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_i2s_int: SPI/I2S interrupt - only one parameter can be selected which is shown as below: - \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt - \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt - \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, - transmission underrun error and format error interrupt - \param[out] none - \retval none -*/ -void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t spi_i2s_int) -{ - switch(spi_i2s_int) { - /* SPI/I2S transmit buffer empty interrupt */ - case SPI_I2S_INT_TBE : - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TBEIE); - break; - /* SPI/I2S receive buffer not empty interrupt */ - case SPI_I2S_INT_RBNE : - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_RBNEIE); - break; - /* SPI/I2S error */ - case SPI_I2S_INT_ERR : - SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_ERRIE); - break; - default : - break; - } -} - -/*! - \brief get SPI and I2S interrupt flag status - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_i2s_int: SPI/I2S interrupt flag status - only one parameter can be selected which are shown as below: - \arg SPI_I2S_INT_FLAG_TBE: transmit buffer empty interrupt flag - \arg SPI_I2S_INT_FLAG_RBNE: receive buffer not empty interrupt flag - \arg SPI_I2S_INT_FLAG_RXORERR: overrun interrupt flag - \arg SPI_INT_FLAG_CONFERR: config error interrupt flag - \arg SPI_INT_FLAG_CRCERR: CRC error interrupt flag - \arg I2S_INT_FLAG_TXURERR: underrun error interrupt flag - \arg SPI_I2S_INT_FLAG_FERR: format error interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t spi_i2s_int) -{ - uint32_t reg1 = SPI_STAT(spi_periph); - uint32_t reg2 = SPI_CTL1(spi_periph); - - switch(spi_i2s_int) { - /* SPI/I2S transmit buffer empty interrupt */ - case SPI_I2S_INT_FLAG_TBE : - reg1 = reg1 & SPI_STAT_TBE; - reg2 = reg2 & SPI_CTL1_TBEIE; - break; - /* SPI/I2S receive buffer not empty interrupt */ - case SPI_I2S_INT_FLAG_RBNE : - reg1 = reg1 & SPI_STAT_RBNE; - reg2 = reg2 & SPI_CTL1_RBNEIE; - break; - /* SPI/I2S overrun interrupt */ - case SPI_I2S_INT_FLAG_RXORERR : - reg1 = reg1 & SPI_STAT_RXORERR; - reg2 = reg2 & SPI_CTL1_ERRIE; - break; - /* SPI config error interrupt */ - case SPI_INT_FLAG_CONFERR : - reg1 = reg1 & SPI_STAT_CONFERR; - reg2 = reg2 & SPI_CTL1_ERRIE; - break; - /* SPI CRC error interrupt */ - case SPI_INT_FLAG_CRCERR : - reg1 = reg1 & SPI_STAT_CRCERR; - reg2 = reg2 & SPI_CTL1_ERRIE; - break; - /* I2S underrun error interrupt */ - case I2S_INT_FLAG_TXURERR : - reg1 = reg1 & SPI_STAT_TXURERR; - reg2 = reg2 & SPI_CTL1_ERRIE; - break; - /* SPI/I2S format error interrupt */ - case SPI_I2S_INT_FLAG_FERR : - reg1 = reg1 & SPI_STAT_FERR; - reg2 = reg2 & SPI_CTL1_ERRIE; - break; - default : - break; - } - /*get SPI/I2S interrupt flag status */ - if(reg1 && reg2) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief get SPI and I2S flag status - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[in] spi_i2s_flag: SPI/I2S flag status - only one parameter can be selected which are shown as below: - \arg SPI_FLAG_TBE: transmit buffer empty flag - \arg SPI_FLAG_RBNE: receive buffer not empty flag - \arg SPI_FLAG_TRANS: transmit on-going flag - \arg SPI_FLAG_RXORERR: receive overrun error flag - \arg SPI_FLAG_CONFERR: mode config error flag - \arg SPI_FLAG_CRCERR: CRC error flag - \arg SPI_FLAG_FERR: format error flag - \arg I2S_FLAG_TBE: transmit buffer empty flag - \arg I2S_FLAG_RBNE: receive buffer not empty flag - \arg I2S_FLAG_TRANS: transmit on-going flag - \arg I2S_FLAG_RXORERR: overrun error flag - \arg I2S_FLAG_TXURERR: underrun error flag - \arg I2S_FLAG_CH: channel side flag - \arg I2S_FLAG_FERR: format error flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t spi_i2s_flag) -{ - if(SPI_STAT(spi_periph) & spi_i2s_flag) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear SPI CRC error flag status - \param[in] spi_periph: SPIx(x=0,1,2,3,4,5) - \param[out] none - \retval none -*/ -void spi_crc_error_clear(uint32_t spi_periph) -{ - SPI_STAT(spi_periph) &= (uint32_t)(~SPI_FLAG_CRCERR); -} - diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c deleted file mode 100644 index ed147118901..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c +++ /dev/null @@ -1,471 +0,0 @@ -/*! - \file gd32f5xx_syscfg.c - \brief SYSCFG driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_syscfg.h" - -/*! - \brief reset the SYSCFG registers - \param[in] none - \param[out] none - \retval none -*/ -void syscfg_deinit(void) -{ - rcu_periph_reset_enable(RCU_SYSCFGRST); - rcu_periph_reset_disable(RCU_SYSCFGRST); -} - -/*! - \brief configure the boot mode - \param[in] syscfg_bootmode: selects the memory remapping - only one parameter can be selected which is shown as below: - \arg SYSCFG_BOOTMODE_FLASH: main flash memory (0x08000000~0x0877FFFF) is mapped at address 0x00000000 - \arg SYSCFG_BOOTMODE_BOOTLOADER: boot loader (0x1FFF0000~0x1FFF77FF) is mapped at address 0x00000000 - \arg SYSCFG_BOOTMODE_SRAM: SRAM0 of on-chip SRAM(0x20000000~0x2003FFFF) is mapped at address 0x00000000 - \arg SYSCFG_BOOTMODE_OTP: OTP(0x1FF00000~0x1FF1FFFF) is mapped at address 0x00000000 - \param[out] none - \retval none -*/ -void syscfg_bootmode_config(uint8_t syscfg_bootmode) -{ - /* reset the SYSCFG_CFG0_BOOT_MODE bit and set according to syscfg_bootmode */ - SYSCFG_CFG0 &= ~SYSCFG_CFG0_BOOT_MODE; - SYSCFG_CFG0 |= (uint32_t)syscfg_bootmode; -} - -/*! - \brief FMC memory mapping swap - \param[in] syscfg_fmc_swap: selects the interal flash bank swapping - only one parameter can be selected which is shown as below: - \arg SYSCFG_FMC_SWP_BANK0: bank 0 is mapped at address 0x08000000 and bank 1 is mapped at address 0x08100000(if main flash is 4M,the swaped address is 0x0820_0000) - \arg SYSCFG_FMC_SWP_BANK1: bank 1 is mapped at address 0x08000000 and bank 0 is mapped at address 0x08100000(if main flash is 4M,the swaped address is 0x0820_0000) - \param[out] none - \retval none -*/ -void syscfg_fmc_swap_config(uint32_t syscfg_fmc_swap) -{ - uint32_t reg; - reg = SYSCFG_CFG0; - /* reset the FMC_SWP bit and set according to syscfg_fmc_swap */ - reg &= ~SYSCFG_CFG0_FMC_SWP; - SYSCFG_CFG0 = (reg | syscfg_fmc_swap); -} - -/*! - \brief EXMC memory mapping swap - \param[in] syscfg_exmc_swap: selects the memories in EXMC swapping - only one parameter can be selected which is shown as below: - \arg SYSCFG_EXMC_SWP_ENABLE: SDRAM bank 0 and bank 1 are swapped with NAND bank 1 and PC card - \arg SYSCFG_EXMC_SWP_DISABLE: no memory mapping swap - \param[out] none - \retval none -*/ -void syscfg_exmc_swap_config(uint32_t syscfg_exmc_swap) -{ - uint32_t reg; - - reg = SYSCFG_CFG0; - /* reset the SYSCFG_CFG0_EXMC_SWP bits and set according to syscfg_exmc_swap */ - reg &= ~SYSCFG_CFG0_EXMC_SWP; - SYSCFG_CFG0 = (reg | syscfg_exmc_swap); -} - -/*! - \brief configure the GPIO pin as EXTI Line - \param[in] exti_port: specify the GPIO port used in EXTI - only one parameter can be selected which is shown as below: - \arg EXTI_SOURCE_GPIOx(x = A,B,C,D,E,F,G,H,I): EXTI GPIO port - \param[in] exti_pin: specify the EXTI line - only one parameter can be selected which is shown as below: - \arg EXTI_SOURCE_PINx(x = 0..15): EXTI GPIO pin - \param[out] none - \retval none -*/ -void syscfg_exti_line_config(uint8_t exti_port, uint8_t exti_pin) -{ - uint32_t clear_exti_mask = ~((uint32_t)EXTI_SS_MASK << (EXTI_SS_MSTEP(exti_pin))); - uint32_t config_exti_mask = ((uint32_t)exti_port) << (EXTI_SS_MSTEP(exti_pin)); - - switch(exti_pin / EXTI_SS_JSTEP) { - case EXTISS0: - /* clear EXTI source line(0..3) */ - SYSCFG_EXTISS0 &= clear_exti_mask; - /* configure EXTI soure line(0..3) */ - SYSCFG_EXTISS0 |= config_exti_mask; - break; - case EXTISS1: - /* clear EXTI soure line(4..7) */ - SYSCFG_EXTISS1 &= clear_exti_mask; - /* configure EXTI soure line(4..7) */ - SYSCFG_EXTISS1 |= config_exti_mask; - break; - case EXTISS2: - /* clear EXTI soure line(8..11) */ - SYSCFG_EXTISS2 &= clear_exti_mask; - /* configure EXTI soure line(8..11) */ - SYSCFG_EXTISS2 |= config_exti_mask; - break; - case EXTISS3: - /* clear EXTI soure line(12..15) */ - SYSCFG_EXTISS3 &= clear_exti_mask; - /* configure EXTI soure line(12..15) */ - SYSCFG_EXTISS3 |= config_exti_mask; - break; - default: - break; - } -} - -/*! - \brief configure the PHY interface for the ethernet MAC - \param[in] syscfg_enet_phy_interface: specifies the media interface mode. - only one parameter can be selected which is shown as below: - \arg SYSCFG_ENET_PHY_MII: MII mode is selected - \arg SYSCFG_ENET_PHY_RMII: RMII mode is selected - \param[out] none - \retval none -*/ -void syscfg_enet_phy_interface_config(uint32_t syscfg_enet_phy_interface) -{ - uint32_t reg; - - reg = SYSCFG_CFG1; - /* reset the ENET_PHY_SEL bit and set according to syscfg_enet_phy_interface */ - reg &= ~SYSCFG_CFG1_ENET_PHY_SEL; - SYSCFG_CFG1 = (reg | syscfg_enet_phy_interface); -} - -/*! - \brief configure the I/O compensation cell - \param[in] syscfg_compensation: specifies the I/O compensation cell mode - only one parameter can be selected which is shown as below: - \arg SYSCFG_COMPENSATION_ENABLE: I/O compensation cell is enabled - \arg SYSCFG_COMPENSATION_DISABLE: I/O compensation cell is disabled - \param[out] none - \retval none -*/ -void syscfg_compensation_config(uint32_t syscfg_compensation) -{ - uint32_t reg; - - reg = SYSCFG_CPSCTL; - /* reset the SYSCFG_CPSCTL_CPS_EN bit and set according to syscfg_compensation */ - reg &= ~SYSCFG_CPSCTL_CPS_EN; - SYSCFG_CPSCTL = (reg | syscfg_compensation); -} - -/*! - \brief get Compensation cell ready flag - \param[in] none - \param[out] FlagStatus: the status of vref - \arg SET: the VREF output is ready - \arg RESET: the VREF output is not ready - \retval none -*/ -FlagStatus syscfg_cps_cell_ready_get(void) -{ - if(SYSCFG_CPSCTL & SYSCFG_CPSCTL_CPS_RDY){ - return SET; - }else{ - return RESET; - } -} - -/*! - \brief get ECC event error bits - \param[in] ecc_type: ECC event type, refer to syscfg_ecc_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_SRAM0_ECC: SRAM0 ECC event - \arg SYSCFG_SRAM1_ECC: SRAM1 ECC event - \arg SYSCFG_SRAM2_ECC: SRAM2 ECC event - \arg SYSCFG_ADDSRAM_ECC: ADDSRAM ECC event - \arg SYSCFG_TCMSRAM_ECC: TCMSRAM ECC event - \arg SYSCFG_BKPSRAM_ECC: BKPSRAM ECC event - \arg SYSCFG_FLASH_ECC: FLASH ECC event - \param[out] none - \retval error bits -*/ -uint32_t syscfg_ecc_err_bits_get(syscfg_ecc_enum ecc_type) -{ - uint32_t err_bits = 0U; - - switch(ecc_type){ - case SYSCFG_SRAM0_ECC: - err_bits = (uint32_t)((SYSCFG_SRAM0ECC & SYSCFG_SRAM0ECC_ECCSERRBITS0) >> 10U); - break; - case SYSCFG_SRAM1_ECC: - err_bits = (uint32_t)((SYSCFG_SRAM1ECC & SYSCFG_SRAM1ECC_ECCSERRBITS1) >> 12U); - break; - case SYSCFG_SRAM2_ECC: - err_bits = (uint32_t)((SYSCFG_SRAM2ECC & SYSCFG_SRAM2ECC_ECCSERRBITS2) >> 10U); - break; - case SYSCFG_ADDSRAM_ECC: - err_bits = (uint32_t)((SYSCFG_ADDSRAMECC & SYSCFG_ADDSRAMECC_ECCSERRBITS3) >> 8U); - break; - case SYSCFG_TCMSRAM_ECC: - err_bits = (uint32_t)((SYSCFG_TCMSRAMECC & SYSCFG_TCMSRAMECC_ECCSERRBITS4) >> 12U); - break; - case SYSCFG_BKPSRAM_ECC: - err_bits = (uint32_t)((SYSCFG_BKPSRAMECC & SYSCFG_BKPSRAMECC_ECCSERRBITS5) >> 16U); - break; - case SYSCFG_FLASH_ECC: - err_bits = (uint32_t)((SYSCFG_FLASHECC & SYSCFG_FLASHECC_ECCSERRBITS6) >> 2U); - break; - default: - /* should not jump to here */ - break; - } - - return err_bits; -} - -/*! - \brief get last address of ECC event - \param[in] ecc_type: ECC event type, refer to syscfg_ecc_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_SRAM0_ECC: SRAM0 ECC event - \arg SYSCFG_SRAM1_ECC: SRAM1 ECC event - \arg SYSCFG_SRAM2_ECC: SRAM2 ECC event - \arg SYSCFG_ADDSRAM_ECC: ADDSRAM ECC event - \arg SYSCFG_TCMSRAM_ECC: TCMSRAM ECC event - \arg SYSCFG_BKPSRAM_ECC: BKPSRAM ECC event - \arg SYSCFG_FLASH_ECC: FLASH ECC event - \param[out] none - \retval error address -*/ -uint32_t syscfg_ecc_address_get(syscfg_ecc_enum ecc_type) -{ - uint32_t err_addr = 0U; - - switch(ecc_type){ - case SYSCFG_SRAM0_ECC: - err_addr = (uint32_t)((SYSCFG_SRAM0ECC & SYSCFG_SRAM0ECC_ECCEADDR0) >> 16U); - break; - case SYSCFG_SRAM1_ECC: - err_addr = (uint32_t)((SYSCFG_SRAM1ECC & SYSCFG_SRAM1ECC_ECCEADDR1) >> 18U); - break; - case SYSCFG_SRAM2_ECC: - err_addr = (uint32_t)((SYSCFG_SRAM2ECC & SYSCFG_SRAM2ECC_ECCEADDR2) >> 16U); - break; - case SYSCFG_ADDSRAM_ECC: - err_addr = (uint32_t)((SYSCFG_ADDSRAMECC & SYSCFG_ADDSRAMECC_ECCEADDR3) >> 14U); - break; - case SYSCFG_TCMSRAM_ECC: - err_addr = (uint32_t)((SYSCFG_TCMSRAMECC & SYSCFG_TCMSRAMECC_ECCEADDR4) >> 18U); - break; - case SYSCFG_BKPSRAM_ECC: - err_addr = (uint32_t)((SYSCFG_BKPSRAMECC & SYSCFG_BKPSRAMECC_ECCEADDR5) >> 22U); - break; - case SYSCFG_FLASH_ECC: - err_addr = (uint32_t)(SYSCFG_FLASHECC_ADDR); - break; - default: - /* should not jump to here */ - break; - } - - return err_addr; -} - -/*! - \brief get SYSCFG flag state - \param[in] flag: SYSCFG flags, refer to syscfg_flag_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_FLAG_ECCME0: SRAM0 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE0: SRAM0 single bit correction event flag - \arg SYSCFG_FLAG_ECCME1: SRAM1 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE1: SRAM1 single bit correction event flag - \arg SYSCFG_FLAG_ECCME2: SRAM2 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE2: SRAM2 single bit correction event flag - \arg SYSCFG_FLAG_ECCME3: ADDSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE3: ADDSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME4: TCMSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE4: TCMSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME5: BKPSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE5: BKPSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME6: FLASH two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE6: FLASH single bit correction event flag - \arg SYSCFG_FLAG_CKMNMI: HXTAL clock moniotor NMI flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus syscfg_flag_get(syscfg_flag_enum flag) -{ - /* get flag and interrupt enable state */ - if(RESET != (SYSCFG_STAT & (uint32_t)flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear SYSCFG flag state - \param[in] flag: SYSCFG flags, refer to syscfg_flag_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_FLAG_ECCME0: SRAM0 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE0: SRAM0 single bit correction event flag - \arg SYSCFG_FLAG_ECCME1: SRAM1 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE1: SRAM1 single bit correction event flag - \arg SYSCFG_FLAG_ECCME2: SRAM2 two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE2: SRAM2 single bit correction event flag - \arg SYSCFG_FLAG_ECCME3: ADDSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE3: ADDSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME4: TCMSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE4: TCMSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME5: BKPSRAM two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE5: BKPSRAM single bit correction event flag - \arg SYSCFG_FLAG_ECCME6: FLASH two bits non-correction event flag - \arg SYSCFG_FLAG_ECCSE6: FLASH single bit correction event flag - \arg SYSCFG_FLAG_CKMNMI: HXTAL clock moniotor NMI flag - \param[out] none - \retval none -*/ -void syscfg_flag_clear(syscfg_flag_enum flag) -{ - SYSCFG_STAT = (uint32_t)flag; -} - -/*! - \brief enable SYSCFG interrupt - \param[in] interrupt: SYSCFG interrupt, refer to syscfg_interrupt_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_INT_ECCME0: SRAM0 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE0: SRAM0 single bit correction interrupt - \arg SYSCFG_INT_CKMNMI: HXTAL clock moniotor NMI interrupt - \arg SYSCFG_INT_ECCME1: SRAM1 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE1: SRAM1 single bit correction interrupt - \arg SYSCFG_INT_ECCME2: SRAM2 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE2: SRAM2 single bit correction interrupt - \arg SYSCFG_INT_ECCME3: ADDSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE3: ADDSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME4: TCMSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE4: TCMSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME5: BKPSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE5: BKPSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME6: FLASH two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE6: FLASH single bit correction interrupt - \param[out] none - \retval none -*/ -void syscfg_interrupt_enable(syscfg_interrupt_enum interrupt) -{ - SYSCFG_REG_VAL(interrupt) |= BIT(SYSCFG_BIT_POS(interrupt)); -} - -/*! - \brief disable SYSCFG interrupt - \param[in] interrupt: SYSCFG interrupt, refer to syscfg_interrupt_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_INT_ECCME0: SRAM0 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE0: SRAM0 single bit correction interrupt - \arg SYSCFG_INT_CKMNMI: HXTAL clock moniotor NMI interrupt - \arg SYSCFG_INT_ECCME1: SRAM1 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE1: SRAM1 single bit correction interrupt - \arg SYSCFG_INT_ECCME2: SRAM2 two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE2: SRAM2 single bit correction interrupt - \arg SYSCFG_INT_ECCME3: ADDSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE3: ADDSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME4: TCMSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE4: TCMSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME5: BKPSRAM two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE5: BKPSRAM single bit correction interrupt - \arg SYSCFG_INT_ECCME6: FLASH two bits non-correction interrupt - \arg SYSCFG_INT_ECCSE6: FLASH single bit correction interrupt - \param[out] none - \retval none -*/ -void syscfg_interrupt_disable(syscfg_interrupt_enum interrupt) -{ - SYSCFG_REG_VAL(interrupt) &= ~BIT(SYSCFG_BIT_POS(interrupt)); -} - -/*! - \brief get SYSCFG interrupt flag state - \param[in] flag: SYSCFG interrupt flags, refer to syscfg_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_INT_FLAG_ECCME0: SRAM0 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE0: SRAM0 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME1: SRAM1 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE1: SRAM1 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME2: SRAM2 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE2: SRAM2 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME3: ADDSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE3: ADDSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME4: TCMSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE4: TCMSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME5: BKPSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE5: BKPSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME6: FLASH two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE6: FLASH single bit correction event flag - \arg SYSCFG_INT_FLAG_CKMNMI: HXTAL clock moniotor NMI flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus syscfg_interrupt_flag_get(syscfg_interrupt_flag_enum flag) -{ - /* get flag and interrupt enable state */ - if(RESET != (SYSCFG_STAT & (uint32_t)flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear SYSCFG interrupt flag state - \param[in] flag: SYSCFG interrupt flags, refer to syscfg_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg SYSCFG_INT_FLAG_ECCME0: SRAM0 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE0: SRAM0 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME1: SRAM1 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE1: SRAM1 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME2: SRAM2 two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE2: SRAM2 single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME3: ADDSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE3: ADDSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME4: TCMSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE4: TCMSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME5: BKPSRAM two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE5: BKPSRAM single bit correction event flag - \arg SYSCFG_INT_FLAG_ECCME6: FLASH two bits non-correction event flag - \arg SYSCFG_INT_FLAG_ECCSE6: FLASH single bit correction event flag - \arg SYSCFG_INT_FLAG_CKMNMI: HXTAL clock moniotor NMI flag - \param[out] none - \retval none -*/ -void syscfg_interrupt_flag_clear(syscfg_interrupt_flag_enum flag) -{ - SYSCFG_STAT = (uint32_t)flag; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c deleted file mode 100644 index 9c212674abc..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c +++ /dev/null @@ -1,2282 +0,0 @@ -/*! - \file gd32f5xx_timer.c - \brief TIMER driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_timer.h" - -/*! - \brief deinit a TIMER - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_deinit(uint32_t timer_periph) -{ - switch(timer_periph) { - case TIMER0: - /* reset TIMER0 */ - rcu_periph_reset_enable(RCU_TIMER0RST); - rcu_periph_reset_disable(RCU_TIMER0RST); - break; - case TIMER1: - /* reset TIMER1 */ - rcu_periph_reset_enable(RCU_TIMER1RST); - rcu_periph_reset_disable(RCU_TIMER1RST); - break; - case TIMER2: - /* reset TIMER2 */ - rcu_periph_reset_enable(RCU_TIMER2RST); - rcu_periph_reset_disable(RCU_TIMER2RST); - break; - case TIMER3: - /* reset TIMER3 */ - rcu_periph_reset_enable(RCU_TIMER3RST); - rcu_periph_reset_disable(RCU_TIMER3RST); - break; - case TIMER4: - /* reset TIMER4 */ - rcu_periph_reset_enable(RCU_TIMER4RST); - rcu_periph_reset_disable(RCU_TIMER4RST); - break; - case TIMER5: - /* reset TIMER5 */ - rcu_periph_reset_enable(RCU_TIMER5RST); - rcu_periph_reset_disable(RCU_TIMER5RST); - break; - case TIMER6: - /* reset TIMER6 */ - rcu_periph_reset_enable(RCU_TIMER6RST); - rcu_periph_reset_disable(RCU_TIMER6RST); - break; - case TIMER7: - /* reset TIMER7 */ - rcu_periph_reset_enable(RCU_TIMER7RST); - rcu_periph_reset_disable(RCU_TIMER7RST); - break; - case TIMER8: - /* reset TIMER8 */ - rcu_periph_reset_enable(RCU_TIMER8RST); - rcu_periph_reset_disable(RCU_TIMER8RST); - break; - case TIMER9: - /* reset TIMER9 */ - rcu_periph_reset_enable(RCU_TIMER9RST); - rcu_periph_reset_disable(RCU_TIMER9RST); - break; - case TIMER10: - /* reset TIMER10 */ - rcu_periph_reset_enable(RCU_TIMER10RST); - rcu_periph_reset_disable(RCU_TIMER10RST); - break; - case TIMER11: - /* reset TIMER11 */ - rcu_periph_reset_enable(RCU_TIMER11RST); - rcu_periph_reset_disable(RCU_TIMER11RST); - break; - case TIMER12: - /* reset TIMER12 */ - rcu_periph_reset_enable(RCU_TIMER12RST); - rcu_periph_reset_disable(RCU_TIMER12RST); - break; - case TIMER13: - /* reset TIMER13 */ - rcu_periph_reset_enable(RCU_TIMER13RST); - rcu_periph_reset_disable(RCU_TIMER13RST); - break; - default: - break; - } -} - -/*! - \brief initialize TIMER init parameter struct with a default value - \param[in] initpara: init parameter struct - \param[out] none - \retval none -*/ -void timer_struct_para_init(timer_parameter_struct *initpara) -{ - /* initialize the init parameter struct member with the default value */ - initpara->prescaler = 0U; - initpara->alignedmode = TIMER_COUNTER_EDGE; - initpara->counterdirection = TIMER_COUNTER_UP; - initpara->period = 65535U; - initpara->clockdivision = TIMER_CKDIV_DIV1; - initpara->repetitioncounter = 0U; -} - -/*! - \brief initialize TIMER counter - \param[in] timer_periph: TIMERx(x=0..13) - \param[in] initpara: init parameter struct - prescaler: prescaler value of the counter clock,0~65535 - alignedmode: TIMER_COUNTER_EDGE,TIMER_COUNTER_CENTER_DOWN,TIMER_COUNTER_CENTER_UP,TIMER_COUNTER_CENTER_BOTH - counterdirection: TIMER_COUNTER_UP,TIMER_COUNTER_DOWN - period: counter auto reload value,(TIMER1,TIMER4,32 bit) - clockdivision: TIMER_CKDIV_DIV1,TIMER_CKDIV_DIV2,TIMER_CKDIV_DIV4 - repetitioncounter: counter repetition value,0~255 - \param[out] none - \retval none -*/ -void timer_init(uint32_t timer_periph, timer_parameter_struct *initpara) -{ - /* configure the counter prescaler value */ - TIMER_PSC(timer_periph) = (uint16_t)initpara->prescaler; - - /* configure the counter direction and aligned mode */ - if((TIMER0 == timer_periph) || (TIMER1 == timer_periph) || (TIMER2 == timer_periph) - || (TIMER3 == timer_periph) || (TIMER4 == timer_periph) || (TIMER7 == timer_periph)) { - TIMER_CTL0(timer_periph) &= ~(uint32_t)(TIMER_CTL0_DIR | TIMER_CTL0_CAM); - TIMER_CTL0(timer_periph) |= (uint32_t)initpara->alignedmode; - TIMER_CTL0(timer_periph) |= (uint32_t)initpara->counterdirection; - } - - /* configure the autoreload value */ - TIMER_CAR(timer_periph) = (uint32_t)initpara->period; - - if((TIMER5 != timer_periph) && (TIMER6 != timer_periph)) { - /* reset the CKDIV bit */ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CKDIV; - TIMER_CTL0(timer_periph) |= (uint32_t)initpara->clockdivision; - } - - if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { - /* configure the repetition counter value */ - TIMER_CREP(timer_periph) = (uint32_t)initpara->repetitioncounter; - } - - /* generate an update event */ - TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; -} - -/*! - \brief enable a TIMER - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_enable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_CEN; -} - -/*! - \brief disable a TIMER - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_disable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CEN; -} - -/*! - \brief enable the auto reload shadow function - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_auto_reload_shadow_enable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_ARSE; -} - -/*! - \brief disable the auto reload shadow function - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_auto_reload_shadow_disable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_ARSE; -} - -/*! - \brief enable the update event - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_update_event_enable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPDIS; -} - -/*! - \brief disable the update event - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval none -*/ -void timer_update_event_disable(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) |= (uint32_t) TIMER_CTL0_UPDIS; -} - -/*! - \brief set TIMER counter alignment mode - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] aligned: - only one parameter can be selected which is shown as below: - \arg TIMER_COUNTER_EDGE: edge-aligned mode - \arg TIMER_COUNTER_CENTER_DOWN: center-aligned and counting down assert mode - \arg TIMER_COUNTER_CENTER_UP: center-aligned and counting up assert mode - \arg TIMER_COUNTER_CENTER_BOTH: center-aligned and counting up/down assert mode - \param[out] none - \retval none -*/ -void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned) -{ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CAM; - TIMER_CTL0(timer_periph) |= (uint32_t)aligned; -} - -/*! - \brief set TIMER counter up direction - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[out] none - \retval none -*/ -void timer_counter_up_direction(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_DIR; -} - -/*! - \brief set TIMER counter down direction - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[out] none - \retval none -*/ -void timer_counter_down_direction(uint32_t timer_periph) -{ - TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_DIR; -} - -/*! - \brief configure TIMER prescaler - \param[in] timer_periph: TIMERx(x=0..13) - \param[in] prescaler: prescaler value,0~65535 - \param[in] pscreload: prescaler reload mode - only one parameter can be selected which is shown as below: - \arg TIMER_PSC_RELOAD_NOW: the prescaler is loaded right now - \arg TIMER_PSC_RELOAD_UPDATE: the prescaler is loaded at the next update event - \param[out] none - \retval none -*/ -void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload) -{ - TIMER_PSC(timer_periph) = (uint32_t)prescaler; - - if(TIMER_PSC_RELOAD_NOW == pscreload) { - TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; - } -} - -/*! - \brief configure TIMER repetition register value - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] repetition: the counter repetition value,0~255 - \param[out] none - \retval none -*/ -void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition) -{ - TIMER_CREP(timer_periph) = (uint32_t)repetition; -} - -/*! - \brief configure TIMER autoreload register value - \param[in] timer_periph: TIMERx(x=0..13) - \param[in] autoreload: the counter auto-reload value - \param[out] none - \retval none -*/ -void timer_autoreload_value_config(uint32_t timer_periph, uint32_t autoreload) -{ - TIMER_CAR(timer_periph) = (uint32_t)autoreload; -} - -/*! - \brief configure TIMER counter register value - \param[in] timer_periph: TIMERx(x=0..13) - \param[in] counter: the counter value,0~65535 - \param[out] none - \retval none -*/ -void timer_counter_value_config(uint32_t timer_periph, uint32_t counter) -{ - TIMER_CNT(timer_periph) = (uint32_t)counter; -} - -/*! - \brief read TIMER counter value - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval counter value -*/ -uint32_t timer_counter_read(uint32_t timer_periph) -{ - uint32_t count_value = 0U; - count_value = TIMER_CNT(timer_periph); - return (count_value); -} - -/*! - \brief read TIMER prescaler value - \param[in] timer_periph: TIMERx(x=0..13) - \param[out] none - \retval prescaler register value -*/ -uint16_t timer_prescaler_read(uint32_t timer_periph) -{ - uint16_t prescaler_value = 0U; - prescaler_value = (uint16_t)(TIMER_PSC(timer_periph)); - return (prescaler_value); -} - -/*! - \brief configure TIMER single pulse mode - \param[in] timer_periph: TIMERx(x=0..8,11) - \param[in] spmode: - only one parameter can be selected which is shown as below: - \arg TIMER_SP_MODE_SINGLE: single pulse mode - \arg TIMER_SP_MODE_REPETITIVE: repetitive pulse mode - \param[out] none - \retval none -*/ -void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode) -{ - if(TIMER_SP_MODE_SINGLE == spmode) { - TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_SPM; - } else if(TIMER_SP_MODE_REPETITIVE == spmode) { - TIMER_CTL0(timer_periph) &= ~((uint32_t)TIMER_CTL0_SPM); - } else { - /* illegal parameters */ - } -} - -/*! - \brief configure TIMER update source - \param[in] timer_periph: TIMERx(x=0..13) - \param[in] update: - only one parameter can be selected which is shown as below: - \arg TIMER_UPDATE_SRC_GLOBAL: update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger - \arg TIMER_UPDATE_SRC_REGULAR: update generate only by counter overflow/underflow - \param[out] none - \retval none -*/ -void timer_update_source_config(uint32_t timer_periph, uint32_t update) -{ - if(TIMER_UPDATE_SRC_REGULAR == update) { - TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_UPS; - } else if(TIMER_UPDATE_SRC_GLOBAL == update) { - TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPS; - } else { - /* illegal parameters */ - } -} - -/*! - \brief enable the TIMER DMA - \param[in] timer_periph: please refer to the following parameters - \param[in] dma: specify which DMA to enable - one or more parameters can be selected which is shown as below: - \arg TIMER_DMA_UPD: update DMA,TIMERx(x=0..7) - \arg TIMER_DMA_CH0D: channel 0 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH1D: channel 1 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH2D: channel 2 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH3D: channel 3 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CMTD: commutation DMA request,TIMERx(x=0,7) - \arg TIMER_DMA_TRGD: trigger DMA request,TIMERx(x=0..4,7) - \param[out] none - \retval none -*/ -void timer_dma_enable(uint32_t timer_periph, uint16_t dma) -{ - TIMER_DMAINTEN(timer_periph) |= (uint32_t) dma; -} - -/*! - \brief disable the TIMER DMA - \param[in] timer_periph: please refer to the following parameters - \param[in] dma: specify which DMA to disable - one or more parameters can be selected which are shown as below: - \arg TIMER_DMA_UPD: update DMA,TIMERx(x=0..7) - \arg TIMER_DMA_CH0D: channel 0 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH1D: channel 1 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH2D: channel 2 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CH3D: channel 3 DMA request,TIMERx(x=0..4,7) - \arg TIMER_DMA_CMTD: commutation DMA request ,TIMERx(x=0,7) - \arg TIMER_DMA_TRGD: trigger DMA request,TIMERx(x=0..4,7) - \param[out] none - \retval none -*/ -void timer_dma_disable(uint32_t timer_periph, uint16_t dma) -{ - TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)(dma)); -} - -/*! - \brief channel DMA request source selection - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] dma_request: channel DMA request source selection - only one parameter can be selected which is shown as below: - \arg TIMER_DMAREQUEST_CHANNELEVENT: DMA request of channel y is sent when channel y event occurs - \arg TIMER_DMAREQUEST_UPDATEEVENT: DMA request of channel y is sent when update event occurs - \param[out] none - \retval none -*/ -void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request) -{ - if(TIMER_DMAREQUEST_UPDATEEVENT == dma_request) { - TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_DMAS; - } else if(TIMER_DMAREQUEST_CHANNELEVENT == dma_request) { - TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_DMAS; - } else { - /* illegal parameters */ - } -} - -/*! - \brief configure the TIMER DMA transfer - \param[in] timer_periph: please refer to the following parameters - \param[in] dma_baseaddr: - only one parameter can be selected which is shown as below: - \arg TIMER_DMACFG_DMATA_CTL0: DMA transfer address is TIMER_CTL0,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CTL1: DMA transfer address is TIMER_CTL1,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_SMCFG: DMA transfer address is TIMER_SMCFG,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_DMAINTEN: DMA transfer address is TIMER_DMAINTEN,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_INTF: DMA transfer address is TIMER_INTF,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_SWEVG: DMA transfer address is TIMER_SWEVG,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CHCTL0: DMA transfer address is TIMER_CHCTL0,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CHCTL1: DMA transfer address is TIMER_CHCTL1,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CHCTL2: DMA transfer address is TIMER_CHCTL2,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CNT: DMA transfer address is TIMER_CNT,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_PSC: DMA transfer address is TIMER_PSC,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CAR: DMA transfer address is TIMER_CAR,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CREP: DMA transfer address is TIMER_CREP,TIMERx(x=0,7) - \arg TIMER_DMACFG_DMATA_CH0CV: DMA transfer address is TIMER_CH0CV,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CH1CV: DMA transfer address is TIMER_CH1CV,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CH2CV: DMA transfer address is TIMER_CH2CV,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CH3CV: DMA transfer address is TIMER_CH3CV,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_CCHP: DMA transfer address is TIMER_CCHP,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_DMACFG: DMA transfer address is TIMER_DMACFG,TIMERx(x=0..4,7) - \arg TIMER_DMACFG_DMATA_DMATB: DMA transfer address is TIMER_DMATB,TIMERx(x=0..4,7) - \param[in] dma_lenth: - only one parameter can be selected which is shown as below: - \arg TIMER_DMACFG_DMATC_xTRANSFER(x=1..18): DMA transfer x time - \param[out] none - \retval none -*/ -void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth) -{ - TIMER_DMACFG(timer_periph) &= (~(uint32_t)(TIMER_DMACFG_DMATA | TIMER_DMACFG_DMATC)); - TIMER_DMACFG(timer_periph) |= (uint32_t)(dma_baseaddr | dma_lenth); -} - -/*! - \brief software generate events - \param[in] timer_periph: please refer to the following parameters - \param[in] event: the timer software event generation sources - one or more parameters can be selected which are shown as below: - \arg TIMER_EVENT_SRC_UPG: update event,TIMERx(x=0..13) - \arg TIMER_EVENT_SRC_CH0G: channel 0 capture or compare event generation,TIMERx(x=0..4,7..13) - \arg TIMER_EVENT_SRC_CH1G: channel 1 capture or compare event generation,TIMERx(x=0..4,7,8,11) - \arg TIMER_EVENT_SRC_CH2G: channel 2 capture or compare event generation,TIMERx(x=0..4,7) - \arg TIMER_EVENT_SRC_CH3G: channel 3 capture or compare event generation,TIMERx(x=0..4,7) - \arg TIMER_EVENT_SRC_CMTG: channel commutation event generation,TIMERx(x=0,7) - \arg TIMER_EVENT_SRC_TRGG: trigger event generation,TIMERx(x=0..4,7,8,11) - \arg TIMER_EVENT_SRC_BRKG: break event generation,TIMERx(x=0,7) - \arg TIMER_EVENT_SRC_CH0COMADDG: Channel 0 additional compare event generation, TIMERx(x=0,7) - \arg TIMER_EVENT_SRC_CH1COMADDG: Channel 1 additional compare event generation, TIMERx(x=0,7) - \arg TIMER_EVENT_SRC_CH2COMADDG: Channel 2 additional compare event generation, TIMERx(x=0,7) - \arg TIMER_EVENT_SRC_CH3COMADDG: Channel 3 additional compare event generation, TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_event_software_generate(uint32_t timer_periph, uint16_t event) -{ - TIMER_SWEVG(timer_periph) |= (uint32_t)event; -} - -/*! - \brief initialize TIMER break parameter struct - \param[in] breakpara: TIMER break parameter struct - \param[out] none - \retval none -*/ -void timer_break_struct_para_init(timer_break_parameter_struct *breakpara) -{ - /* initialize the break parameter struct member with the default value */ - breakpara->runoffstate = TIMER_ROS_STATE_DISABLE; - breakpara->ideloffstate = TIMER_IOS_STATE_DISABLE; - breakpara->deadtime = 0U; - breakpara->breakpolarity = TIMER_BREAK_POLARITY_LOW; - breakpara->outputautostate = TIMER_OUTAUTO_DISABLE; - breakpara->protectmode = TIMER_CCHP_PROT_OFF; - breakpara->breakstate = TIMER_BREAK_DISABLE; -} - -/*! - \brief configure TIMER break function - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] breakpara: TIMER break parameter struct - runoffstate: TIMER_ROS_STATE_ENABLE,TIMER_ROS_STATE_DISABLE - ideloffstate: TIMER_IOS_STATE_ENABLE,TIMER_IOS_STATE_DISABLE - deadtime: 0~255 - breakpolarity: TIMER_BREAK_POLARITY_LOW,TIMER_BREAK_POLARITY_HIGH - outputautostate: TIMER_OUTAUTO_ENABLE,TIMER_OUTAUTO_DISABLE - protectmode: TIMER_CCHP_PROT_OFF,TIMER_CCHP_PROT_0,TIMER_CCHP_PROT_1,TIMER_CCHP_PROT_2 - breakstate: TIMER_BREAK_ENABLE,TIMER_BREAK_DISABLE - \param[out] none - \retval none -*/ -void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct *breakpara) -{ - TIMER_CCHP(timer_periph) = (uint32_t)(((uint32_t)(breakpara->runoffstate)) | - ((uint32_t)(breakpara->ideloffstate)) | - ((uint32_t)(breakpara->deadtime)) | - ((uint32_t)(breakpara->breakpolarity)) | - ((uint32_t)(breakpara->outputautostate)) | - ((uint32_t)(breakpara->protectmode)) | - ((uint32_t)(breakpara->breakstate))) ; -} - -/*! - \brief enable TIMER break function - \param[in] timer_periph: TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_break_enable(uint32_t timer_periph) -{ - TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_BRKEN; -} - -/*! - \brief disable TIMER break function - \param[in] timer_periph: TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_break_disable(uint32_t timer_periph) -{ - TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_BRKEN; -} - -/*! - \brief enable TIMER output automatic function - \param[in] timer_periph: TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_automatic_output_enable(uint32_t timer_periph) -{ - TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_OAEN; -} - -/*! - \brief disable TIMER output automatic function - \param[in] timer_periph: TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_automatic_output_disable(uint32_t timer_periph) -{ - TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_OAEN; -} - -/*! - \brief configure TIMER primary output function - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_POEN; - } else { - TIMER_CCHP(timer_periph) &= (~(uint32_t)TIMER_CCHP_POEN); - } -} - -/*! - \brief enable or disable channel capture/compare control shadow register - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] newvalue: ENABLE or DISABLE - \param[out] none - \retval none -*/ -void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue) -{ - if(ENABLE == newvalue) { - TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCSE; - } else { - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCSE); - } -} - -/*! - \brief configure TIMER channel control shadow register update control - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] ccuctl: channel control shadow register update control - only one parameter can be selected which is shown as below: - \arg TIMER_UPDATECTL_CCU: the shadow registers update by when CMTG bit is set - \arg TIMER_UPDATECTL_CCUTRI: the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs - \param[out] none - \retval none -*/ -void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl) -{ - if(TIMER_UPDATECTL_CCU == ccuctl) { - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCUC); - } else if(TIMER_UPDATECTL_CCUTRI == ccuctl) { - TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCUC; - } else { - /* illegal parameters */ - } -} - -/*! - \brief initialize TIMER channel output parameter struct with a default value - \param[in] ocpara: TIMER channel n output parameter struct - \param[out] none - \retval none -*/ -void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara) -{ - /* initialize the channel output parameter struct member with the default value */ - ocpara->outputstate = (uint16_t)TIMER_CCX_DISABLE; - ocpara->outputnstate = TIMER_CCXN_DISABLE; - ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH; - ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH; - ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW; - ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; -} - -/*! - \brief configure TIMER channel output function - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4,7)) - \param[in] ocpara: TIMER channeln output parameter struct - outputstate: TIMER_CCX_ENABLE,TIMER_CCX_DISABLE - outputnstate: TIMER_CCXN_ENABLE,TIMER_CCXN_DISABLE - ocpolarity: TIMER_OC_POLARITY_HIGH,TIMER_OC_POLARITY_LOW - ocnpolarity: TIMER_OCN_POLARITY_HIGH,TIMER_OCN_POLARITY_LOW - ocidlestate: TIMER_OC_IDLE_STATE_LOW,TIMER_OC_IDLE_STATE_HIGH - ocnidlestate: TIMER_OCN_IDLE_STATE_LOW,TIMER_OCN_IDLE_STATE_HIGH - \param[out] none - \retval none -*/ -void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, - timer_oc_parameter_struct *ocpara) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - /* reset the CH0EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH0MS; - /* set the CH0EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputstate; - /* reset the CH0P bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); - /* set the CH0P bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocpolarity; - - if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { - /* reset the CH0NEN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); - /* set the CH0NEN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputnstate; - /* reset the CH0NP bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); - /* set the CH0NP bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocnpolarity; - /* reset the ISO0 bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0); - /* set the ISO0 bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocidlestate; - /* reset the ISO0N bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0N); - /* set the ISO0N bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocnidlestate; - } - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - /* reset the CH1EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH1MS; - /* set the CH1EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 4U); - /* reset the CH1P bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); - /* set the CH1P bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 4U); - - if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { - /* reset the CH1NEN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); - /* set the CH1NEN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 4U); - /* reset the CH1NP bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); - /* set the CH1NP bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 4U); - /* reset the ISO1 bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1); - /* set the ISO1 bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 2U); - /* reset the ISO1N bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1N); - /* set the ISO1N bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 2U); - } - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - /* reset the CH2EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); - TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH2MS; - /* set the CH2EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 8U); - /* reset the CH2P bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); - /* set the CH2P bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 8U); - - if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { - /* reset the CH2NEN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); - /* set the CH2NEN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 8U); - /* reset the CH2NP bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); - /* set the CH2NP bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 8U); - /* reset the ISO2 bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2); - /* set the ISO2 bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 4U); - /* reset the ISO2N bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2N); - /* set the ISO2N bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 4U); - } - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - /* reset the CH3EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); - TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH3MS; - /* set the CH3EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 12U); - /* reset the CH3P bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); - /* set the CH3P bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 12U); - - if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)) { - /* reset the CH3NEN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NEN); - /* set the CH3NEN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 12U); - /* reset the CH3NP bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NP); - /* set the CH3NP bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 12U); - /* reset the ISO3 bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3); - /* set the ISO3 bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 6U); - /* reset the ISO3N bit */ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3N); - /* set the ISO3N bit */ - TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 6U); - } - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output compare mode - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] ocmode: channel output compare mode - only one parameter can be selected which is shown as below: - \arg TIMER_OC_MODE_TIMING: timing mode - \arg TIMER_OC_MODE_ACTIVE: active mode - \arg TIMER_OC_MODE_INACTIVE: inactive mode - \arg TIMER_OC_MODE_TOGGLE: toggle mode - \arg TIMER_OC_MODE_LOW: force low mode - \arg TIMER_OC_MODE_HIGH: force high mode - \arg TIMER_OC_MODE_PWM0: PWM0 mode - \arg TIMER_OC_MODE_PWM1: PWM1 mode - \param[out] none - \retval none -*/ -void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCTL); - TIMER_CHCTL0(timer_periph) |= (uint32_t)ocmode; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCTL); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCTL); - TIMER_CHCTL1(timer_periph) |= (uint32_t)ocmode; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCTL); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output pulse value - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] pulse: channel output pulse value,0~65535 - \param[out] none - \retval none -*/ -void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, - uint32_t pulse) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CH0CV(timer_periph) = (uint32_t)pulse; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CH1CV(timer_periph) = (uint32_t)pulse; - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CH2CV(timer_periph) = (uint32_t)pulse; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CH3CV(timer_periph) = (uint32_t)pulse; - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output shadow function - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] ocshadow: channel output shadow state - only one parameter can be selected which is shown as below: - \arg TIMER_OC_SHADOW_ENABLE: channel output shadow state enable - \arg TIMER_OC_SHADOW_DISABLE: channel output shadow state disable - \param[out] none - \retval none -*/ -void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMSEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)ocshadow; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMSEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMSEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)ocshadow; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMSEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output fast function - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] ocfast: channel output fast function - only one parameter can be selected which is shown as below: - \arg TIMER_OC_FAST_ENABLE: channel output fast function enable - \arg TIMER_OC_FAST_DISABLE: channel output fast function disable - \param[out] none - \retval none -*/ -void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMFEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)ocfast; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMFEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMFEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)ocfast; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMFEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output clear function - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] occlear: channel output clear function - only one parameter can be selected which is shown as below: - \arg TIMER_OC_CLEAR_ENABLE: channel output clear function enable - \arg TIMER_OC_CLEAR_DISABLE: channel output clear function disable - \param[out] none - \retval none -*/ -void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)occlear; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCEN); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)occlear; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCEN); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel output polarity - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] ocpolarity: channel output polarity - only one parameter can be selected which is shown as below: - \arg TIMER_OC_POLARITY_HIGH: channel output polarity is high - \arg TIMER_OC_POLARITY_LOW: channel output polarity is low - \param[out] none - \retval none -*/ -void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocpolarity) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpolarity; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 4U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 8U); - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 12U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel complementary output polarity - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0,7)) - \param[in] ocnpolarity: channel complementary output polarity - only one parameter can be selected which is shown as below: - \arg TIMER_OCN_POLARITY_HIGH: channel complementary output polarity is high - \arg TIMER_OCN_POLARITY_LOW: channel complementary output polarity is low - \param[out] none - \retval none -*/ -void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocnpolarity) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnpolarity; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 4U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 8U); - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NP); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 12U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel enable state - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] state: TIMER channel enable state - only one parameter can be selected which is shown as below: - \arg TIMER_CCX_ENABLE: channel enable - \arg TIMER_CCX_DISABLE: channel disable - \param[out] none - \retval none -*/ -void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)state; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 4U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 8U); - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 12U); - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel complementary output enable state - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0 - \arg TIMER_CH_1: TIMER channel1 - \arg TIMER_CH_2: TIMER channel2 - \arg TIMER_CH_3: TIMER channel3 - \param[in] ocnstate: TIMER channel complementary output enable state - only one parameter can be selected which is shown as below: - \arg TIMER_CCXN_ENABLE: channel complementary enable - \arg TIMER_CCXN_DISABLE: channel complementary disable - \param[out] none - \retval none -*/ -void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocnstate) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnstate; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 4U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 8U); - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3NEN); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 12U); - break; - default: - break; - } -} - -/*! - \brief initialize TIMER channel input parameter struct - \param[in] icpara: TIMER channel intput parameter struct - \param[out] none - \retval none -*/ -void timer_channel_input_struct_para_init(timer_ic_parameter_struct *icpara) -{ - /* initialize the channel input parameter struct member with the default value */ - icpara->icpolarity = TIMER_IC_POLARITY_RISING; - icpara->icselection = TIMER_IC_SELECTION_DIRECTTI; - icpara->icprescaler = TIMER_IC_PSC_DIV1; - icpara->icfilter = 0U; -} - -/*! - \brief configure TIMER input capture parameter - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] icpara: TIMER channel intput parameter struct - icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING,TIMER_IC_POLARITY_BOTH_EDGE - icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI,TIMER_IC_SELECTION_ITS - icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 - icfilter: 0~15 - \param[out] none - \retval none -*/ -void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, - timer_ic_parameter_struct *icpara) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - /* reset the CH0EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - - /* reset the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); - TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpara->icpolarity); - /* reset the CH0MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); - TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpara->icselection); - /* reset the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); - - /* set the CH0EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; - break; - - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - /* reset the CH1EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - - /* reset the CH1P and CH1NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 4U); - /* reset the CH1MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); - /* reset the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); - - /* set the CH1EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - /* reset the CH2EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); - - /* reset the CH2P and CH2NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH2P | TIMER_CHCTL2_CH2NP)); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 8U); - - /* reset the CH2MS bit */ - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2MS); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection)); - - /* reset the CH2CAPFLT bit */ - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPFLT); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); - - /* set the CH2EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH2EN; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - /* reset the CH3EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); - - /* reset the CH3P bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH3P)); - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 12U); - - /* reset the CH3MS bit */ - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3MS); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); - - /* reset the CH3CAPFLT bit */ - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPFLT); - TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); - - /* set the CH3EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH3EN; - break; - default: - break; - } - /* configure TIMER channel input capture prescaler value */ - timer_channel_input_capture_prescaler_config(timer_periph, channel, - (uint16_t)(icpara->icprescaler)); -} - -/*! - \brief configure TIMER channel input capture prescaler value - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[in] prescaler: channel input capture prescaler value - only one parameter can be selected which is shown as below: - \arg TIMER_IC_PSC_DIV1: no prescaler - \arg TIMER_IC_PSC_DIV2: divided by 2 - \arg TIMER_IC_PSC_DIV4: divided by 4 - \arg TIMER_IC_PSC_DIV8: divided by 8 - \param[out] none - \retval none -*/ -void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, - uint16_t prescaler) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPPSC); - TIMER_CHCTL0(timer_periph) |= (uint32_t)prescaler; - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPPSC); - TIMER_CHCTL0(timer_periph) |= ((uint32_t)prescaler << 8U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPPSC); - TIMER_CHCTL1(timer_periph) |= (uint32_t)prescaler; - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPPSC); - TIMER_CHCTL1(timer_periph) |= ((uint32_t)prescaler << 8U); - break; - default: - break; - } -} - -/*! - \brief read TIMER channel capture compare register value - \param[in] timer_periph: please refer to the following parameters - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) - \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) - \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) - \param[out] none - \retval channel capture compare register value -*/ -uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel) -{ - uint32_t count_value = 0U; - - switch(channel) { - /* read TIMER channel 0 capture compare register value */ - case TIMER_CH_0: - count_value = TIMER_CH0CV(timer_periph); - break; - /* read TIMER channel 1 capture compare register value */ - case TIMER_CH_1: - count_value = TIMER_CH1CV(timer_periph); - break; - /* read TIMER channel 2 capture compare register value */ - case TIMER_CH_2: - count_value = TIMER_CH2CV(timer_periph); - break; - /* read TIMER channel 3 capture compare register value */ - case TIMER_CH_3: - count_value = TIMER_CH3CV(timer_periph); - break; - default: - break; - } - return (count_value); -} - -/*! - \brief configure TIMER input pwm capture function - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel0 - \arg TIMER_CH_1: TIMER channel1 - \param[in] icpwm:TIMER channel intput pwm parameter struct - icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING - icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI - icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 - icfilter: 0~15 - \param[out] none - \retval none -*/ -void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, - timer_ic_parameter_struct *icpwm) -{ - uint16_t icpolarity = 0x0U; - uint16_t icselection = 0x0U; - - /* Set channel input polarity */ - if(TIMER_IC_POLARITY_RISING == icpwm->icpolarity) { - icpolarity = TIMER_IC_POLARITY_FALLING; - } else { - icpolarity = TIMER_IC_POLARITY_RISING; - } - - /* Set channel input mode selection */ - if(TIMER_IC_SELECTION_DIRECTTI == icpwm->icselection) { - icselection = TIMER_IC_SELECTION_INDIRECTTI; - } else { - icselection = TIMER_IC_SELECTION_DIRECTTI; - } - - if(TIMER_CH_0 == channel) { - /* reset the CH0EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - /* reset the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); - /* set the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpwm->icpolarity); - /* reset the CH0MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); - /* set the CH0MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpwm->icselection); - /* reset the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); - /* set the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); - /* set the CH0EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; - /* configure TIMER channel input capture prescaler value */ - timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, - (uint16_t)(icpwm->icprescaler)); - - /* reset the CH1EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - /* reset the CH1P and CH1NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); - /* set the CH1P and CH1NP bits */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)icpolarity << 4U); - /* reset the CH1MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); - /* set the CH1MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)icselection << 8U); - /* reset the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); - /* set the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); - /* set the CH1EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; - /* configure TIMER channel input capture prescaler value */ - timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, - (uint16_t)(icpwm->icprescaler)); - } else { - /* reset the CH1EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - /* reset the CH1P and CH1NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); - /* set the CH1P and CH1NP bits */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icpolarity) << 4U); - /* reset the CH1MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); - /* set the CH1MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icselection) << 8U); - /* reset the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); - /* set the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); - /* set the CH1EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; - /* configure TIMER channel input capture prescaler value */ - timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, - (uint16_t)(icpwm->icprescaler)); - - /* reset the CH0EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - /* reset the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); - /* set the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)icpolarity; - /* reset the CH0MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); - /* set the CH0MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)icselection; - /* reset the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); - /* set the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); - /* set the CH0EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; - /* configure TIMER channel input capture prescaler value */ - timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, - (uint16_t)(icpwm->icprescaler)); - } -} - -/*! - \brief configure TIMER hall sensor mode - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] hallmode: - only one parameter can be selected which is shown as below: - \arg TIMER_HALLINTERFACE_ENABLE: TIMER hall sensor mode enable - \arg TIMER_HALLINTERFACE_DISABLE: TIMER hall sensor mode disable - \param[out] none - \retval none -*/ -void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode) -{ - if(TIMER_HALLINTERFACE_ENABLE == hallmode) { - TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_TI0S; - } else if(TIMER_HALLINTERFACE_DISABLE == hallmode) { - TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_TI0S; - } else { - /* illegal parameters */ - } -} - -/*! - \brief select TIMER input trigger source - \param[in] timer_periph: please refer to the following parameters - \param[in] intrigger: - only one parameter can be selected which is shown as below: - \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SMCFG_TRGSEL_ETIFP: external trigger(TIMERx(x=0..4,7,8,11)) - \param[out] none - \retval none -*/ -void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger) -{ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_TRGS); - TIMER_SMCFG(timer_periph) |= (uint32_t)intrigger; -} - -/*! - \brief select TIMER master mode output trigger source - \param[in] timer_periph: TIMERx(x=0..7) - \param[in] outrigger: - only one parameter can be selected which is shown as below: - \arg TIMER_TRI_OUT_SRC_RESET: the UPG bit as trigger output(TIMERx(x=0..7,9,10,12,13)) - \arg TIMER_TRI_OUT_SRC_ENABLE: the counter enable signal TIMER_CTL0_CEN as trigger output(TIMERx(x=0..7,9,10,12,13)) - \arg TIMER_TRI_OUT_SRC_UPDATE: update event as trigger output(TIMERx(x=0..7,9,10,12,13)) - \arg TIMER_TRI_OUT_SRC_CH0: a capture or a compare match occurred in channal0 as trigger output TRGO(TIMERx(x=0..4,7,9,10,12,13)) - \arg TIMER_TRI_OUT_SRC_O0CPRE: O0CPRE as trigger output(TIMERx(x=0..4,7,9,10,12,13)) - \arg TIMER_TRI_OUT_SRC_O1CPRE: O1CPRE as trigger output(TIMERx(x=0..4,7)) - \arg TIMER_TRI_OUT_SRC_O2CPRE: O2CPRE as trigger output(TIMERx(x=0..4,7)) - \arg TIMER_TRI_OUT_SRC_O3CPRE: O3CPRE as trigger output(TIMERx(x=0..4,7)) - \param[out] none - \retval none -*/ -void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger) -{ - TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_MMC); - TIMER_CTL1(timer_periph) |= (uint32_t)outrigger; -} - -/*! - \brief select TIMER slave mode - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] slavemode: - only one parameter can be selected which is shown as below: - \arg TIMER_SLAVE_MODE_DISABLE: slave mode disable(TIMERx(x=0..4,7,8,11)) - \arg TIMER_ENCODER_MODE0: encoder mode 0(TIMERx(x=0..4,7)) - \arg TIMER_ENCODER_MODE1: encoder mode 1(TIMERx(x=0..4,7)) - \arg TIMER_ENCODER_MODE2: encoder mode 2(TIMERx(x=0..4,7)) - \arg TIMER_SLAVE_MODE_RESTART: restart mode(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SLAVE_MODE_PAUSE: pause mode(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SLAVE_MODE_EVENT: event mode(TIMERx(x=0..4,7,8,11)) - \arg TIMER_SLAVE_MODE_EXTERNAL0: external clock mode 0.(TIMERx(x=0..4,7,8,11)) - \param[out] none - \retval none -*/ - -void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode) -{ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); - - TIMER_SMCFG(timer_periph) |= (uint32_t)slavemode; -} - -/*! - \brief configure TIMER master slave mode - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] masterslave: - only one parameter can be selected which is shown as below: - \arg TIMER_MASTER_SLAVE_MODE_ENABLE: master slave mode enable - \arg TIMER_MASTER_SLAVE_MODE_DISABLE: master slave mode disable - \param[out] none - \retval none -*/ -void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave) -{ - if(TIMER_MASTER_SLAVE_MODE_ENABLE == masterslave) { - TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_MSM; - } else if(TIMER_MASTER_SLAVE_MODE_DISABLE == masterslave) { - TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_MSM; - } else { - /* illegal parameters */ - } -} - -/*! - \brief configure TIMER external trigger input - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] extprescaler: - only one parameter can be selected which is shown as below: - \arg TIMER_EXT_TRI_PSC_OFF: no divided - \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 - \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 - \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 - \param[in] extpolarity: - only one parameter can be selected which is shown as below: - \arg TIMER_ETP_FALLING: active low or falling edge active - \arg TIMER_ETP_RISING: active high or rising edge active - \param[in] extfilter: a value between 0 and 15 - \param[out] none - \retval none -*/ -void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter) -{ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_ETP | TIMER_SMCFG_ETPSC | TIMER_SMCFG_ETFC)); - TIMER_SMCFG(timer_periph) |= (uint32_t)(extprescaler | extpolarity); - TIMER_SMCFG(timer_periph) |= (uint32_t)(extfilter << 8U); -} - -/*! - \brief configure TIMER quadrature decoder mode - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] decomode: - only one parameter can be selected which is shown as below: - \arg TIMER_ENCODER_MODE0: counter counts on CI0FE0 edge depending on CI1FE1 level - \arg TIMER_ENCODER_MODE1: counter counts on CI1FE1 edge depending on CI0FE0 level - \arg TIMER_ENCODER_MODE2: counter counts on both CI0FE0 and CI1FE1 edges depending on the level of the other input - \param[in] ic0polarity: - only one parameter can be selected which is shown as below: - \arg TIMER_IC_POLARITY_RISING: capture rising edge - \arg TIMER_IC_POLARITY_FALLING: capture falling edge - \param[in] ic1polarity: - only one parameter can be selected which is shown as below: - \arg TIMER_IC_POLARITY_RISING: capture rising edge - \arg TIMER_IC_POLARITY_FALLING: capture falling edge - \param[out] none - \retval none -*/ -void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, - uint16_t ic0polarity, uint16_t ic1polarity) -{ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); - TIMER_SMCFG(timer_periph) |= (uint32_t)decomode; - - TIMER_CHCTL0(timer_periph) &= (uint32_t)(((~(uint32_t)TIMER_CHCTL0_CH0MS)) & ((~ - (uint32_t)TIMER_CHCTL0_CH1MS))); - TIMER_CHCTL0(timer_periph) |= (uint32_t)(TIMER_IC_SELECTION_DIRECTTI | (( - uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U)); - - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); - TIMER_CHCTL2(timer_periph) |= ((uint32_t)ic0polarity | ((uint32_t)ic1polarity << 4U)); -} - -/*! - \brief configure TIMER internal clock mode - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[out] none - \retval none -*/ -void timer_internal_clock_config(uint32_t timer_periph) -{ - TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; -} - -/*! - \brief configure TIMER the internal trigger as external clock input - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] intrigger: - only one parameter can be selected which is shown as below: - \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0 - \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1 - \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2 - \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3 - \param[out] none - \retval none -*/ -void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger) -{ - timer_input_trigger_source_select(timer_periph, intrigger); - TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; - TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; -} - -/*! - \brief configure TIMER the external trigger as external clock input - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] extrigger: - only one parameter can be selected which is shown as below: - \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector - \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0 - \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1 - \param[in] extpolarity: - only one parameter can be selected which is shown as below: - \arg TIMER_IC_POLARITY_RISING: active high or rising edge active - \arg TIMER_IC_POLARITY_FALLING: active low or falling edge active - \param[in] extfilter: a value between 0 and 15 - \param[out] none - \retval none -*/ -void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, - uint16_t extpolarity, uint32_t extfilter) -{ - if(TIMER_SMCFG_TRGSEL_CI1FE1 == extrigger) { - /* reset the CH1EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); - /* reset the CH1NP bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); - /* set the CH1NP bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)extpolarity << 4U); - /* reset the CH1MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); - /* set the CH1MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U); - /* reset the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); - /* set the CH1CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 12U); - /* set the CH1EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; - } else { - /* reset the CH0EN bit */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); - /* reset the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); - /* set the CH0P and CH0NP bits */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)extpolarity; - /* reset the CH0MS bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); - /* set the CH0MS bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)TIMER_IC_SELECTION_DIRECTTI; - /* reset the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); - /* reset the CH0CAPFLT bit */ - TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 4U); - /* set the CH0EN bit */ - TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; - } - /* select TIMER input trigger source */ - timer_input_trigger_source_select(timer_periph, extrigger); - /* reset the SMC bit */ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); - /* set the SMC bit */ - TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; -} - -/*! - \brief configure TIMER the external clock mode0 - \param[in] timer_periph: TIMERx(x=0..4,7,8,11) - \param[in] extprescaler: - only one parameter can be selected which is shown as below: - \arg TIMER_EXT_TRI_PSC_OFF: no divided - \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 - \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 - \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 - \param[in] extpolarity: - only one parameter can be selected which is shown as below: - \arg TIMER_ETP_FALLING: active low or falling edge active - \arg TIMER_ETP_RISING: active high or rising edge active - \param[in] extfilter: a value between 0 and 15 - \param[out] none - \retval none -*/ -void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter) -{ - /* configure TIMER external trigger input */ - timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); - - /* reset the SMC bit,TRGS bit */ - TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_SMC | TIMER_SMCFG_TRGS)); - /* set the SMC bit,TRGS bit */ - TIMER_SMCFG(timer_periph) |= (uint32_t)(TIMER_SLAVE_MODE_EXTERNAL0 | TIMER_SMCFG_TRGSEL_ETIFP); -} - -/*! - \brief configure TIMER the external clock mode1 - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[in] extprescaler: - only one parameter can be selected which is shown as below: - \arg TIMER_EXT_TRI_PSC_OFF: no divided - \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 - \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 - \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 - \param[in] extpolarity: - only one parameter can be selected which is shown as below: - \arg TIMER_ETP_FALLING: active low or falling edge active - \arg TIMER_ETP_RISING: active high or rising edge active - \param[in] extfilter: a value between 0 and 15 - \param[out] none - \retval none -*/ -void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, - uint32_t extpolarity, uint32_t extfilter) -{ - /* configure TIMER external trigger input */ - timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); - - TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_SMC1; -} - -/*! - \brief disable TIMER the external clock mode1 - \param[in] timer_periph: TIMERx(x=0..4,7) - \param[out] none - \retval none -*/ -void timer_external_clock_mode1_disable(uint32_t timer_periph) -{ - TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC1; -} - -/*! - \brief configure TIMER channel remap function - \param[in] timer_periph: TIMERx(x=1,4,10) - \param[in] remap: - only one parameter can be selected which is shown as below: - \arg TIMER1_ITI1_RMP_TIMER7_TRGO: timer1 internal trigger input1 remap to TIMER7_TRGO - \arg TIMER1_ITI1_RMP_ETHERNET_PTP: timer1 internal trigger input1 remap to ethernet PTP - \arg TIMER1_ITI1_RMP_USB_FS_SOF: timer1 internal trigger input1 remap to USB FS SOF - \arg TIMER1_ITI1_RMP_USB_HS_SOF: timer1 internal trigger input1 remap to USB HS SOF - \arg TIMER4_CI3_RMP_GPIO: timer4 channel 3 input remap to GPIO pin - \arg TIMER4_CI3_RMP_IRC32K: timer4 channel 3 input remap to IRC32K - \arg TIMER4_CI3_RMP_LXTAL: timer4 channel 3 input remap to LXTAL - \arg TIMER4_CI3_RMP_RTC_WAKEUP_INT: timer4 channel 3 input remap to RTC wakeup interrupt - \arg TIMER10_ITI1_RMP_GPIO: timer10 internal trigger input1 remap based on GPIO setting - \arg TIMER10_ITI1_RMP_RTC_HXTAL_DIV: timer10 internal trigger input1 remap HXTAL _DIV(clock used for RTC which is HXTAL clock divided by RTCDIV bits in RCU_CFG0 register) - \param[out] none - \retval none -*/ -void timer_channel_remap_config(uint32_t timer_periph, uint32_t remap) -{ - TIMER_IRMP(timer_periph) = (uint32_t)remap; -} - -/*! - \brief configure TIMER write CHxVAL register selection - \param[in] timer_periph: TIMERx(x=0,1,2,13,14,15,16) - \param[in] ccsel: - only one parameter can be selected which is shown as below: - \arg TIMER_CHVSEL_DISABLE: no effect - \arg TIMER_CHVSEL_ENABLE: when write the CHxVAL register, if the write value is same as the CHxVAL value, the write access is ignored - \param[out] none - \retval none -*/ -void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel) -{ - if(TIMER_CHVSEL_ENABLE == ccsel) { - TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_CHVSEL; - } else if(TIMER_CHVSEL_DISABLE == ccsel) { - TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_CHVSEL; - } else { - /* illegal parameters */ - } -} - -/*! - \brief configure TIMER output value selection - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] outsel: - only one parameter can be selected which is shown as below: - \arg TIMER_OUTSEL_DISABLE: no effect - \arg TIMER_OUTSEL_ENABLE: if POEN and IOS is 0, the output disabled - \param[out] none - \retval none -*/ -void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel) -{ - if(TIMER_OUTSEL_ENABLE == outsel) { - TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_OUTSEL; - } else if(TIMER_OUTSEL_DISABLE == outsel) { - TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_OUTSEL; - } else { - /* illegal parameters */ - } -} - -/*! - \brief enable the TIMER composite pwm - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) - \param[out] none - \retval none -*/ -void timer_channel_composite_pwm_enable(uint32_t timer_periph, uint32_t channel) -{ - TIMER_CTL2(timer_periph) |= (uint32_t)(TIMER_CTL2_CH0CPWMEN << channel); -} - -/*! - \brief disable the TIMER composite pwm - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) - \param[out] none - \retval none -*/ -void timer_channel_composite_pwm_disable(uint32_t timer_periph, uint32_t channel) -{ - TIMER_CTL2(timer_periph) &= (~(uint32_t)(TIMER_CTL2_CH0CPWMEN << channel)); -} - -/*! - \brief configure TIMER channel additional compare value - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) - \param[in] value: channel additional compare value - \param[out] none - \retval none -*/ -void timer_channel_additional_compare_value_config(uint32_t timer_periph, uint16_t channel, - uint32_t value) -{ - switch(channel) { - /* configure CH0COMV_ADD value */ - case TIMER_CH_0: - TIMER_CH0COMV_ADD(timer_periph) = (uint32_t)value; - break; - /* configure CH1COMV_ADD value */ - case TIMER_CH_1: - TIMER_CH1COMV_ADD(timer_periph) = (uint32_t)value; - break; - /* configure CH2COMV_ADD value */ - case TIMER_CH_2: - TIMER_CH2COMV_ADD(timer_periph) = (uint32_t)value; - break; - /* configure CH3COMV_ADD value */ - case TIMER_CH_3: - TIMER_CH3COMV_ADD(timer_periph) = (uint32_t)value; - break; - default: - break; - } -} - -/*! - \brief configure TIMER channel additional output shadow function - \param[in] timer_periph: TIMERx(x=0~4,7,14~16,22,23,30,31,40~44) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) - \param[in] ocshadow: channel additional compare output shadow state - only one parameter can be selected which is shown as below: - \arg TIMER_ADD_SHADOW_ENABLE: channel additional compare output shadow enable - \arg TIMER_ADD_SHADOW_DISABLE: channel additional compare output shadow disable - \param[out] none - \retval none -*/ -void timer_channel_additional_output_shadow_config(uint32_t timer_periph, uint16_t channel, - uint16_t ocshadow) -{ - switch(channel) { - /* configure TIMER_CH_0 */ - case TIMER_CH_0: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMADDSEN); - TIMER_CHCTL0(timer_periph) |= ((uint32_t)(ocshadow) << 28U); - break; - /* configure TIMER_CH_1 */ - case TIMER_CH_1: - TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMADDSEN); - TIMER_CHCTL0(timer_periph) |= ((uint32_t)(ocshadow) << 29U); - break; - /* configure TIMER_CH_2 */ - case TIMER_CH_2: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMADDSEN); - TIMER_CHCTL1(timer_periph) |= ((uint32_t)(ocshadow) << 28U); - break; - /* configure TIMER_CH_3 */ - case TIMER_CH_3: - TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMADDSEN); - TIMER_CHCTL1(timer_periph) |= ((uint32_t)(ocshadow) << 29U); - break; - default: - break; - } -} - -/*! - \brief read TIMER channel additional compare value - \param[in] timer_periph: TIMERx(x=0,7) - \param[in] channel: - only one parameter can be selected which is shown as below: - \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0,7)) - \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0,7)) - \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0,7)) - \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0,7)) - \param[out] none - \retval value: channel additional compare value -*/ -uint32_t timer_channel_additional_compare_value_read(uint32_t timer_periph, uint16_t channel) -{ - uint32_t value = 0U; - switch(channel) { - case TIMER_CH_0: - /* read CH0COMV_ADD value */ - value = TIMER_CH0COMV_ADD(timer_periph); - break; - case TIMER_CH_1: - /* read CH1COMV_ADD value */ - value = TIMER_CH1COMV_ADD(timer_periph); - break; - case TIMER_CH_2: - /* read CH2COMV_ADD value */ - value = TIMER_CH2COMV_ADD(timer_periph); - break; - case TIMER_CH_3: - /* read CH3COMV_ADD value */ - value = TIMER_CH3COMV_ADD(timer_periph); - break; - default: - break; - } - return value; -} - -/*! - \brief get TIMER flags - \param[in] timer_periph: please refer to the following parameters - \param[in] flag: the timer interrupt flags - only one parameter can be selected which is shown as below: - \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) - \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) - \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) - \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) - \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) - \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) - \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH0COMADD: Channel 0 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH1COMADD: Channel 1 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH2COMADD: Channel 2 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH3COMADD: Channel 3 additional compare interrupt flag, TIMERx(x=0,7) - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag) -{ - if(RESET != (TIMER_INTF(timer_periph) & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear TIMER flags - \param[in] timer_periph: please refer to the following parameters - \param[in] flag: the timer interrupt flags - only one parameter can be selected which is shown as below: - \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) - \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) - \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) - \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) - \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) - \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) - \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) - \arg TIMER_FLAG_CH0COMADD: Channel 0 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH1COMADD: Channel 1 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH2COMADD: Channel 2 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_FLAG_CH3COMADD: Channel 3 additional compare interrupt flag, TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_flag_clear(uint32_t timer_periph, uint32_t flag) -{ - TIMER_INTF(timer_periph) = (~(uint32_t)flag); -} - -/*! - \brief enable the TIMER interrupt - \param[in] timer_periph: please refer to the following parameters - \param[in] interrupt: timer interrupt enable source - only one parameter can be selected which is shown as below: - \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..13) - \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4,7..13) - \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4,7) - \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4,7) - \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_CH0COMADD: channel 0 additional compare interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_CH1COMADD: channel 1 additional compare interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_CH2COMADD: channel 2 additional compare interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_CH3COMADD: channel 3 additional compare interrupt enable, TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt) -{ - TIMER_DMAINTEN(timer_periph) |= (uint32_t) interrupt; -} - -/*! - \brief disable the TIMER interrupt - \param[in] timer_periph: please refer to the following parameters - \param[in] interrupt: timer interrupt source enable - only one parameter can be selected which is shown as below: - \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..13) - \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4,7..13) - \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4,7) - \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4,7) - \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0,7) - \arg TIMER_INT_CH0COMADD: channel 0 additional compare interrupt disable, TIMERx(x=0,7) - \arg TIMER_INT_CH1COMADD: channel 1 additional compare interrupt disable, TIMERx(x=0,7) - \arg TIMER_INT_CH2COMADD: channel 2 additional compare interrupt disable, TIMERx(x=0,7) - \arg TIMER_INT_CH3COMADD: channel 3 additional compare interrupt disable, TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt) -{ - TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)interrupt); -} - -/*! - \brief get timer interrupt flag - \param[in] timer_periph: please refer to the following parameters - \param[in] interrupt: the timer interrupt bits - only one parameter can be selected which is shown as below: - \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) - \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) - \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) - \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) - \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) - \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) - \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH0COMADD: channel 0 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH1COMADD: channel 1 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH2COMADD: channel 2 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH3COMADD: channel 3 additional compare interrupt flag, TIMERx(x=0,7) - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt) -{ - uint32_t val; - val = (TIMER_DMAINTEN(timer_periph) & interrupt); - if((RESET != (TIMER_INTF(timer_periph) & interrupt)) && (RESET != val)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear TIMER interrupt flag - \param[in] timer_periph: please refer to the following parameters - \param[in] interrupt: the timer interrupt bits - only one parameter can be selected which is shown as below: - \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) - \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) - \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) - \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) - \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) - \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) - \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) - \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH0COMADD: channel 0 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH1COMADD: channel 1 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH2COMADD: channel 2 additional compare interrupt flag, TIMERx(x=0,7) - \arg TIMER_INT_FLAG_CH3COMADD: channel 3 additional compare interrupt flag, TIMERx(x=0,7) - \param[out] none - \retval none -*/ -void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) -{ - TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c deleted file mode 100644 index 9cd3a0c5cf0..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_tli.c +++ /dev/null @@ -1,595 +0,0 @@ -/*! - \file gd32f5xx_tli.c - \brief TLI driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_tli.h" - -#define TLI_DEFAULT_VALUE 0x00000000U -#define TLI_OPAQUE_VALUE 0x000000FFU - -/*! - \brief deinitialize TLI registers - \param[in] none - \param[out] none - \retval none -*/ -void tli_deinit(void) -{ - rcu_periph_reset_enable(RCU_TLIRST); - rcu_periph_reset_disable(RCU_TLIRST); -} - -/*! - \brief initialize the parameters of TLI parameter structure with the default values, it is suggested - that call this function after a tli_parameter_struct structure is defined - \param[in] none - \param[out] tli_struct: the data needed to initialize TLI - synpsz_vpsz: size of the vertical synchronous pulse - synpsz_hpsz: size of the horizontal synchronous pulse - backpsz_vbpsz: size of the vertical back porch plus synchronous pulse - backpsz_hbpsz: size of the horizontal back porch plus synchronous pulse - activesz_vasz: size of the vertical active area width plus back porch and synchronous pulse - activesz_hasz: size of the horizontal active area width plus back porch and synchronous pulse - totalsz_vtsz: vertical total size of the display, including active area, back porch, synchronous - totalsz_htsz: vorizontal total size of the display, including active area, back porch, synchronous - backcolor_red: background value red - backcolor_green: background value green - backcolor_blue: background value blue - signalpolarity_hs: TLI_HSYN_ACTLIVE_LOW,TLI_HSYN_ACTLIVE_HIGHT - signalpolarity_vs: TLI_VSYN_ACTLIVE_LOW,TLI_VSYN_ACTLIVE_HIGHT - signalpolarity_de: TLI_DE_ACTLIVE_LOW,TLI_DE_ACTLIVE_HIGHT - signalpolarity_pixelck: TLI_PIXEL_CLOCK_TLI,TLI_PIXEL_CLOCK_INVERTEDTLI - \retval none -*/ -void tli_struct_para_init(tli_parameter_struct *tli_struct) -{ - /* initialize the struct parameters with default values */ - tli_struct->synpsz_vpsz = TLI_DEFAULT_VALUE; - tli_struct->synpsz_hpsz = TLI_DEFAULT_VALUE; - tli_struct->backpsz_vbpsz = TLI_DEFAULT_VALUE; - tli_struct->backpsz_hbpsz = TLI_DEFAULT_VALUE; - tli_struct->activesz_vasz = TLI_DEFAULT_VALUE; - tli_struct->activesz_hasz = TLI_DEFAULT_VALUE; - tli_struct->totalsz_vtsz = TLI_DEFAULT_VALUE; - tli_struct->totalsz_htsz = TLI_DEFAULT_VALUE; - tli_struct->backcolor_red = TLI_DEFAULT_VALUE; - tli_struct->backcolor_green = TLI_DEFAULT_VALUE; - tli_struct->backcolor_blue = TLI_DEFAULT_VALUE; - tli_struct->signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW; - tli_struct->signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW; - tli_struct->signalpolarity_de = TLI_DE_ACTLIVE_LOW; - tli_struct->signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI; -} - -/*! - \brief initialize TLI display timing parameters - \param[in] tli_struct: the data needed to initialize TLI - synpsz_vpsz: size of the vertical synchronous pulse - synpsz_hpsz: size of the horizontal synchronous pulse - backpsz_vbpsz: size of the vertical back porch plus synchronous pulse - backpsz_hbpsz: size of the horizontal back porch plus synchronous pulse - activesz_vasz: size of the vertical active area width plus back porch and synchronous pulse - activesz_hasz: size of the horizontal active area width plus back porch and synchronous pulse - totalsz_vtsz: vertical total size of the display, including active area, back porch, synchronous - totalsz_htsz: vorizontal total size of the display, including active area, back porch, synchronous - backcolor_red: background value red - backcolor_green: background value green - backcolor_blue: background value blue - signalpolarity_hs: TLI_HSYN_ACTLIVE_LOW,TLI_HSYN_ACTLIVE_HIGHT - signalpolarity_vs: TLI_VSYN_ACTLIVE_LOW,TLI_VSYN_ACTLIVE_HIGHT - signalpolarity_de: TLI_DE_ACTLIVE_LOW,TLI_DE_ACTLIVE_HIGHT - signalpolarity_pixelck: TLI_PIXEL_CLOCK_TLI,TLI_PIXEL_CLOCK_INVERTEDTLI - \param[out] none - \retval none -*/ -void tli_init(tli_parameter_struct *tli_struct) -{ - /* synchronous pulse size configuration */ - TLI_SPSZ &= ~(TLI_SPSZ_VPSZ | TLI_SPSZ_HPSZ); - TLI_SPSZ = (uint32_t)((uint32_t)tli_struct->synpsz_vpsz | ((uint32_t)tli_struct->synpsz_hpsz << 16U)); - /* back-porch size configuration */ - TLI_BPSZ &= ~(TLI_BPSZ_VBPSZ | TLI_BPSZ_HBPSZ); - TLI_BPSZ = (uint32_t)((uint32_t)tli_struct->backpsz_vbpsz | ((uint32_t)tli_struct->backpsz_hbpsz << 16U)); - /* active size configuration */ - TLI_ASZ &= ~(TLI_ASZ_VASZ | TLI_ASZ_HASZ); - TLI_ASZ = (tli_struct->activesz_vasz | (tli_struct->activesz_hasz << 16U)); - /* total size configuration */ - TLI_TSZ &= ~(TLI_TSZ_VTSZ | TLI_TSZ_HTSZ); - TLI_TSZ = (tli_struct->totalsz_vtsz | (tli_struct->totalsz_htsz << 16U)); - /* background color configuration */ - TLI_BGC &= ~(TLI_BGC_BVB | (TLI_BGC_BVG) | (TLI_BGC_BVR)); - TLI_BGC = (tli_struct->backcolor_blue | (tli_struct->backcolor_green << 8U) | (tli_struct->backcolor_red << 16U)); - TLI_CTL &= ~(TLI_CTL_HPPS | TLI_CTL_VPPS | TLI_CTL_DEPS | TLI_CTL_CLKPS); - TLI_CTL |= (tli_struct->signalpolarity_hs | tli_struct->signalpolarity_vs | \ - tli_struct->signalpolarity_de | tli_struct->signalpolarity_pixelck); - -} - -/*! - \brief configure TLI dither function - \param[in] dither_stat - only one parameter can be selected which is shown as below: - \arg TLI_DITHER_ENABLE - \arg TLI_DITHER_DISABLE - \param[out] none - \retval none -*/ -void tli_dither_config(uint8_t dither_stat) -{ - if(TLI_DITHER_ENABLE == dither_stat) { - TLI_CTL |= TLI_CTL_DFEN; - } else { - TLI_CTL &= ~(TLI_CTL_DFEN); - } -} - -/*! - \brief enable TLI - \param[in] none - \param[out] none - \retval none -*/ -void tli_enable(void) -{ - TLI_CTL |= TLI_CTL_TLIEN; -} - -/*! - \brief disable TLI - \param[in] none - \param[out] none - \retval none -*/ -void tli_disable(void) -{ - TLI_CTL &= ~(TLI_CTL_TLIEN); -} - -/*! - \brief configure TLI reload mode - \param[in] reload_mod - only one parameter can be selected which is shown as below: - \arg TLI_FRAME_BLANK_RELOAD_EN - \arg TLI_REQUEST_RELOAD_EN - \param[out] none - \retval none -*/ -void tli_reload_config(uint8_t reload_mod) -{ - if(TLI_FRAME_BLANK_RELOAD_EN == reload_mod) { - /* the layer configuration will be reloaded at frame blank */ - TLI_RL |= TLI_RL_FBR; - } else { - /* the layer configuration will be reloaded after this bit sets */ - TLI_RL |= TLI_RL_RQR; - } -} - -/*! - \brief initialize the parameters of TLI layer structure with the default values, it is suggested - that call this function after a tli_layer_parameter_struct structure is defined - \param[in] none - \param[out] layer_struct: TLI Layer parameter struct - layer_window_rightpos: window right position - layer_window_leftpos: window left position - layer_window_bottompos: window bottom position - layer_window_toppos: window top position - layer_ppf: LAYER_PPF_ARGB8888,LAYER_PPF_RGB888,LAYER_PPF_RGB565, - LAYER_PPF_ARG1555,LAYER_PPF_ARGB4444,LAYER_PPF_L8, - LAYER_PPF_AL44,LAYER_PPF_AL88 - layer_sa: specified alpha - layer_default_alpha: the default color alpha - layer_default_red: the default color red - layer_default_green: the default color green - layer_default_blue: the default color blue - layer_acf1: LAYER_ACF1_SA,LAYER_ACF1_PASA - layer_acf2: LAYER_ACF2_SA,LAYER_ACF2_PASA - layer_frame_bufaddr: frame buffer base address - layer_frame_buf_stride_offset: frame buffer stride offset - layer_frame_line_length: frame line length - layer_frame_total_line_number: frame total line number - \retval none -*/ -void tli_layer_struct_para_init(tli_layer_parameter_struct *layer_struct) -{ - /* initialize the struct parameters with default values */ - layer_struct->layer_window_rightpos = TLI_DEFAULT_VALUE; - layer_struct->layer_window_leftpos = TLI_DEFAULT_VALUE; - layer_struct->layer_window_bottompos = TLI_DEFAULT_VALUE; - layer_struct->layer_window_toppos = TLI_DEFAULT_VALUE; - layer_struct->layer_ppf = LAYER_PPF_ARGB8888; - layer_struct->layer_sa = TLI_OPAQUE_VALUE; - layer_struct->layer_default_alpha = TLI_DEFAULT_VALUE; - layer_struct->layer_default_red = TLI_DEFAULT_VALUE; - layer_struct->layer_default_green = TLI_DEFAULT_VALUE; - layer_struct->layer_default_blue = TLI_DEFAULT_VALUE; - layer_struct->layer_acf1 = LAYER_ACF1_PASA; - layer_struct->layer_acf2 = LAYER_ACF2_PASA; - layer_struct->layer_frame_bufaddr = TLI_DEFAULT_VALUE; - layer_struct->layer_frame_buf_stride_offset = TLI_DEFAULT_VALUE; - layer_struct->layer_frame_line_length = TLI_DEFAULT_VALUE; - layer_struct->layer_frame_total_line_number = TLI_DEFAULT_VALUE; -} - -/*! - \brief initialize TLI layer - \param[in] layerx: LAYERx(x=0,1) - \param[in] layer_struct: TLI Layer parameter struct - layer_window_rightpos: window right position - layer_window_leftpos: window left position - layer_window_bottompos: window bottom position - layer_window_toppos: window top position - layer_ppf: LAYER_PPF_ARGB8888,LAYER_PPF_RGB888,LAYER_PPF_RGB565, - LAYER_PPF_ARG1555,LAYER_PPF_ARGB4444,LAYER_PPF_L8, - LAYER_PPF_AL44,LAYER_PPF_AL88 - layer_sa: specified alpha - layer_default_alpha: the default color alpha - layer_default_red: the default color red - layer_default_green: the default color green - layer_default_blue: the default color blue - layer_acf1: LAYER_ACF1_SA,LAYER_ACF1_PASA - layer_acf2: LAYER_ACF2_SA,LAYER_ACF2_PASA - layer_frame_bufaddr: frame buffer base address - layer_frame_buf_stride_offset: frame buffer stride offset - layer_frame_line_length: frame line length - layer_frame_total_line_number: frame total line number - \param[out] none - \retval none -*/ -void tli_layer_init(uint32_t layerx, tli_layer_parameter_struct *layer_struct) -{ - /* configure layer window horizontal position */ - TLI_LxHPOS(layerx) &= ~(TLI_LxHPOS_WLP | (TLI_LxHPOS_WRP)); - TLI_LxHPOS(layerx) = (uint32_t)((uint32_t)layer_struct->layer_window_leftpos | ((uint32_t)layer_struct->layer_window_rightpos << 16U)); - /* configure layer window vertical position */ - TLI_LxVPOS(layerx) &= ~(TLI_LxVPOS_WTP | (TLI_LxVPOS_WBP)); - TLI_LxVPOS(layerx) = (uint32_t)((uint32_t)layer_struct->layer_window_toppos | ((uint32_t)layer_struct->layer_window_bottompos << 16U)); - /* configure layer packeted pixel format */ - TLI_LxPPF(layerx) &= ~(TLI_LxPPF_PPF); - TLI_LxPPF(layerx) = layer_struct->layer_ppf; - /* configure layer specified alpha */ - TLI_LxSA(layerx) &= ~(TLI_LxSA_SA); - TLI_LxSA(layerx) = layer_struct->layer_sa; - /* configure layer default color */ - TLI_LxDC(layerx) &= ~(TLI_LxDC_DCB | (TLI_LxDC_DCG) | (TLI_LxDC_DCR) | (TLI_LxDC_DCA)); - TLI_LxDC(layerx) = (uint32_t)((uint32_t)layer_struct->layer_default_blue | ((uint32_t)layer_struct->layer_default_green << 8U) - | ((uint32_t)layer_struct->layer_default_red << 16U) - | ((uint32_t)layer_struct->layer_default_alpha << 24U)); - - /* configure layer alpha calculation factors */ - TLI_LxBLEND(layerx) &= ~(TLI_LxBLEND_ACF2 | (TLI_LxBLEND_ACF1)); - TLI_LxBLEND(layerx) = ((layer_struct->layer_acf2) | (layer_struct->layer_acf1)); - /* configure layer frame buffer base address */ - TLI_LxFBADDR(layerx) &= ~(TLI_LxFBADDR_FBADD); - TLI_LxFBADDR(layerx) = (layer_struct->layer_frame_bufaddr); - /* configure layer frame line length */ - TLI_LxFLLEN(layerx) &= ~(TLI_LxFLLEN_FLL | (TLI_LxFLLEN_STDOFF)); - TLI_LxFLLEN(layerx) = (uint32_t)((uint32_t)layer_struct->layer_frame_line_length | ((uint32_t)layer_struct->layer_frame_buf_stride_offset << 16U)); - /* configure layer frame total line number */ - TLI_LxFTLN(layerx) &= ~(TLI_LxFTLN_FTLN); - TLI_LxFTLN(layerx) = (uint32_t)(layer_struct->layer_frame_total_line_number); - -} - -/*! - \brief reconfigure window position - \param[in] layerx: LAYERx(x=0,1) - \param[in] offset_x: new horizontal offset - \param[in] offset_y: new vertical offset - \param[out] none - \retval none -*/ -void tli_layer_window_offset_modify(uint32_t layerx, uint16_t offset_x, uint16_t offset_y) -{ - /* configure window start position */ - uint32_t layer_ppf, line_num, hstart, vstart; - uint32_t line_length = 0U; - TLI_LxHPOS(layerx) &= ~(TLI_LxHPOS_WLP | (TLI_LxHPOS_WRP)); - TLI_LxVPOS(layerx) &= ~(TLI_LxVPOS_WTP | (TLI_LxVPOS_WBP)); - hstart = (uint32_t)offset_x + (((TLI_BPSZ & TLI_BPSZ_HBPSZ) >> 16U) + 1U); - vstart = (uint32_t)offset_y + ((TLI_BPSZ & TLI_BPSZ_VBPSZ) + 1U); - line_num = (TLI_LxFTLN(layerx) & TLI_LxFTLN_FTLN); - layer_ppf = (TLI_LxPPF(layerx) & TLI_LxPPF_PPF); - /* the bytes of a line equal TLI_LxFLLEN_FLL bits value minus 3 */ - switch(layer_ppf) { - case LAYER_PPF_ARGB8888: - /* each pixel includes 4bytes, when pixel format is ARGB8888 */ - line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 4U); - break; - case LAYER_PPF_RGB888: - /* each pixel includes 3bytes, when pixel format is RGB888 */ - line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 3U); - break; - case LAYER_PPF_RGB565: - case LAYER_PPF_ARGB1555: - case LAYER_PPF_ARGB4444: - case LAYER_PPF_AL88: - /* each pixel includes 2bytes, when pixel format is RGB565,ARG1555,ARGB4444 or AL88 */ - line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U) / 2U); - break; - case LAYER_PPF_L8: - case LAYER_PPF_AL44: - /* each pixel includes 1byte, when pixel format is L8 or AL44 */ - line_length = (((TLI_LxFLLEN(layerx) & TLI_LxFLLEN_FLL) - 3U)); - break; - default: - break; - } - /* reconfigure window position */ - TLI_LxHPOS(layerx) = (hstart | ((hstart + line_length - 1U) << 16U)); - TLI_LxVPOS(layerx) = (vstart | ((vstart + line_num - 1U) << 16U)); -} - -/*! - \brief initialize the parameters of TLI layer LUT structure with the default values, it is suggested - that call this function after a tli_layer_lut_parameter_struct structure is defined - \param[in] none - \param[out] lut_struct: TLI layer LUT parameter struct - layer_table_addr: look up table write address - layer_lut_channel_red: red channel of a LUT entry - layer_lut_channel_green: green channel of a LUT entry - layer_lut_channel_blue: blue channel of a LUT entry - \retval none -*/ -void tli_lut_struct_para_init(tli_layer_lut_parameter_struct *lut_struct) -{ - /* initialize the struct parameters with default values */ - lut_struct->layer_table_addr = TLI_DEFAULT_VALUE; - lut_struct->layer_lut_channel_red = TLI_DEFAULT_VALUE; - lut_struct->layer_lut_channel_green = TLI_DEFAULT_VALUE; - lut_struct->layer_lut_channel_blue = TLI_DEFAULT_VALUE; -} - -/*! - \brief initialize TLI layer LUT - \param[in] layerx: LAYERx(x=0,1) - \param[in] lut_struct: TLI layer LUT parameter struct - layer_table_addr: look up table write address - layer_lut_channel_red: red channel of a LUT entry - layer_lut_channel_green: green channel of a LUT entry - layer_lut_channel_blue: blue channel of a LUT entry - \param[out] none - \retval none -*/ -void tli_lut_init(uint32_t layerx, tli_layer_lut_parameter_struct *lut_struct) -{ - TLI_LxLUT(layerx) = (uint32_t)(((uint32_t)lut_struct->layer_lut_channel_blue) | ((uint32_t)lut_struct->layer_lut_channel_green << 8U) - | ((uint32_t)lut_struct->layer_lut_channel_red << 16U - | ((uint32_t)lut_struct->layer_table_addr << 24U))); -} - -/*! - \brief initialize TLI layer color key - \param[in] layerx: LAYERx(x=0,1) - \param[in] redkey: color key red - \param[in] greenkey: color key green - \param[in] bluekey: color key blue - \param[out] none - \retval none -*/ -void tli_color_key_init(uint32_t layerx, uint8_t redkey, uint8_t greenkey, uint8_t bluekey) -{ - TLI_LxCKEY(layerx) = (((uint32_t)bluekey) | ((uint32_t)greenkey << 8U) | ((uint32_t)redkey << 16U)); -} - -/*! - \brief enable TLI layer - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_layer_enable(uint32_t layerx) -{ - TLI_LxCTL(layerx) |= TLI_LxCTL_LEN; -} - -/*! - \brief disable TLI layer - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_layer_disable(uint32_t layerx) -{ - TLI_LxCTL(layerx) &= ~(TLI_LxCTL_LEN); -} - -/*! - \brief enable TLI layer color keying - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_color_key_enable(uint32_t layerx) -{ - TLI_LxCTL(layerx) |= TLI_LxCTL_CKEYEN; -} - -/*! - \brief disable TLI layer color keying - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_color_key_disable(uint32_t layerx) -{ - TLI_LxCTL(layerx) &= ~(TLI_LxCTL_CKEYEN); -} - -/*! - \brief enable TLI layer LUT - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_lut_enable(uint32_t layerx) -{ - TLI_LxCTL(layerx) |= TLI_LxCTL_LUTEN; -} - -/*! - \brief disable TLI layer LUT - \param[in] layerx: LAYERx(x=0,1) - \param[out] none - \retval none -*/ -void tli_lut_disable(uint32_t layerx) -{ - TLI_LxCTL(layerx) &= ~(TLI_LxCTL_LUTEN); -} - -/*! - \brief set line mark value - \param[in] line_num: line number - \param[out] none - \retval none -*/ -void tli_line_mark_set(uint16_t line_num) -{ - TLI_LM &= ~(TLI_LM_LM); - TLI_LM = (uint32_t)line_num; -} - -/*! - \brief get current displayed position - \param[in] none - \param[out] none - \retval position of current pixel -*/ -uint32_t tli_current_pos_get(void) -{ - return TLI_CPPOS; -} - -/*! - \brief enable TLI interrupt - \param[in] int_flag: TLI interrupt flags - one or more parameters can be selected which are shown as below: - \arg TLI_INT_LM: line mark interrupt - \arg TLI_INT_FE: FIFO error interrupt - \arg TLI_INT_TE: transaction error interrupt - \arg TLI_INT_LCR: layer configuration reloaded interrupt - \param[out] none - \retval none -*/ -void tli_interrupt_enable(uint32_t int_flag) -{ - TLI_INTEN |= (int_flag); -} - -/*! - \brief disable TLI interrupt - \param[in] int_flag: TLI interrupt flags - one or more parameters can be selected which are shown as below: - \arg TLI_INT_LM: line mark interrupt - \arg TLI_INT_FE: FIFO error interrupt - \arg TLI_INT_TE: transaction error interrupt - \arg TLI_INT_LCR: layer configuration reloaded interrupt - \param[out] none - \retval none -*/ -void tli_interrupt_disable(uint32_t int_flag) -{ - TLI_INTEN &= ~(int_flag); -} - -/*! - \brief get TLI interrupt flag - \param[in] int_flag: TLI interrupt flags - one or more parameters can be selected which are shown as below: - \arg TLI_INT_FLAG_LM: line mark interrupt flag - \arg TLI_INT_FLAG_FE: FIFO error interrupt flag - \arg TLI_INT_FLAG_TE: transaction error interrupt flag - \arg TLI_INT_FLAG_LCR: layer configuration reloaded interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus tli_interrupt_flag_get(uint32_t int_flag) -{ - uint32_t state; - state = TLI_INTF; - if(state & int_flag) { - state = TLI_INTEN; - if(state & int_flag) { - return SET; - } - } - return RESET; -} - -/*! - \brief clear TLI interrupt flag - \param[in] int_flag: TLI interrupt flags - one or more parameters can be selected which are shown as below: - \arg TLI_INT_FLAG_LM: line mark interrupt flag - \arg TLI_INT_FLAG_FE: FIFO error interrupt flag - \arg TLI_INT_FLAG_TE: transaction error interrupt flag - \arg TLI_INT_FLAG_LCR: layer configuration reloaded interrupt flag - \param[out] none - \retval none -*/ -void tli_interrupt_flag_clear(uint32_t int_flag) -{ - TLI_INTC |= (int_flag); -} - -/*! - \brief get TLI flag or state in TLI_INTF register or TLI_STAT register - \param[in] flag: TLI flags or states - only one parameter can be selected which is shown as below: - \arg TLI_FLAG_VDE: current VDE state - \arg TLI_FLAG_HDE: current HDE state - \arg TLI_FLAG_VS: current VS status of the TLI - \arg TLI_FLAG_HS: current HS status of the TLI - \arg TLI_FLAG_LM: line mark interrupt flag - \arg TLI_FLAG_FE: FIFO error interrupt flag - \arg TLI_FLAG_TE: transaction error interrupt flag - \arg TLI_FLAG_LCR: layer configuration reloaded interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus tli_flag_get(uint32_t flag) -{ - uint32_t stat; - /* choose which register to get flag or state */ - if(flag >> 31U) { - stat = TLI_INTF; - } else { - stat = TLI_STAT; - } - if(flag & stat) { - return SET; - } else { - return RESET; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c deleted file mode 100644 index 36bd0460267..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_trng.c +++ /dev/null @@ -1,153 +0,0 @@ -/*! - \file gd32f5xx_trng.c - \brief TRNG driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_trng.h" - -/*! - \brief reset TRNG - \param[in] none - \param[out] none - \retval none -*/ -void trng_deinit(void) -{ - rcu_periph_reset_enable(RCU_TRNGRST); - rcu_periph_reset_disable(RCU_TRNGRST); -} - -/*! - \brief enable TRNG - \param[in] none - \param[out] none - \retval none -*/ -void trng_enable(void) -{ - TRNG_CTL |= TRNG_CTL_TRNGEN; -} - -/*! - \brief disable TRNG - \param[in] none - \param[out] none - \retval none -*/ -void trng_disable(void) -{ - TRNG_CTL &= ~TRNG_CTL_TRNGEN; -} - -/*! - \brief get the true random data - \param[in] none - \param[out] none - \retval uint32_t: 0x0-0xFFFFFFFF -*/ -uint32_t trng_get_true_random_data(void) -{ - return (TRNG_DATA); -} - -/*! - \brief get TRNG flag status - \param[in] flag: TRNG flag - only one parameter can be selected which is shown as below: - \arg TRNG_FLAG_DRDY: random Data ready status - \arg TRNG_FLAG_CECS: clock error current status - \arg TRNG_FLAG_SECS: seed error current status - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus trng_flag_get(trng_flag_enum flag) -{ - if(RESET != (TRNG_STAT & flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief enable TRNG interrupt - \param[in] none - \param[out] none - \retval none -*/ -void trng_interrupt_enable(void) -{ - TRNG_CTL |= TRNG_CTL_TRNGIE; -} - -/*! - \brief disable TRNG interrupt - \param[in] none - \param[out] none - \retval none -*/ -void trng_interrupt_disable(void) -{ - TRNG_CTL &= ~TRNG_CTL_TRNGIE; -} - -/*! - \brief get TRNG interrupt flag status - \param[in] int_flag: TRNG interrupt flag - only one parameter can be selected which is shown as below: - \arg TRNG_INT_FLAG_CEIF: clock error interrupt flag - \arg TRNG_INT_FLAG_SEIF: seed error interrupt flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus trng_interrupt_flag_get(trng_int_flag_enum int_flag) -{ - if(RESET != (TRNG_STAT & int_flag)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear TRNG interrupt flag status - \param[in] int_flag: TRNG interrupt flag - only one parameter can be selected which is shown as below: - \arg TRNG_INT_FLAG_CEIF: clock error interrupt flag - \arg TRNG_INT_FLAG_SEIF: seed error interrupt flag - \param[out] none - \retval none -*/ -void trng_interrupt_flag_clear(trng_int_flag_enum int_flag) -{ - TRNG_STAT &= ~(uint32_t)int_flag; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c deleted file mode 100644 index a0a45ac28da..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c +++ /dev/null @@ -1,1010 +0,0 @@ -/*! - \file gd32f5xx_usart.c - \brief USART driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_usart.h" - -/* USART register bit offset */ -#define GP_GUAT_OFFSET ((uint32_t)8U) /* bit offset of GUAT in USART_GP */ -#define CTL3_SCRTNUM_OFFSET ((uint32_t)1U) /* bit offset of SCRTNUM in USART_CTL3 */ -#define RT_BL_OFFSET ((uint32_t)24U) /* bit offset of BL in USART_RT */ - -/*! - \brief reset USART/UART - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_deinit(uint32_t usart_periph) -{ - switch(usart_periph) { - case USART0: - rcu_periph_reset_enable(RCU_USART0RST); - rcu_periph_reset_disable(RCU_USART0RST); - break; - case USART1: - rcu_periph_reset_enable(RCU_USART1RST); - rcu_periph_reset_disable(RCU_USART1RST); - break; - case USART2: - rcu_periph_reset_enable(RCU_USART2RST); - rcu_periph_reset_disable(RCU_USART2RST); - break; - case USART5: - rcu_periph_reset_enable(RCU_USART5RST); - rcu_periph_reset_disable(RCU_USART5RST); - break; - case UART3: - rcu_periph_reset_enable(RCU_UART3RST); - rcu_periph_reset_disable(RCU_UART3RST); - break; - case UART4: - rcu_periph_reset_enable(RCU_UART4RST); - rcu_periph_reset_disable(RCU_UART4RST); - break; - case UART6: - rcu_periph_reset_enable(RCU_UART6RST); - rcu_periph_reset_disable(RCU_UART6RST); - break; - case UART7: - rcu_periph_reset_enable(RCU_UART7RST); - rcu_periph_reset_disable(RCU_UART7RST); - break; - default: - break; - } -} - -/*! - \brief configure USART baud rate value - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] baudval: baud rate value - \param[out] none - \retval none -*/ -void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval) -{ - uint32_t uclk = 0U, intdiv = 0U, fradiv = 0U, udiv = 0U; - switch(usart_periph) { - /* get clock frequency */ - case USART0: - uclk = rcu_clock_freq_get(CK_APB2); - break; - case USART5: - uclk = rcu_clock_freq_get(CK_APB2); - break; - case USART1: - uclk = rcu_clock_freq_get(CK_APB1); - break; - case USART2: - uclk = rcu_clock_freq_get(CK_APB1); - break; - case UART3: - uclk = rcu_clock_freq_get(CK_APB1); - break; - case UART4: - uclk = rcu_clock_freq_get(CK_APB1); - break; - case UART6: - uclk = rcu_clock_freq_get(CK_APB1); - break; - case UART7: - uclk = rcu_clock_freq_get(CK_APB1); - break; - default: - break; - } - if(USART_CTL0(usart_periph) & USART_CTL0_OVSMOD) { - /* when oversampling by 8, configure the value of USART_BAUD */ - udiv = ((2U * uclk) + baudval / 2U) / baudval; - intdiv = udiv & 0xfff0U; - fradiv = (udiv >> 1U) & 0x7U; - USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); - } else { - /* when oversampling by 16, configure the value of USART_BAUD */ - udiv = (uclk + baudval / 2U) / baudval; - intdiv = udiv & 0xfff0U; - fradiv = udiv & 0xfU; - USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); - } -} - -/*! - \brief configure USART parity function - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] paritycfg: configure USART parity - only one parameter can be selected which is shown as below: - \arg USART_PM_NONE: no parity - \arg USART_PM_EVEN: even parity - \arg USART_PM_ODD: odd parity - \param[out] none - \retval none -*/ -void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg) -{ - /* clear USART_CTL0 PM,PCEN Bits */ - USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN); - /* configure USART parity mode */ - USART_CTL0(usart_periph) |= paritycfg ; -} - -/*! - \brief configure USART word length - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] wlen: USART word length configure - only one parameter can be selected which is shown as below: - \arg USART_WL_8BIT: 8 bits - \arg USART_WL_9BIT: 9 bits - \param[out] none - \retval none -*/ -void usart_word_length_set(uint32_t usart_periph, uint32_t wlen) -{ - /* clear USART_CTL0 WL bit */ - USART_CTL0(usart_periph) &= ~USART_CTL0_WL; - /* configure USART word length */ - USART_CTL0(usart_periph) |= wlen; -} - -/*! - \brief configure USART stop bit length - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] stblen: USART stop bit configure - only one parameter can be selected which is shown as below: - \arg USART_STB_1BIT: 1 bit - \arg USART_STB_0_5BIT: 0.5 bit(not available for UARTx(x=3,4,6,7)) - \arg USART_STB_2BIT: 2 bits - \arg USART_STB_1_5BIT: 1.5 bits(not available for UARTx(x=3,4,6,7)) - \param[out] none - \retval none -*/ -void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen) -{ - /* clear USART_CTL1 STB bits */ - USART_CTL1(usart_periph) &= ~USART_CTL1_STB; - /* configure USART stop bits */ - USART_CTL1(usart_periph) |= stblen; -} -/*! - \brief enable USART - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_enable(uint32_t usart_periph) -{ - USART_CTL0(usart_periph) |= USART_CTL0_UEN; -} - -/*! - \brief disable USART - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_disable(uint32_t usart_periph) -{ - USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN); -} - -/*! - \brief configure USART transmitter - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] txconfig: enable or disable USART transmitter - only one parameter can be selected which is shown as below: - \arg USART_TRANSMIT_ENABLE: enable USART transmission - \arg USART_TRANSMIT_DISABLE: enable USART transmission - \param[out] none - \retval none -*/ -void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL0(usart_periph); - ctl &= ~USART_CTL0_TEN; - ctl |= txconfig; - /* configure transfer mode */ - USART_CTL0(usart_periph) = ctl; -} - -/*! - \brief configure USART receiver - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] rxconfig: enable or disable USART receiver - only one parameter can be selected which is shown as below: - \arg USART_RECEIVE_ENABLE: enable USART reception - \arg USART_RECEIVE_DISABLE: disable USART reception - \param[out] none - \retval none -*/ -void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL0(usart_periph); - ctl &= ~USART_CTL0_REN; - ctl |= rxconfig; - /* configure transfer mode */ - USART_CTL0(usart_periph) = ctl; -} - -/*! - \brief data is transmitted/received with the LSB/MSB first - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] msbf: LSB/MSB - only one parameter can be selected which is shown as below: - \arg USART_MSBF_LSB: LSB first - \arg USART_MSBF_MSB: MSB first - \param[out] none - \retval none -*/ -void usart_data_first_config(uint32_t usart_periph, uint32_t msbf) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL3(usart_periph); - ctl &= ~(USART_CTL3_MSBF); - ctl |= msbf; - /* configure data transmitted/received mode */ - USART_CTL3(usart_periph) = ctl; -} - -/*! - \brief configure USART inversion - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] invertpara: refer to enum USART_INVERT_CONFIG - only one parameter can be selected which is shown as below: - \arg USART_DINV_ENABLE: data bit level inversion - \arg USART_DINV_DISABLE: data bit level not inversion - \arg USART_TXPIN_ENABLE: TX pin level inversion - \arg USART_TXPIN_DISABLE: TX pin level not inversion - \arg USART_RXPIN_ENABLE: RX pin level inversion - \arg USART_RXPIN_DISABLE: RX pin level not inversion - \param[out] none - \retval none -*/ -void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara) -{ - /* inverted or not the specified siginal */ - switch(invertpara) { - case USART_DINV_ENABLE: - USART_CTL3(usart_periph) |= USART_CTL3_DINV; - break; - case USART_TXPIN_ENABLE: - USART_CTL3(usart_periph) |= USART_CTL3_TINV; - break; - case USART_RXPIN_ENABLE: - USART_CTL3(usart_periph) |= USART_CTL3_RINV; - break; - case USART_DINV_DISABLE: - USART_CTL3(usart_periph) &= ~(USART_CTL3_DINV); - break; - case USART_TXPIN_DISABLE: - USART_CTL3(usart_periph) &= ~(USART_CTL3_TINV); - break; - case USART_RXPIN_DISABLE: - USART_CTL3(usart_periph) &= ~(USART_CTL3_RINV); - break; - default: - break; - } -} - -/*! - \brief configure the USART oversample mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] oversamp: oversample value - only one parameter can be selected which is shown as below: - \arg USART_OVSMOD_8: 8 bits - \arg USART_OVSMOD_16: 16 bits - \param[out] none - \retval none -*/ -void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp) -{ - /* clear OVSMOD bit */ - USART_CTL0(usart_periph) &= ~(USART_CTL0_OVSMOD); - USART_CTL0(usart_periph) |= oversamp; -} - -/*! - \brief configure sample bit method - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] obsm: sample bit - only one parameter can be selected which is shown as below: - \arg USART_OSB_1bit: 1 bit - \arg USART_OSB_3bit: 3 bits - \param[out] none - \retval none -*/ -void usart_sample_bit_config(uint32_t usart_periph, uint32_t obsm) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_OSB); - USART_CTL2(usart_periph) |= obsm; -} - -/*! - \brief enable receiver timeout of USART - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_receiver_timeout_enable(uint32_t usart_periph) -{ - USART_CTL3(usart_periph) |= USART_CTL3_RTEN; -} - -/*! - \brief disable receiver timeout of USART - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_receiver_timeout_disable(uint32_t usart_periph) -{ - USART_CTL3(usart_periph) &= ~(USART_CTL3_RTEN); -} - -/*! - \brief configure receiver timeout threshold - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] rtimeout: 0-0x00FFFFFF - \param[out] none - \retval none -*/ -void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout) -{ - USART_RT(usart_periph) &= ~(USART_RT_RT); - USART_RT(usart_periph) |= rtimeout; -} - -/*! - \brief USART transmit data function - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] data: data of transmission - \param[out] none - \retval none -*/ -void usart_data_transmit(uint32_t usart_periph, uint32_t data) -{ - USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data); -} - -/*! - \brief USART receive data function - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval data of received -*/ -uint16_t usart_data_receive(uint32_t usart_periph) -{ - return (uint16_t)(GET_BITS(USART_DATA(usart_periph), 0U, 8U)); -} - -/*! - \brief configure address of the USART - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] addr: address of USART/UART - \param[out] none - \retval none -*/ -void usart_address_config(uint32_t usart_periph, uint8_t addr) -{ - USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR); - USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr); -} - -/*! - \brief enable mute mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_mute_mode_enable(uint32_t usart_periph) -{ - USART_CTL0(usart_periph) |= USART_CTL0_RWU; -} - -/*! - \brief disable mute mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_mute_mode_disable(uint32_t usart_periph) -{ - USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU); -} - -/*! - \brief configure wakeup method in mute mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] wmehtod: two method be used to enter or exit the mute mode - only one parameter can be selected which is shown as below: - \arg USART_WM_IDLE: idle line - \arg USART_WM_ADDR: address mask - \param[out] none - \retval none -*/ -void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmehtod) -{ - USART_CTL0(usart_periph) &= ~(USART_CTL0_WM); - USART_CTL0(usart_periph) |= wmehtod; -} - -/*! - \brief enable LIN mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_lin_mode_enable(uint32_t usart_periph) -{ - USART_CTL1(usart_periph) |= USART_CTL1_LMEN; -} - -/*! - \brief disable LIN mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_lin_mode_disable(uint32_t usart_periph) -{ - USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN); -} - -/*! - \brief configure lin break frame length - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] lblen: lin break frame length - only one parameter can be selected which is shown as below: - \arg USART_LBLEN_10B: 10 bits - \arg USART_LBLEN_11B: 11 bits - \param[out] none - \retval none -*/ -void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen) -{ - USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN); - USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen); -} - -/*! - \brief send break frame - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_send_break(uint32_t usart_periph) -{ - USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD; -} - -/*! - \brief enable half-duplex mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_halfduplex_enable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) |= USART_CTL2_HDEN; -} - -/*! - \brief disable half-duplex mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_halfduplex_disable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN); -} - -/*! - \brief enable CK pin in synchronous mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_synchronous_clock_enable(uint32_t usart_periph) -{ - USART_CTL1(usart_periph) |= USART_CTL1_CKEN; -} - -/*! - \brief disable CK pin in synchronous mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_synchronous_clock_disable(uint32_t usart_periph) -{ - USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN); -} - -/*! - \brief configure USART synchronous mode parameters - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] clen: CK length - only one parameter can be selected which is shown as below: - \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame - \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame - \param[in] cph: clock phase - only one parameter can be selected which is shown as below: - \arg USART_CPH_1CK: first clock transition is the first data capture edge - \arg USART_CPH_2CK: second clock transition is the first data capture edge - \param[in] cpl: clock polarity - only one parameter can be selected which is shown as below: - \arg USART_CPL_LOW: steady low value on CK pin - \arg USART_CPL_HIGH: steady high value on CK pin - \param[out] none - \retval none -*/ -void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl) -{ - uint32_t ctl = 0U; - - /* read USART_CTL1 register */ - ctl = USART_CTL1(usart_periph); - ctl &= ~(USART_CTL1_CLEN | USART_CTL1_CPH | USART_CTL1_CPL); - /* set CK length, CK phase, CK polarity */ - ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl); - - USART_CTL1(usart_periph) = ctl; -} - -/*! - \brief configure guard time value in smartcard mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] guat: guard time value, 0-0xFF - \param[out] none - \retval none -*/ -void usart_guard_time_config(uint32_t usart_periph, uint32_t guat) -{ - USART_GP(usart_periph) &= ~(USART_GP_GUAT); - USART_GP(usart_periph) |= (USART_GP_GUAT & ((guat) << GP_GUAT_OFFSET)); -} - -/*! - \brief enable smartcard mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_smartcard_mode_enable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) |= USART_CTL2_SCEN; -} - -/*! - \brief disable smartcard mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_smartcard_mode_disable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_SCEN); -} - -/*! - \brief enable NACK in smartcard mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_smartcard_mode_nack_enable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) |= USART_CTL2_NKEN; -} - -/*! - \brief disable NACK in smartcard mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[out] none - \retval none -*/ -void usart_smartcard_mode_nack_disable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_NKEN); -} - -/*! - \brief configure smartcard auto-retry number - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] scrtnum: smartcard auto-retry number - \param[out] none - \retval none -*/ -void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum) -{ - USART_CTL3(usart_periph) &= ~(USART_CTL3_SCRTNUM); - USART_CTL3(usart_periph) |= (USART_CTL3_SCRTNUM & ((scrtnum) << CTL3_SCRTNUM_OFFSET)); -} - -/*! - \brief configure block length in Smartcard T=1 reception - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] bl: block length - \param[out] none - \retval none -*/ -void usart_block_length_config(uint32_t usart_periph, uint32_t bl) -{ - USART_RT(usart_periph) &= ~(USART_RT_BL); - USART_RT(usart_periph) |= (USART_RT_BL & ((bl) << RT_BL_OFFSET)); -} - -/*! - \brief enable IrDA mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_irda_mode_enable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) |= USART_CTL2_IREN; -} - -/*! - \brief disable IrDA mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[out] none - \retval none -*/ -void usart_irda_mode_disable(uint32_t usart_periph) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_IREN); -} - -/*! - \brief configure the peripheral clock prescaler in USART IrDA low-power mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] psc: 0-0xFF - \param[out] none - \retval none -*/ -void usart_prescaler_config(uint32_t usart_periph, uint8_t psc) -{ - USART_GP(usart_periph) &= ~(USART_GP_PSC); - USART_GP(usart_periph) |= psc; -} - -/*! - \brief configure IrDA low-power - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] irlp: IrDA low-power or normal - only one parameter can be selected which is shown as below: - \arg USART_IRLP_LOW: low-power - \arg USART_IRLP_NORMAL: normal - \param[out] none - \retval none -*/ -void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp) -{ - USART_CTL2(usart_periph) &= ~(USART_CTL2_IRLP); - USART_CTL2(usart_periph) |= (USART_CTL2_IRLP & irlp); -} - -/*! - \brief configure hardware flow control RTS - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] rtsconfig: enable or disable RTS - only one parameter can be selected which is shown as below: - \arg USART_RTS_ENABLE: enable RTS - \arg USART_RTS_DISABLE: disable RTS - \param[out] none - \retval none -*/ -void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL2(usart_periph); - ctl &= ~USART_CTL2_RTSEN; - ctl |= rtsconfig; - /* configure RTS */ - USART_CTL2(usart_periph) = ctl; -} - -/*! - \brief configure hardware flow control CTS - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] ctsconfig: enable or disable CTS - only one parameter can be selected which is shown as below: - \arg USART_CTS_ENABLE: enable CTS - \arg USART_CTS_DISABLE: disable CTS - \param[out] none - \retval none -*/ -void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL2(usart_periph); - ctl &= ~USART_CTL2_CTSEN; - ctl |= ctsconfig; - /* configure CTS */ - USART_CTL2(usart_periph) = ctl; -} - -/*! - \brief configure break frame coherence mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] bcm: - only one parameter can be selected which is shown as below: - \arg USART_BCM_NONE: no parity error is detected - \arg USART_BCM_EN: parity error is detected - \param[out] none - \retval none -*/ -void usart_break_frame_coherence_config(uint32_t usart_periph, uint32_t bcm) -{ - USART_CHC(usart_periph) &= ~(USART_CHC_BCM); - USART_CHC(usart_periph) |= (USART_CHC_BCM & bcm); -} - -/*! - \brief configure parity check coherence mode - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] pcm: - only one parameter can be selected which is shown as below: - \arg USART_PCM_NONE: not check parity - \arg USART_PCM_EN: check the parity - \param[out] none - \retval none -*/ -void usart_parity_check_coherence_config(uint32_t usart_periph, uint32_t pcm) -{ - USART_CHC(usart_periph) &= ~(USART_CHC_PCM); - USART_CHC(usart_periph) |= (USART_CHC_PCM & pcm); -} - -/*! - \brief configure hardware flow control coherence mode - \param[in] usart_periph: USARTx(x=0,1,2,5) - \param[in] hcm: - only one parameter can be selected which is shown as below: - \arg USART_HCM_NONE: nRTS signal equals to the rxne status register - \arg USART_HCM_EN: nRTS signal is set when the last data bit has been sampled - \param[out] none - \retval none -*/ -void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm) -{ - USART_CHC(usart_periph) &= ~(USART_CHC_HCM); - USART_CHC(usart_periph) |= (USART_CHC_HCM & hcm); -} - -/*! - \brief configure USART DMA for reception - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] dmacmd: enable or disable DMA for reception - only one parameter can be selected which is shown as below: - \arg USART_DENR_ENABLE: DMA enable for reception - \arg USART_DENR_DISABLE: DMA disable for reception - \param[out] none - \retval none -*/ -void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL2(usart_periph); - ctl &= ~USART_CTL2_DENR; - ctl |= dmacmd; - /* configure DMA reception */ - USART_CTL2(usart_periph) = ctl; -} - -/*! - \brief configure USART DMA for transmission - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] dmacmd: enable or disable DMA for transmission - only one parameter can be selected which is shown as below: - \arg USART_DENT_ENABLE: DMA enable for transmission - \arg USART_DENT_DISABLE: DMA disable for transmission - \param[out] none - \retval none -*/ -void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd) -{ - uint32_t ctl = 0U; - - ctl = USART_CTL2(usart_periph); - ctl &= ~USART_CTL2_DENT; - ctl |= dmacmd; - /* configure DMA transmission */ - USART_CTL2(usart_periph) = ctl; -} - -/*! - \brief get USART flag status - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] flag: USART flags, refer to usart_flag_enum - only one parameter can be selected which is shown as below: - \arg USART_FLAG_CTS: CTS change flag - \arg USART_FLAG_LBD: LIN break detected flag - \arg USART_FLAG_TBE: transmit data buffer empty - \arg USART_FLAG_TC: transmission complete - \arg USART_FLAG_RBNE: read data buffer not empty - \arg USART_FLAG_IDLE: IDLE frame detected flag - \arg USART_FLAG_ORERR: overrun error - \arg USART_FLAG_NERR: noise error flag - \arg USART_FLAG_FERR: frame error flag - \arg USART_FLAG_PERR: parity error flag - \arg USART_FLAG_BSY: busy flag - \arg USART_FLAG_EB: end of block flag - \arg USART_FLAG_RT: receiver timeout flag - \arg USART_FLAG_EPERR: early parity error flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag) -{ - if(RESET != (USART_REG_VAL(usart_periph, flag) & BIT(USART_BIT_POS(flag)))) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear USART flag status - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] flag: USART flags, refer to usart_flag_enum - only one parameter can be selected which is shown as below: - \arg USART_FLAG_CTS: CTS change flag - \arg USART_FLAG_LBD: LIN break detected flag - \arg USART_FLAG_TC: transmission complete - \arg USART_FLAG_RBNE: read data buffer not empty - \arg USART_FLAG_EB: end of block flag - \arg USART_FLAG_RT: receiver timeout flag - \arg USART_FLAG_EPERR: early parity error flag - \param[out] none - \retval none -*/ -void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag) -{ - if (USART_FLAG_EPERR == flag) { - USART_REG_VAL(usart_periph, flag) &= ~BIT(USART_BIT_POS(flag)); - } else { - USART_REG_VAL(usart_periph, flag) = ~BIT(USART_BIT_POS(flag)); - } -} - -/*! - \brief enable USART interrupt - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] interrupt: USART interrupts, refer to usart_interrupt_enum - only one parameter can be selected which is shown as below: - \arg USART_INT_PERR: parity error interrupt - \arg USART_INT_TBE: transmitter buffer empty interrupt - \arg USART_INT_TC: transmission complete interrupt - \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt - \arg USART_INT_IDLE: IDLE line detected interrupt - \arg USART_INT_LBD: LIN break detected interrupt - \arg USART_INT_ERR: error interrupt - \arg USART_INT_CTS: CTS interrupt - \arg USART_INT_RT: interrupt enable bit of receive timeout event - \arg USART_INT_EB: interrupt enable bit of end of block event - \param[out] none - \retval none -*/ -void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt) -{ - USART_REG_VAL(usart_periph, interrupt) |= BIT(USART_BIT_POS(interrupt)); -} - -/*! - \brief disable USART interrupt - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] interrupt: USART interrupts, refer to usart_interrupt_enum - only one parameter can be selected which is shown as below: - \arg USART_INT_PERR: parity error interrupt - \arg USART_INT_TBE: transmitter buffer empty interrupt - \arg USART_INT_TC: transmission complete interrupt - \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt - \arg USART_INT_IDLE: IDLE line detected interrupt - \arg USART_INT_LBD: LIN break detected interrupt - \arg USART_INT_ERR: error interrupt - \arg USART_INT_CTS: CTS interrupt - \arg USART_INT_RT: interrupt enable bit of receive timeout event - \arg USART_INT_EB: interrupt enable bit of end of block event - \param[out] none - \retval none -*/ -void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt) -{ - USART_REG_VAL(usart_periph, interrupt) &= ~BIT(USART_BIT_POS(interrupt)); -} - -/*! - \brief get USART interrupt and flag status - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] int_flag: USART interrupt flags, refer to usart_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg USART_INT_FLAG_PERR: parity error interrupt and flag - \arg USART_INT_FLAG_TBE: transmitter buffer empty interrupt and flag - \arg USART_INT_FLAG_TC: transmission complete interrupt and flag - \arg USART_INT_FLAG_RBNE: read data buffer not empty interrupt and flag - \arg USART_INT_FLAG_RBNE_ORERR: read data buffer not empty interrupt and overrun error flag - \arg USART_INT_FLAG_IDLE: IDLE line detected interrupt and flag - \arg USART_INT_FLAG_LBD: LIN break detected interrupt and flag - \arg USART_INT_FLAG_CTS: CTS interrupt and flag - \arg USART_INT_FLAG_ERR_ORERR: error interrupt and overrun error - \arg USART_INT_FLAG_ERR_NERR: error interrupt and noise error flag - \arg USART_INT_FLAG_ERR_FERR: error interrupt and frame error flag - \arg USART_INT_FLAG_EB: interrupt enable bit of end of block event and flag - \arg USART_INT_FLAG_RT: interrupt enable bit of receive timeout event and flag - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag) -{ - uint32_t intenable = 0U, flagstatus = 0U; - /* get the interrupt enable bit status */ - intenable = (USART_REG_VAL(usart_periph, int_flag) & BIT(USART_BIT_POS(int_flag))); - /* get the corresponding flag bit status */ - flagstatus = (USART_REG_VAL2(usart_periph, int_flag) & BIT(USART_BIT_POS2(int_flag))); - - if((0U != flagstatus) && (0U != intenable)) { - return SET; - } else { - return RESET; - } -} - -/*! - \brief clear interrupt flag and flag status - \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7) - \param[in] int_flag: USART interrupt flags, refer to usart_interrupt_flag_enum - only one parameter can be selected which is shown as below: - \arg USART_INT_FLAG_CTS: CTS change flag - \arg USART_INT_FLAG_LBD: LIN break detected flag - \arg USART_INT_FLAG_TC: transmission complete - \arg USART_INT_FLAG_RBNE: read data buffer not empty - \arg USART_INT_FLAG_EB: end of block flag - \arg USART_INT_FLAG_RT: receiver timeout flag - \param[out] none - \retval none -*/ -void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag) -{ - USART_REG_VAL2(usart_periph, int_flag) = ~BIT(USART_BIT_POS2(int_flag)); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c deleted file mode 100644 index caf9c7c5705..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c +++ /dev/null @@ -1,141 +0,0 @@ -/*! - \file gd32f5xx_wwdgt.c - \brief WWDGT driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "gd32f5xx_wwdgt.h" - -/*! - \brief reset the window watchdog timer configuration - \param[in] none - \param[out] none - \retval none -*/ -void wwdgt_deinit(void) -{ - rcu_periph_reset_enable(RCU_WWDGTRST); - rcu_periph_reset_disable(RCU_WWDGTRST); -} - -/*! - \brief start the window watchdog timer counter - \param[in] none - \param[out] none - \retval none -*/ -void wwdgt_enable(void) -{ - WWDGT_CTL |= WWDGT_CTL_WDGTEN; -} - -/*! - \brief configure the window watchdog timer counter value - \param[in] counter_value: 0x00 - 0x7F - \param[out] none - \retval none -*/ -void wwdgt_counter_update(uint16_t counter_value) -{ - WWDGT_CTL = (uint32_t)(CTL_CNT(counter_value)); -} - -/*! - \brief configure counter value, window value, and prescaler divider value - \param[in] counter: 0x00 - 0x7F - \param[in] window: 0x00 - 0x7F - \param[in] prescaler: wwdgt prescaler value - only one parameter can be selected which is shown as below: - \arg WWDGT_CFG_PSC_DIV1 : the time base of window watchdog counter = (PCLK1/4096)/1 - \arg WWDGT_CFG_PSC_DIV2 : the time base of window watchdog counter = (PCLK1/4096)/2 - \arg WWDGT_CFG_PSC_DIV4 : the time base of window watchdog counter = (PCLK1/4096)/4 - \arg WWDGT_CFG_PSC_DIV8 : the time base of window watchdog counter = (PCLK1/4096)/8 - \arg WWDGT_CFG_PSC_DIV16 : the time base of window watchdog counter = (PCLK1/4096)/16 - \arg WWDGT_CFG_PSC_DIV32 : the time base of window watchdog counter = (PCLK1/4096)/32 - \arg WWDGT_CFG_PSC_DIV64 : the time base of window watchdog counter = (PCLK1/4096)/64 - \arg WWDGT_CFG_PSC_DIV128 : the time base of window watchdog counter = (PCLK1/4096)/128 - \arg WWDGT_CFG_PSC_DIV256 : the time base of window watchdog counter = (PCLK1/4096)/256 - \arg WWDGT_CFG_PSC_DIV512 : the time base of window watchdog counter = (PCLK1/4096)/512 - \arg WWDGT_CFG_PSC_DIV1024 : the time base of window watchdog counter = (PCLK1/4096)/1024 - \arg WWDGT_CFG_PSC_DIV2048 : the time base of window watchdog counter = (PCLK1/4096)/2048 - \arg WWDGT_CFG_PSC_DIV4096 : the time base of window watchdog counter = (PCLK1/4096)/4096 - \arg WWDGT_CFG_PSC_DIV8192 : the time base of window watchdog counter = (PCLK1/4096)/8192 - \arg WWDGT_CFG_PSC_DIV16384 : the time base of window watchdog counter = (PCLK1/4096)/16384 - \arg WWDGT_CFG_PSC_DIV32768 : the time base of window watchdog counter = (PCLK1/4096)/32768 - \arg WWDGT_CFG_PSC_DIV65536 : the time base of window watchdog counter = (PCLK1/4096)/65536 - \arg WWDGT_CFG_PSC_DIV131072: the time base of window watchdog counter = (PCLK1/4096)/131072 - \arg WWDGT_CFG_PSC_DIV262144: the time base of window watchdog counter = (PCLK1/4096)/262144 - \param[out] none - \retval none -*/ -void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler) -{ - /* configure WIN and PSC bits, configure CNT bit */ - WWDGT_CTL = (uint32_t)(CTL_CNT(counter)); - WWDGT_CFG = (uint32_t)(CFG_WIN(window) | prescaler); -} - -/*! - \brief check early wakeup interrupt state of WWDGT - \param[in] none - \param[out] none - \retval FlagStatus: SET or RESET -*/ -FlagStatus wwdgt_flag_get(void) -{ - if(RESET != (WWDGT_STAT & WWDGT_STAT_EWIF)) { - return SET; - } - - return RESET; -} - -/*! - \brief clear early wakeup interrupt state of WWDGT - \param[in] none - \param[out] none - \retval none -*/ -void wwdgt_flag_clear(void) -{ - WWDGT_STAT = (uint32_t)(RESET); -} - -/*! - \brief enable early wakeup interrupt of WWDGT - \param[in] none - \param[out] none - \retval none -*/ -void wwdgt_interrupt_enable(void) -{ - WWDGT_CFG |= WWDGT_CFG_EWIE; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h deleted file mode 100644 index c531d51ae1a..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_core.h +++ /dev/null @@ -1,316 +0,0 @@ -/*! - \file audio_core.h - \brief the header file of USB audio device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef AUDIO_CORE_H -#define AUDIO_CORE_H - -#include "usbd_enum.h" - -#define FORMAT_24BIT(x) (uint8_t)(x);(uint8_t)((x) >> 8);(uint8_t)((x) >> 16) - -/* number of sub-packets in the audio transfer buffer. you can modify this value but always make sure - that it is an even number and higher than 3 */ -#define OUT_PACKET_NUM 200U - -/* total size of the audio transfer buffer */ -#define OUT_BUF_MARGIN 0U -#define TOTAL_OUT_BUF_SIZE ((uint32_t)((SPEAKER_OUT_PACKET + OUT_BUF_MARGIN) * OUT_PACKET_NUM)) - -/* audio configuration descriptor length and interface descriptor size */ -#define AD_CONFIG_DESC_SET_LEN (sizeof(usb_desc_config_set)) -#define AD_INTERFACE_DESC_SIZE 9U - -/* audio standard endpoint and streaming endpoint descriptor size */ -#define USB_AD_DESC_SIZ 0x09U /*!< audio descriptor size */ -#define AD_STANDARD_EP_DESC_SIZE 0x09U /*!< audio standard endpoint descriptor size */ -#define AD_STREAMING_EP_DESC_SIZE 0x07U /*!< audio streaming endpoint descriptor size */ - -/* audio interface class code */ -#define USB_CLASS_AUDIO 0x01U - -/* audio interface subclass codes */ -#define AD_SUBCLASS_CONTROL 0x01U /*!< audio interface control */ -#define AD_SUBCLASS_AUDIOSTREAMING 0x02U /*!< audio interface audiostreaming */ -#define AD_SUBCLASS_MIDISTREAMING 0x03U /*!< audio interface midistreaming */ - -/* audio interface protocol codes */ -#define AD_PROTOCOL_UNDEFINED 0x00U /*!< audio interface undefined */ -#define AD_STREAMING_GENERAL 0x01U /*!< audio interface streaming general */ -#define AD_STREAMING_FORMAT_TYPE 0x02U /*!< audio interface streaming format type */ - -/* audio class-specific descriptor types */ -#define AD_DESCTYPE_UNDEFINED 0x20U /*!< audio class-specific descriptor undefined */ -#define AD_DESCTYPE_DEVICE 0x21U /*!< audio device descriptor */ -#define AD_DESCTYPE_CONFIGURATION 0x22U /*!< audio configuration descriptor */ -#define AD_DESCTYPE_STRING 0x23U /*!< audio string descriptor */ -#define AD_DESCTYPE_INTERFACE 0x24U /*!< audio interface descriptor */ -#define AD_DESCTYPE_ENDPOINT 0x25U /*!< audio endpoint descriptor */ - -/* audio control interface descriptor subtypes */ -#define AD_CONTROL_HEADER 0x01U /*!< audio control interface header descriptor */ -#define AD_CONTROL_INPUT_TERMINAL 0x02U /*!< audio control interface input terminal descriptor */ -#define AD_CONTROL_OUTPUT_TERMINAL 0x03U /*!< audio control interface output terminal descriptor */ -#define AD_CONTROL_MIXER_UNIT 0x04U /*!< audio control interface maximum unit descriptor */ -#define AD_CONTROL_SELECTOR_UNIT 0x05U /*!< audio control interface selector unit descriptor */ -#define AD_CONTROL_FEATURE_UNIT 0x06U /*!< audio control interface feature unit descriptor */ -#define AD_CONTROL_PROCESSING_UNIT 0x07U /*!< audio control interface processing unit descriptor */ -#define AD_CONTROL_EXTENSION_UNIT 0x08U /*!< audio control interface extension unit descriptor */ - -/* audio input/output terminal and streaming interface descriptor size */ -#define AD_INPUT_TERMINAL_DESC_SIZE 0x0CU /*!< audio input terminal interface descriptor size */ -#define AD_OUTPUT_TERMINAL_DESC_SIZE 0x09U /*!< audio output terminal interface descriptor size */ -#define AD_STREAMING_INTERFACE_DESC_SIZE 0x07U /*!< audio streaming interface descriptor size */ - -/* audio control types */ -#define AD_CONTROL_MUTE 0x01U /*!< audio control mute type */ -#define AD_CONTROL_VOLUME 0x02U /*!< audio control volume type */ - -/* audio format types */ -#define AD_FORMAT_TYPE_I 0x01U /*!< audio format typeI */ -#define AD_FORMAT_TYPE_III 0x03U /*!< audio format typeIII */ - -/* endpoint types */ -#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01U /*!< audio isochronous endpoint type */ -#define AD_ENDPOINT_GENERAL 0x01U /*!< audio general endpoint type */ - -/* audio request types */ -#define AD_REQ_UNDEFINED 0x00U /*!< audio undefined request */ -#define AD_REQ_SET_CUR 0x01U /*!< current setting attribute request */ -#define AD_REQ_GET_CUR 0x81U /*!< current getting attribute request */ -#define AD_REQ_SET_MIN 0x02U /*!< setting minimum range attribute request */ -#define AD_REQ_GET_MIN 0x82U /*!< getting minimum range attribute request */ -#define AD_REQ_SET_MAX 0x03U /*!< setting maximum range attribute request */ -#define AD_REQ_GET_MAX 0x83U /*!< getting maximum range attribute request */ -#define AD_REQ_SET_RES 0x04U /*!< setting range attribute request */ -#define AD_REQ_GET_RES 0x84U /*!< getting range attribute request */ -#define AD_REQ_SET_MEM 0x05U /*!< setting memory attribute request */ -#define AD_REQ_GET_MEM 0x85U /*!< getting memory attribute request */ -#define AD_REQ_GET_STAT 0xFFU /*!< getting state request */ - -/* streaming control types */ -#define AD_OUT_STREAMING_CTRL 0x05U /*!< audio streaming control OUT */ -#define AD_IN_STREAMING_CTRL 0x02U /*!< audio streaming control IN */ - -/* audio stream interface number */ -enum { -#ifdef USE_USB_AD_MICPHONE - MIC_INTERFACE_COUNT, /*!< audio microphone interface count */ -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - SPEAK_INTERFACE_COUNT, /*!< audio speaker interface count */ -#endif /* USE_USB_AD_SPEAKER */ - CONFIG_DESC_AS_ITF_COUNT /*!< audio system interface count */ -}; - -/* audio interface descriptor total length */ -#define AC_ITF_TOTAL_LEN (sizeof(usb_desc_AC_itf) + CONFIG_DESC_AS_ITF_COUNT*(sizeof(usb_desc_input_terminal) + \ - sizeof(usb_desc_mono_feature_unit) + sizeof(usb_desc_output_terminal))) - -#pragma pack(1) - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< header descriptor subtype */ - uint16_t bcdADC; /*!< audio device class specification release number in binary-coded decimal */ - uint16_t wTotalLength; /*!< total number of bytes */ - uint8_t bInCollection; /*!< the number of the streaming interfaces */ -#ifdef USE_USB_AD_MICPHONE - uint8_t baInterfaceNr0; /*!< interface number of the streaming interfaces */ -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - uint8_t baInterfaceNr1; /*!< interface number of the streaming interfaces */ -#endif /* USE_USB_AD_SPEAKER */ -} usb_desc_AC_itf; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< general audio system descriptor subtype */ - uint8_t bTerminalLink; /*!< the terminal ID */ - uint8_t bDelay; /*!< delay introduced by the data path */ - uint16_t wFormatTag; /*!< the audio data format */ -} usb_desc_AS_itf; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< input terminal descriptor subtype. */ - uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ - uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ - uint8_t bAssocTerminal; /*!< ID of the output terminal */ - uint8_t bNrChannels; /*!< number of logical output channels */ - uint16_t wChannelConfig; /*!< describes the spatial location of the logical channels */ - uint8_t iChannelNames; /*!< index of a string descriptor */ - uint8_t iTerminal; /*!< index of a string descriptor */ -} usb_desc_input_terminal; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< output terminal descriptor subtype */ - uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ - uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ - uint8_t bAssocTerminal; /*!< constant, identifying the input terminal to which this output terminal is associated */ - uint8_t bSourceID; /*!< ID of the unit or terminal */ - uint8_t iTerminal; /*!< index of a string descriptor */ -} usb_desc_output_terminal; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< feature unit descriptor subtype */ - uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ - uint8_t bSourceID; /*!< ID of the unit or terminal */ - uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ - uint8_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ - uint8_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ - uint8_t iFeature; /*!< index of a string descriptor */ -} usb_desc_mono_feature_unit; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< feature unit descriptor subtype */ - uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ - uint8_t bSourceID; /*!< ID of the unit or terminal */ - uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ - uint16_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ - uint16_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ - uint16_t bmaControls2; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 2 */ - uint8_t iFeature; /*!< index of a string descriptor */ -} usb_desc_stereo_feature_unit; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< format type descriptor subtype */ - uint8_t bFormatType; /*!< constant identifying the format type */ - uint8_t bNrChannels; /*!< indicates the number of physical channels in the audio data stream */ - uint8_t bSubFrameSize; /*!< the number of bytes occupied by one audio subframe */ - uint8_t bBitResolution; /*!< the number of effectively used bits from the available bits in an audio subframe */ - uint8_t bSamFreqType; /*!< indicates how the sampling frequency can be programmed */ - uint8_t bSamFreq[3]; /*!< sampling frequency ns in Hz for this isochronous data endpoint */ -} usb_desc_format_type; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bEndpointAddress; /*!< the address of the endpoint */ - uint8_t bmAttributes; /*!< transfer type and synchronization type */ - uint16_t wMaxPacketSize; /*!< maximum packet size this endpoint is capable of sending or receiving */ - uint8_t bInterval; /*!< left to the designer's discretion */ - uint8_t bRefresh; /*!< reset to 0 */ - uint8_t bSynchAddress; /*!< reset to 0 */ -} usb_desc_std_ep; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bDescriptorSubtype; /*!< general endpoint descriptor subtype */ - uint8_t bmAttributes; /*!< transfer type and synchronization type */ - uint8_t bLockDelayUnits; /*!< indicates the units used for the lock delay field */ - uint16_t wLockDelay; /*!< indicates the time it takes this endpoint to reliably lock its internal clock recovery circuitry */ -} usb_desc_AS_ep; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bEndpointAddress; /*!< general endpoint descriptor subtype */ - uint8_t bmAttributes; /*!< transfer type and synchronization type */ - uint16_t wMaxPacketSize; /*!< maximum packet size this endpoint is capable of sending or receiving */ - uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an interrupt or isochronous type */ - uint8_t Refresh; /*!< refresh 1~9, power of 2 */ - uint8_t bSynchAddress; /*!< synchronous address */ -} usb_desc_FeedBack_ep; - -#pragma pack() - -/* USB configuration descriptor structure */ -typedef struct { - usb_desc_config config; /*!< configuration descriptor */ - usb_desc_itf std_itf; /*!< interface descriptor */ - usb_desc_AC_itf ac_itf; /*!< audio controller interface descriptor */ - -#ifdef USE_USB_AD_MICPHONE - usb_desc_input_terminal mic_in_terminal; /*!< microphone input terminal descriptor */ - usb_desc_mono_feature_unit mic_feature_unit; /*!< microphone feature unit descriptor */ - usb_desc_output_terminal mic_out_terminal; /*!< microphone output terminal descriptor */ -#endif - -#ifdef USE_USB_AD_SPEAKER - usb_desc_input_terminal speak_in_terminal; /*!< speaker input terminal descriptor */ - usb_desc_mono_feature_unit speak_feature_unit; /*!< speaker feature unit descriptor */ - usb_desc_output_terminal speak_out_terminal; /*!< speaker output terminal descriptor */ -#endif /* USE_USB_AD_SPEAKER */ - -#ifdef USE_USB_AD_MICPHONE - usb_desc_itf mic_std_as_itf_zeroband; /*!< microphone zeroband configuration standard audio streaming interface descriptor */ - usb_desc_itf mic_std_as_itf_opera; /*!< microphone standard audio streaming interface descriptor */ - usb_desc_AS_itf mic_as_itf; /*!< microphone audio correlation descriptor */ - usb_desc_format_type mic_format_typeI; /*!< microphone typeI format type descriptor */ - usb_desc_std_ep mic_std_endpoint; /*!< microphone standard endpoint descriptor */ - usb_desc_AS_ep mic_as_endpoint; /*!< microphone audio dependent isochronous data endpoint descriptor */ -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - usb_desc_itf speak_std_as_itf_zeroband; /*!< speaker zeroband configuration standard audio streaming interface descriptor */ - usb_desc_itf speak_std_as_itf_opera; /*!< speaker standard audio streaming interface descriptor */ - usb_desc_AS_itf speak_as_itf; /*!< speaker audio correlation descriptor */ - usb_desc_format_type speak_format_typeI; /*!< speaker typeI format type descriptor */ - usb_desc_std_ep speak_std_endpoint; /*!< speaker standard endpoint descriptor */ - usb_desc_AS_ep speak_as_endpoint; /*!< speaker audio dependent isochronous data endpoint descriptor */ - usb_desc_FeedBack_ep speak_feedback_endpoint; /*!< speaker feedback endpoint descriptor */ -#endif /* USE_USB_AD_SPEAKER */ -} usb_desc_config_set; - -typedef struct { - /* main buffer for audio data OUT transfers and its relative pointers */ - uint8_t isoc_out_buff[TOTAL_OUT_BUF_SIZE]; /*!< audio isochronous OUT data buff */ - uint8_t* isoc_out_wrptr; /*!< audio isochronous OUT data write pointer */ - uint8_t* isoc_out_rdptr; /*!< audio isochronous OUT data read pointer */ - uint16_t buf_free_size; /*!< audio data buff free size */ - uint16_t dam_tx_len; /*!< audio amplifier transmit length */ - - __IO uint32_t actual_freq; /*!< audio actual frequency */ - __IO uint8_t play_flag; /*!< audio play flag */ - uint8_t feedback_freq[3]; /*!< audio feedback frequency */ - uint32_t cur_sam_freq; /*!< audio current sampling frequency */ - - /* USB receive buffer */ - uint8_t usb_rx_buffer[SPEAKER_OUT_MAX_PACKET]; - - /* main buffer for audio control requests transfers and its relative variables */ - uint8_t audioctl[64]; /*!< audio control requests transfers buff */ - uint8_t audioctl_unit; /*!< audio control requests unit */ - uint32_t audioctl_len; /*!< audio control requests length */ -} usbd_audio_handler; - -extern usb_desc audio_desc; -extern usb_class_core usbd_audio_cb; -extern usbd_audio_handler audio_handler; - -#endif /* AUDIO_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h deleted file mode 100644 index 949cee91146..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Include/audio_out_itf.h +++ /dev/null @@ -1,48 +0,0 @@ -/*! - \file audio_out_itf.h - \brief audio OUT (playback) interface header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef AUDIO_OUT_ITF_H -#define AUDIO_OUT_ITF_H - -#include "usbd_conf.h" - -typedef struct { - uint8_t (*audio_init)(uint32_t audio_freq, uint32_t volume); - uint8_t (*audio_deinit)(void); - uint8_t (*audio_cmd)(uint8_t* pbuf, uint32_t size, uint8_t cmd); -} audio_fops_struct; - -extern audio_fops_struct audio_out_fops; - -#endif /* AUDIO_OUT_ITF_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c deleted file mode 100644 index 9c62646440b..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_core.c +++ /dev/null @@ -1,951 +0,0 @@ -/*! - \file audio_core.c - \brief USB audio device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "audio_out_itf.h" -#include "audio_core.h" -#include - -#define USBD_VID 0x28E9U -#define USBD_PID 0x9574U - -#define VOL_MIN 0U /* volume minimum value */ -#define VOL_MAX 100U /* volume maximum value */ -#define VOL_RES 1U /* volume resolution */ -#define VOL_0dB 70U /* 0dB is in the middle of VOL_MIN and VOL_MAX */ - -#ifdef USE_USB_AD_MICPHONE -extern volatile uint32_t count_data; -extern const char wavetestdata[]; -#define LENGTH_DATA (1747U * 32U) -#endif /* USE_USB_AD_MICPHONE */ - -__ALIGN_BEGIN usbd_audio_handler audio_handler __ALIGN_END; - -/* local function prototypes ('static') */ -static uint8_t audio_init(usb_dev *udev, uint8_t config_index); -static uint8_t audio_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t audio_req_handler(usb_dev *udev, usb_req *req); -static uint8_t audio_set_intf(usb_dev *udev, usb_req *req); -static uint8_t audio_ctlx_out(usb_dev *udev); -static uint8_t audio_data_in(usb_dev *udev, uint8_t ep_num); -static uint8_t audio_data_out(usb_dev *udev, uint8_t ep_num); -static uint8_t audio_sof(usb_dev *udev); -static uint8_t audio_iso_in_incomplete(usb_dev *udev); -static uint8_t audio_iso_out_incomplete(usb_dev *udev); -static uint32_t usbd_audio_spk_get_feedback(usb_dev *udev); -static void get_feedback_fs_rate(uint32_t rate, uint8_t *buf); - -usb_class_core usbd_audio_cb = { - .init = audio_init, - .deinit = audio_deinit, - .req_proc = audio_req_handler, - .set_intf = audio_set_intf, - .ctlx_out = audio_ctlx_out, - .data_in = audio_data_in, - .data_out = audio_data_out, - .SOF = audio_sof, - .incomplete_isoc_in = audio_iso_in_incomplete, - .incomplete_isoc_out = audio_iso_out_incomplete -}; - -/* note:it should use the c99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev audio_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_desc_config_set audio_config_set __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = AD_CONFIG_DESC_SET_LEN, - .bNumInterfaces = 0x01U + CONFIG_DESC_AS_ITF_COUNT, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xC0U, - .bMaxPower = 0x32U - }, - - .std_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = AD_SUBCLASS_CONTROL, - .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, - .iInterface = 0x00U - }, - - .ac_itf = - { - .header = - { - .bLength = sizeof(usb_desc_AC_itf), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = 0x01U, - .bcdADC = 0x0100U, - .wTotalLength = AC_ITF_TOTAL_LEN, - .bInCollection = CONFIG_DESC_AS_ITF_COUNT, -#ifdef USE_USB_AD_MICPHONE - .baInterfaceNr0 = 0x01U, -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - .baInterfaceNr1 = 0x02U -#endif /* USE_USB_AD_SPEAKER */ - }, - -#ifdef USE_USB_AD_MICPHONE - .mic_in_terminal = - { - .header = - { - .bLength = sizeof(usb_desc_input_terminal), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = 0x02U, - .bTerminalID = 0x01U, - .wTerminalType = 0x0201U, - .bAssocTerminal = 0x00U, - .bNrChannels = 0x02U, - .wChannelConfig = 0x0003U, - .iChannelNames = 0x00U, - .iTerminal = 0x00U - }, - - .mic_feature_unit = - { - .header = - { - .bLength = sizeof(usb_desc_mono_feature_unit), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_CONTROL_FEATURE_UNIT, - .bUnitID = AD_IN_STREAMING_CTRL, - .bSourceID = 0x01U, - .bControlSize = 0x01U, - .bmaControls0 = AD_CONTROL_MUTE | AD_CONTROL_VOLUME, - .bmaControls1 = 0x00U, - .iFeature = 0x00U - }, - - .mic_out_terminal = - { - .header = - { - .bLength = sizeof(usb_desc_output_terminal), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_CONTROL_OUTPUT_TERMINAL, - .bTerminalID = 0x03U, - .wTerminalType = 0x0101U, - .bAssocTerminal = 0x00U, - .bSourceID = 0x02U, - .iTerminal = 0x00U - }, -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - .speak_in_terminal = - { - .header = - { - .bLength = sizeof(usb_desc_input_terminal), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_CONTROL_INPUT_TERMINAL, - .bTerminalID = 0x04U, - .wTerminalType = 0x0101U, - .bAssocTerminal = 0x00U, - .bNrChannels = 0x02U, - .wChannelConfig = 0x0003U, - .iChannelNames = 0x00U, - .iTerminal = 0x00U - }, - - .speak_feature_unit = - { - .header = - { - .bLength = sizeof(usb_desc_mono_feature_unit), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_CONTROL_FEATURE_UNIT, - .bUnitID = AD_OUT_STREAMING_CTRL, - .bSourceID = 0x04U, - .bControlSize = 0x01U, - .bmaControls0 = AD_CONTROL_MUTE | AD_CONTROL_VOLUME, - .bmaControls1 = 0x00U, - .iFeature = 0x00U - }, - - .speak_out_terminal = - { - .header = - { - .bLength = sizeof(usb_desc_output_terminal), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_CONTROL_OUTPUT_TERMINAL, - .bTerminalID = 0x06U, - .wTerminalType = 0x0301U, - .bAssocTerminal = 0x00U, - .bSourceID = 0x05U, - .iTerminal = 0x00U - }, -#endif /* USE_USB_AD_SPEAKER */ - -#ifdef USE_USB_AD_MICPHONE - .mic_std_as_itf_zeroband = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x01U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, - .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, - .iInterface = 0x00U - }, - - .mic_std_as_itf_opera = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x01U, - .bAlternateSetting = 0x01U, - .bNumEndpoints = 0x01U, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, - .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, - .iInterface = 0x00U - }, - - .mic_as_itf = - { - .header = - { - .bLength = sizeof(usb_desc_AS_itf), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_STREAMING_GENERAL, - .bTerminalLink = 0x03U, - .bDelay = 0x01U, - .wFormatTag = 0x0001U - }, - - .mic_format_typeI = - { - .header = - { - .bLength = sizeof(usb_desc_format_type), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_STREAMING_FORMAT_TYPE, - .bFormatType = AD_FORMAT_TYPE_I, - .bNrChannels = MIC_IN_CHANNEL_NBR, - .bSubFrameSize = 0x02U, - .bBitResolution = MIC_IN_BIT_RESOLUTION, - .bSamFreqType = 0x01U, - .bSamFreq[0] = (uint8_t)USBD_MIC_FREQ, - .bSamFreq[1] = USBD_MIC_FREQ >> 8, - .bSamFreq[2] = USBD_MIC_FREQ >> 16 - }, - - .mic_std_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_std_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = AD_IN_EP, - .bmAttributes = USB_ENDPOINT_TYPE_ISOCHRONOUS, - .wMaxPacketSize = MIC_IN_PACKET, - .bInterval = 0x01U, - .bRefresh = 0x00U, - .bSynchAddress = 0x00U - }, - - .mic_as_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_AS_ep), - .bDescriptorType = AD_DESCTYPE_ENDPOINT - }, - .bDescriptorSubtype = AD_ENDPOINT_GENERAL, - .bmAttributes = 0x00U, - .bLockDelayUnits = 0x00U, - .wLockDelay = 0x0000U - }, -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - .speak_std_as_itf_zeroband = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x02U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, - .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, - .iInterface = 0x00U - }, - - .speak_std_as_itf_opera = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x02U, - .bAlternateSetting = 0x01U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = AD_SUBCLASS_AUDIOSTREAMING, - .bInterfaceProtocol = AD_PROTOCOL_UNDEFINED, - .iInterface = 0x00U - }, - - .speak_as_itf = - { - .header = - { - .bLength = sizeof(usb_desc_AS_itf), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_STREAMING_GENERAL, - .bTerminalLink = 0x04U, - .bDelay = 0x01U, - .wFormatTag = 0x0001U - }, - - .speak_format_typeI = - { - .header = - { - .bLength = sizeof(usb_desc_format_type), - .bDescriptorType = AD_DESCTYPE_INTERFACE - }, - .bDescriptorSubtype = AD_STREAMING_FORMAT_TYPE, - .bFormatType = AD_FORMAT_TYPE_I, - .bNrChannels = SPEAKER_OUT_CHANNEL_NBR, - .bSubFrameSize = 0x02U, - .bBitResolution = SPEAKER_OUT_BIT_RESOLUTION, - .bSamFreqType = 0x01U, - .bSamFreq[0] = (uint8_t)USBD_SPEAKER_FREQ, - .bSamFreq[1] = USBD_SPEAKER_FREQ >> 8, - .bSamFreq[2] = USBD_SPEAKER_FREQ >> 16 - }, - - .speak_std_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_std_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = AD_OUT_EP, - .bmAttributes = USB_EP_ATTR_ISO | USB_EP_ATTR_ASYNC, - .wMaxPacketSize = SPEAKER_OUT_PACKET, - .bInterval = 0x01U, - .bRefresh = 0x00U, - .bSynchAddress = AD_FEEDBACK_IN_EP - }, - - .speak_as_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_AS_ep), - .bDescriptorType = AD_DESCTYPE_ENDPOINT - }, - .bDescriptorSubtype = AD_ENDPOINT_GENERAL, - .bmAttributes = 0x00U, - .bLockDelayUnits = 0x00U, - .wLockDelay = 0x0000U, - }, - - .speak_feedback_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_FeedBack_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = AD_FEEDBACK_IN_EP, - .bmAttributes = USB_EP_ATTR_ISO | USB_EP_ATTR_ASYNC | USB_EP_ATTR_FEEDBACK, - .wMaxPacketSize = FEEDBACK_IN_PACKET, - .bInterval = 0x01U, - .Refresh = FEEDBACK_IN_INTERVAL, /* refresh every 32(2^5) ms */ - .bSynchAddress = 0x00U - }, -#endif /* USE_USB_AD_SPEAKER */ -}; - -/* USB language ID descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(14U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'A', 'u', 'd', 'i', 'o'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB string descriptor */ -void *const usbd_audio_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -/* USB descriptor configure */ -usb_desc audio_desc = { - .dev_desc = (uint8_t *)&audio_dev_desc, - .config_desc = (uint8_t *)&audio_config_set, - .strings = usbd_audio_strings -}; - -/*! - \brief initialize the AUDIO device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_init(usb_dev *udev, uint8_t config_index) -{ - memset((void *)&audio_handler, 0U, sizeof(usbd_audio_handler)); - -#ifdef USE_USB_AD_MICPHONE - { - usb_desc_std_ep std_ep = audio_config_set.mic_std_endpoint; - - usb_desc_ep ep = { - .header = std_ep.header, - .bEndpointAddress = std_ep.bEndpointAddress, - .bmAttributes = std_ep.bmAttributes, - .wMaxPacketSize = std_ep.wMaxPacketSize, - .bInterval = std_ep.bInterval - }; - - /* initialize TX endpoint */ - usbd_ep_setup(udev, &ep); - } -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - { - audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; - audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; - - usb_desc_std_ep std_ep = audio_config_set.speak_std_endpoint; - - usb_desc_ep ep1 = { - .header = std_ep.header, - .bEndpointAddress = std_ep.bEndpointAddress, - .bmAttributes = std_ep.bmAttributes, - .wMaxPacketSize = SPEAKER_OUT_MAX_PACKET, - .bInterval = std_ep.bInterval - }; - - /* initialize RX endpoint */ - usbd_ep_setup(udev, &ep1); - - /* prepare OUT endpoint to receive next audio packet */ - usbd_ep_recev(udev, AD_OUT_EP, audio_handler.usb_rx_buffer, SPEAKER_OUT_MAX_PACKET); - - /* initialize the audio output hardware layer */ - if(USBD_OK != audio_out_fops.audio_init(USBD_SPEAKER_FREQ, DEFAULT_VOLUME)) { - return USBD_FAIL; - } - - usb_desc_FeedBack_ep feedback_ep = audio_config_set.speak_feedback_endpoint; - - usb_desc_ep ep2 = { - .header = feedback_ep.header, - .bEndpointAddress = feedback_ep.bEndpointAddress, - .bmAttributes = feedback_ep.bmAttributes, - .wMaxPacketSize = feedback_ep.wMaxPacketSize, - .bInterval = feedback_ep.bInterval - }; - - /* initialize TX endpoint */ - usbd_ep_setup(udev, &ep2); - } -#endif /* USE_USB_AD_SPEAKER */ - - return USBD_OK; -} - -/*! - \brief de-initialize the AUDIO device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_deinit(usb_dev *udev, uint8_t config_index) -{ -#ifdef USE_USB_AD_MICPHONE - /* deinitialize AUDIO endpoints */ - usbd_ep_clear(udev, AD_IN_EP); -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - /* deinitialize AUDIO endpoints */ - usbd_ep_clear(udev, AD_OUT_EP); - - /* deinitialize the audio output hardware layer */ - if(USBD_OK != audio_out_fops.audio_deinit()) { - return USBD_FAIL; - } - - /* deinitialize AUDIO endpoints */ - usbd_ep_clear(udev, AD_FEEDBACK_IN_EP); -#endif /* USE_USB_AD_SPEAKER */ - - return USBD_OK; -} - -/*! - \brief handle the AUDIO class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_req_handler(usb_dev *udev, usb_req *req) -{ - uint8_t status = REQ_NOTSUPP; - - usb_transc *transc_in = &udev->dev.transc_in[0]; - usb_transc *transc_out = &udev->dev.transc_out[0]; - - switch(req->bRequest) { - case AD_REQ_GET_CUR: - transc_in->xfer_buf = audio_handler.audioctl; - transc_in->remain_len = req->wLength; - - status = REQ_SUPP; - break; - - case AD_REQ_SET_CUR: - if(req->wLength) { - transc_out->xfer_buf = audio_handler.audioctl; - transc_out->remain_len = req->wLength; - - udev->dev.class_core->command = AD_REQ_SET_CUR; - - audio_handler.audioctl_len = req->wLength; - audio_handler.audioctl_unit = BYTE_HIGH(req->wIndex); - - status = REQ_SUPP; - } - break; - - case AD_REQ_GET_MIN: - *((uint16_t *)audio_handler.audioctl) = VOL_MIN; - transc_in->xfer_buf = audio_handler.audioctl; - transc_in->remain_len = req->wLength; - status = REQ_SUPP; - break; - - case AD_REQ_GET_MAX: - *((uint16_t *)audio_handler.audioctl) = VOL_MAX; - transc_in->xfer_buf = audio_handler.audioctl; - transc_in->remain_len = req->wLength; - status = REQ_SUPP; - break; - - case AD_REQ_GET_RES: - *((uint16_t *)audio_handler.audioctl) = VOL_RES; - transc_in->xfer_buf = audio_handler.audioctl; - transc_in->remain_len = req->wLength; - status = REQ_SUPP; - break; - - default: - break; - } - - return status; -} - -/*! - \brief handle the AUDIO set interface requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_set_intf(usb_dev *udev, usb_req *req) -{ - udev->dev.class_core->alter_set = req->wValue; - - if(0xFFU != req->wValue) { - if(0U != req->wValue) { - /* deinit audio handler */ - memset((void *)&audio_handler, 0U, sizeof(usbd_audio_handler)); - - audio_handler.play_flag = 0U; - audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; - audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; - - /* feedback calculate sample frequency */ - audio_handler.actual_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ); - get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); - - /* send feedback data of estimated frequency */ - usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); - } else { - /* stop audio output */ - audio_out_fops.audio_cmd(audio_handler.isoc_out_rdptr, SPEAKER_OUT_PACKET / 2U, AD_CMD_STOP); - - audio_handler.play_flag = 0U; - audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; - audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; - - usbd_fifo_flush(udev, AD_IN_EP); - usbd_fifo_flush(udev, AD_FEEDBACK_IN_EP); - usbd_fifo_flush(udev, AD_OUT_EP); - } - } - - return 0U; -} - -/*! - \brief handles the control transfer OUT callback - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_ctlx_out(usb_dev *udev) -{ -#ifdef USE_USB_AD_SPEAKER - /* handles audio control requests data */ - /* check if an audio_control request has been issued */ - if(AD_REQ_SET_CUR == udev->dev.class_core->command) { - /* in this driver, to simplify code, only SET_CUR request is managed */ - - /* check for which addressed unit the audio_control request has been issued */ - if(AD_OUT_STREAMING_CTRL == audio_handler.audioctl_unit) { - /* in this driver, to simplify code, only one unit is manage */ - - /* reset the audioctl_cmd variable to prevent re-entering this function */ - udev->dev.class_core->command = 0U; - - audio_handler.audioctl_len = 0U; - } - } -#endif /* USE_USB_AD_SPEAKER */ - - return USBD_OK; -} - -/*! - \brief handles the audio IN data stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_data_in(usb_dev *udev, uint8_t ep_num) -{ -#ifdef USE_USB_AD_MICPHONE - if(EP_ID(AD_IN_EP) == ep_num) { - if(count_data < LENGTH_DATA) { - /* Prepare next buffer to be sent: dummy data */ - usbd_ep_send(udev, AD_IN_EP, (uint8_t *)&wavetestdata[count_data], MIC_IN_PACKET); - count_data += MIC_IN_PACKET; - } else { - usbd_ep_send(udev, AD_IN_EP, (uint8_t *)wavetestdata, MIC_IN_PACKET); - count_data = MIC_IN_PACKET; - } - } -#endif /* USE_USB_AD_MICPHONE */ - -#ifdef USE_USB_AD_SPEAKER - if(EP_ID(AD_FEEDBACK_IN_EP) == ep_num) { - /* calculate feedback actual freq */ - audio_handler.actual_freq = usbd_audio_spk_get_feedback(udev); - get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); - - usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); - } -#endif /* USE_USB_AD_SPEAKER */ - - return USBD_OK; -} - -/*! - \brief handles the audio OUT data stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_data_out(usb_dev *udev, uint8_t ep_num) -{ - uint16_t usb_rx_length, tail_len; - - /* get receive length */ - usb_rx_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count; - - if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { - audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } else { - audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } - - /* free buffer enough to save RX data */ - if(audio_handler.buf_free_size > usb_rx_length) { - if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { - tail_len = audio_handler.isoc_out_buff + TOTAL_OUT_BUF_SIZE - audio_handler.isoc_out_wrptr; - - if(tail_len >= usb_rx_length) { - memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, usb_rx_length); - - /* increment the buffer pointer */ - audio_handler.isoc_out_wrptr += usb_rx_length; - - /* increment the Buffer pointer or roll it back when all buffers are full */ - if(audio_handler.isoc_out_wrptr >= (audio_handler.isoc_out_buff + TOTAL_OUT_BUF_SIZE)) { - /* all buffers are full: roll back */ - audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; - } - } else { - memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, tail_len); - /* adjust write pointer */ - audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; - - memcpy(audio_handler.isoc_out_wrptr, &audio_handler.usb_rx_buffer[tail_len], usb_rx_length - tail_len); - /* adjust write pointer */ - audio_handler.isoc_out_wrptr += usb_rx_length - tail_len; - } - } else { - memcpy(audio_handler.isoc_out_wrptr, audio_handler.usb_rx_buffer, usb_rx_length); - - /* increment the buffer pointer */ - audio_handler.isoc_out_wrptr += usb_rx_length; - } - } - - /* toggle the frame index */ - udev->dev.transc_out[ep_num].frame_num = (udev->dev.transc_out[ep_num].frame_num) ? 0U : 1U; - - /* prepare OUT endpoint to receive next audio packet */ - usbd_ep_recev(udev, AD_OUT_EP, audio_handler.usb_rx_buffer, SPEAKER_OUT_MAX_PACKET); - - if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { - audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } else { - audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } - - if((0U == audio_handler.play_flag) && (audio_handler.buf_free_size < TOTAL_OUT_BUF_SIZE / 2U)) { - /* enable start of streaming */ - audio_handler.play_flag = 1U; - - /* initialize the audio output hardware layer */ - if(USBD_OK != audio_out_fops.audio_cmd(audio_handler.isoc_out_rdptr, SPEAKER_OUT_MAX_PACKET / 2U, AD_CMD_PLAY)) { - return USBD_FAIL; - } - - audio_handler.dam_tx_len = SPEAKER_OUT_MAX_PACKET; - } - - return USBD_OK; -} - -/*! - \brief handles the SOF event (data buffer update and synchronization) - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_sof(usb_dev *udev) -{ - return USBD_OK; -} - -/*! - \brief handles the audio ISO IN Incomplete event - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_iso_in_incomplete(usb_dev *udev) -{ - (void)usb_txfifo_flush(&udev->regs, EP_ID(AD_FEEDBACK_IN_EP)); - - audio_handler.actual_freq = usbd_audio_spk_get_feedback(udev); - get_feedback_fs_rate(audio_handler.actual_freq, audio_handler.feedback_freq); - - /* send feedback data of estimated frequency */ - usbd_ep_send(udev, AD_FEEDBACK_IN_EP, audio_handler.feedback_freq, FEEDBACK_IN_PACKET); - - return USBD_OK; -} - -/*! - \brief handles the audio ISO OUT Incomplete event - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t audio_iso_out_incomplete(usb_dev *udev) -{ - return USBD_OK; -} - -/*! - \brief calculate feedback sample frequency - \param[in] udev: pointer to USB device instance - \param[out] none - \retval feedback frequency value -*/ -static uint32_t usbd_audio_spk_get_feedback(usb_dev *udev) -{ - static uint32_t fb_freq; - - /* calculate buffer free size */ - if(audio_handler.isoc_out_wrptr >= audio_handler.isoc_out_rdptr) { - audio_handler.buf_free_size = TOTAL_OUT_BUF_SIZE + audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } else { - audio_handler.buf_free_size = audio_handler.isoc_out_rdptr - audio_handler.isoc_out_wrptr; - } - - /* calculate feedback frequency */ - if(audio_handler.buf_free_size <= (TOTAL_OUT_BUF_SIZE / 4U)) { - fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ) - FEEDBACK_FREQ_OFFSET; - } else if(audio_handler.buf_free_size >= (TOTAL_OUT_BUF_SIZE * 3U / 4U)) { - fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ) + FEEDBACK_FREQ_OFFSET; - } else { - fb_freq = I2S_ACTUAL_SAM_FREQ(USBD_SPEAKER_FREQ); - } - - return fb_freq; -} - -/*! - \brief get feedback value from rate in USB full speed - \param[in] rate: sample frequency - \param[in] buf: pointer to result buffer - \param[out] none - \retval none -*/ -static void get_feedback_fs_rate(uint32_t rate, uint8_t *buf) -{ - rate = ((rate / 1000U) << 14) | ((rate % 1000U) << 4); - - buf[0] = rate; - buf[1] = rate >> 8; - buf[2] = rate >> 16; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c deleted file mode 100644 index 1eda0cb68fc..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/audio/Source/audio_out_itf.c +++ /dev/null @@ -1,167 +0,0 @@ -/*! - \file audio_out_itf.c - \brief audio OUT (playback) interface functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "audio_core.h" -#include "audio_out_itf.h" - -/* local function prototypes ('static') */ -static uint8_t init(uint32_t audio_freq, uint32_t volume); -static uint8_t deinit(void); -static uint8_t audio_cmd(uint8_t *pbuf, uint32_t size, uint8_t cmd); - -/* local variable defines */ -static uint8_t audio_state = AD_STATE_INACTIVE; - -audio_fops_struct audio_out_fops = { - .audio_init = init, - .audio_deinit = deinit, - .audio_cmd = audio_cmd -}; - -/*! - \brief initialize and configures all required resources - \param[in] audio_freq: statrt_up audio frequency - \param[in] volume: start_up volume to be set - \param[out] none - \retval AD_OK if all operations succeed, otherwise, AD_FAIL. -*/ -static uint8_t init(uint32_t audio_freq, uint32_t volume) -{ - static uint32_t initialized = 0U; - - /* check if the low layer has already been initialized */ - if(0U == initialized) { - /* initialize GPIO */ - codec_gpio_init(); - - /* initialize I2S */ - codec_audio_interface_init(audio_freq); - - /* initialize DMA */ - codec_i2s_dma_init(); - - /* prevent reinitializing the interface again */ - initialized = 1U; - } - - /* update the audio state machine */ - audio_state = AD_STATE_ACTIVE; - - return AD_OK; -} - -/*! - \brief free all resources used by low layer and stops audio-play function - \param[in] none - \param[out] none - \retval AD_OK if all operations succeed, otherwise, AD_FAIL. -*/ -static uint8_t deinit(void) -{ - /* update the audio state machine */ - audio_state = AD_STATE_INACTIVE; - - return AD_OK; -} - -/*! - \brief play, stop, pause or resume current file - \param[in] pbuf: address from which file should be played - \param[in] size: size of the current buffer/file - \param[in] cmd: command to be executed, can be: - \arg AD_CMD_PLAY - \arg AD_CMD_PAUSE - \arg AD_CMD_RESUME - \arg AD_CMD_STOP - \param[out] none - \retval AD_OK if all operations succeed, otherwise, AD_FAIL. -*/ -static uint8_t audio_cmd(uint8_t *pbuf, uint32_t size, uint8_t cmd) -{ - /* check the current state */ - if((AD_STATE_INACTIVE == audio_state) || (AD_STATE_ERROR == audio_state)) { - audio_state = AD_STATE_ERROR; - - return AD_FAIL; - } - - switch(cmd) { - /* process the play command */ - case AD_CMD_PLAY: - /* if current state is active or stopped */ - if((AD_STATE_ACTIVE == audio_state) || \ - (AD_STATE_STOPPED == audio_state) || \ - (AD_STATE_PLAYING == audio_state)) { - audio_play((uint32_t)pbuf, size); - audio_state = AD_STATE_PLAYING; - - return AD_OK; - } else if(AD_STATE_PAUSED == audio_state) { - audio_pause_resume(AD_RESUME, (uint32_t)pbuf, (size / 2U)); - audio_state = AD_STATE_PLAYING; - - return AD_OK; - } else { - return AD_FAIL; - } - - /* process the stop command */ - case AD_CMD_STOP: - if(AD_STATE_PLAYING != audio_state) { - /* unsupported command */ - return AD_FAIL; - } else { - audio_stop(); - audio_state = AD_STATE_STOPPED; - - return AD_OK; - } - - /* process the pause command */ - case AD_CMD_PAUSE: - if(AD_STATE_PLAYING != audio_state) { - /* unsupported command */ - return AD_FAIL; - } else { - audio_pause_resume(AD_PAUSE, (uint32_t)pbuf, (size / 2U)); - audio_state = AD_STATE_PAUSED; - - return AD_OK; - } - - /* unsupported command */ - default: - return AD_FAIL; - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h deleted file mode 100644 index 741938e1f98..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Include/cdc_acm_core.h +++ /dev/null @@ -1,65 +0,0 @@ -/*! - \file cdc_acm_core.h - \brief the header file of cdc acm driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef CDC_ACM_CORE_H -#define CDC_ACM_CORE_H - -#include "usbd_enum.h" -#include "usb_cdc.h" - -#define USB_CDC_RX_LEN USB_CDC_DATA_PACKET_SIZE /*< CDC data packet size */ - -typedef struct { - uint8_t data[USB_CDC_RX_LEN]; /*< CDC data transfer buff */ - uint8_t cmd[USB_CDC_CMD_PACKET_SIZE]; /*< CDC cmd packet buff */ - - uint8_t packet_sent; /*< CDC data packet start send flag */ - uint8_t packet_receive; /*< CDC data packet start receive flag */ - uint32_t receive_length; /*< CDC data receive length */ - - acm_line line_coding; /*< CDC line coding structure */ -} usb_cdc_handler; - -extern usb_desc cdc_desc; -extern usb_class_core cdc_class; - -/* function declarations */ -/* check CDC ACM is ready for data transfer */ -uint8_t cdc_acm_check_ready(usb_dev *udev); -/* send CDC ACM data */ -void cdc_acm_data_send(usb_dev *udev); -/* receive CDC ACM data */ -void cdc_acm_data_receive(usb_dev *udev); - -#endif /* CDC_ACM_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c deleted file mode 100644 index bbf9c410178..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/cdc/Source/cdc_acm_core.c +++ /dev/null @@ -1,520 +0,0 @@ -/*! - \file cdc_acm_core.c - \brief CDC ACM driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "cdc_acm_core.h" - -#define USBD_VID 0x28E9U -#define USBD_PID 0x018AU - -/* note:it should use the C99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev cdc_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = USB_CLASS_CDC, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_cdc_desc_config_set cdc_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = USB_CDC_ACM_CONFIG_DESC_SIZE, - .bNumInterfaces = 0x02U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0x80U, - .bMaxPower = 0x32U - }, - - .cmd_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x01U, - .bInterfaceClass = USB_CLASS_CDC, - .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, - .bInterfaceProtocol = USB_CDC_PROTOCOL_AT, - .iInterface = 0x00U - }, - - .cdc_header = - { - .header = - { - .bLength = sizeof(usb_desc_header_func), - .bDescriptorType = USB_DESCTYPE_CS_INTERFACE - }, - .bDescriptorSubtype = 0x00U, - .bcdCDC = 0x0110U - }, - - .cdc_call_managment = - { - .header = - { - .bLength = sizeof(usb_desc_call_managment_func), - .bDescriptorType = USB_DESCTYPE_CS_INTERFACE - }, - .bDescriptorSubtype = 0x01U, - .bmCapabilities = 0x00U, - .bDataInterface = 0x01U - }, - - .cdc_acm = - { - .header = - { - .bLength = sizeof(usb_desc_acm_func), - .bDescriptorType = USB_DESCTYPE_CS_INTERFACE - }, - .bDescriptorSubtype = 0x02U, - .bmCapabilities = 0x02U - }, - - .cdc_union = - { - .header = - { - .bLength = sizeof(usb_desc_union_func), - .bDescriptorType = USB_DESCTYPE_CS_INTERFACE - }, - .bDescriptorSubtype = 0x06U, - .bMasterInterface = 0x00U, - .bSlaveInterface0 = 0x01U - }, - - .cdc_cmd_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = CDC_CMD_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = USB_CDC_CMD_PACKET_SIZE, - .bInterval = 0x0AU - }, - - .cdc_data_interface = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x01U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_CLASS_DATA, - .bInterfaceSubClass = 0x00U, - .bInterfaceProtocol = USB_CDC_PROTOCOL_NONE, - .iInterface = 0x00U - }, - - .cdc_out_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = CDC_DATA_OUT_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = USB_CDC_DATA_PACKET_SIZE, - .bInterval = 0x00U - }, - - .cdc_in_endpoint = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = CDC_DATA_IN_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = USB_CDC_DATA_PACKET_SIZE, - .bInterval = 0x00U - } -}; - -/* USB language ID Descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'C', 'D', 'C', '_', 'A', 'C', 'M'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB string descriptor set */ -void *const usbd_cdc_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -usb_desc cdc_desc = { - .dev_desc = (uint8_t *)&cdc_dev_desc, - .config_desc = (uint8_t *)&cdc_config_desc, - .strings = usbd_cdc_strings -}; - -/* local function prototypes ('static') */ -static uint8_t cdc_acm_init(usb_dev *udev, uint8_t config_index); -static uint8_t cdc_acm_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t cdc_acm_req(usb_dev *udev, usb_req *req); -static uint8_t cdc_acm_ctlx_out(usb_dev *udev); -static uint8_t cdc_acm_in(usb_dev *udev, uint8_t ep_num); -static uint8_t cdc_acm_out(usb_dev *udev, uint8_t ep_num); - -/* USB CDC device class callbacks structure */ -usb_class_core cdc_class = { - .command = NO_CMD, - .alter_set = 0U, - - .init = cdc_acm_init, - .deinit = cdc_acm_deinit, - .req_proc = cdc_acm_req, - .ctlx_out = cdc_acm_ctlx_out, - .data_in = cdc_acm_in, - .data_out = cdc_acm_out -}; - -/*! - \brief check CDC ACM is ready for data transfer - \param[in] udev: pointer to USB device instance - \param[out] none - \retval 0 if CDC is ready, else 1 -*/ -uint8_t cdc_acm_check_ready(usb_dev *udev) -{ - if(NULL != udev->dev.class_data[CDC_COM_INTERFACE]) { - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - if((1U == cdc->packet_receive) && (1U == cdc->packet_sent)) { - return 0U; - } - } - - return 1U; -} - -/*! - \brief send CDC ACM data - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void cdc_acm_data_send(usb_dev *udev) -{ - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - if(0U != cdc->receive_length) { - cdc->packet_sent = 0U; - - usbd_ep_send(udev, CDC_DATA_IN_EP, (uint8_t *)(cdc->data), cdc->receive_length); - - cdc->receive_length = 0U; - } -} - -/*! - \brief receive CDC ACM data - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void cdc_acm_data_receive(usb_dev *udev) -{ - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - cdc->packet_receive = 0U; - cdc->packet_sent = 0U; - - usbd_ep_recev(udev, CDC_DATA_OUT_EP, (uint8_t *)(cdc->data), USB_CDC_DATA_PACKET_SIZE); -} - -/*! - \brief initialize the CDC ACM device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN usb_cdc_handler cdc_handler __ALIGN_END; - - /* initialize the data TX endpoint */ - usbd_ep_setup(udev, &(cdc_config_desc.cdc_in_endpoint)); - - /* initialize the data RX endpoint */ - usbd_ep_setup(udev, &(cdc_config_desc.cdc_out_endpoint)); - - /* initialize the command TX endpoint */ - usbd_ep_setup(udev, &(cdc_config_desc.cdc_cmd_endpoint)); - - /* initialize CDC handler structure */ - cdc_handler.packet_receive = 1U; - cdc_handler.packet_sent = 1U; - cdc_handler.receive_length = 0U; - - cdc_handler.line_coding = (acm_line) { - .dwDTERate = 115200U, - .bCharFormat = 0U, - .bParityType = 0U, - .bDataBits = 0x08U - }; - - udev->dev.class_data[CDC_COM_INTERFACE] = (void *)&cdc_handler; - - return USBD_OK; -} - -/*! - \brief deinitialize the CDC ACM device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_deinit(usb_dev *udev, uint8_t config_index) -{ - /* deinitialize the data TX/RX endpoint */ - usbd_ep_clear(udev, CDC_DATA_IN_EP); - usbd_ep_clear(udev, CDC_DATA_OUT_EP); - - /* deinitialize the command TX endpoint */ - usbd_ep_clear(udev, CDC_CMD_EP); - - return USBD_OK; -} - -/*! - \brief handle the CDC ACM class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_req(usb_dev *udev, usb_req *req) -{ - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - usb_transc *transc = NULL; - - switch(req->bRequest) { - case SEND_ENCAPSULATED_COMMAND: - /* no operation for this driver */ - break; - - case GET_ENCAPSULATED_RESPONSE: - /* no operation for this driver */ - break; - - case SET_COMM_FEATURE: - /* no operation for this driver */ - break; - - case GET_COMM_FEATURE: - /* no operation for this driver */ - break; - - case CLEAR_COMM_FEATURE: - /* no operation for this driver */ - break; - - case SET_LINE_CODING: - transc = &udev->dev.transc_out[0]; - - /* set the value of the current command to be processed */ - udev->dev.class_core->alter_set = req->bRequest; - - /* enable EP0 prepare to receive command data packet */ - transc->remain_len = req->wLength; - transc->xfer_buf = cdc->cmd; - break; - - case GET_LINE_CODING: - transc = &udev->dev.transc_in[0]; - - cdc->cmd[0] = (uint8_t)(cdc->line_coding.dwDTERate); - cdc->cmd[1] = (uint8_t)(cdc->line_coding.dwDTERate >> 8); - cdc->cmd[2] = (uint8_t)(cdc->line_coding.dwDTERate >> 16); - cdc->cmd[3] = (uint8_t)(cdc->line_coding.dwDTERate >> 24); - cdc->cmd[4] = cdc->line_coding.bCharFormat; - cdc->cmd[5] = cdc->line_coding.bParityType; - cdc->cmd[6] = cdc->line_coding.bDataBits; - - transc->xfer_buf = cdc->cmd; - transc->remain_len = 7U; - break; - - case SET_CONTROL_LINE_STATE: - /* no operation for this driver */ - break; - - case SEND_BREAK: - /* no operation for this driver */ - break; - - default: - break; - } - - return USBD_OK; -} - -/*! - \brief command data received on control endpoint - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_ctlx_out(usb_dev *udev) -{ - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - if(NO_CMD != udev->dev.class_core->alter_set) { - /* process the command data */ - cdc->line_coding.dwDTERate = (uint32_t)((uint32_t)cdc->cmd[0] | \ - ((uint32_t)cdc->cmd[1] << 8) | \ - ((uint32_t)cdc->cmd[2] << 16) | \ - ((uint32_t)cdc->cmd[3] << 24)); - - cdc->line_coding.bCharFormat = cdc->cmd[4]; - cdc->line_coding.bParityType = cdc->cmd[5]; - cdc->line_coding.bDataBits = cdc->cmd[6]; - - udev->dev.class_core->alter_set = NO_CMD; - } - - return USBD_OK; -} - -/*! - \brief handle CDC ACM data IN stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_in(usb_dev *udev, uint8_t ep_num) -{ - usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_num)]; - - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - if((0U == transc->xfer_len % transc->max_len) && (0U != transc->xfer_len)) { - usbd_ep_send(udev, ep_num, NULL, 0U); - } else { - cdc->packet_sent = 1U; - } - - return USBD_OK; -} - -/*! - \brief handle CDC ACM data OUT stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval USB device operation status -*/ -static uint8_t cdc_acm_out(usb_dev *udev, uint8_t ep_num) -{ - usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE]; - - cdc->packet_receive = 1U; - cdc->receive_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count; - - return USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h deleted file mode 100644 index 62819092194..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_core.h +++ /dev/null @@ -1,173 +0,0 @@ -/*! - \file dfu_core.h - \brief the header file of USB DFU device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DFU_CORE_H -#define DFU_CORE_H - -#include "usbd_enum.h" - -/* DFU class code */ -#define USB_DFU_CLASS 0xFEU - -/* DFU subclass code */ -#define USB_DFU_SUBCLASS_UPGRADE 0x01U - -/* DFU protocol code */ -#define USB_DFU_PROTOCL_RUNTIME 0x01U /*!< runtime interface protocol */ -#define USB_DFU_PROTOCL_DFU 0x02U /*!< DFU interface protocol */ - -/* manifestation state */ -#define MANIFEST_COMPLETE 0x00U /*!< manifest complete state */ -#define MANIFEST_IN_PROGRESS 0x01U /*!< manifest in progress state */ - -/* DFU attributes code */ -#define USB_DFU_CAN_DOWNLOAD 0x01U /*!< download attribute */ -#define USB_DFU_CAN_UPLOAD 0x02U /*!< upload attribute */ -#define USB_DFU_MANIFEST_TOLERANT 0x04U /*!< manifest tolerant attribute */ -#define USB_DFU_WILL_DETACH 0x08U /*!< detach attribute */ - -/* special commands with download request */ -#define GET_COMMANDS 0x00U /*!< get command request */ -#define SET_ADDRESS_POINTER 0x21U /*!< set address pointer request */ -#define ERASE 0x41U /*!< erase request */ - -/* memory operation command */ -#define CMD_ERASE 0U /*!< erase command */ -#define CMD_WRITE 1U /*!< write command */ - -#define _BYTE1(x) (uint8_t)((x) & 0xFFU) /*!< addressing cycle 1st byte */ -#define _BYTE2(x) (uint8_t)(((x) & 0xFF00U) >> 8) /*!< addressing cycle 2nd byte */ -#define _BYTE3(x) (uint8_t)(((x) & 0xFF0000U) >> 16) /*!< addressing cycle 3rd byte */ - -#define FLASH_ERASE_TIMEOUT 60U /*!< erase flash timeout */ -#define FLASH_WRITE_TIMEOUT 80U /*!< write flash timeout */ - -/* bit detach capable = bit 3 in bmAttributes field */ -#define DFU_DETACH_MASK (uint8_t)(0x10U) - -/* DFU descriptor type code */ -#define DFU_DESC_TYPE 0x21U - -/* DFU device state defines */ -typedef enum { - STATE_APP_IDLE = 0x00U, /*!< DFU APP idle state */ - STATE_APP_DETACH, /*!< DFU APP detach state */ - STATE_DFU_IDLE, /*!< idle state */ - STATE_DFU_DNLOAD_SYNC, /*!< download synchronous state */ - STATE_DFU_DNBUSY, /*!< download busy state */ - STATE_DFU_DNLOAD_IDLE, /*!< download idle state */ - STATE_DFU_MANIFEST_SYNC, /*!< manifest synchronous state */ - STATE_DFU_MANIFEST, /*!< manifest state */ - STATE_DFU_MANIFEST_WAIT_RESET, /*!< manifest wait reset state */ - STATE_DFU_UPLOAD_IDLE, /*!< upload idle state */ - STATE_DFU_ERROR /*!< DFU error state */ -} dfu_state; - -/* DFU device status defines */ -typedef enum { - STATUS_OK = 0x00U, /*!< no error status */ - STATUS_ERR_TARGET, /*!< trigger error status */ - STATUS_ERR_FILE, /*!< file error status */ - STATUS_ERR_WRITE, /*!< write error status */ - STATUS_ERR_ERASE, /*!< erase error status */ - STATUS_ERR_CHECK_ERASED, /*!< check erased error status */ - STATUS_ERR_PROG, /*!< program error status */ - STATUS_ERR_VERIFY, /*!< verify error status */ - STATUS_ERR_ADDRESS, /*!< address error status */ - STATUS_ERR_NOTDONE, /*!< not done error status */ - STATUS_ERR_FIRMWARE, /*!< firmware error status */ - STATUS_ERR_VENDOR, /*!< vendor error status */ - STATUS_ERR_USBR, /*!< USB reset error status */ - STATUS_ERR_POR, /*!< power error status */ - STATUS_ERR_UNKNOWN, /*!< unknown error status */ - STATUS_ERR_STALLEDPKT /*!< stalled pocket error status */ -} dfu_status; - -/* DFU class-specific requests */ -typedef enum { - DFU_DETACH = 0U, /*!< detach request */ - DFU_DNLOAD, /*!< download request */ - DFU_UPLOAD, /*!< upload request */ - DFU_GETSTATUS, /*!< get status request */ - DFU_CLRSTATUS, /*!< clear status request */ - DFU_GETSTATE, /*!< get state request */ - DFU_ABORT, /*!< abort request */ - DFU_REQ_MAX /*!< maximum request */ -} dfu_requests; - -#pragma pack(1) - -/* USB DFU function descriptor structure */ -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size */ - uint8_t bmAttributes; /*!< DFU attributes */ - uint16_t wDetachTimeOut; /*!< time, in milliseconds, that the device will wait after receipt of the DFU_DETACH request. */ - uint16_t wTransferSize; /*!< maximum number of bytes that the device can accept per control-write transaction */ - uint16_t bcdDFUVersion; /*!< numeric expression identifying the version of the DFU Specification release. */ -} usb_desc_dfu_func; - -#pragma pack() - -/* USB configuration descriptor structure */ -typedef struct { - usb_desc_config config; /*!< configuration descriptor */ - usb_desc_itf dfu_itf0; /*!< DFU interface 0 descriptor */ - usb_desc_itf dfu_itf1; /*!< DFU interface 1 descriptor */ - usb_desc_itf dfu_itf2; /*!< DFU interface 2 descriptor */ - usb_desc_dfu_func dfu_func; /*!< DFU function descriptor */ -} usb_dfu_desc_config_set; - -/* USB DFU handler structure */ -typedef struct { - uint8_t bStatus; /*!< DFU device current status */ - uint8_t bwPollTimeout0; /*!< DFU device polling timeout 0 */ - uint8_t bwPollTimeout1; /*!< DFU device polling timeout 1 */ - uint8_t bwPollTimeout2; /*!< DFU device polling timeout 2 */ - uint8_t bState; /*!< DFU device current state */ - uint8_t iString; /*!< DFU device string */ - - uint8_t manifest_state; /*!< DFU device current manifest state */ - uint32_t data_len; /*!< DFU device data transfer length */ - uint16_t block_num; /*!< memory block number */ - uint32_t base_addr; /*!< memory base address */ - - uint8_t buf[TRANSFER_SIZE]; /*!< data transfer buff */ -} usbd_dfu_handler; - -typedef void (*app_func)(void); - -extern usb_desc dfu_desc; -extern usb_class_core dfu_class; - -#endif /* DFU_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h deleted file mode 100644 index d0c651a43ac..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Include/dfu_mem.h +++ /dev/null @@ -1,82 +0,0 @@ -/*! - \file dfu_mem.h - \brief USB DFU device media access layer header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DFU_MEM_H -#define DFU_MEM_H - -#include "usb_conf.h" - -#define _1ST_BYTE(x) (uint8_t)((x) & 0xFFU) /*!< addressing cycle 1st byte */ -#define _2ND_BYTE(x) (uint8_t)(((x) & 0xFF00U) >> 8) /*!< addressing cycle 2nd byte */ -#define _3RD_BYTE(x) (uint8_t)(((x) & 0xFF0000U) >> 16) /*!< addressing cycle 3rd byte */ - -#define POLLING_TIMEOUT_SET(x) buffer[0] = _1ST_BYTE(x); \ - buffer[1] = _2ND_BYTE(x); \ - buffer[2] = _3RD_BYTE(x); - -/* USB DFU property structure */ -typedef struct _dfu_mem_prop { - const uint8_t *pstr_desc; /*!< pointer to the string descriptor */ - - uint8_t (*mem_init)(void); - uint8_t (*mem_deinit)(void); - uint8_t (*mem_erase)(uint32_t addr); - uint8_t (*mem_write)(uint8_t *buf, uint32_t addr, uint32_t len); - uint8_t *(*mem_read)(uint8_t *buf, uint32_t addr, uint32_t len); - uint8_t (*mem_checkaddr)(uint32_t addr); - - const uint32_t erase_timeout; /*!< erase memory timeout */ - const uint32_t write_timeout; /*!< write memory timeout */ -} dfu_mem_prop; - -typedef enum { - MEM_OK = 0U, /*!< memory operation succeed */ - MEM_FAIL /*!< memory operation fail */ -} mem_status; - -/* function declarations */ -/* initialize the memory media */ -uint8_t dfu_mem_init(void); -/* deinitialize the memory media */ -uint8_t dfu_mem_deinit(void); -/* erase a memory sector */ -uint8_t dfu_mem_erase(uint32_t addr); -/* write data to sectors of memory */ -uint8_t dfu_mem_write(uint8_t *buf, uint32_t addr, uint32_t len); -/* read data from sectors of memory */ -uint8_t *dfu_mem_read(uint8_t *buf, uint32_t addr, uint32_t len); -/* get the status of a given memory and store in buffer */ -uint8_t dfu_mem_getstatus(uint32_t addr, uint8_t cmd, uint8_t *buffer); - -#endif /* DFU_MEM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c deleted file mode 100644 index 40d1e7cb75d..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_core.c +++ /dev/null @@ -1,721 +0,0 @@ -/*! - \file dfu_core.c - \brief USB DFU device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "dfu_core.h" -#include "dfu_mem.h" -#include "drv_usb_hw.h" -#include - -#define USBD_VID 0x28E9U -#define USBD_PID 0x0189U - -/* local function prototypes ('static') */ -static uint8_t dfu_init(usb_dev *udev, uint8_t config_index); -static uint8_t dfu_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t dfu_req_handler(usb_dev *udev, usb_req *req); -static uint8_t dfu_ctlx_in(usb_dev *udev); - -static void dfu_mode_leave(usb_dev *udev); -static uint8_t dfu_getstatus_complete(usb_dev *udev); - -/* DFU requests management functions */ -static void dfu_detach(usb_dev *udev, usb_req *req); -static void dfu_dnload(usb_dev *udev, usb_req *req); -static void dfu_upload(usb_dev *udev, usb_req *req); -static void dfu_getstatus(usb_dev *udev, usb_req *req); -static void dfu_clrstatus(usb_dev *udev, usb_req *req); -static void dfu_getstate(usb_dev *udev, usb_req *req); -static void dfu_abort(usb_dev *udev, usb_req *req); - -static void string_to_unicode(uint8_t *str, uint16_t *pbuf); - -static void (*dfu_request_process[])(usb_dev *udev, usb_req *req) = { - [DFU_DETACH] = dfu_detach, - [DFU_DNLOAD] = dfu_dnload, - [DFU_UPLOAD] = dfu_upload, - [DFU_GETSTATUS] = dfu_getstatus, - [DFU_CLRSTATUS] = dfu_clrstatus, - [DFU_GETSTATE] = dfu_getstate, - [DFU_ABORT] = dfu_abort -}; - -/* note:it should use the c99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev dfu_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_dfu_desc_config_set dfu_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = sizeof(usb_dfu_desc_config_set), - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0x80U, - .bMaxPower = 0x32U - }, - - .dfu_itf0 = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_DFU_CLASS, - .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, - .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, - .iInterface = STR_IDX_ALT_ITF0 - }, - - .dfu_itf1 = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x01U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_DFU_CLASS, - .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, - .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, - .iInterface = STR_IDX_ALT_ITF1 - }, - - .dfu_itf2 = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x02U, - .bNumEndpoints = 0x00U, - .bInterfaceClass = USB_DFU_CLASS, - .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, - .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, - .iInterface = STR_IDX_ALT_ITF2 - }, - - .dfu_func = - { - .header = - { - .bLength = sizeof(usb_desc_dfu_func), - .bDescriptorType = DFU_DESC_TYPE - }, - .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_CAN_UPLOAD | USB_DFU_WILL_DETACH, - .wDetachTimeOut = 0x00FFU, - .wTransferSize = TRANSFER_SIZE, - .bcdDFUVersion = 0x0110U - } -}; - -/* USB language ID descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'D', 'F', 'U'} -}; - -/* USB serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(2U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB configure string */ -static __ALIGN_BEGIN const usb_desc_str config_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(15U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', ' ', 'U', 'S', 'B', ' ', 'C', 'O', 'N', 'F', 'I', 'G'} -}; - -/* alternate interface 0 string */ -static __ALIGN_BEGIN usb_desc_str interface_string0 __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(2U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* alternate interface 1 string */ -static __ALIGN_BEGIN usb_desc_str interface_string1 __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(2U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* alternate interface 2 string */ -static __ALIGN_BEGIN usb_desc_str interface_string2 __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(2U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -void *const usbd_dfu_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string, - [STR_IDX_CONFIG] = (uint8_t *)&config_string, - [STR_IDX_ALT_ITF0] = (uint8_t *)&interface_string0, - [STR_IDX_ALT_ITF1] = (uint8_t *)&interface_string1, - [STR_IDX_ALT_ITF2] = (uint8_t *)&interface_string2 -}; - -usb_desc dfu_desc = { - .dev_desc = (uint8_t *)&dfu_dev_desc, - .config_desc = (uint8_t *)&dfu_config_desc, - .strings = usbd_dfu_strings -}; - -usb_class_core dfu_class = { - .init = dfu_init, - .deinit = dfu_deinit, - .req_proc = dfu_req_handler, - .ctlx_in = dfu_ctlx_in -}; - -/*! - \brief initialize the DFU device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t dfu_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN usbd_dfu_handler dfu_handler __ALIGN_END; - - /* unlock the internal flash */ - dfu_mem_init(); - - memset((void *)&dfu_handler, 0U, sizeof(usbd_dfu_handler)); - - dfu_handler.manifest_state = MANIFEST_COMPLETE; - dfu_handler.bState = STATE_DFU_IDLE; - dfu_handler.bStatus = STATUS_OK; - - udev->dev.class_data[USBD_DFU_INTERFACE] = (void *)&dfu_handler; - - /* create interface string */ - string_to_unicode((uint8_t *)dfu_inter_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF0]); - string_to_unicode((uint8_t *)dfu_nor_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF1]); - string_to_unicode((uint8_t *)dfu_nand_flash_cb.pstr_desc, udev->dev.desc->strings[STR_IDX_ALT_ITF2]); - - return USBD_OK; -} - -/*! - \brief deinitialize the DFU device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t dfu_deinit(usb_dev *udev, uint8_t config_index) -{ - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - /* restore device default state */ - memset(udev->dev.class_data[USBD_DFU_INTERFACE], 0U, sizeof(usbd_dfu_handler)); - - dfu->bState = STATE_DFU_IDLE; - dfu->bStatus = STATUS_OK; - - /* deinit the memory */ - dfu_mem_deinit(); - - return USBD_OK; -} - -/*! - \brief handle the DFU class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t dfu_req_handler(usb_dev *udev, usb_req *req) -{ - if(req->bRequest < DFU_REQ_MAX) { - dfu_request_process[req->bRequest](udev, req); - } else { - return USBD_FAIL; - } - - return USBD_OK; -} - -/*! - \brief handle data stage - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status -*/ -static uint8_t dfu_ctlx_in(usb_dev *udev) -{ - dfu_getstatus_complete(udev); - - return USBD_OK; -} - -/*! - \brief leave DFU mode and reset device to jump to user loaded code - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void dfu_mode_leave(usb_dev *udev) -{ - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - dfu->manifest_state = MANIFEST_COMPLETE; - - if(dfu_config_desc.dfu_func.bmAttributes & 0x04U) { - dfu->bState = STATE_DFU_MANIFEST_SYNC; - } else { - dfu->bState = STATE_DFU_MANIFEST_WAIT_RESET; - - /* deinit the memory */ - dfu_mem_deinit(); - - /* generate system reset to allow jumping to the user code */ - NVIC_SystemReset(); - } -} - -/*! - \brief handle data IN stage in control endpoint 0 - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation status - */ -static uint8_t dfu_getstatus_complete(usb_dev *udev) -{ - uint32_t addr; - - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - if(STATE_DFU_DNBUSY == dfu->bState) { - /* decode the special command */ - if(0U == dfu->block_num) { - if(1U == dfu->data_len) { - if(GET_COMMANDS == dfu->buf[0]) { - /* no operation */ - } - } else if(5U == dfu->data_len) { - if(SET_ADDRESS_POINTER == dfu->buf[0]) { - /* set flash operation address */ - dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); - } else if(ERASE == dfu->buf[0]) { - dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); - - dfu_mem_erase(dfu->base_addr); - } else { - /* no operation */ - } - } else { - /* no operation */ - } - } else if(dfu->block_num > 1U) { /* regular download command */ - /* decode the required address */ - addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; - - dfu_mem_write(dfu->buf, addr, dfu->data_len); - - dfu->block_num = 0U; - } else { - /* no operation */ - } - - dfu->data_len = 0U; - - /* update the device state and poll timeout */ - dfu->bState = STATE_DFU_DNLOAD_SYNC; - - return USBD_OK; - } else if(STATE_DFU_MANIFEST == dfu->bState) { /* manifestation in progress */ - /* start leaving DFU mode */ - dfu_mode_leave(udev); - } else { - /* no operation */ - } - - return USBD_OK; -} - -/*! - \brief handle the DFU_DETACH request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none. -*/ -static void dfu_detach(usb_dev *udev, usb_req *req) -{ - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - switch(dfu->bState) { - case STATE_DFU_IDLE: - case STATE_DFU_DNLOAD_SYNC: - case STATE_DFU_DNLOAD_IDLE: - case STATE_DFU_MANIFEST_SYNC: - case STATE_DFU_UPLOAD_IDLE: - dfu->bStatus = STATUS_OK; - dfu->bState = STATE_DFU_IDLE; - dfu->iString = 0U; /* iString */ - - dfu->block_num = 0U; - dfu->data_len = 0U; - break; - - default: - break; - } - - /* check the detach capability in the DFU functional descriptor */ - if(dfu_config_desc.dfu_func.wDetachTimeOut & DFU_DETACH_MASK) { - usbd_disconnect(udev); - - usbd_connect(udev); - } else { - /* wait for the period of time specified in detach request */ - usb_mdelay(4U); - } -} - -/*! - \brief handle the DFU_DNLOAD request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_dnload(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_out[0]; - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - switch(dfu->bState) { - case STATE_DFU_IDLE: - case STATE_DFU_DNLOAD_IDLE: - if(req->wLength > 0U) { - /* update the global length and block number */ - dfu->block_num = req->wValue; - dfu->data_len = req->wLength; - - dfu->bState = STATE_DFU_DNLOAD_SYNC; - - transc->remain_len = dfu->data_len; - transc->xfer_buf = dfu->buf; - } else { - dfu->manifest_state = MANIFEST_IN_PROGRESS; - dfu->bState = STATE_DFU_MANIFEST_SYNC; - } - break; - - default: - break; - } -} - -/*! - \brief handles the DFU UPLOAD request. - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_upload(usb_dev *udev, usb_req *req) -{ - uint8_t *phy_addr = NULL; - uint32_t addr = 0U; - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - usb_transc *transc = &udev->dev.transc_in[0]; - - if(req->wLength <= 0U) { - dfu->bState = STATE_DFU_IDLE; - return; - } - - switch(dfu->bState) { - case STATE_DFU_IDLE: - case STATE_DFU_UPLOAD_IDLE: - /* update the global length and block number */ - dfu->block_num = req->wValue; - dfu->data_len = req->wLength; - - /* DFU get command */ - if(0U == dfu->block_num) { - /* update the state machine */ - dfu->bState = (dfu->data_len > 3U) ? STATE_DFU_IDLE : STATE_DFU_UPLOAD_IDLE; - - /* store the values of all supported commands */ - dfu->buf[0] = GET_COMMANDS; - dfu->buf[1] = SET_ADDRESS_POINTER; - dfu->buf[2] = ERASE; - - /* send the status data over EP0 */ - transc->xfer_buf = &(dfu->buf[0]); - transc->remain_len = 3U; - } else if(dfu->block_num > 1U) { - dfu->bState = STATE_DFU_UPLOAD_IDLE; - - /* change is accelerated */ - addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; - - /* return the physical address where data are stored */ - phy_addr = dfu_mem_read(dfu->buf, addr, dfu->data_len); - - /* send the status data over EP0 */ - transc->xfer_buf = phy_addr; - transc->remain_len = dfu->data_len; - } else { - dfu->bState = STATUS_ERR_STALLEDPKT; - } - break; - - default: - dfu->data_len = 0U; - dfu->block_num = 0U; - break; - } -} - -/*! - \brief handle the DFU_GETSTATUS request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_getstatus(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - switch(dfu->bState) { - case STATE_DFU_DNLOAD_SYNC: - if(0U != dfu->data_len) { - dfu->bState = STATE_DFU_DNBUSY; - - if(0U == dfu->block_num) { - if(ERASE == dfu->buf[0]) { - dfu_mem_getstatus(dfu->base_addr, CMD_ERASE, (uint8_t *)&dfu->bwPollTimeout0); - } else { - dfu_mem_getstatus(dfu->base_addr, CMD_WRITE, (uint8_t *)&dfu->bwPollTimeout0); - } - } - } else { - dfu->bState = STATE_DFU_DNLOAD_IDLE; - } - break; - - case STATE_DFU_MANIFEST_SYNC: - if(MANIFEST_IN_PROGRESS == dfu->manifest_state) { - dfu->bState = STATE_DFU_MANIFEST; - dfu->bwPollTimeout0 = 1U; - } else if((MANIFEST_COMPLETE == dfu->manifest_state) && \ - (dfu_config_desc.dfu_func.bmAttributes & 0x04U)) { - dfu->bState = STATE_DFU_IDLE; - dfu->bwPollTimeout0 = 0U; - } else { - /* no operation */ - } - break; - - default: - break; - } - - /* send the status data of DFU interface to host over EP0 */ - transc->xfer_buf = (uint8_t *)&(dfu->bStatus); - transc->remain_len = 6U; -} - -/*! - \brief handle the DFU_CLRSTATUS request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_clrstatus(usb_dev *udev, usb_req *req) -{ - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - if(STATE_DFU_ERROR == dfu->bState) { - dfu->bStatus = STATUS_OK; - dfu->bState = STATE_DFU_IDLE; - } else { - /* state error */ - dfu->bStatus = STATUS_ERR_UNKNOWN; - dfu->bState = STATE_DFU_ERROR; - } - - dfu->iString = 0U; /* iString: index = 0 */ -} - -/*! - \brief handle the DFU_GETSTATE request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_getstate(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - /* send the current state of the DFU interface to host */ - transc->xfer_buf = &(dfu->bState); - transc->remain_len = 1U; -} - -/*! - \brief handle the DFU_ABORT request - \param[in] udev: pointer to USB device instance - \param[in] req: DFU class request - \param[out] none - \retval none -*/ -static void dfu_abort(usb_dev *udev, usb_req *req) -{ - usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->dev.class_data[USBD_DFU_INTERFACE]; - - switch(dfu->bState) { - case STATE_DFU_IDLE: - case STATE_DFU_DNLOAD_SYNC: - case STATE_DFU_DNLOAD_IDLE: - case STATE_DFU_MANIFEST_SYNC: - case STATE_DFU_UPLOAD_IDLE: - dfu->bStatus = STATUS_OK; - dfu->bState = STATE_DFU_IDLE; - dfu->iString = 0U; /* iString: index = 0 */ - - dfu->block_num = 0U; - dfu->data_len = 0U; - break; - - default: - break; - } -} - -/*! - \brief convert string value into unicode char - \param[in] str: pointer to plain string - \param[in] pbuf: buffer pointer to store unicode char - \param[out] none - \retval none -*/ -static void string_to_unicode(uint8_t *str, uint16_t *pbuf) -{ - uint8_t index = 0U; - - if(NULL != str) { - pbuf[index++] = ((strlen((const char *)str) * 2U + 2U) & 0x00FFU) | ((USB_DESCTYPE_STR << 8) & 0xFF00U); - - while('\0' != *str) { - pbuf[index++] = *str++; - } - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c deleted file mode 100644 index 92bd84c627c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/dfu/Source/dfu_mem.c +++ /dev/null @@ -1,241 +0,0 @@ -/*! - \file dfu_mem.c - \brief USB DFU device media access layer functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "dfu_mem.h" -#include "usbd_transc.h" - -extern usb_core_driver usb_dfu_dev; - -extern struct { - uint8_t buf[TRANSFER_SIZE]; - uint16_t data_len; - uint16_t block_num; - uint32_t base_addr; -} prog; - -dfu_mem_prop *mem_tab[MAX_USED_MEMORY_MEDIA] = { - &dfu_inter_flash_cb, - &dfu_nor_flash_cb, - &dfu_nand_flash_cb, -}; - -/* The list of memory interface string descriptor pointers. This list - can be updated whenever a memory has to be added or removed */ -const uint8_t *USBD_DFU_StringDesc[MAX_USED_MEMORY_MEDIA] = { - (const uint8_t *)INTER_FLASH_IF_STR, - (const uint8_t *)NOR_FLASH_IF_STR, - (const uint8_t *)NAND_FLASH_IF_STR -}; - -static uint8_t dfu_mem_checkaddr(uint32_t addr); - -/*! - \brief initialize the memory media - \param[in] none - \param[out] none - \retval MEM_OK -*/ -uint8_t dfu_mem_init(void) -{ - uint32_t mem_index = 0U; - - /* initialize all supported memory medias */ - for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { - /* check if the memory media exists */ - if(NULL != mem_tab[mem_index]->mem_init) { - mem_tab[mem_index]->mem_init(); - } - } - - return MEM_OK; -} - -/*! - \brief deinitialize the memory media - \param[in] none - \param[out] none - \retval MEM_OK -*/ -uint8_t dfu_mem_deinit(void) -{ - uint32_t mem_index = 0U; - - /* deinitialize all supported memory medias */ - for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { - /* check if the memory media exists */ - if(NULL != mem_tab[mem_index]->mem_deinit) { - mem_tab[mem_index]->mem_deinit(); - } - } - - return MEM_OK; -} - -/*! - \brief erase a memory sector - \param[in] addr: memory sector address/code - \param[out] none - \retval MEM_OK -*/ -uint8_t dfu_mem_erase(uint32_t addr) -{ - uint32_t mem_index = dfu_mem_checkaddr(addr); - - /* check if the address is in protected area */ - if(IS_PROTECTED_AREA(addr)) { - return MEM_FAIL; - } - - if(mem_index < MAX_USED_MEMORY_MEDIA) { - /* check if the operation is supported */ - if(NULL != mem_tab[mem_index]->mem_erase) { - return mem_tab[mem_index]->mem_erase(addr); - } else { - return MEM_FAIL; - } - } else { - return MEM_FAIL; - } -} - -/*! - \brief write data to sectors of memory - \param[in] buf: the data buffer to be write - \param[in] addr: memory sector address/code - \param[in] len: data length - \param[out] none - \retval MEM_OK -*/ -uint8_t dfu_mem_write(uint8_t *buf, uint32_t addr, uint32_t len) -{ - uint32_t mem_index = dfu_mem_checkaddr(addr); - - /* check if the address is in protected area */ - if(IS_PROTECTED_AREA(addr)) { - return MEM_FAIL; - } - - if(OB_RDPT0 == (addr & MAL_MASK_OB)) { - option_byte_write(addr, buf); - NVIC_SystemReset(); - - return MEM_OK; - } - - if(mem_index < MAX_USED_MEMORY_MEDIA) { - /* check if the operation is supported */ - if(NULL != mem_tab[mem_index]->mem_write) { - return mem_tab[mem_index]->mem_write(buf, addr, len); - } else { - return MEM_FAIL; - } - } else { - return MEM_FAIL; - } -} - -/*! - \brief read data from sectors of memory - \param[in] buf: the data buffer to be write - \param[in] addr: memory sector address/code - \param[in] len: data length - \param[out] none - \retval pointer to buffer -*/ -uint8_t *dfu_mem_read(uint8_t *buf, uint32_t addr, uint32_t len) -{ - uint32_t mem_index = 0U; - - if((OB_RDPT0 != addr) && (OB_RDPT1 != addr)) { - mem_index = dfu_mem_checkaddr(addr); - } - - if(mem_index < MAX_USED_MEMORY_MEDIA) { - /* check if the operation is supported */ - if(NULL != mem_tab[mem_index]->mem_read) { - return mem_tab[mem_index]->mem_read(buf, addr, len); - } else { - return buf; - } - } else { - return buf; - } -} - -/*! - \brief get the status of a given memory and store in buffer - \param[in] addr: memory sector address/code - \param[in] cmd: 0 for erase and 1 for write - \param[in] buffer: pointer to the buffer where the status data will be stored - \param[out] none - \retval MEM_OK if all operations are OK, MEM_FAIL else -*/ -uint8_t dfu_mem_getstatus(uint32_t addr, uint8_t cmd, uint8_t *buffer) -{ - uint32_t mem_index = dfu_mem_checkaddr(addr); - - if(mem_index < MAX_USED_MEMORY_MEDIA) { - if(cmd & 0x01U) { - POLLING_TIMEOUT_SET(mem_tab[mem_index]->write_timeout); - } else { - POLLING_TIMEOUT_SET(mem_tab[mem_index]->erase_timeout); - } - - return MEM_OK; - } else { - return MEM_FAIL; - } -} - -/*! - \brief check the address is supported - \param[in] addr: memory sector address/code - \param[out] none - \retval index of the addressed memory -*/ -static uint8_t dfu_mem_checkaddr(uint32_t addr) -{ - uint8_t mem_index = 0U; - - /* check with all supported memories */ - for(mem_index = 0U; mem_index < MAX_USED_MEMORY_MEDIA; mem_index++) { - /* if the check address is supported, return the memory index */ - if(MEM_OK == mem_tab[mem_index]->mem_checkaddr(addr)) { - return mem_index; - } - } - - /* if there is no memory found, return MAX_USED_MEMORY_MEDIA */ - return (MAX_USED_MEMORY_MEDIA); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h deleted file mode 100644 index 60f70bbf4d0..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/custom_hid_core.h +++ /dev/null @@ -1,66 +0,0 @@ -/*! - \file custom_hid_core.h - \brief definitions for HID core - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef CUSTOM_HID_CORE_H -#define CUSTOM_HID_CORE_H - -#include "usbd_enum.h" -#include "usb_hid.h" - -#define DESC_LEN_REPORT 96U /*!< report descriptor length */ -#define DESC_LEN_CONFIG 41U /*!< configuration descriptor length */ -#define NO_CMD 0xFFU /*!< no command */ -#define MAX_PERIPH_NUM 4U /*!< maximum peripheral number */ - -typedef struct { - uint8_t data[2]; /*!< custom HID data packet buff */ - uint8_t reportID; /*!< custom HID report id */ - uint8_t idlestate; /*!< idle state */ - uint8_t protocol; /*!< HID protocol */ -} custom_hid_handler; - -typedef struct { - void (*periph_config[MAX_PERIPH_NUM])(void); -} hid_fop_handler; - -extern usb_desc custom_hid_desc; -extern usb_class_core usbd_custom_hid_cb; - -/* function declarations */ -/* register HID interface operation functions */ -uint8_t custom_hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop); -/* send custom HID report */ -uint8_t custom_hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len); - -#endif /* CUSTOM_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h deleted file mode 100644 index 5a60ac886cd..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Include/standard_hid_core.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - \file standard_hid_core.h - \brief definitions for HID core - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef STANDARD_HID_CORE_H -#define STANDARD_HID_CORE_H - -#include "usbd_enum.h" -#include "usb_hid.h" - -#define USB_HID_CONFIG_DESC_LEN 0x22U /*!< HID device configuration descriptor length */ -#define USB_HID_REPORT_DESC_LEN 0x2EU /*!< HID device report descriptor length */ - -#define NO_CMD 0xFFU /*!< no command */ - -typedef struct { - uint32_t protocol; /*!< control request protocol */ - uint32_t idle_state; /*!< HID device idle state */ - uint8_t data[HID_IN_PACKET]; /*!< data transfer buff */ - __IO uint8_t prev_transfer_complete; /*!< previous transfer complete flag */ -} standard_hid_handler; - -typedef struct { - void (*hid_itf_config)(void); - void (*hid_itf_data_process)(usb_dev *udev); -} hid_fop_handler; - -extern usb_desc hid_desc; -extern usb_class_core usbd_hid_cb; - -/* function declarations */ -/* register HID interface operation functions */ -uint8_t hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop); -/* send keyboard report */ -uint8_t hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len); - -#endif /* STANDARD_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c deleted file mode 100644 index 57dd157a003..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/custom_hid_core.c +++ /dev/null @@ -1,473 +0,0 @@ -/*! - \file custom_hid_core.c - \brief custom HID class driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "custom_hid_core.h" -#include - -#define USBD_VID 0x28E9U -#define USBD_PID 0x028AU - -/* Note:it should use the C99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev custom_hid_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_hid_desc_config_set custom_hid_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = DESC_LEN_CONFIG, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0x80U, - .bMaxPower = 0x32U - }, - - .hid_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_HID_CLASS, - .bInterfaceSubClass = 0x00U, - .bInterfaceProtocol = 0x00U, - .iInterface = 0x00U - }, - - .hid_vendor = - { - .header = - { - .bLength = sizeof(usb_desc_hid), - .bDescriptorType = USB_DESCTYPE_HID - }, - .bcdHID = 0x0111U, - .bCountryCode = 0x00U, - .bNumDescriptors = 0x01U, - .bDescriptorType = USB_DESCTYPE_REPORT, - .wDescriptorLength = DESC_LEN_REPORT - }, - - .hid_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = CUSTOMHID_IN_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = CUSTOMHID_IN_PACKET, - .bInterval = 0x20U - }, - - .hid_epout = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = CUSTOMHID_OUT_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = CUSTOMHID_OUT_PACKET, - .bInterval = 0x20U - } -}; - -/* USB language ID descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(14U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'C', 'u', 's', 't', 'o', 'm', 'H', 'I', 'D'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB string descriptor set */ -void *const usbd_hid_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -usb_desc custom_hid_desc = { - .dev_desc = (uint8_t *)&custom_hid_dev_desc, - .config_desc = (uint8_t *)&custom_hid_config_desc, - .strings = usbd_hid_strings -}; - -__ALIGN_BEGIN const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] __ALIGN_END = { - 0x06U, 0x00U, 0xFFU, /* USAGE_PAGE (Vendor Defined: 0xFF00) */ - 0x09U, 0x00U, /* USAGE (Custom Device) */ - 0xa1U, 0x01U, /* COLLECTION (Application) */ - - /* led 1 */ - 0x85U, 0x11U, /* REPORT_ID (0x11) */ - 0x09U, 0x01U, /* USAGE (LED 1) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x95U, 0x01U, /* REPORT_COUNT (1) */ - 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ - - /* led 2 */ - 0x85U, 0x12U, /* REPORT_ID (0x12) */ - 0x09U, 0x02U, /* USAGE (LED 2) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x95U, 0x01U, /* REPORT_COUNT (1) */ - 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ - - /* led 3 */ - 0x85U, 0x13U, /* REPORT_ID (0x13) */ - 0x09U, 0x03U, /* USAGE (LED 3) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x95U, 0x01U, /* REPORT_COUNT (1) */ - 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ - - /* led 4 */ - 0x85U, 0x14U, /* REPORT_ID (0x14) */ - 0x09U, 0x04U, /* USAGE (LED 4) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x95U, 0x01U, /* REPORT_COUNT (1) */ - 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ - - /* wakeup key */ - 0x85U, 0x15U, /* REPORT_ID (0x15) */ - 0x09U, 0x05U, /* USAGE (Push Button) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x01U, /* REPORT_SIZE (1) */ - 0x81U, 0x02U, /* INPUT (Data,Var,Abs,Vol) */ - - 0x75U, 0x07U, /* REPORT_SIZE (7) */ - 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs,Vol) */ - - /* tamper key */ - 0x85U, 0x16U, /* REPORT_ID (0x16) */ - 0x09U, 0x06U, /* USAGE (Push Button) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x75U, 0x01U, /* REPORT_SIZE (1) */ - 0x81U, 0x02U, /* INPUT (Data,Var,Abs,Vol) */ - - 0x75U, 0x07U, /* REPORT_SIZE (7) */ - 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs,Vol) */ - - 0xc0U /* END_COLLECTION */ -}; - -/* local function prototypes ('static') */ -static uint8_t custom_hid_init(usb_dev *udev, uint8_t config_index); -static uint8_t custom_hid_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t custom_hid_req_handler(usb_dev *udev, usb_req *req); - -static uint8_t custom_hid_data_in(usb_dev *udev, uint8_t ep_num); -static uint8_t custom_hid_data_out(usb_dev *udev, uint8_t ep_num); - -usb_class_core usbd_custom_hid_cb = { - .command = NO_CMD, - .alter_set = 0U, - - .init = custom_hid_init, - .deinit = custom_hid_deinit, - - .req_proc = custom_hid_req_handler, - - .data_in = custom_hid_data_in, - .data_out = custom_hid_data_out -}; - -/*! - \brief register HID interface operation functions - \param[in] udev: pointer to USB device instance - \param[in] hid_fop: HID operation functions structure - \param[out] none - \retval USB device operation status -*/ -uint8_t custom_hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop) -{ - if(NULL != hid_fop) { - udev->dev.user_data = hid_fop; - - return USBD_OK; - } - - return USBD_FAIL; -} - -/*! - \brief send custom HID report - \param[in] udev: pointer to USB device instance - \param[in] report: pointer to HID report - \param[in] len: data length - \param[out] none - \retval USB device operation status -*/ -uint8_t custom_hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len) -{ - usbd_ep_send(udev, CUSTOMHID_IN_EP, report, len); - - return USBD_OK; -} - -/*! - \brief initialize the HID device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t custom_hid_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN custom_hid_handler hid_handler __ALIGN_END; - - memset((void *)&hid_handler, 0U, sizeof(custom_hid_handler)); - - /* initialize the data TX endpoint */ - usbd_ep_setup(udev, &(custom_hid_config_desc.hid_epin)); - - /* initialize the data RX endpoint */ - usbd_ep_setup(udev, &(custom_hid_config_desc.hid_epout)); - - /* prepare receive data */ - usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid_handler.data, 2U); - - udev->dev.class_data[CUSTOM_HID_INTERFACE] = (void *)&hid_handler; - - if(NULL != udev->dev.user_data) { - for(uint8_t i = 0U; i < MAX_PERIPH_NUM; i++) { - if(NULL != ((hid_fop_handler *)udev->dev.user_data)->periph_config[i]) { - ((hid_fop_handler *)udev->dev.user_data)->periph_config[i](); - } - } - } - - return USBD_OK; -} - -/*! - \brief deinitialize the HID device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t custom_hid_deinit(usb_dev *udev, uint8_t config_index) -{ - /* deinitialize HID endpoints */ - usbd_ep_clear(udev, CUSTOMHID_IN_EP); - usbd_ep_clear(udev, CUSTOMHID_OUT_EP); - - return USBD_OK; -} - -/*! - \brief handle the HID class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t custom_hid_req_handler(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - - custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE]; - - switch(req->bRequest) { - case GET_REPORT: - break; - - case GET_IDLE: - transc->xfer_buf = (uint8_t *)&hid->idlestate; - transc->remain_len = 1U; - break; - - case GET_PROTOCOL: - transc->xfer_buf = (uint8_t *)&hid->protocol; - transc->remain_len = 1U; - break; - - case SET_REPORT: - hid->reportID = (uint8_t)(req->wValue); - break; - - case SET_IDLE: - hid->idlestate = (uint8_t)(req->wValue >> 8); - break; - - case SET_PROTOCOL: - hid->protocol = (uint8_t)(req->wValue); - break; - - case USB_GET_DESCRIPTOR: - if(USB_DESCTYPE_REPORT == (req->wValue >> 8)) { - transc->remain_len = USB_MIN(DESC_LEN_REPORT, req->wLength); - transc->xfer_buf = (uint8_t *)customhid_report_descriptor; - } - break; - - default: - return USBD_FAIL; - } - - return USBD_OK; -} - -/*! - \brief handle custom HID data - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval USB device operation status -*/ -static uint8_t custom_hid_data_in(usb_dev *udev, uint8_t ep_num) -{ - return USBD_OK; -} - -/*! - \brief handle custom HID data - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval USB device operation status -*/ -static uint8_t custom_hid_data_out(usb_dev *udev, uint8_t ep_num) -{ - custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE]; - - /* light the LED */ - switch(hid->data[0]) { - case 0x11U: - if(RESET != hid->data[1]) { - gd_eval_led_on(LED1); - } else { - gd_eval_led_off(LED1); - } - break; - - case 0x12U: - if(RESET != hid->data[1]) { - gd_eval_led_on(LED2); - } else { - gd_eval_led_off(LED2); - } - break; - - case 0x13U: - if(RESET != hid->data[1]) { - gd_eval_led_on(LED3); - } else { - gd_eval_led_off(LED3); - } - break; - - case 0x14U: - break; - - default: - break; - } - - usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid->data, 2U); - - return USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c deleted file mode 100644 index 2a60d758ef2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/hid/Source/standard_hid_core.c +++ /dev/null @@ -1,460 +0,0 @@ -/*! - \file standard_hid_core.c - \brief HID class driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "standard_hid_core.h" -#include - -#define USBD_VID 0x28e9U -#define USBD_PID 0x0380U - -/* Note:it should use the C99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev hid_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -__ALIGN_BEGIN const usb_hid_desc_config_set hid_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = USB_HID_CONFIG_DESC_LEN, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xA0U, - .bMaxPower = 0x32U - }, - - .hid_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x01U, - .bInterfaceClass = USB_HID_CLASS, - .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, - .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD, - .iInterface = 0x00U - }, - - .hid_vendor = - { - .header = - { - .bLength = sizeof(usb_desc_hid), - .bDescriptorType = USB_DESCTYPE_HID - }, - .bcdHID = 0x0111U, - .bCountryCode = 0x00U, - .bNumDescriptors = 0x01U, - .bDescriptorType = USB_DESCTYPE_REPORT, - .wDescriptorLength = USB_HID_REPORT_DESC_LEN - }, - - .hid_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = HID_IN_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = HID_IN_PACKET, - .bInterval = 0x10U - } -}; - -__ALIGN_BEGIN const usb_hid_desc_config_set other_speed_hid_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_OTHER_SPD_CONFIG - }, - .wTotalLength = USB_HID_CONFIG_DESC_LEN, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xA0U, - .bMaxPower = 0x32U - }, - - .hid_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x01U, - .bInterfaceClass = USB_HID_CLASS, - .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, - .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD, - .iInterface = 0x00U - }, - - .hid_vendor = - { - .header = - { - .bLength = sizeof(usb_desc_hid), - .bDescriptorType = USB_DESCTYPE_HID - }, - .bcdHID = 0x0111U, - .bCountryCode = 0x00U, - .bNumDescriptors = 0x01U, - .bDescriptorType = USB_DESCTYPE_REPORT, - .wDescriptorLength = USB_HID_REPORT_DESC_LEN - }, - - .hid_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = HID_IN_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = HID_IN_PACKET, - .bInterval = 0x40U - } -}; - -__ALIGN_BEGIN const uint8_t usbd_qualifier_desc[10] __ALIGN_END = { - 0x0AU, - 0x06U, - 0x00U, - 0x02U, - 0x00U, - 0x00U, - 0x00U, - 0x40U, - 0x01U, - 0x00U -}; - -/* USB language ID Descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(17U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'K', 'e', 'y', 'b', 'o', 'a', 'r', 'd'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -void *const usbd_hid_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -usb_desc hid_desc = { - .dev_desc = (uint8_t *)&hid_dev_desc, - .config_desc = (uint8_t *)&hid_config_desc, -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - .other_speed_config_desc = (uint8_t *)&other_speed_hid_config_desc, - .qualifier_desc = (uint8_t *)&usbd_qualifier_desc, -#endif - .strings = usbd_hid_strings -}; - -__ALIGN_BEGIN const uint8_t hid_report_desc[USB_HID_REPORT_DESC_LEN] __ALIGN_END = { - 0x05U, 0x01U, /* USAGE_PAGE (Generic Desktop) */ - 0x09U, 0x06U, /* USAGE (Keyboard) */ - 0xa1U, 0x01U, /* COLLECTION (Application) */ - - 0x05U, 0x07U, /* USAGE_PAGE (Keyboard/Keypad) */ - 0x19U, 0xe0U, /* USAGE_MINIMUM (Keyboard LeftControl) */ - 0x29U, 0xe7U, /* USAGE_MAXIMUM (Keyboard Right GUI) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0x01U, /* LOGICAL_MAXIMUM (1) */ - 0x95U, 0x08U, /* REPORT_COUNT (8) */ - 0x75U, 0x01U, /* REPORT_SIZE (1) */ - 0x81U, 0x02U, /* INPUT (Data,Var,Abs) */ - - 0x95U, 0x01U, /* REPORT_COUNT (1) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x81U, 0x03U, /* INPUT (Cnst,Var,Abs) */ - - 0x95U, 0x06U, /* REPORT_COUNT (6) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x26U, 0xFFU, 0x00U, /* LOGICAL_MAXIMUM (255) */ - 0x05U, 0x07U, /* USAGE_PAGE (Keyboard/Keypad) */ - 0x19U, 0x00U, /* USAGE_MINIMUM (Reserved (no event indicated)) */ - 0x29U, 0x65U, /* USAGE_MAXIMUM (Keyboard Application) */ - 0x81U, 0x00U, /* INPUT (Data,Ary,Abs) */ - - 0xc0U /* END_COLLECTION */ -}; - -/* local function prototypes ('static') */ -static uint8_t hid_init(usb_dev *udev, uint8_t config_index); -static uint8_t hid_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t hid_req(usb_dev *udev, usb_req *req); -static uint8_t hid_data_in(usb_dev *udev, uint8_t ep_num); - -usb_class_core usbd_hid_cb = { - .command = NO_CMD, - .alter_set = 0U, - - .init = hid_init, - .deinit = hid_deinit, - .req_proc = hid_req, - .data_in = hid_data_in -}; - -/*! - \brief register HID interface operation functions - \param[in] udev: pointer to USB device instance - \param[in] hid_fop: HID operation function structure - \param[out] none - \retval USB device operation status -*/ -uint8_t hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop) -{ - if(NULL != hid_fop) { - udev->dev.user_data = (void *)hid_fop; - - return USBD_OK; - } - - return USBD_FAIL; -} - -/*! - \brief send keyboard report - \param[in] udev: pointer to USB device instance - \param[in] report: pointer to HID report - \param[in] len: data length - \param[out] none - \retval USB device operation status -*/ -uint8_t hid_report_send(usb_dev *udev, uint8_t *report, uint32_t len) -{ - standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; - - hid->prev_transfer_complete = 0U; - - usbd_ep_send(udev, HID_IN_EP, report, len); - - return USBD_OK; -} - -/*! - \brief initialize the HID device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t hid_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN standard_hid_handler hid_handler __ALIGN_END; - - memset((void *)&hid_handler, 0U, sizeof(standard_hid_handler)); - - /* initialize the data TX endpoint */ - usbd_ep_setup(udev, &(hid_config_desc.hid_epin)); - - hid_handler.prev_transfer_complete = 1U; - - udev->dev.class_data[USBD_HID_INTERFACE] = (void *)&hid_handler; - - if(NULL != udev->dev.user_data) { - ((hid_fop_handler *)udev->dev.user_data)->hid_itf_config(); - } - - return USBD_OK; -} - -/*! - \brief deinitialize the HID device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t hid_deinit(usb_dev *udev, uint8_t config_index) -{ - /* deinitialize HID endpoints */ - usbd_ep_clear(udev, HID_IN_EP); - - return USBD_OK; -} - -/*! - \brief handle the HID class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t hid_req(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - - standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; - - switch(req->bRequest) { - case GET_REPORT: - /* no use for this driver */ - break; - - case GET_IDLE: - transc->xfer_buf = (uint8_t *)&hid->idle_state; - - transc->remain_len = 1U; - break; - - case GET_PROTOCOL: - transc->xfer_buf = (uint8_t *)&hid->protocol; - - transc->remain_len = 1U; - break; - - case SET_REPORT: - /* no use for this driver */ - break; - - case SET_IDLE: - hid->idle_state = (uint8_t)(req->wValue >> 8); - break; - - case SET_PROTOCOL: - hid->protocol = (uint8_t)(req->wValue); - break; - - case USB_GET_DESCRIPTOR: - if(USB_DESCTYPE_REPORT == (req->wValue >> 8)) { - transc->remain_len = USB_MIN(USB_HID_REPORT_DESC_LEN, req->wLength); - transc->xfer_buf = (uint8_t *)hid_report_desc; - - return REQ_SUPP; - } else if(USB_DESCTYPE_HID == (req->wValue >> 8)) { - transc->remain_len = USB_MIN(9U, req->wLength); - transc->xfer_buf = (uint8_t *)(&(hid_config_desc.hid_vendor)); - } else { - /* no operation */ - } - break; - - default: - break; - } - - return USBD_OK; -} - -/*! - \brief handle data stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval USB device operation status -*/ -static uint8_t hid_data_in(usb_dev *udev, uint8_t ep_num) -{ - standard_hid_handler *hid = (standard_hid_handler *)udev->dev.class_data[USBD_HID_INTERFACE]; - - if(0U != hid->data[2]) { - hid->data[2] = 0x00U; - - usbd_ep_send(udev, HID_IN_EP, hid->data, HID_IN_PACKET); - } else { - hid->prev_transfer_complete = 1U; - } - - return USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h deleted file mode 100644 index 0d4f9efa331..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Include/usb_iap_core.h +++ /dev/null @@ -1,103 +0,0 @@ -/*! - \file usb_iap_core.h - \brief the header file of IAP driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USB_IAP_CORE_H -#define USB_IAP_CORE_H - -#include "usbd_enum.h" -#include "usb_hid.h" - -#define USB_SERIAL_STRING_SIZE 0x06U /*!< serial string size */ - -#ifdef USE_USB_FS - #define USB_DESC_LEN_IAP_REPORT 35U /*!< report descriptor length */ -#elif defined(USE_USB_HS) - #ifdef USE_ULPI_PHY - #define USB_DESC_LEN_IAP_REPORT 37U /*!< report descriptor length */ - #else - #define USB_DESC_LEN_IAP_REPORT 35U /*!< report descriptor length */ - #endif /* USE_ULPI_PHY */ -#else - #error "please select 'USE_USB_FS' or 'USE_USB_HS'" -#endif /* USE_USB_FS */ - -#define USB_DESC_LEN_IAP_CONFIG_SET 41U /*!< configuration descriptor length */ - -/* special commands with download request */ -#define IAP_READ_OPTION_BYTE 0x01U -#define IAP_ERASE 0x02U -#define IAP_DOWNLOAD 0x03U -#define IAP_LEAVE 0x04U -#define IAP_GETBIN_ADDRESS 0x05U -#define IAP_WRITE_OPTION_BYTE 0x06U -#define IAP_UPLOAD 0x07U -#define IAP_CHECK_RDP 0x08U - -#define OPERATION_SUCCESS 0x02U -#define OPERATION_FAIL 0x5FU -#define LEAVE_FINISH 0x04U -#define OB_WRITE_SUCCESS 0x03U -#define IS_RDP_MODE 0xBBU -#define IS_NORMAL_MODE 0xA5U - -#define IAP_HOST_ID 0x01U /*!< IAP host ID */ -#define IAP_DEVICE_ID 0x02U /*!< IAP device ID */ - -typedef struct { - __ALIGN_BEGIN uint8_t report_buf[IAP_OUT_PACKET + 1U] __ALIGN_END; - __ALIGN_BEGIN uint8_t option_byte[IAP_IN_PACKET] __ALIGN_END; - - /* state machine variables */ - __ALIGN_BEGIN uint8_t dev_status[IAP_IN_PACKET] __ALIGN_END; /*!< device status */ - __ALIGN_BEGIN uint8_t bin_addr[IAP_IN_PACKET] __ALIGN_END; /*!< load bin address */ - uint8_t reportID; /*!< report id */ - uint8_t flag; /*!< flag */ - uint32_t protocol; /*!< control request protocol */ - uint32_t idlestate; /*!< control request idle state */ - uint16_t transfer_times; /*!< data transfer times */ - uint16_t page_count; /*!< memory page count */ - uint32_t file_length; /*!< file length*/ - uint32_t base_address; /*!< loaded base address */ -} usbd_iap_handler; - -typedef void (*app_func)(void); - -extern usb_desc iap_desc; -extern usb_class_core iap_class; - -/* function declarations */ -/* send IAP report */ -uint8_t iap_report_send(usb_dev *udev, uint8_t *report, uint32_t len); - -#endif /* USB_IAP_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c deleted file mode 100644 index c2acd3f4e7e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/iap/Source/usb_iap_core.c +++ /dev/null @@ -1,667 +0,0 @@ -/*! - \file usb_iap_core.c - \brief IAP driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usb_iap_core.h" -#include "flash_operation.h" -#include - -#define USBD_VID 0x28E9U -#define USBD_PID 0x3228U - -/* Note:it should use the C99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev iap_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -__ALIGN_BEGIN const usb_hid_desc_config_set iap_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = USB_DESC_LEN_IAP_CONFIG_SET, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0x80U, - .bMaxPower = 0x32U - }, - - .hid_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_HID_CLASS, - .bInterfaceSubClass = 0x00U, - .bInterfaceProtocol = 0x00U, - .iInterface = 0x00U - }, - - .hid_vendor = - { - .header = - { - .bLength = sizeof(usb_desc_hid), - .bDescriptorType = USB_DESCTYPE_HID - }, - .bcdHID = 0x0111U, - .bCountryCode = 0x00U, - .bNumDescriptors = 0x01U, - .bDescriptorType = USB_DESCTYPE_REPORT, - .wDescriptorLength = USB_DESC_LEN_IAP_REPORT - }, - - .hid_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = IAP_IN_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = IAP_IN_PACKET, - .bInterval = 0x01U - }, - - .hid_epout = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = IAP_OUT_EP, - .bmAttributes = USB_EP_ATTR_INT, - .wMaxPacketSize = IAP_OUT_PACKET, - .bInterval = 0x01U - } -}; - -/* USB language ID Descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'I', 'A', 'P'} -}; - -/* USB serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(2U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -void *const usbd_iap_strings[] = { - [STR_IDX_LANGID] = (uint8_t *) &usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *) &manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *) &product_string, - [STR_IDX_SERIAL] = (uint8_t *) &serial_string -}; - -usb_desc iap_desc = { - .dev_desc = (uint8_t *) &iap_dev_desc, - .config_desc = (uint8_t *) &iap_config_desc, - .strings = usbd_iap_strings -}; - -/* local function prototypes ('static') */ -static uint8_t iap_init(usb_dev *udev, uint8_t config_index); -static uint8_t iap_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t iap_req_handler(usb_dev *udev, usb_req *req); -static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num); - -/* IAP requests management functions */ -static void iap_req_erase(usb_dev *udev); -static void iap_req_download(usb_dev *udev); -static void iap_req_read_optionbyte(usb_dev *udev); -static void iap_req_write_optionbyte(usb_dev *udev); -static void iap_req_leave(usb_dev *udev); -static void iap_address_send(usb_dev *udev); -static void iap_req_upload(usb_dev *udev); -static void iap_check_rdp(usb_dev *udev); - -usb_class_core iap_class = { - .init = iap_init, - .deinit = iap_deinit, - .req_proc = iap_req_handler, - .data_out = iap_data_out -}; - -/* USB custom HID device report descriptor */ -__ALIGN_BEGIN const uint8_t iap_report_desc[USB_DESC_LEN_IAP_REPORT] __ALIGN_END = { - 0x05U, 0x01U, /* USAGE_PAGE (Generic Desktop) */ - 0x09U, 0x00U, /* USAGE (Custom Device) */ - 0xa1U, 0x01U, /* COLLECTION (Application) */ - - /* IAP command and data */ - 0x85U, 0x01U, /* REPORT_ID (0x01) */ - 0x09U, 0x01U, /* USAGE (IAP command) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0xffU, /* LOGICAL_MAXIMUM (255) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ -#ifdef USE_USB_FS - 0x95U, REPORT_OUT_COUNT, -#else -#ifdef USE_ULPI_PHY - 0x96U, BYTE_LOW(REPORT_OUT_COUNT), BYTE_HIGH(REPORT_OUT_COUNT), -#elif defined(USE_EMBEDDED_PHY) - 0x95U, REPORT_OUT_COUNT, -#endif -#endif - 0x91U, 0x82U, /* OUTPUT (Data,Var,Abs,Vol) */ - - /* device status and option byte */ - 0x85U, 0x02U, /* REPORT_ID (0x02) */ - 0x09U, 0x02U, /* USAGE (Status and option byte) */ - 0x15U, 0x00U, /* LOGICAL_MINIMUM (0) */ - 0x25U, 0xffU, /* LOGICAL_MAXIMUM (255) */ - 0x75U, 0x08U, /* REPORT_SIZE (8) */ - -#ifdef USE_USB_FS - 0x95U, REPORT_IN_COUNT, -#else -#ifdef USE_ULPI_PHY - 0x96U, BYTE_LOW(REPORT_IN_COUNT), BYTE_HIGH(REPORT_IN_COUNT), -#elif defined(USE_EMBEDDED_PHY) - 0x95U, REPORT_IN_COUNT, -#endif -#endif - 0x81U, 0x82U, /* INPUT (Data,Var,Abs,Vol) */ - - 0xc0U /* END_COLLECTION */ -}; - -/*! - \brief send IAP report - \param[in] udev: pointer to USB device instance - \param[in] report: pointer to HID report - \param[in] len: data length - \param[out] none - \retval USB device operation status -*/ -uint8_t iap_report_send(usb_dev *udev, uint8_t *report, uint32_t len) -{ - usbd_ep_send(udev, IAP_IN_EP, report, len); - - return USBD_OK; -} - -/*! - \brief initialize the IAP device - \param[in] udev: pointer to usb device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t iap_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN usbd_iap_handler iap_handler __ALIGN_END; - - /* initialize Tx endpoint */ - usbd_ep_setup(udev, &(iap_config_desc.hid_epin)); - - /* initialize Rx endpoint */ - usbd_ep_setup(udev, &(iap_config_desc.hid_epout)); - - memset((void *)&iap_handler, 0U, sizeof(usbd_iap_handler)); - - /* prepare receive data */ - usbd_ep_recev(udev, IAP_OUT_EP, iap_handler.report_buf, IAP_OUT_PACKET); - - iap_handler.base_address = APP_LOADED_ADDR; - - udev->dev.class_data[USBD_IAP_INTERFACE] = (void *)&iap_handler; - - return USBD_OK; -} - -/*! - \brief deinitialize the IAP device - \param[in] udev: pointer to usb device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t iap_deinit(usb_dev *udev, uint8_t config_index) -{ - /* deinitialize IAP endpoints */ - usbd_ep_clear(udev, IAP_IN_EP); - usbd_ep_clear(udev, IAP_OUT_EP); - - return USBD_OK; -} - -/*! - \brief handle the IAP class-specific requests - \param[in] udev: pointer to usb device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t iap_req_handler(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - switch(req->bRequest) { - case GET_REPORT: - /* no use for this driver */ - break; - - case GET_IDLE: - transc->xfer_buf = (uint8_t *)&iap->idlestate; - transc->remain_len = 1U; - break; - - case GET_PROTOCOL: - transc->xfer_buf = (uint8_t *)&iap->protocol; - transc->remain_len = 1U; - break; - - case SET_REPORT: - iap->reportID = (uint8_t)(req->wValue); - break; - - case SET_IDLE: - iap->idlestate = (uint8_t)(req->wValue >> 8U); - break; - - case SET_PROTOCOL: - iap->protocol = (uint8_t)(req->wValue); - break; - - case USB_GET_DESCRIPTOR: - if(USB_DESCTYPE_REPORT == (req->wValue >> 8U)) { - transc->remain_len = USB_MIN(USB_DESC_LEN_IAP_REPORT, req->wLength); - transc->xfer_buf = (uint8_t *)iap_report_desc; - } - break; - - default: - return USBD_FAIL; - } - - return USBD_OK; -} - -/*! - \brief handle data out stage - \param[in] udev: pointer to usb device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval none -*/ -static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - if(IAP_HOST_ID == iap->report_buf[0]) { - switch(iap->report_buf[1]) { - case IAP_DOWNLOAD: - iap_req_download(udev); - break; - - case IAP_ERASE: - iap_req_erase(udev); - break; - - case IAP_READ_OPTION_BYTE: - iap_req_read_optionbyte(udev); - break; - - case IAP_LEAVE: - iap_req_leave(udev); - break; - - case IAP_GETBIN_ADDRESS: - iap_address_send(udev); - break; - - case IAP_WRITE_OPTION_BYTE: - iap_req_write_optionbyte(udev); - break; - - case IAP_UPLOAD: - iap_req_upload(udev); - break; - - case IAP_CHECK_RDP: - iap_check_rdp(udev); - break; - - default: - break; - } - } - - usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); - - return USBD_OK; -} - -/*! - \brief handle the IAP_DOWNLOAD request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_download(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->dev_status[0] = IAP_DEVICE_ID; - - /* get the target address to download */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; - - /* program the target address */ - if(FMC_READY == iap_data_write(&iap->report_buf[6], iap->base_address, TRANSFER_SIZE)) { - iap->dev_status[1] = OPERATION_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_WRITE_OPTION_BYTE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_write_optionbyte(usb_dev *udev) -{ - uint32_t option_byte_addr = 0U; - uint16_t option_byte_size = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get option byte address address */ - option_byte_addr = iap->report_buf[2]; - option_byte_addr |= (uint32_t)iap->report_buf[3] << 8U; - option_byte_addr |= (uint32_t)iap->report_buf[4] << 16U; - option_byte_addr |= (uint32_t)iap->report_buf[5] << 24U; - - /* get option byte address size */ - if(OPT_BYTE_ADDR1 == option_byte_addr) { - option_byte_size = OPT_BYTE_SIZE1; - } else if(OPT_BYTE_ADDR2 == option_byte_addr) { - option_byte_size = OPT_BYTE_SIZE2; - } else if(EFUSE_BYTE_ADDR == option_byte_addr) { - option_byte_size = EFUSE_BYTE_SIZE; - } - - iap->dev_status[0] = IAP_DEVICE_ID; - /* write option byte address data */ - if(FMC_READY == option_byte_write(option_byte_addr, &iap->report_buf[6], option_byte_size)) { - iap->dev_status[1] = OB_WRITE_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_ERASE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_erase(usb_dev *udev) -{ - uint32_t addr = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get base address to erase */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; - - /* get file length */ - iap->file_length = iap->report_buf[6]; - iap->file_length |= (uint32_t)iap->report_buf[7] << 8U; - iap->file_length |= (uint32_t)iap->report_buf[8] << 16U; - iap->file_length |= (uint32_t)iap->report_buf[9] << 24U; - - /* check if the address is in protected area */ - if(IS_PROTECTED_AREA(iap->base_address)) { - return; - } - - addr = iap->base_address; - iap->dev_status[0] = IAP_DEVICE_ID; - - if(FMC_READY == flash_erase(addr, iap->file_length)) { - iap->dev_status[1] = OPERATION_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_READ_OPTION_BYTE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_read_optionbyte(usb_dev *udev) -{ - uint8_t i = 0U; - uint32_t option_size = 0U, temp = 0U, option_address = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* read option address address */ - option_address = iap->report_buf[2] + (iap->report_buf[3] << 8U) + (iap->report_buf[4] << 16U) + (iap->report_buf[5] << 24U); - - iap->option_byte[0] = IAP_DEVICE_ID; - if(OPT_BYTE_ADDR1 == option_address) { - option_size = OPT_BYTE_SIZE1; - } else if(OPT_BYTE_ADDR2 == option_address) { - option_size = OPT_BYTE_SIZE2; - } else if(EFUSE_BYTE_ADDR == option_address) { - option_size = EFUSE_BYTE_SIZE; - } - - /* read option address content */ - for(i = 0U; i < (option_size / 4U); i++) { - temp = *(uint32_t *)option_address; - iap->option_byte[4 * i + 5] = temp >> 24U; - iap->option_byte[4 * i + 4] = temp >> 16U; - iap->option_byte[4 * i + 3] = temp >> 8U; - iap->option_byte[4 * i + 2] = temp; - option_address = option_address + 4U; - } - iap->option_byte[1] = OPERATION_SUCCESS; - - iap_report_send(udev, iap->option_byte, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_LEAVE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_leave(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get base address to jump */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8U; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16U; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24U; - - iap->dev_status[0] = IAP_DEVICE_ID; - iap->dev_status[1] = LEAVE_FINISH; - - usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); - usbd_disconnect(udev); - - /* reset register */ - register_reset(); - /* jump to target */ - jump_to_execute(iap->base_address); -} - -/*! - \brief handle the IAP_GETBIN_ADDRESS request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_address_send(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->bin_addr[0] = IAP_DEVICE_ID; - /* get app boundary address */ - iap->bin_addr[1] = (uint8_t)(APP_LOADED_ADDR); - iap->bin_addr[2] = (uint8_t)(APP_LOADED_ADDR >> 8U); - iap->bin_addr[3] = (uint8_t)(APP_LOADED_ADDR >> 16U); - iap->bin_addr[4] = (uint8_t)(APP_LOADED_ADDR >> 24U); - - iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_UPLOAD request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_upload(usb_dev *udev) -{ - uint16_t packet_valid_length = 0U, i = 0U; - uint32_t bin_flash_addr = APP_LOADED_ADDR; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->bin_addr[0] = IAP_DEVICE_ID; - /* get target flash address */ - bin_flash_addr = iap->report_buf[2]; - bin_flash_addr |= (uint32_t)iap->report_buf[3] << 8U; - bin_flash_addr |= (uint32_t)iap->report_buf[4] << 16U; - bin_flash_addr |= (uint32_t)iap->report_buf[5] << 24U; - /* get current packet valid length */ - packet_valid_length = iap->report_buf[6]; - packet_valid_length |= iap->report_buf[7] << 8U; - /* get target flash address content */ - for(i = 0; i < packet_valid_length; i++) { - iap->bin_addr[i + 1] = REG8(bin_flash_addr + i); - } - - iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); -} - -/*! - \brief handle the IAP_CHECK_RDP request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_check_rdp(usb_dev *udev) -{ - uint8_t mode = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* check whether the SPC bit of FMC module is normal state */ - if(0xAAU != (uint8_t)(REG16(OPT_BYTE_ADDR1) >> 8U)) { - mode = IS_RDP_MODE; - } else { - mode = IS_NORMAL_MODE; - } - - iap->bin_addr[0] = IAP_DEVICE_ID; - iap->bin_addr[1] = mode; - - iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h deleted file mode 100644 index a13eba1ee33..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_bbb.h +++ /dev/null @@ -1,100 +0,0 @@ -/*! - \file usbd_msc_bbb.h - \brief the header file of the usbd_msc_bbb.c file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_MSC_BBB_H -#define USBD_MSC_BBB_H - -#include "msc_bbb.h" -#include "msc_scsi.h" -#include "usbd_msc_scsi.h" - -/* MSC BBB state */ -enum msc_bbb_state { - BBB_IDLE = 0U, /*!< idle state */ - BBB_DATA_OUT, /*!< data OUT state */ - BBB_DATA_IN, /*!< data IN state */ - BBB_LAST_DATA_IN, /*!< last data IN state */ - BBB_SEND_DATA /*!< send immediate data state */ -}; - -/* MSC BBB status */ -enum msc_bbb_status { - BBB_STATUS_NORMAL = 0U, /*!< normal status */ - BBB_STATUS_RECOVERY, /*!< recovery status*/ - BBB_STATUS_ERROR /*!< error status */ -}; - -typedef struct { - uint8_t bbb_data[MSC_MEDIA_PACKET_SIZE]; /*!< MSC BBB data buff */ - - uint8_t max_lun; /*!< maximum LUN */ - - uint8_t bbb_state; /*!< BBB state */ - uint8_t bbb_status; /*!< BBB status */ - - uint32_t bbb_datalen; /*!< BBB data length */ - - msc_bbb_cbw bbb_cbw; /*!< MSC BBB CBW structural */ - msc_bbb_csw bbb_csw; /*!< MSC BBB CSW structural */ - - uint8_t scsi_sense_head; /*!< SCSI sense header */ - uint8_t scsi_sense_tail; /*!< SCSI sense tail */ - - uint32_t scsi_blk_size[MEM_LUN_NUM]; /*!< SCSI block size */ - uint32_t scsi_blk_nbr[MEM_LUN_NUM]; /*!< SCSI block number */ - - uint32_t scsi_blk_addr; /*!< SCSI block address */ - uint32_t scsi_blk_len; /*!< SCSI block length */ - uint32_t scsi_disk_pop; /*!< SCSI disk pop */ - - msc_scsi_sense scsi_sense[SENSE_LIST_DEEPTH]; /*!< MSC SCSI sense structural buff */ -} usbd_msc_handler; - -/* function declarations */ -/* initialize the BBB process */ -void msc_bbb_init(usb_core_driver *udev); -/* reset the BBB machine */ -void msc_bbb_reset(usb_core_driver *udev); -/* deinitialize the BBB machine */ -void msc_bbb_deinit(usb_core_driver *udev); -/* handle BBB data IN stage */ -void msc_bbb_data_in(usb_core_driver *udev, uint8_t ep_num); -/* handle BBB data OUT stage */ -void msc_bbb_data_out(usb_core_driver *udev, uint8_t ep_num); -/* send the CSW(command status wrapper) */ -void msc_bbb_csw_send(usb_core_driver *udev, uint8_t csw_status); -/* complete the clear feature request */ -void msc_bbb_clrfeature(usb_core_driver *udev, uint8_t ep_num); - -#endif /* USBD_MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h deleted file mode 100644 index c40bff77f08..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_core.h +++ /dev/null @@ -1,57 +0,0 @@ -/*! - \file usbd_msc_core.h - \brief the header file of USB MSC device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_MSC_CORE_H -#define USBD_MSC_CORE_H - -#include "usbd_core.h" -#include "usb_msc.h" - -#define USB_MSC_CONFIG_DESC_SIZE 32U /*!< MSC configuration descriptor size */ - -#define MSC_EPIN_SIZE MSC_DATA_PACKET_SIZE /*!< MSC endpoint IN size */ -#define MSC_EPOUT_SIZE MSC_DATA_PACKET_SIZE /*!< MSC endpoint OUT size */ - -/* USB configuration descriptor structure */ -typedef struct { - usb_desc_config config; /*!< configuration descriptor */ - usb_desc_itf msc_itf; /*!< interface descriptor */ - usb_desc_ep msc_epin; /*!< endpoint IN descriptor */ - usb_desc_ep msc_epout; /*!< endpoint OUT descriptor */ -} usb_desc_config_set; - -extern usb_desc msc_desc; -extern usb_class_core msc_class; - -#endif /* USBD_MSC_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h deleted file mode 100644 index 358af93128e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_mem.h +++ /dev/null @@ -1,58 +0,0 @@ -/*! - \file usbd_msc_mem.h - \brief header file for storage memory - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_MSC_MEM_H -#define USBD_MSC_MEM_H - -#include "usbd_conf.h" - -#define USBD_STD_INQUIRY_LENGTH 36U /*!< standard inquiry length */ - -typedef struct { - int8_t (*mem_init)(uint8_t lun); - int8_t (*mem_ready)(uint8_t lun); - int8_t (*mem_protected)(uint8_t lun); - int8_t (*mem_read)(uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); - int8_t (*mem_write)(uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); - int8_t (*mem_maxlun)(void); - - uint8_t *mem_toc_data; /*!< memory TOC command data pointer */ - uint8_t *mem_inquiry_data[MEM_LUN_NUM]; /*!< memory inquiry data buff */ - uint32_t mem_block_size[MEM_LUN_NUM]; /*!< memory block size buff */ - uint32_t mem_block_len[MEM_LUN_NUM]; /*!< memory block length buff */ -}usbd_mem_cb; - -extern usbd_mem_cb *usbd_mem_fops; - -#endif /* USBD_MSC_MEM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h deleted file mode 100644 index 180685f9f91..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Include/usbd_msc_scsi.h +++ /dev/null @@ -1,53 +0,0 @@ -/*! - \file usbd_msc_scsi.h - \brief the header file of the usbd_msc_scsi.c file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_MSC_SCSI_H -#define USBD_MSC_SCSI_H - -#include "usbd_core.h" - -#define SENSE_LIST_DEEPTH 4U /*!< sense list deepth */ - -#define MODE_SENSE6_LENGTH 8U /*!< sense6 mode length */ -#define MODE_SENSE10_LENGTH 8U /*!< sense10 mode length */ -#define INQUIRY_PAGE00_LENGTH 96U /*!< sense page 0 inquiry length */ -#define FORMAT_CAPACITIES_LENGTH 20U /*!< format capacities length */ - -/* function declarations */ -/* process SCSI commands */ -int8_t scsi_process_cmd(usb_core_driver *udev, uint8_t lun, uint8_t *cmd); -/* load the last error code in the error list */ -void scsi_sense_code(usb_core_driver *udev, uint8_t lun, uint8_t skey, uint8_t asc); - -#endif /* USBD_MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c deleted file mode 100644 index 2a00a8f6f55..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_bbb.c +++ /dev/null @@ -1,287 +0,0 @@ -/*! - \file usbd_msc_bbb.c - \brief USB BBB(Bulk/Bulk/Bulk) protocol core functions - \note BBB means Bulk-only transport protocol for USB MSC - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbd_msc_bbb.h" -#include "usbd_msc_mem.h" - -/* local function prototypes ('static') */ -static void msc_bbb_cbw_decode(usb_core_driver *udev); -static void msc_bbb_data_send(usb_core_driver *udev, uint8_t *pbuf, uint32_t Len); -static void msc_bbb_abort(usb_core_driver *udev); - -/*! - \brief initialize the BBB process - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void msc_bbb_init(usb_core_driver *udev) -{ - uint8_t lun_num; - - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_state = BBB_IDLE; - msc->bbb_status = BBB_STATUS_NORMAL; - - /* initializes the storage logic unit */ - for(lun_num = 0U; lun_num < MEM_LUN_NUM; lun_num++) { - usbd_mem_fops->mem_init(lun_num); - } - - /* flush the RX FIFO */ - usbd_fifo_flush(udev, MSC_OUT_EP); - - /* flush the TX FIFO */ - usbd_fifo_flush(udev, MSC_IN_EP); - - /* prepare endpoint to receive the first BBB CBW */ - usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); -} - -/*! - \brief reset the BBB machine - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void msc_bbb_reset(usb_core_driver *udev) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_state = BBB_IDLE; - msc->bbb_status = BBB_STATUS_RECOVERY; - - /* prepare endpoint to receive the first BBB command */ - usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); -} - -/*! - \brief deinitialize the BBB machine - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void msc_bbb_deinit(usb_core_driver *udev) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_state = BBB_IDLE; -} - -/*! - \brief handle BBB data IN stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval none -*/ -void msc_bbb_data_in(usb_core_driver *udev, uint8_t ep_num) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - switch(msc->bbb_state) { - case BBB_DATA_IN: - if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { - msc_bbb_csw_send(udev, CSW_CMD_FAILED); - } - break; - - case BBB_SEND_DATA: - case BBB_LAST_DATA_IN: - msc_bbb_csw_send(udev, CSW_CMD_PASSED); - break; - - default: - break; - } -} - -/*! - \brief handle BBB data OUT stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval none -*/ -void msc_bbb_data_out(usb_core_driver *udev, uint8_t ep_num) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - switch(msc->bbb_state) { - case BBB_IDLE: - msc_bbb_cbw_decode(udev); - break; - - case BBB_DATA_OUT: - if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { - msc_bbb_csw_send(udev, CSW_CMD_FAILED); - } - break; - - default: - break; - } -} - -/*! - \brief send the CSW(command status wrapper) - \param[in] udev: pointer to USB device instance - \param[in] csw_status: CSW status - \param[out] none - \retval none -*/ -void msc_bbb_csw_send(usb_core_driver *udev, uint8_t csw_status) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_csw.dCSWSignature = BBB_CSW_SIGNATURE; - msc->bbb_csw.bCSWStatus = csw_status; - msc->bbb_state = BBB_IDLE; - - usbd_ep_send(udev, MSC_IN_EP, (uint8_t *)&msc->bbb_csw, BBB_CSW_LENGTH); - - /* prepare endpoint to receive next command */ - usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); -} - -/*! - \brief complete the clear feature request - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval none -*/ -void msc_bbb_clrfeature(usb_core_driver *udev, uint8_t ep_num) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if(BBB_STATUS_ERROR == msc->bbb_status) { /* bad CBW signature */ - usbd_ep_stall(udev, MSC_IN_EP); - - msc->bbb_status = BBB_STATUS_NORMAL; - } else if((0x80U == (ep_num & 0x80U)) && (BBB_STATUS_RECOVERY != msc->bbb_status)) { - msc_bbb_csw_send(udev, CSW_CMD_FAILED); - } else { - - } -} - -/*! - \brief decode the CBW command and set the BBB state machine accordingly - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void msc_bbb_cbw_decode(usb_core_driver *udev) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_csw.dCSWTag = msc->bbb_cbw.dCBWTag; - msc->bbb_csw.dCSWDataResidue = msc->bbb_cbw.dCBWDataTransferLength; - - if((BBB_CBW_LENGTH != usbd_rxcount_get(udev, MSC_OUT_EP)) || \ - (BBB_CBW_SIGNATURE != msc->bbb_cbw.dCBWSignature) || \ - (msc->bbb_cbw.bCBWLUN > 1U) || \ - (msc->bbb_cbw.bCBWCBLength < 1U) || \ - (msc->bbb_cbw.bCBWCBLength > 16U)) { - /* illegal command handler */ - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - msc->bbb_status = BBB_STATUS_ERROR; - - msc_bbb_abort(udev); - } else { - if(scsi_process_cmd(udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { - msc_bbb_abort(udev); - } else if((BBB_DATA_IN != msc->bbb_state) && \ - (BBB_DATA_OUT != msc->bbb_state) && \ - (BBB_LAST_DATA_IN != msc->bbb_state)) { /* burst transfer handled internally */ - if(msc->bbb_datalen > 0U) { - msc_bbb_data_send(udev, msc->bbb_data, msc->bbb_datalen); - } else if(0U == msc->bbb_datalen) { - msc_bbb_csw_send(udev, CSW_CMD_PASSED); - } else { - - } - } else { - - } - } -} - -/*! - \brief send the requested data - \param[in] udev: pointer to USB device instance - \param[in] buf: pointer to data buffer - \param[in] len: data length - \param[out] none - \retval none -*/ -static void msc_bbb_data_send(usb_core_driver *udev, uint8_t *buf, uint32_t len) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - len = USB_MIN(msc->bbb_cbw.dCBWDataTransferLength, len); - - msc->bbb_csw.dCSWDataResidue -= len; - msc->bbb_csw.bCSWStatus = CSW_CMD_PASSED; - msc->bbb_state = BBB_SEND_DATA; - - usbd_ep_send(udev, MSC_IN_EP, buf, len); -} - -/*! - \brief abort the current transfer - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void msc_bbb_abort(usb_core_driver *udev) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if((0U == msc->bbb_cbw.bmCBWFlags) && \ - (0U != msc->bbb_cbw.dCBWDataTransferLength) && \ - (BBB_STATUS_NORMAL == msc->bbb_status)) { - usbd_ep_stall(udev, MSC_OUT_EP); - } - - usbd_ep_stall(udev, MSC_IN_EP); - - if(BBB_STATUS_ERROR == msc->bbb_status) { - usbd_ep_recev(udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c deleted file mode 100644 index 8b063b943d7..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_core.c +++ /dev/null @@ -1,395 +0,0 @@ -/*! - \file usbd_msc_core.c - \brief USB MSC device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include -#include "usbd_enum.h" -#include "usbd_msc_bbb.h" -#include "usbd_msc_core.h" -#include "usbd_msc_mem.h" - -#define USBD_VID 0x28E9U -#define USBD_PID 0x028FU - -/* local function prototypes ('static') */ -static uint8_t msc_core_init(usb_dev *udev, uint8_t config_index); -static uint8_t msc_core_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t msc_core_req(usb_dev *udev, usb_req *req); -static uint8_t msc_core_in(usb_dev *udev, uint8_t ep_num); -static uint8_t msc_core_out(usb_dev *udev, uint8_t ep_num); - -usb_class_core msc_class = { - .init = msc_core_init, - .deinit = msc_core_deinit, - - .req_proc = msc_core_req, - - .data_in = msc_core_in, - .data_out = msc_core_out -}; - -/* note: it should use the C99 standard when compiling the below codes */ -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev msc_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_desc_config_set msc_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xC0U, - .bMaxPower = 0x32U - }, - - .msc_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_CLASS_MSC, - .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, - .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, - .iInterface = 0x00U - }, - - .msc_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = MSC_IN_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = MSC_EPIN_SIZE, - .bInterval = 0x00U - }, - - .msc_epout = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = MSC_OUT_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = MSC_EPOUT_SIZE, - .bInterval = 0x00U - } -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_desc_config_set other_speed_msc_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_OTHER_SPD_CONFIG - }, - .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xC0U, - .bMaxPower = 0x32U - }, - - .msc_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_CLASS_MSC, - .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, - .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, - .iInterface = 0x00U - }, - - .msc_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = MSC_IN_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = 64U, - .bInterval = 0x00U - }, - - .msc_epout = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = MSC_OUT_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = 64U, - .bInterval = 0x00U - } -}; - -__ALIGN_BEGIN const uint8_t usbd_qualifier_desc[10] __ALIGN_END = { - 0x0AU, - 0x06U, - 0x00U, - 0x02U, - 0x00U, - 0x00U, - 0x00U, - 0x40U, - 0x01U, - 0x00U -}; - -/* USB language ID descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'M', 'S', 'C'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB string descriptor */ -static void *const usbd_msc_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -usb_desc msc_desc = { - .dev_desc = (uint8_t *)&msc_dev_desc, - .config_desc = (uint8_t *)&msc_config_desc, - -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - .other_speed_config_desc = (uint8_t *)&other_speed_msc_config_desc, - .qualifier_desc = (uint8_t *)&usbd_qualifier_desc, -#endif /* USE_USB_HS && USE_ULPI_PHY */ - - .strings = usbd_msc_strings -}; - -static __ALIGN_BEGIN uint8_t usbd_msc_maxlun __ALIGN_END = 0U ; - -/*! - \brief initialize the MSC device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t msc_core_init(usb_dev *udev, uint8_t config_index) -{ - static __ALIGN_BEGIN usbd_msc_handler msc_handler __ALIGN_END; - - memset((void *)&msc_handler, 0U, sizeof(usbd_msc_handler)); - - udev->dev.class_data[USBD_MSC_INTERFACE] = (void *)&msc_handler; - - /* configure MSC TX endpoint */ - usbd_ep_setup(udev, &(msc_config_desc.msc_epin)); - - /* configure MSC RX endpoint */ - usbd_ep_setup(udev, &(msc_config_desc.msc_epout)); - - /* initialize the BBB layer */ - msc_bbb_init(udev); - - return USBD_OK; -} - -/*! - \brief deinitialize the MSC device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t msc_core_deinit(usb_dev *udev, uint8_t config_index) -{ - /* clear MSC endpoints */ - usbd_ep_clear(udev, MSC_IN_EP); - usbd_ep_clear(udev, MSC_OUT_EP); - - /* deinitialize the BBB layer */ - msc_bbb_deinit(udev); - - return USBD_OK; -} - -/*! - \brief handle the MSC class-specific and standard requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t msc_core_req(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - - switch(req->bRequest) { - case BBB_GET_MAX_LUN : - if((0U == req->wValue) && \ - (1U == req->wLength) && \ - (0x80U == (req->bmRequestType & 0x80U))) { - usbd_msc_maxlun = (uint8_t)usbd_mem_fops->mem_maxlun(); - - transc->xfer_buf = &usbd_msc_maxlun; - transc->remain_len = 1U; - } else { - return USBD_FAIL; - } - break; - - case BBB_RESET : - if((0U == req->wValue) && \ - (0U == req->wLength) && \ - (0x80U != (req->bmRequestType & 0x80U))) { - msc_bbb_reset(udev); - } else { - return USBD_FAIL; - } - break; - - case USB_CLEAR_FEATURE: - msc_bbb_clrfeature(udev, (uint8_t)req->wIndex); - break; - - default: - return USBD_FAIL; - } - - return USBD_OK; -} - -/*! - \brief handle data IN stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: the endpoint number - \param[out] none - \retval none -*/ -static uint8_t msc_core_in(usb_dev *udev, uint8_t ep_num) -{ - msc_bbb_data_in(udev, ep_num); - - return USBD_OK; -} - -/*! - \brief handle data OUT stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: the endpoint number - \param[out] none - \retval none -*/ -static uint8_t msc_core_out(usb_dev *udev, uint8_t ep_num) -{ - msc_bbb_data_out(udev, ep_num); - - return USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c deleted file mode 100644 index 36cef6309d2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/msc/Source/usbd_msc_scsi.c +++ /dev/null @@ -1,758 +0,0 @@ -/*! - \file usbd_msc_scsi.c - \brief USB SCSI layer functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbd_msc_mem.h" -#include "usbd_msc_bbb.h" -#include "usbd_msc_scsi.h" - -/* USB mass storage page 0 inquiry data */ -const uint8_t msc_page00_inquiry_data[] = { - 0x00U, - 0x00U, - 0x00U, - 0x00U, - (INQUIRY_PAGE00_LENGTH - 4U), - 0x80U, - 0x83U -}; - -/* USB mass storage sense 6 data */ -const uint8_t msc_mode_sense6_data[] = { - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U -}; - -/* USB mass storage sense 10 data */ -const uint8_t msc_mode_sense10_data[] = { - 0x00U, - 0x06U, - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U, - 0x00U -}; - -/* local function prototypes ('static') */ -static int8_t scsi_test_unit_ready(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_mode_select6(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_mode_select10(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_inquiry(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_read_format_capacity(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_read_capacity10(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_request_sense(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_mode_sense6(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_toc_cmd_read(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_mode_sense10(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_write10(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_read10(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static int8_t scsi_verify10(usb_core_driver *udev, uint8_t lun, uint8_t *params); - -static int8_t scsi_process_read(usb_core_driver *udev, uint8_t lun); -static int8_t scsi_process_write(usb_core_driver *udev, uint8_t lun); - -static inline int8_t scsi_check_address_range(usb_core_driver *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr); -static inline int8_t scsi_format_cmd(usb_core_driver *udev, uint8_t lun); -static inline int8_t scsi_start_stop_unit(usb_core_driver *udev, uint8_t lun, uint8_t *params); -static inline int8_t scsi_allow_medium_removal(usb_core_driver *udev, uint8_t lun, uint8_t *params); - -/*! - \brief process SCSI commands - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -int8_t scsi_process_cmd(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - switch(params[0]) { - case SCSI_TEST_UNIT_READY: - return scsi_test_unit_ready(udev, lun, params); - - case SCSI_REQUEST_SENSE: - return scsi_request_sense(udev, lun, params); - - case SCSI_INQUIRY: - return scsi_inquiry(udev, lun, params); - - case SCSI_START_STOP_UNIT: - return scsi_start_stop_unit(udev, lun, params); - - case SCSI_ALLOW_MEDIUM_REMOVAL: - return scsi_allow_medium_removal(udev, lun, params); - - case SCSI_MODE_SENSE6: - return scsi_mode_sense6(udev, lun, params); - - case SCSI_MODE_SENSE10: - return scsi_mode_sense10(udev, lun, params); - - case SCSI_READ_FORMAT_CAPACITIES: - return scsi_read_format_capacity(udev, lun, params); - - case SCSI_READ_CAPACITY10: - return scsi_read_capacity10(udev, lun, params); - - case SCSI_READ10: - return scsi_read10(udev, lun, params); - - case SCSI_WRITE10: - return scsi_write10(udev, lun, params); - - case SCSI_VERIFY10: - return scsi_verify10(udev, lun, params); - - case SCSI_FORMAT_UNIT: - return scsi_format_cmd(udev, lun); - - case SCSI_READ_TOC_DATA: - return scsi_toc_cmd_read(udev, lun, params); - - case SCSI_MODE_SELECT6: - return scsi_mode_select6(udev, lun, params); - - case SCSI_MODE_SELECT10: - return scsi_mode_select10(udev, lun, params); - - default: - scsi_sense_code(udev, lun, ILLEGAL_REQUEST, INVALID_CDB); - return -1; - } -} - -/*! - \brief load the last error code in the error list - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] skey: sense key - \param[in] asc: additional sense key - \param[out] none - \retval none -*/ -void scsi_sense_code(usb_core_driver *udev, uint8_t lun, uint8_t skey, uint8_t asc) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->scsi_sense[msc->scsi_sense_tail].SenseKey = skey; - msc->scsi_sense[msc->scsi_sense_tail].ASC = asc; - msc->scsi_sense_tail++; - - if(SENSE_LIST_DEEPTH == msc->scsi_sense_tail) { - msc->scsi_sense_tail = 0U; - } -} - -/*! - \brief process SCSI Test Unit Ready command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_test_unit_ready(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - /* case 9 : Hi > D0 */ - if(0U != msc->bbb_cbw.dCBWDataTransferLength) { - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - return -1; - } - - if(0 != usbd_mem_fops->mem_ready(lun)) { - scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - - return -1; - } - - msc->bbb_datalen = 0U; - - return 0; -} - -/*! - \brief process mode select 6 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_mode_select6(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = 0U; - - return 0; -} - -/*! - \brief process mode select 10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_mode_select10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = 0U; - - return 0; -} - -/*! - \brief process Inquiry command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_inquiry(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint8_t *page = NULL; - uint16_t len = 0U; - - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if(params[1] & 0x01U) { - page = (uint8_t *)msc_page00_inquiry_data; - - len = INQUIRY_PAGE00_LENGTH; - } else { - page = (uint8_t *)usbd_mem_fops->mem_inquiry_data[lun]; - - len = (uint16_t)(page[4] + 5U); - - if(params[4] <= len) { - len = params[4]; - } - } - - msc->bbb_datalen = len; - - while(len) { - len--; - msc->bbb_data[len] = page[len]; - } - - return 0; -} - -/*! - \brief process Read Capacity 10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_read_capacity10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint32_t blk_num = usbd_mem_fops->mem_block_len[lun] - 1U; - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->scsi_blk_nbr[lun] = usbd_mem_fops->mem_block_len[lun]; - msc->scsi_blk_size[lun] = usbd_mem_fops->mem_block_size[lun]; - - msc->bbb_data[0] = (uint8_t)(blk_num >> 24); - msc->bbb_data[1] = (uint8_t)(blk_num >> 16); - msc->bbb_data[2] = (uint8_t)(blk_num >> 8); - msc->bbb_data[3] = (uint8_t)(blk_num); - - msc->bbb_data[4] = (uint8_t)(msc->scsi_blk_size[lun] >> 24); - msc->bbb_data[5] = (uint8_t)(msc->scsi_blk_size[lun] >> 16); - msc->bbb_data[6] = (uint8_t)(msc->scsi_blk_size[lun] >> 8); - msc->bbb_data[7] = (uint8_t)(msc->scsi_blk_size[lun]); - - msc->bbb_datalen = 8U; - - return 0; -} - -/*! - \brief process Read Format Capacity command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_read_format_capacity(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint16_t i = 0U; - uint32_t blk_size = usbd_mem_fops->mem_block_size[lun]; - uint32_t blk_num = usbd_mem_fops->mem_block_len[lun]; - uint32_t blk_nbr = blk_num - 1U; - - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - for(i = 0U; i < 12U; i++) { - msc->bbb_data[i] = 0U; - } - - msc->bbb_data[3] = 0x08U; - msc->bbb_data[4] = (uint8_t)(blk_nbr >> 24); - msc->bbb_data[5] = (uint8_t)(blk_nbr >> 16); - msc->bbb_data[6] = (uint8_t)(blk_nbr >> 8); - msc->bbb_data[7] = (uint8_t)(blk_nbr); - - msc->bbb_data[8] = 0x02U; - msc->bbb_data[9] = (uint8_t)(blk_size >> 16); - msc->bbb_data[10] = (uint8_t)(blk_size >> 8); - msc->bbb_data[11] = (uint8_t)(blk_size); - - msc->bbb_datalen = 12U; - - return 0; -} - -/*! - \brief process Mode Sense6 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_mode_sense6(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint16_t len = 8U; - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = len; - - while(len) { - len--; - msc->bbb_data[len] = msc_mode_sense6_data[len]; - } - - return 0; -} - -/*! - \brief process Mode Sense10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_mode_sense10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint16_t len = 8U; - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = len; - - while(len) { - len--; - msc->bbb_data[len] = msc_mode_sense10_data[len]; - } - - return 0; -} - -/*! - \brief process Request Sense command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_request_sense(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint8_t i = 0U; - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - for(i = 0U; i < REQUEST_SENSE_DATA_LEN; i++) { - msc->bbb_data[i] = 0U; - } - - msc->bbb_data[0] = 0x70U; - msc->bbb_data[7] = REQUEST_SENSE_DATA_LEN - 6U; - - if((msc->scsi_sense_head != msc->scsi_sense_tail)) { - msc->bbb_data[2] = msc->scsi_sense[msc->scsi_sense_head].SenseKey; - msc->bbb_data[12] = msc->scsi_sense[msc->scsi_sense_head].ASC; - msc->bbb_data[13] = msc->scsi_sense[msc->scsi_sense_head].ASCQ; - msc->scsi_sense_head++; - - if(SENSE_LIST_DEEPTH == msc->scsi_sense_head) { - msc->scsi_sense_head = 0U; - } - } - - msc->bbb_datalen = USB_MIN(REQUEST_SENSE_DATA_LEN, params[4]); - - return 0; -} - -/*! - \brief process Start Stop Unit command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static inline int8_t scsi_start_stop_unit(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = 0U; - msc->scsi_disk_pop = 1U; - - return 0; -} - -/*! - \brief process Allow Medium Removal command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static inline int8_t scsi_allow_medium_removal(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - msc->bbb_datalen = 0U; - - return 0; -} - -/*! - \brief process Read10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_read10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if(BBB_IDLE == msc->bbb_state) { - /* direction is from device to host */ - if(0x80U != (msc->bbb_cbw.bmCBWFlags & 0x80U)) { - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - return -1; - } - - if(0 != usbd_mem_fops->mem_ready(lun)) { - scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - - return -1; - } - - msc->scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ - (params[4] << 8) | params[5]; - - msc->scsi_blk_len = (params[7] << 8) | params[8]; - - if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { - return -1; /* error */ - } - - msc->bbb_state = BBB_DATA_IN; - - msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; - msc->scsi_blk_len *= msc->scsi_blk_size[lun]; - - /* cases 4,5 : Hi <> Dn */ - if(msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - return -1; - } - } - - msc->bbb_datalen = MSC_MEDIA_PACKET_SIZE; - - return scsi_process_read(udev, lun); -} - -/*! - \brief process Write10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_write10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if(BBB_IDLE == msc->bbb_state) { - /* case 8 : Hi <> Do */ - if(0x80U == (msc->bbb_cbw.bmCBWFlags & 0x80U)) { - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - return -1; - } - - /* check whether media is ready */ - if(0 != usbd_mem_fops->mem_ready(lun)) { - scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - - return -1; - } - - /* check if media is write-protected */ - if(0 != usbd_mem_fops->mem_protected(lun)) { - scsi_sense_code(udev, lun, NOT_READY, WRITE_PROTECTED); - - return -1; - } - - msc->scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ - (params[4] << 8) | params[5]; - - msc->scsi_blk_len = (params[7] << 8) | params[8]; - - /* check if LBA address is in the right range */ - if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { - return -1; /* error */ - } - - msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; - msc->scsi_blk_len *= msc->scsi_blk_size[lun]; - - /* cases 3,11,13 : Hn,Ho <> D0 */ - if(msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { - scsi_sense_code(udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); - - return -1; - } - - /* prepare endpoint to receive first data packet */ - msc->bbb_state = BBB_DATA_OUT; - - usbd_ep_recev(udev, \ - MSC_OUT_EP, \ - msc->bbb_data, \ - USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); - } else { /* write process ongoing */ - return scsi_process_write(udev, lun); - } - - return 0; -} - -/*! - \brief process Verify10 command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_verify10(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if(0x02U == (params[1] & 0x02U)) { - scsi_sense_code(udev, lun, ILLEGAL_REQUEST, INVALID_FIELD_IN_COMMAND); - - return -1; /* error, verify mode not supported*/ - } - - if(scsi_check_address_range(udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { - return -1; /* error */ - } - - msc->bbb_datalen = 0U; - - return 0; -} - -/*! - \brief check address range - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] blk_offset: block offset - \param[in] blk_nbr: number of block to be processed - \param[out] none - \retval status -*/ -static inline int8_t scsi_check_address_range(usb_core_driver *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - if((blk_offset + blk_nbr) > msc->scsi_blk_nbr[lun]) { - scsi_sense_code(udev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); - - return -1; - } - - return 0; -} - -/*! - \brief handle read process - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[out] none - \retval status -*/ -static int8_t scsi_process_read(usb_core_driver *udev, uint8_t lun) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); - - if(usbd_mem_fops->mem_read(lun, \ - msc->bbb_data, \ - msc->scsi_blk_addr, \ - (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { - scsi_sense_code(udev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); - - return -1; - } - - usbd_ep_send(udev, MSC_IN_EP, msc->bbb_data, len); - - msc->scsi_blk_addr += len; - msc->scsi_blk_len -= len; - - /* case 6 : Hi = Di */ - msc->bbb_csw.dCSWDataResidue -= len; - - if(0U == msc->scsi_blk_len) { - msc->bbb_state = BBB_LAST_DATA_IN; - } - - return 0; -} - -/*! - \brief handle write process - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[out] none - \retval status -*/ -static int8_t scsi_process_write(usb_core_driver *udev, uint8_t lun) -{ - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); - - if(usbd_mem_fops->mem_write(lun, \ - msc->bbb_data, \ - msc->scsi_blk_addr, \ - (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { - scsi_sense_code(udev, lun, HARDWARE_ERROR, WRITE_FAULT); - - return -1; - } - - msc->scsi_blk_addr += len; - msc->scsi_blk_len -= len; - - /* case 12 : Ho = Do */ - msc->bbb_csw.dCSWDataResidue -= len; - - if(0U == msc->scsi_blk_len) { - msc_bbb_csw_send(udev, CSW_CMD_PASSED); - } else { - /* prepare endpoint to receive next packet */ - usbd_ep_recev(udev, \ - MSC_OUT_EP, \ - msc->bbb_data, \ - USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); - } - - return 0; -} - -/*! - \brief process Format Unit command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[out] none - \retval status -*/ -static inline int8_t scsi_format_cmd(usb_core_driver *udev, uint8_t lun) -{ - return 0; -} - -/*! - \brief process Read_Toc command - \param[in] udev: pointer to USB device instance - \param[in] lun: logical unit number - \param[in] params: command parameters - \param[out] none - \retval status -*/ -static int8_t scsi_toc_cmd_read(usb_core_driver *udev, uint8_t lun, uint8_t *params) -{ - uint8_t *pPage; - uint16_t len; - - usbd_msc_handler *msc = (usbd_msc_handler *)udev->dev.class_data[USBD_MSC_INTERFACE]; - - pPage = (uint8_t *)&usbd_mem_fops->mem_toc_data[lun * READ_TOC_CMD_LEN]; - len = (uint16_t)pPage[1] + 2U; - - msc->bbb_datalen = len; - - while(len) { - len--; - msc->bbb_data[len] = pPage[len]; - } - - return 0; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h deleted file mode 100644 index d3799652321..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Include/printer_core.h +++ /dev/null @@ -1,78 +0,0 @@ -/*! - \file printer_core.h - \brief the header file of USB printer device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef PRINTER_CORE_H -#define PRINTER_CORE_H - -#include "usbd_enum.h" - -/* USB printing device class code */ -#define USB_CLASS_PRINTER 0x07U - -/* printing device subclass code */ -#define USB_SUBCLASS_PRINTER 0x01U - -/* printing device protocol code */ -#define PROTOCOL_UNIDIRECTIONAL_ITF 0x01U /*!< unidirectional interface */ -#define PROTOCOL_BI_DIRECTIONAL_ITF 0x02U /*!< BI directional interface */ -#define PROTOCOL_1284_4_ITF 0x03U /*!< 1284.4 interface */ -#define PROTOCOL_VENDOR 0xFFU /*!< vendor */ - -/* device id length */ -#define DEVICE_ID_LEN 103U - -/* printer configuration descriptor length */ -#define USB_PRINTER_CONFIG_DESC_LEN 32U - -/* printing device specific-class request */ -#define GET_DEVICE_ID 0x00U /*!< get device id request */ -#define GET_PORT_STATUS 0x01U /*!< get port status request */ -#define SOFT_RESET 0x02U /*!< soft reset request */ - -#pragma pack(1) - -/* USB configuration descriptor structure */ -typedef struct { - usb_desc_config config; /*!< printer configuration descriptor */ - usb_desc_itf printer_itf; /*!< printer interface descriptor */ - usb_desc_ep printer_epin; /*!< endpoint IN descriptor */ - usb_desc_ep printer_epout; /*!< endpoint OUT descriptor */ -} usb_printer_desc_config_set; - -#pragma pack() - -extern usb_desc printer_desc; -extern usb_class_core usbd_printer_cb; - -#endif /* PRINTER_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c deleted file mode 100644 index 175c9d7a5b5..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/class/printer/Source/printer_core.c +++ /dev/null @@ -1,302 +0,0 @@ -/*! - \file printer_core.c - \brief USB printer device class core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "printer_core.h" - -#define USBD_VID 0x28E9U -#define USBD_PID 0x028DU - -/* printer port status: paper not empty/selected/no error */ -static uint8_t g_port_status = 0x18U; - -uint8_t g_printer_data_buf[PRINTER_OUT_PACKET]; - -__ALIGN_BEGIN uint8_t PRINTER_DEVICE_ID[DEVICE_ID_LEN] __ALIGN_END = { - 0x00U, 0x67U, - 'M', 'A', 'N', 'U', 'F', 'A', 'C', 'T', 'U', 'R', 'E', 'R', ':', - 'G', 'I', 'G', 'A', ' ', 'D', 'E', 'V', 'I', 'C', 'E', '-', ';', - 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', - 'P', 'C', 'L', ',', 'M', 'P', 'L', ';', - 'M', 'O', 'D', 'E', 'L', ':', - 'L', 'a', 's', 'e', 'r', 'B', 'e', 'a', 'm', '?', ';', - 'C', 'O', 'M', 'M', 'E', 'N', 'T', ':', - 'G', 'o', 'o', 'd', ' ', '!', ';', - 'A', 'C', 'T', 'I', 'V', 'E', ' ', 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', - 'P', 'C', 'L', ';' -}; - -/* USB standard device descriptor */ -__ALIGN_BEGIN const usb_desc_dev printer_dev_desc __ALIGN_END = { - .header = - { - .bLength = USB_DEV_DESC_LEN, - .bDescriptorType = USB_DESCTYPE_DEV - }, - .bcdUSB = 0x0200U, - .bDeviceClass = 0x00U, - .bDeviceSubClass = 0x00U, - .bDeviceProtocol = 0x00U, - .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, - .idVendor = USBD_VID, - .idProduct = USBD_PID, - .bcdDevice = 0x0100U, - .iManufacturer = STR_IDX_MFC, - .iProduct = STR_IDX_PRODUCT, - .iSerialNumber = STR_IDX_SERIAL, - .bNumberConfigurations = USBD_CFG_MAX_NUM -}; - -/* USB device configuration descriptor */ -__ALIGN_BEGIN const usb_printer_desc_config_set printer_config_desc __ALIGN_END = { - .config = - { - .header = - { - .bLength = sizeof(usb_desc_config), - .bDescriptorType = USB_DESCTYPE_CONFIG - }, - .wTotalLength = USB_PRINTER_CONFIG_DESC_LEN, - .bNumInterfaces = 0x01U, - .bConfigurationValue = 0x01U, - .iConfiguration = 0x00U, - .bmAttributes = 0xA0U, - .bMaxPower = 0x32U - }, - - .printer_itf = - { - .header = - { - .bLength = sizeof(usb_desc_itf), - .bDescriptorType = USB_DESCTYPE_ITF - }, - .bInterfaceNumber = 0x00U, - .bAlternateSetting = 0x00U, - .bNumEndpoints = 0x02U, - .bInterfaceClass = USB_CLASS_PRINTER, - .bInterfaceSubClass = USB_SUBCLASS_PRINTER, - .bInterfaceProtocol = PROTOCOL_BI_DIRECTIONAL_ITF, - .iInterface = 0x00U - }, - - .printer_epin = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = PRINTER_IN_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = PRINTER_IN_PACKET, - .bInterval = 0x00U - }, - - .printer_epout = - { - .header = - { - .bLength = sizeof(usb_desc_ep), - .bDescriptorType = USB_DESCTYPE_EP - }, - .bEndpointAddress = PRINTER_OUT_EP, - .bmAttributes = USB_EP_ATTR_BULK, - .wMaxPacketSize = PRINTER_OUT_PACKET, - .bInterval = 0x00U - }, -}; - -/* USB language ID Descriptor */ -static __ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = { - .header = - { - .bLength = sizeof(usb_desc_LANGID), - .bDescriptorType = USB_DESCTYPE_STR - }, - .wLANGID = ENG_LANGID -}; - -/* USB manufacture string */ -static __ALIGN_BEGIN const usb_desc_str manufacturer_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(10U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} -}; - -/* USB product string */ -static __ALIGN_BEGIN const usb_desc_str product_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(16U), - .bDescriptorType = USB_DESCTYPE_STR - }, - .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'P', 'r', 'i', 'n', 't', 'e', 'r'} -}; - -/* USBD serial string */ -static __ALIGN_BEGIN usb_desc_str serial_string __ALIGN_END = { - .header = - { - .bLength = USB_STRING_LEN(12U), - .bDescriptorType = USB_DESCTYPE_STR - } -}; - -/* USB string descriptor */ -static void *const usbd_printer_strings[] = { - [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, - [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, - [STR_IDX_PRODUCT] = (uint8_t *)&product_string, - [STR_IDX_SERIAL] = (uint8_t *)&serial_string -}; - -usb_desc printer_desc = { - .dev_desc = (uint8_t *)&printer_dev_desc, - .config_desc = (uint8_t *)&printer_config_desc, - .strings = usbd_printer_strings -}; - -/* local function prototypes ('static') */ -static uint8_t printer_init(usb_dev *udev, uint8_t config_index); -static uint8_t printer_deinit(usb_dev *udev, uint8_t config_index); -static uint8_t printer_req(usb_dev *udev, usb_req *req); -static uint8_t printer_in(usb_dev *udev, uint8_t ep_num); -static uint8_t printer_out(usb_dev *udev, uint8_t ep_num); - -usb_class_core usbd_printer_cb = { - .init = printer_init, - .deinit = printer_deinit, - - .req_proc = printer_req, - - .data_in = printer_in, - .data_out = printer_out -}; - -/*! - \brief initialize the printer device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t printer_init(usb_dev *udev, uint8_t config_index) -{ - /* initialize the data TX endpoint */ - usbd_ep_setup(udev, &(printer_config_desc.printer_epin)); - - /* initialize the data RX endpoint */ - usbd_ep_setup(udev, &(printer_config_desc.printer_epout)); - - /* prepare to receive data */ - usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); - - return USBD_OK; -} - -/*! - \brief deinitialize the printer device - \param[in] udev: pointer to USB device instance - \param[in] config_index: configuration index - \param[out] none - \retval USB device operation status -*/ -static uint8_t printer_deinit(usb_dev *udev, uint8_t config_index) -{ - /* deinitialize the data TX/RX endpoint */ - usbd_ep_clear(udev, PRINTER_IN_EP); - usbd_ep_clear(udev, PRINTER_OUT_EP); - - return USBD_OK; -} - -/*! - \brief handle the printer class-specific requests - \param[in] udev: pointer to USB device instance - \param[in] req: device class-specific request - \param[out] none - \retval USB device operation status -*/ -static uint8_t printer_req(usb_dev *udev, usb_req *req) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - - switch(req->bRequest) { - case GET_DEVICE_ID: - transc->xfer_buf = (uint8_t *)PRINTER_DEVICE_ID; - transc->remain_len = DEVICE_ID_LEN; - break; - - case GET_PORT_STATUS: - transc->xfer_buf = (uint8_t *)&g_port_status; - transc->remain_len = 1U; - break; - - case SOFT_RESET: - usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); - break; - - default: - return USBD_FAIL; - } - - return USBD_OK; -} - -/*! - \brief handle printer data - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval USB device operation status -*/ -static uint8_t printer_in(usb_dev *udev, uint8_t ep_num) -{ - return USBD_OK; -} - -/*! - \brief handle printer data - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval USB device operation status -*/ -static uint8_t printer_out(usb_dev *udev, uint8_t ep_num) -{ - return USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h deleted file mode 100644 index 6a610f8c8a5..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_core.h +++ /dev/null @@ -1,102 +0,0 @@ -/*! - \file usbd_core.h - \brief USB device mode core functions prototype - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_CORE_H -#define USBD_CORE_H - -#include "drv_usb_core.h" -#include "drv_usb_dev.h" - -typedef enum { - USBD_OK = 0U, /*!< status OK */ - USBD_BUSY, /*!< status busy */ - USBD_FAIL /*!< status fail */ -} usbd_status; - -enum _usbd_status { - USBD_DEFAULT = 1U, /*!< default status */ - USBD_ADDRESSED = 2U, /*!< address send status */ - USBD_CONFIGURED = 3U, /*!< configured status */ - USBD_SUSPENDED = 4U /*!< suspended status */ -}; - -/* static inline function definitions */ - -/*! - \brief set USB device address - \param[in] udev: pointer to USB core instance - \param[in] addr: device address to set - \param[out] none - \retval none -*/ -__STATIC_INLINE void usbd_addr_set(usb_core_driver *udev, uint8_t addr) -{ - usb_devaddr_set(udev, addr); -} - -/*! - \brief get the received data length - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval received data length -*/ -__STATIC_INLINE uint16_t usbd_rxcount_get(usb_core_driver *udev, uint8_t ep_num) -{ - return (uint16_t)udev->dev.transc_out[ep_num].xfer_count; -} - -/* function declarations */ -/* initializes the USB device-mode stack and load the class driver */ -void usbd_init(usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core); -/* endpoint initialization */ -uint32_t usbd_ep_setup(usb_core_driver *udev, const usb_desc_ep *ep_desc); -/* configure the endpoint when it is disabled */ -uint32_t usbd_ep_clear(usb_core_driver *udev, uint8_t ep_addr); -/* endpoint prepare to receive data */ -uint32_t usbd_ep_recev(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len); -/* endpoint prepare to transmit data */ -uint32_t usbd_ep_send(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len); -/* set an endpoint to STALL status */ -uint32_t usbd_ep_stall(usb_core_driver *udev, uint8_t ep_addr); -/* clear endpoint STALLed status */ -uint32_t usbd_ep_stall_clear(usb_core_driver *udev, uint8_t ep_addr); -/* flush the endpoint FIFOs */ -uint32_t usbd_fifo_flush(usb_core_driver *udev, uint8_t ep_addr); -/* device connect */ -void usbd_connect(usb_core_driver *udev); -/* device disconnect */ -void usbd_disconnect(usb_core_driver *udev); - -#endif /* USBD_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h deleted file mode 100644 index b68d82744fa..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_enum.h +++ /dev/null @@ -1,98 +0,0 @@ -/*! - \file usbd_enum.h - \brief USB enumeration definitions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_ENUM_H -#define USBD_ENUM_H - -#include "usbd_core.h" -#include - -typedef enum _usb_reqsta { - REQ_SUPP = 0x0U, /*!< request support */ - REQ_NOTSUPP = 0x1U /*!< request not support */ -} usb_reqsta; - -/* string descriptor index */ -enum _str_index { - STR_IDX_LANGID = 0x00U, /*!< language ID string index */ - STR_IDX_MFC = 0x01U, /*!< manufacturer string index */ - STR_IDX_PRODUCT = 0x02U, /*!< product string index */ - STR_IDX_SERIAL = 0x03U, /*!< serial string index */ - STR_IDX_CONFIG = 0x04U, /*!< configuration string index */ - STR_IDX_ITF = 0x05U, /*!< interface string index */ -#ifndef WINUSB_EXEMPT_DRIVER - STR_IDX_MAX = 0x0AU, /*!< string maximum index */ -#else - STR_IDX_MAX = 0xEFU /*!< string maximum index */ -#endif /* WINUSB_EXEMPT_DRIVER */ -}; - -typedef enum _usb_pwrsta { - USB_PWRSTA_SELF_POWERED = 0x1U, /*!< USB is in self powered status */ - USB_PWRSTA_REMOTE_WAKEUP = 0x2U /*!< USB is in remote wakeup status */ -} usb_pwrsta; - -typedef enum _usb_feature { - USB_FEATURE_EP_HALT = 0x0U, /*!< USB has endpoint halt feature */ - USB_FEATURE_REMOTE_WAKEUP = 0x1U, /*!< USB has endpoint remote wakeup feature */ - USB_FEATURE_TEST_MODE = 0x2U /*!< USB has endpoint test mode feature */ -} usb_feature; - -#define ENG_LANGID 0x0409U /*!< english language ID */ -#define CHN_LANGID 0x0804U /*!< chinese language ID */ - -/* USB device exported macros */ -#define CTL_EP(ep) ((0x00U == (ep)) || (0x80U == (ep))) - -#define DEVICE_ID1 (0x1FFF7A1BU) /*!< device ID1 */ -#define DEVICE_ID2 (0x1FFF7A1FU) /*!< device ID2 */ -#define DEVICE_ID3 (0x1FFF7A23U) /*!< device ID3 */ - -#define DEVICE_ID (0x40023D00U) /*!< product reserved ID */ - -/* function declarations */ -/* handle USB standard device request */ -usb_reqsta usbd_standard_request(usb_core_driver *udev, usb_req *req); -/* handle USB device class request */ -usb_reqsta usbd_class_request(usb_core_driver *udev, usb_req *req); -/* handle USB vendor request */ -usb_reqsta usbd_vendor_request(usb_core_driver *udev, usb_req *req); -/* handle USB enumeration error */ -void usbd_enum_error(usb_core_driver *udev, usb_req *req); -/* convert hex 32bits value into Unicode char */ -void int_to_unicode(uint32_t value, uint8_t *pbuf, uint8_t len); -/* get serial string */ -void serial_string_get(uint16_t *unicode_str); - -#endif /* USBD_ENUM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h deleted file mode 100644 index 8364f38f733..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Include/usbd_transc.h +++ /dev/null @@ -1,56 +0,0 @@ -/*! - \file usbd_transc.h - \brief USB transaction core functions prototype - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBD_TRANSC_H -#define USBD_TRANSC_H - -#include "usbd_core.h" - -/* function declarations */ -/* USB send data in the control transaction */ -usbd_status usbd_ctl_send(usb_core_driver *udev); -/* USB receive data in the control transaction */ -usbd_status usbd_ctl_recev(usb_core_driver *udev); -/* USB send control transaction status */ -usbd_status usbd_ctl_status_send(usb_core_driver *udev); -/* USB control receive status */ -usbd_status usbd_ctl_status_recev(usb_core_driver *udev); -/* USB SETUP stage processing */ -uint8_t usbd_setup_transc(usb_core_driver *udev); -/* data OUT stage processing */ -uint8_t usbd_out_transc(usb_core_driver *udev, uint8_t ep_num); -/* data IN stage processing */ -uint8_t usbd_in_transc(usb_core_driver *udev, uint8_t ep_num); - -#endif /* USBD_TRANSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c deleted file mode 100644 index eccc9b0ba65..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_core.c +++ /dev/null @@ -1,320 +0,0 @@ -/*! - \file usbd_core.c - \brief USB device mode core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbd_core.h" -#include "usbd_enum.h" -#include "drv_usb_hw.h" - -/* endpoint type */ -const uint32_t ep_type[] = { - [USB_EP_ATTR_CTL] = (uint32_t)USB_EPTYPE_CTRL, - [USB_EP_ATTR_BULK] = (uint32_t)USB_EPTYPE_BULK, - [USB_EP_ATTR_INT] = (uint32_t)USB_EPTYPE_INTR, - [USB_EP_ATTR_ISO] = (uint32_t)USB_EPTYPE_ISOC -}; - -/*! - \brief initializes the USB device-mode stack and load the class driver - \param[in] udev: pointer to USB core instance - \param[in] core: USB core type - \param[in] desc: pointer to USB descriptor - \param[in] class_core: class driver - \param[out] none - \retval none -*/ -void usbd_init(usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core) -{ - udev->dev.desc = desc; - - /* class callbacks */ - udev->dev.class_core = class_core; - - /* create serial string */ - serial_string_get(udev->dev.desc->strings[STR_IDX_SERIAL]); - - /* configure USB capabilities */ - (void)usb_basic_init(&udev->bp, &udev->regs, core); - - usb_globalint_disable(&udev->regs); - - /* initializes the USB core*/ - (void)usb_core_init(udev->bp, &udev->regs); - - /* set device disconnect */ - usbd_disconnect(udev); - -#ifndef USE_OTG_MODE - usb_curmode_set(&udev->regs, DEVICE_MODE); -#endif /* USE_OTG_MODE */ - - /* initializes device mode */ - (void)usb_devcore_init(udev); - - usb_globalint_enable(&udev->regs); - - /* set device connect */ - usbd_connect(udev); - - udev->dev.cur_status = (uint8_t)USBD_DEFAULT; -} - -/*! - \brief endpoint initialization - \param[in] udev: pointer to USB core instance - \param[in] ep_desc: pointer to endpoint descriptor - \param[out] none - \retval none -*/ -uint32_t usbd_ep_setup(usb_core_driver *udev, const usb_desc_ep *ep_desc) -{ - usb_transc *transc; - - uint8_t ep_addr = ep_desc->bEndpointAddress; - uint16_t max_len = ep_desc->wMaxPacketSize & EP_MAX_PACKET_SIZE_MASK; - - /* set endpoint direction */ - if(EP_DIR(ep_addr)) { - transc = &udev->dev.transc_in[EP_ID(ep_addr)]; - - transc->ep_addr.dir = 1U; - } else { - transc = &udev->dev.transc_out[ep_addr]; - - transc->ep_addr.dir = 0U; - } - - transc->ep_addr.num = EP_ID(ep_addr); - transc->max_len = max_len; - transc->ep_type = (uint8_t)ep_type[ep_desc->bmAttributes & (uint8_t)USB_EPTYPE_MASK]; - - /* active USB endpoint function */ - (void)usb_transc_active(udev, transc); - - return 0U; -} - -/*! - \brief configure the endpoint when it is disabled - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[out] none - \retval none -*/ -uint32_t usbd_ep_clear(usb_core_driver *udev, uint8_t ep_addr) -{ - usb_transc *transc; - - if(EP_DIR(ep_addr)) { - transc = &udev->dev.transc_in[EP_ID(ep_addr)]; - } else { - transc = &udev->dev.transc_out[ep_addr]; - } - - /* deactivate USB endpoint function */ - (void)usb_transc_deactivate(udev, transc); - - return 0U; -} - -/*! - \brief endpoint prepare to receive data - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[in] pbuf: user buffer address pointer - \param[in] len: buffer length - \param[out] none - \retval none -*/ -uint32_t usbd_ep_recev(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len) -{ - usb_transc *transc = &udev->dev.transc_out[EP_ID(ep_addr)]; - - /* setup the transfer */ - transc->xfer_buf = pbuf; - transc->xfer_len = len; - transc->xfer_count = 0U; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - transc->dma_addr = (uint32_t)pbuf; - } - - /* start the transfer */ - (void)usb_transc_outxfer(udev, transc); - - return 0U; -} - -/*! - \brief endpoint prepare to transmit data - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[in] pbuf: transmit buffer address pointer - \param[in] len: buffer length - \param[out] none - \retval none -*/ -uint32_t usbd_ep_send(usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint32_t len) -{ - usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_addr)]; - - /* setup the transfer */ - transc->xfer_buf = pbuf; - transc->xfer_len = len; - transc->xfer_count = 0U; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - transc->dma_addr = (uint32_t)pbuf; - } - - /* start the transfer */ - (void)usb_transc_inxfer(udev, transc); - - return 0U; -} - -/*! - \brief set an endpoint to STALL status - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[out] none - \retval none -*/ -uint32_t usbd_ep_stall(usb_core_driver *udev, uint8_t ep_addr) -{ - usb_transc *transc = NULL; - - if(EP_DIR(ep_addr)) { - transc = &udev->dev.transc_in[EP_ID(ep_addr)]; - } else { - transc = &udev->dev.transc_out[ep_addr]; - } - - transc->ep_stall = 1U; - - (void)usb_transc_stall(udev, transc); - - return (0U); -} - -/*! - \brief clear endpoint STALLed status - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[out] none - \retval none -*/ -uint32_t usbd_ep_stall_clear(usb_core_driver *udev, uint8_t ep_addr) -{ - usb_transc *transc = NULL; - - if(EP_DIR(ep_addr)) { - transc = &udev->dev.transc_in[EP_ID(ep_addr)]; - } else { - transc = &udev->dev.transc_out[ep_addr]; - } - - transc->ep_stall = 0U; - - (void)usb_transc_clrstall(udev, transc); - - return (0U); -} - -/*! - \brief flush the endpoint FIFOs - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - in this parameter: - bit0..bit6: endpoint number (0..7) - bit7: endpoint direction which can be IN(1) or OUT(0) - \param[out] none - \retval none -*/ -uint32_t usbd_fifo_flush(usb_core_driver *udev, uint8_t ep_addr) -{ - if(EP_DIR(ep_addr)) { - (void)usb_txfifo_flush(&udev->regs, EP_ID(ep_addr)); - } else { - (void)usb_rxfifo_flush(&udev->regs); - } - - return (0U); -} - -/*! - \brief device connect - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void usbd_connect(usb_core_driver *udev) -{ -#ifndef USE_OTG_MODE - /* connect device */ - usb_dev_connect(udev); - - usb_mdelay(3U); -#endif /* USE_OTG_MODE */ -} - -/*! - \brief device disconnect - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void usbd_disconnect(usb_core_driver *udev) -{ -#ifndef USE_OTG_MODE - /* disconnect device for 3ms */ - usb_dev_disconnect(udev); - - usb_mdelay(3U); -#endif /* USE_OTG_MODE */ -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c deleted file mode 100644 index bb1d28cf6c1..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_enum.c +++ /dev/null @@ -1,816 +0,0 @@ -/*! - \file usbd_enum.c - \brief USB enumeration function - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbd_enum.h" - -#ifdef WINUSB_EXEMPT_DRIVER - -extern usbd_status usbd_OEM_req(usb_dev *udev, usb_req *req); - -#endif /* WINUSB_EXEMPT_DRIVER */ - -/* local function prototypes ('static') */ -static usb_reqsta _usb_std_reserved(usb_core_driver *udev, usb_req *req); -static uint8_t *_usb_dev_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -static uint8_t *_usb_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) -static uint8_t *_usb_other_speed_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -static uint8_t *_usb_qualifier_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -#endif -static uint8_t *_usb_bos_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -static uint8_t *_usb_str_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len); -static usb_reqsta _usb_std_getstatus(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_clearfeature(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_setfeature(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_setaddress(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_getdescriptor(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_setdescriptor(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_getconfiguration(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_setconfiguration(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_getinterface(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_setinterface(usb_core_driver *udev, usb_req *req); -static usb_reqsta _usb_std_synchframe(usb_core_driver *udev, usb_req *req); - -static usb_reqsta(*_std_dev_req[])(usb_core_driver *udev, usb_req *req) = { - [USB_GET_STATUS] = _usb_std_getstatus, - [USB_CLEAR_FEATURE] = _usb_std_clearfeature, - [USB_RESERVED2] = _usb_std_reserved, - [USB_SET_FEATURE] = _usb_std_setfeature, - [USB_RESERVED4] = _usb_std_reserved, - [USB_SET_ADDRESS] = _usb_std_setaddress, - [USB_GET_DESCRIPTOR] = _usb_std_getdescriptor, - [USB_SET_DESCRIPTOR] = _usb_std_setdescriptor, - [USB_GET_CONFIGURATION] = _usb_std_getconfiguration, - [USB_SET_CONFIGURATION] = _usb_std_setconfiguration, - [USB_GET_INTERFACE] = _usb_std_getinterface, - [USB_SET_INTERFACE] = _usb_std_setinterface, - [USB_SYNCH_FRAME] = _usb_std_synchframe, -}; - -/* get standard descriptor handler */ -static uint8_t *(*std_desc_get[])(usb_core_driver *udev, uint8_t index, uint16_t *len) = { - [(uint8_t)USB_DESCTYPE_DEV - 1U] = _usb_dev_desc_get, - [(uint8_t)USB_DESCTYPE_CONFIG - 1U] = _usb_config_desc_get, - [(uint8_t)USB_DESCTYPE_STR - 1U] = _usb_str_desc_get, -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - [(uint8_t)USB_DESCTYPE_DEV_QUALIFIER - 3U] = _usb_qualifier_desc_get, - [(uint8_t)USB_DESCTYPE_OTHER_SPD_CONFIG - 3U] = _usb_other_speed_config_desc_get, -#endif -}; - -/*! - \brief handle USB standard device request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -usb_reqsta usbd_standard_request(usb_core_driver *udev, usb_req *req) -{ - return (*_std_dev_req[req->bRequest])(udev, req); -} - -/*! - \brief handle USB device class request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device class request - \param[out] none - \retval USB device request status -*/ -usb_reqsta usbd_class_request(usb_core_driver *udev, usb_req *req) -{ - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { - /* call device class handle function */ - return (usb_reqsta)udev->dev.class_core->req_proc(udev, req); - } - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB vendor request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB vendor request - \param[out] none - \retval USB device request status -*/ -usb_reqsta usbd_vendor_request(usb_core_driver *udev, usb_req *req) -{ - (void)udev; - (void)req; - - /* added by user... */ -#ifdef WINUSB_EXEMPT_DRIVER - usbd_OEM_req(udev, req); -#endif - - return REQ_SUPP; -} - -/*! - \brief handle USB enumeration error - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval none -*/ -void usbd_enum_error(usb_core_driver *udev, usb_req *req) -{ - (void)req; - - (void)usbd_ep_stall(udev, 0x80U); - (void)usbd_ep_stall(udev, 0x00U); - - usb_ctlep_startout(udev); -} - -/*! - \brief convert hex 32bits value into Unicode char - \param[in] value: hex 32bits value - \param[in] pbuf: buffer pointer to store Unicode char - \param[in] len: value length - \param[out] none - \retval none -*/ -void int_to_unicode(uint32_t value, uint8_t *pbuf, uint8_t len) -{ - uint8_t index; - - for(index = 0U; index < len; index++) { - if((value >> 28) < 0x0AU) { - pbuf[2 * index] = (uint8_t)((value >> 28) + '0'); - } else { - pbuf[2 * index] = (uint8_t)((value >> 28) + 'A' - 10U); - } - - value = value << 4; - - pbuf[2U * index + 1U] = 0U; - } -} - -/*! - \brief convert hex 32bits value into Unicode char - \param[in] unicode_str: pointer to Unicode string - \param[out] none - \retval none -*/ -void serial_string_get(uint16_t *unicode_str) -{ - if(6U != (unicode_str[0] & 0x00FFU)) { - uint32_t DeviceSerial0, DeviceSerial1, DeviceSerial2; - - DeviceSerial0 = *(uint32_t *)DEVICE_ID1; - DeviceSerial1 = *(uint32_t *)DEVICE_ID2; - DeviceSerial2 = *(uint32_t *)DEVICE_ID3; - - DeviceSerial0 += DeviceSerial2; - - if(0U != DeviceSerial0) { - int_to_unicode(DeviceSerial0, (uint8_t *)&(unicode_str[1]), 8U); - int_to_unicode(DeviceSerial1, (uint8_t *)&(unicode_str[9]), 4U); - } - } else { - uint32_t device_serial = *(uint32_t *)DEVICE_ID; - - if(0U != device_serial) { - unicode_str[1] = (uint16_t)(device_serial & 0x0000FFFFU); - unicode_str[2] = (uint16_t)((device_serial & 0xFFFF0000U) >> 16); - - } - } -} - -/*! - \brief no operation, just for reserved - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB vendor request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_reserved(usb_core_driver *udev, usb_req *req) -{ - (void)udev; - (void)req; - - /* no operation... */ - - return REQ_NOTSUPP; -} - -/*! - \brief get the device descriptor - \param[in] udev: pointer to USB device instance - \param[in] index: no use - \param[out] len: data length pointer - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_dev_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - (void)index; - - *len = udev->dev.desc->dev_desc[0]; - - return udev->dev.desc->dev_desc; -} - -/*! - \brief get the configuration descriptor - \brief[in] udev: pointer to USB device instance - \brief[in] index: no use - \param[out] len: data length pointer - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - (void)index; - - *len = udev->dev.desc->config_desc[2] | (udev->dev.desc->config_desc[3] << 8); - - return udev->dev.desc->config_desc; -} - -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - -/*! - \brief get the other speed configuration descriptor - \brief[in] udev: pointer to USB device instance - \brief[in] index: no use - \param[out] len: data length pointer - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_other_speed_config_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - (void)index; - - *len = udev->dev.desc->other_speed_config_desc[2]; - - return udev->dev.desc->other_speed_config_desc; -} - -/*! - \brief get the other speed configuration descriptor - \brief[in] udev: pointer to USB device instance - \brief[in] index: no use - \param[out] len: data length pointer - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_qualifier_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - (void)index; - - *len = udev->dev.desc->qualifier_desc[0]; - - return udev->dev.desc->qualifier_desc; -} - -#endif /* USE_USB_HS && USE_ULPI_PHY */ - -/*! - \brief get the BOS descriptor - \brief[in] udev: pointer to USB device instance - \brief[in] index: no use - \param[out] len: data length pointer - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_bos_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - (void)index; - - *len = udev->dev.desc->bos_desc[2]; - - return udev->dev.desc->bos_desc; -} - -/*! - \brief get string descriptor - \param[in] udev: pointer to USB device instance - \param[in] index: string descriptor index - \param[out] len: pointer to string length - \retval descriptor buffer pointer -*/ -static uint8_t *_usb_str_desc_get(usb_core_driver *udev, uint8_t index, uint16_t *len) -{ - uint8_t *desc = udev->dev.desc->strings[index]; - - *len = desc[0]; - - return desc; -} - -/*! - \brief handle Get_Status request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_getstatus(usb_core_driver *udev, usb_req *req) -{ - uint8_t recp = BYTE_LOW(req->wIndex); - usb_reqsta req_status = REQ_NOTSUPP; - usb_transc *transc = &udev->dev.transc_in[0]; - - static uint8_t status[2] = {0}; - - switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { - case USB_RECPTYPE_DEV: - if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ - ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { - - if(udev->dev.pm.power_mode) { - status[0] = USB_STATUS_SELF_POWERED; - } else { - status[0] = 0U; - } - - if(udev->dev.pm.dev_remote_wakeup) { - status[0] |= USB_STATUS_REMOTE_WAKEUP; - } else { - status[0] = 0U; - } - - req_status = REQ_SUPP; - } - break; - - case USB_RECPTYPE_ITF: - if(((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) && (recp <= USBD_ITF_MAX_NUM)) { - req_status = REQ_SUPP; - } - break; - - case USB_RECPTYPE_EP: - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - if(0x80U == (recp & 0x80U)) { - status[0] = udev->dev.transc_in[EP_ID(recp)].ep_stall; - } else { - status[0] = udev->dev.transc_out[recp].ep_stall; - } - - req_status = REQ_SUPP; - } - break; - - default: - break; - } - - if(REQ_SUPP == req_status) { - transc->xfer_buf = status; - transc->remain_len = 2U; - } - - return req_status; -} - -/*! - \brief handle USB Clear_Feature request - \param[in] udev: pointer to USB device instance - \param[in] req: USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_clearfeature(usb_core_driver *udev, usb_req *req) -{ - uint8_t ep = 0U; - - switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { - case USB_RECPTYPE_DEV: - if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ - ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { - - /* clear device remote wakeup feature */ - if((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { - udev->dev.pm.dev_remote_wakeup = 0U; - - return REQ_SUPP; - } - } - break; - - case USB_RECPTYPE_ITF: - break; - - case USB_RECPTYPE_EP: - /* get endpoint address */ - ep = BYTE_LOW(req->wIndex); - - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - /* clear endpoint halt feature */ - if(((uint16_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { - (void)usbd_ep_stall_clear(udev, ep); - - (void)udev->dev.class_core->req_proc(udev, req); - } - - return REQ_SUPP; - } - break; - - default: - break; - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB Set_Feature request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_setfeature(usb_core_driver *udev, usb_req *req) -{ - uint8_t ep = 0U; - - switch(req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { - case USB_RECPTYPE_DEV: - if(((uint8_t)USBD_ADDRESSED == udev->dev.cur_status) || \ - ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { - /* set device remote wakeup feature */ - if((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { - udev->dev.pm.dev_remote_wakeup = 1U; - } - - return REQ_SUPP; - } - break; - - case USB_RECPTYPE_ITF: - break; - - case USB_RECPTYPE_EP: - /* get endpoint address */ - ep = BYTE_LOW(req->wIndex); - - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - /* set endpoint halt feature */ - if(((uint16_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { - (void)usbd_ep_stall(udev, ep); - } - - return REQ_SUPP; - } - break; - - default: - break; - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB Set_Address request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_setaddress(usb_core_driver *udev, usb_req *req) -{ - if((0U == req->wIndex) && (0U == req->wLength)) { - udev->dev.dev_addr = (uint8_t)(req->wValue) & 0x7FU; - - if((uint8_t)USBD_CONFIGURED != udev->dev.cur_status) { - usbd_addr_set(udev, udev->dev.dev_addr); - - if(udev->dev.dev_addr) { - udev->dev.cur_status = (uint8_t)USBD_ADDRESSED; - } else { - udev->dev.cur_status = (uint8_t)USBD_DEFAULT; - } - - return REQ_SUPP; - } - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB Get_Descriptor request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_getdescriptor(usb_core_driver *udev, usb_req *req) -{ - uint8_t desc_type = 0U; - uint8_t desc_index = 0U; - - usb_reqsta status = REQ_NOTSUPP; - - usb_transc *transc = &udev->dev.transc_in[0]; - - /* get device standard descriptor */ - switch(req->bmRequestType & USB_RECPTYPE_MASK) { - case USB_RECPTYPE_DEV: - desc_type = BYTE_HIGH(req->wValue); - desc_index = BYTE_LOW(req->wValue); - - switch(desc_type) { - case USB_DESCTYPE_DEV: - transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); - - if(64U == req->wLength) { - transc->remain_len = 8U; - } - break; - - case USB_DESCTYPE_CONFIG: - transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); - break; - - case USB_DESCTYPE_STR: - if(desc_index < (uint8_t)STR_IDX_MAX) { - transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); - } - break; - - case USB_DESCTYPE_ITF: - case USB_DESCTYPE_EP: - break; - -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - case USB_DESCTYPE_DEV_QUALIFIER: - transc->xfer_buf = std_desc_get[desc_type - 3U](udev, desc_index, (uint16_t *)&(transc->remain_len)); - break; - - case USB_DESCTYPE_OTHER_SPD_CONFIG: - transc->xfer_buf = std_desc_get[desc_type - 3U](udev, desc_index, (uint16_t *)&(transc->remain_len)); - break; -#endif - - case USB_DESCTYPE_ITF_POWER: - break; - - case USB_DESCTYPE_BOS: - transc->xfer_buf = _usb_bos_desc_get(udev, desc_index, (uint16_t *)&(transc->remain_len)); - break; - - default: - break; - } - break; - - case USB_RECPTYPE_ITF: - /* get device class special descriptor */ - status = (usb_reqsta)(udev->dev.class_core->req_proc(udev, req)); - break; - - case USB_RECPTYPE_EP: - break; - - default: - break; - } - - if((0U != transc->remain_len) && (0U != req->wLength)) { - if(transc->remain_len < req->wLength) { - if((transc->remain_len >= transc->max_len) && (0U == (transc->remain_len % transc->max_len))) { - udev->dev.control.ctl_zlp = 1U; - } - } else { - transc->remain_len = req->wLength; - } - - status = REQ_SUPP; - } - - return status; -} - -/*! - \brief handle USB Set_Descriptor request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_setdescriptor(usb_core_driver *udev, usb_req *req) -{ - (void)udev; - (void)req; - - /* no handle... */ - return REQ_SUPP; -} - -/*! - \brief handle USB Get_Configuration request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_getconfiguration(usb_core_driver *udev, usb_req *req) -{ - (void)req; - - usb_reqsta req_status = REQ_NOTSUPP; - usb_transc *transc = &udev->dev.transc_in[0]; - - switch(udev->dev.cur_status) { - case USBD_ADDRESSED: - if(USB_DEFAULT_CONFIG == udev->dev.config) { - req_status = REQ_SUPP; - } - break; - - case USBD_CONFIGURED: - if(USB_DEFAULT_CONFIG != udev->dev.config) { - req_status = REQ_SUPP; - } - break; - - default: - break; - } - - if(REQ_SUPP == req_status) { - transc->xfer_buf = &(udev->dev.config); - transc->remain_len = 1U; - } - - return req_status; -} - -/*! - \brief handle USB Set_Configuration request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_setconfiguration(usb_core_driver *udev, usb_req *req) -{ - static uint8_t config; - usb_reqsta status = REQ_NOTSUPP; - - config = (uint8_t)(req->wValue); - - if(config <= USBD_CFG_MAX_NUM) { - switch(udev->dev.cur_status) { - case USBD_ADDRESSED: - if(config) { - (void)udev->dev.class_core->init(udev, config); - - udev->dev.config = config; - udev->dev.cur_status = (uint8_t)USBD_CONFIGURED; - } - - status = REQ_SUPP; - break; - - case USBD_CONFIGURED: - if(USB_DEFAULT_CONFIG == config) { - (void)udev->dev.class_core->deinit(udev, config); - - udev->dev.config = config; - udev->dev.cur_status = (uint8_t)USBD_ADDRESSED; - } else if(config != udev->dev.config) { - /* clear old configuration */ - (void)udev->dev.class_core->deinit(udev, config); - - /* set new configuration */ - udev->dev.config = config; - - (void)udev->dev.class_core->init(udev, config); - } else { - /* no operation */ - } - - status = REQ_SUPP; - break; - - case USBD_DEFAULT: - break; - - default: - break; - } - } - - return status; -} - -/*! - \brief handle USB Get_Interface request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_getinterface(usb_core_driver *udev, usb_req *req) -{ - switch(udev->dev.cur_status) { - case USBD_DEFAULT: - break; - - case USBD_ADDRESSED: - break; - - case USBD_CONFIGURED: - if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { - usb_transc *transc = &udev->dev.transc_in[0]; - - transc->xfer_buf = &(udev->dev.class_core->alter_set); - transc->remain_len = 1U; - - return REQ_SUPP; - } - break; - - default: - break; - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB Set_Interface request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_setinterface(usb_core_driver *udev, usb_req *req) -{ - switch(udev->dev.cur_status) { - case USBD_DEFAULT: - break; - - case USBD_ADDRESSED: - break; - - case USBD_CONFIGURED: - if(BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { - if(NULL != udev->dev.class_core->set_intf) { - (void)udev->dev.class_core->set_intf(udev, req); - } - - return REQ_SUPP; - } - break; - - default: - break; - } - - return REQ_NOTSUPP; -} - -/*! - \brief handle USB SynchFrame request - \param[in] udev: pointer to USB device instance - \param[in] req: pointer to USB device request - \param[out] none - \retval USB device request status -*/ -static usb_reqsta _usb_std_synchframe(usb_core_driver *udev, usb_req *req) -{ - (void)udev; - (void)req; - - /* no handle */ - return REQ_SUPP; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c deleted file mode 100644 index 7ebb19d3959..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/device/core/Source/usbd_transc.c +++ /dev/null @@ -1,264 +0,0 @@ -/*! - \file usbd_transc.c - \brief USB transaction core functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbd_enum.h" -#include "usbd_transc.h" - -/*! - \brief USB send data in the control transaction - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation cur_status -*/ -usbd_status usbd_ctl_send(usb_core_driver *udev) -{ - usb_transc *transc = &udev->dev.transc_in[0]; - - (void)usbd_ep_send(udev, 0U, transc->xfer_buf, transc->remain_len); - - if(transc->remain_len > transc->max_len) { - udev->dev.control.ctl_state = (uint8_t)USB_CTL_DATA_IN; - } else { - udev->dev.control.ctl_state = (uint8_t)USB_CTL_LAST_DATA_IN; - } - - return USBD_OK; -} - -/*! - \brief USB receive data in the control transaction - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation cur_status -*/ -usbd_status usbd_ctl_recev(usb_core_driver *udev) -{ - usb_transc *transc = &udev->dev.transc_out[0]; - - (void)usbd_ep_recev(udev, 0U, transc->xfer_buf, transc->remain_len); - - if(transc->remain_len > transc->max_len) { - udev->dev.control.ctl_state = (uint8_t)USB_CTL_DATA_OUT; - } else { - udev->dev.control.ctl_state = (uint8_t)USB_CTL_LAST_DATA_OUT; - } - - return USBD_OK; -} - -/*! - \brief USB send control transaction status - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation cur_status -*/ -usbd_status usbd_ctl_status_send(usb_core_driver *udev) -{ - udev->dev.control.ctl_state = (uint8_t)USB_CTL_STATUS_IN; - - (void)usbd_ep_send(udev, 0U, NULL, 0U); - - usb_ctlep_startout(udev); - - return USBD_OK; -} - -/*! - \brief USB control receive status - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation cur_status -*/ -usbd_status usbd_ctl_status_recev(usb_core_driver *udev) -{ - udev->dev.control.ctl_state = (uint8_t)USB_CTL_STATUS_OUT; - - (void)usbd_ep_recev(udev, 0U, NULL, 0U); - - usb_ctlep_startout(udev); - - return USBD_OK; -} - -/*! - \brief USB SETUP stage processing - \param[in] udev: pointer to USB device instance - \param[out] none - \retval USB device operation cur_status -*/ -uint8_t usbd_setup_transc(usb_core_driver *udev) -{ - usb_reqsta reqstat = REQ_NOTSUPP; - - usb_req req = udev->dev.control.req; - - switch(req.bmRequestType & USB_REQTYPE_MASK) { - /* standard device request */ - case USB_REQTYPE_STRD: - reqstat = usbd_standard_request(udev, &req); - break; - - /* device class request */ - case USB_REQTYPE_CLASS: - reqstat = usbd_class_request(udev, &req); - break; - - /* vendor defined request */ - case USB_REQTYPE_VENDOR: - reqstat = usbd_vendor_request(udev, &req); - break; - - default: - break; - } - - if(REQ_SUPP == reqstat) { - if(0U == req.wLength) { - (void)usbd_ctl_status_send(udev); - } else { - if(req.bmRequestType & 0x80U) { - (void)usbd_ctl_send(udev); - } else { - (void)usbd_ctl_recev(udev); - } - } - } else { - usbd_enum_error(udev, &req); - } - - return (uint8_t)USBD_OK; -} - -/*! - \brief data OUT stage processing - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier(0..7) - \param[out] none - \retval USB device operation cur_status -*/ -uint8_t usbd_out_transc(usb_core_driver *udev, uint8_t ep_num) -{ - if(0U == ep_num) { - usb_transc *transc = &udev->dev.transc_out[0]; - - switch(udev->dev.control.ctl_state) { - case USB_CTL_DATA_OUT: - /* update transfer length */ - transc->remain_len -= transc->max_len; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - transc->xfer_buf += transc->max_len; - } - - (void)usbd_ctl_recev(udev); - break; - - case USB_CTL_LAST_DATA_OUT: - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - if(NULL != udev->dev.class_core->ctlx_out) { - (void)udev->dev.class_core->ctlx_out(udev); - } - } - - transc->remain_len = 0U; - - (void)usbd_ctl_status_send(udev); - break; - - default: - break; - } - } else if((NULL != udev->dev.class_core->data_out) && ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status)) { - (void)udev->dev.class_core->data_out(udev, ep_num); - } else { - /* no operation */ - } - - return (uint8_t)USBD_OK; -} - -/*! - \brief data IN stage processing - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier(0..7) - \param[out] none - \retval USB device operation cur_status -*/ -uint8_t usbd_in_transc(usb_core_driver *udev, uint8_t ep_num) -{ - if(0U == ep_num) { - usb_transc *transc = &udev->dev.transc_in[0]; - - switch(udev->dev.control.ctl_state) { - case USB_CTL_DATA_IN: - /* update transfer length */ - transc->remain_len -= transc->max_len; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - transc->xfer_buf += transc->max_len; - } - - (void)usbd_ctl_send(udev); - break; - - case USB_CTL_LAST_DATA_IN: - /* last packet is MPS multiple, so send ZLP packet */ - if(udev->dev.control.ctl_zlp) { - (void)usbd_ep_send(udev, 0U, NULL, 0U); - - udev->dev.control.ctl_zlp = 0U; - } else { - if((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) { - if(NULL != udev->dev.class_core->ctlx_in) { - (void)udev->dev.class_core->ctlx_in(udev); - } - } - - transc->remain_len = 0U; - - (void)usbd_ctl_status_recev(udev); - } - break; - - default: - break; - } - } else { - if(((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) && (NULL != udev->dev.class_core->data_in)) { - (void)udev->dev.class_core->data_in(udev, ep_num); - } - } - - return (uint8_t)USBD_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h deleted file mode 100644 index 50cf0b8bb42..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_core.h +++ /dev/null @@ -1,347 +0,0 @@ -/*! - \file drv_usb_core.h - \brief USB core low level driver header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USB_CORE_H -#define DRV_USB_CORE_H - -#include "drv_usb_regs.h" -#include "usb_ch9_std.h" - -#define USB_FS_EP0_MAX_LEN 64U /*!< maximum packet size of endpoint 0 */ -#define HC_MAX_PACKET_COUNT 140U /*!< maximum packet count */ - -#define EP_ID(x) ((uint8_t)((x) & 0x7FU)) /*!< endpoint number */ -#define EP_DIR(x) ((uint8_t)((x) >> 7)) /*!< endpoint direction */ - -#define EP_MAX_PACKET_SIZE_MASK 0x07FFU /*!< endpoint maximum packet size mask */ - -enum _usb_mode { - DEVICE_MODE = 0U, /*!< device mode */ - HOST_MODE, /*!< host mode */ - OTG_MODE /*!< OTG mode */ -}; - -enum _usb_eptype { - USB_EPTYPE_CTRL = 0U, /*!< control endpoint type */ - USB_EPTYPE_ISOC = 1U, /*!< isochronous endpoint type */ - USB_EPTYPE_BULK = 2U, /*!< bulk endpoint type */ - USB_EPTYPE_INTR = 3U, /*!< interrupt endpoint type */ - USB_EPTYPE_MASK = 3U /*!< endpoint type mask */ -}; - -typedef enum { - USB_OTG_OK = 0U, /*!< USB OTG status succeed */ - USB_OTG_FAIL /*!< USB OTG status fail */ -} usb_otg_status; - -typedef enum { - USB_OK = 0U, /*!< USB status succeed */ - USB_FAIL /*!< USB status fail */ -} usb_status; - -typedef enum { - USB_USE_FIFO = 0U, /*!< USB use FIFO transfer mode */ - USB_USE_DMA /*!< USB use DMA transfer mode */ -} usb_transfer_mode; - -typedef struct { - uint8_t core_enum; /*!< USB core type */ - uint8_t core_speed; /*!< USB core speed */ - uint8_t num_pipe; /*!< USB host channel numbers */ - uint8_t num_ep; /*!< USB device endpoint numbers */ - uint8_t transfer_mode; /*!< USB transfer mode */ - uint8_t phy_itf; /*!< USB core PHY interface */ - uint8_t sof_enable; /*!< USB SOF output */ - uint8_t low_power; /*!< USB low power */ - uint8_t lpm_enable; /*!< USB link power mode(LPM) */ - uint8_t vbus_sensing_enable; /*!< USB VBUS sensing feature */ - uint8_t use_dedicated_ep1; /*!< USB dedicated endpoint1 interrupt */ - uint8_t use_external_vbus; /*!< enable or disable the use of the external VBUS */ - uint32_t base_reg; /*!< base register address */ -} usb_core_basic; - -#ifdef USE_DEVICE_MODE - -/* USB descriptor */ -typedef struct _usb_desc { - uint8_t *dev_desc; /*!< device descriptor */ - uint8_t *config_desc; /*!< configure descriptor */ - uint8_t *bos_desc; /*!< BOS descriptor */ - -#if defined(USE_USB_HS) && defined(USE_ULPI_PHY) - uint8_t *other_speed_config_desc; /*!< other speed configuration descriptor */ - uint8_t *qualifier_desc; /*!< qualifier descriptor */ -#endif - - void* const *strings; /*!< string descriptor */ -} usb_desc; - -/* USB power management */ -typedef struct _usb_pm { - uint8_t power_mode; /*!< power mode */ - uint8_t power_low; /*!< power low */ - uint8_t dev_remote_wakeup; /*!< remote wakeup */ - uint8_t remote_wakeup_on; /*!< remote wakeup on */ -} usb_pm; - -/* USB control information */ -typedef struct _usb_control { - usb_req req; /*!< USB standard device request */ - - uint8_t ctl_state; /*!< USB control transfer state */ - uint8_t ctl_zlp; /*!< zero length package */ -} usb_control; - -typedef struct { - struct { - uint8_t num: 4U; /*!< the endpoint number.it can be from 0 to 6 */ - uint8_t pad: 3U; /*!< padding between number and direction */ - uint8_t dir: 1U; /*!< the endpoint direction */ - } ep_addr; - - uint8_t ep_type; /*!< USB endpoint type */ - uint8_t ep_stall; /*!< USB endpoint STALL status */ - - uint8_t frame_num; /*!< number of frame */ - uint16_t max_len; /*!< maximum packet length */ - - /* transaction level variables */ - uint8_t *xfer_buf; /*!< transmit buffer */ - uint32_t xfer_len; /*!< transmit buffer length */ - uint32_t xfer_count; /*!< transmit buffer count */ - - uint32_t remain_len; /*!< remain packet length */ - - uint32_t dma_addr; /*!< DMA address */ -} usb_transc; - -typedef struct _usb_core_driver usb_dev; - -typedef struct _usb_class_core { - uint8_t command; /*!< device class request command */ - uint8_t alter_set; /*!< alternative set */ - - uint8_t (*init)(usb_dev *udev, uint8_t config_index); /*!< initialize handler */ - uint8_t (*deinit)(usb_dev *udev, uint8_t config_index); /*!< de-initialize handler */ - - uint8_t (*req_proc)(usb_dev *udev, usb_req *req); /*!< device request handler */ - - uint8_t (*set_intf)(usb_dev *udev, usb_req *req); /*!< device set interface callback */ - - uint8_t (*ctlx_in)(usb_dev *udev); /*!< device control IN callback */ - uint8_t (*ctlx_out)(usb_dev *udev); /*!< device control OUT callback */ - - uint8_t (*data_in)(usb_dev *udev, uint8_t ep_num); /*!< device data IN handler */ - uint8_t (*data_out)(usb_dev *udev, uint8_t ep_num); /*!< device data OUT handler */ - - uint8_t (*SOF)(usb_dev *udev); /*!< start of frame handler */ - - uint8_t (*incomplete_isoc_in)(usb_dev *udev); /*!< incomplete synchronization IN transfer handler */ - uint8_t (*incomplete_isoc_out)(usb_dev *udev); /*!< incomplete synchronization OUT transfer handler */ -} usb_class_core; - -typedef struct _usb_perp_dev { - uint8_t config; /*!< configuration */ - uint8_t dev_addr; /*!< device address */ - - __IO uint8_t cur_status; /*!< current status */ - __IO uint8_t backup_status; /*!< backup status */ - - usb_transc transc_in[USBFS_MAX_TX_FIFOS]; /*!< endpoint IN transaction */ - usb_transc transc_out[USBFS_MAX_TX_FIFOS]; /*!< endpoint OUT transaction */ - - usb_pm pm; /*!< power management */ - usb_control control; /*!< USB control information */ - usb_desc *desc; /*!< USB descriptors pointer */ - usb_class_core *class_core; /*!< class driver */ - void *class_data[6]; /*!< class data pointer */ - void *user_data; /*!< user data pointer */ - void *pdata; /*!< reserved data pointer */ -} usb_perp_dev; - -#endif /* USE_DEVICE_MODE */ - -#ifdef USE_HOST_MODE - -typedef enum _usb_pipe_status { - PIPE_IDLE = 0U, /*!< host pipe IDLE status */ - PIPE_XF, /*!< host pipe transfer completed status */ - PIPE_HALTED, /*!< host pipe halted status */ - PIPE_NAK, /*!< host pipe NAK status */ - PIPE_NYET, /*!< host pipe NYET status */ - PIPE_STALL, /*!< host pipe STALL status */ - PIPE_TRACERR, /*!< host pipe transaction error status */ - PIPE_BBERR, /*!< host pipe babble error status */ - PIPE_REQOVR, /*!< host pipe frame overrun status */ - PIPE_DTGERR /*!< host pipe data toggle error status */ -} usb_pipe_status; - -typedef enum _usb_pipe_mode { - PIPE_PERIOD = 0U, /*!< USB host pipe PERIOD mode */ - PIPE_NON_PERIOD = 1U /*!< USB host pipe NOT PERIOD mode */ -} usb_pipe_mode; - -typedef enum _usb_urb_state { - URB_IDLE = 0U, /*!< USB URB IDLE state */ - URB_DONE, /*!< USB URB DONE state */ - URB_NOTREADY, /*!< USB URB NOT READY state */ - URB_ERROR, /*!< USB URB ERROR state */ - URB_STALL, /*!< USB URB STALL state */ - URB_PING /*!< USB URB PING state */ -} usb_urb_state; - -typedef struct _usb_pipe { - uint8_t in_used; /*!< pipe used */ - uint8_t dev_addr; /*!< USB device address */ - uint32_t dev_speed; /*!< USB device speed */ - - struct { - uint8_t num; /*!< endpoint numbers */ - uint8_t dir; /*!< endpoint direction */ - uint8_t type; /*!< endpoint transfer type */ - uint16_t mps; /*!< endpoint max packet size */ - } ep; - - __IO uint8_t supp_ping; /*!< host pipe support PING */ - __IO uint8_t do_ping; /*!< host pipe do PING */ - __IO uint32_t DPID; /*!< data PID */ - - uint8_t *xfer_buf; /*!< USB transfer buffer */ - uint32_t xfer_len; /*!< USB transfer length */ - uint32_t xfer_count; /*!< USB transfer count */ - - uint8_t data_toggle_in; /*!< toggle DATA IN */ - uint8_t data_toggle_out; /*!< toggle DATA OUT */ - - __IO uint32_t err_count; /*!< error count */ - __IO usb_pipe_status pp_status; /*!< USB pipe status */ - __IO usb_urb_state urb_state; /*!< USB urb state */ -} usb_pipe; - -typedef struct _usb_host_drv { - __IO uint32_t connect_status; /*!< connect status */ - __IO uint32_t port_enabled; /*!< USB port enable */ - __IO uint32_t backup_xfercount[USBFS_MAX_TX_FIFOS]; /*!< USB backup transfer data count */ - - usb_pipe pipe[USBFS_MAX_TX_FIFOS]; /*!< USB host pipe handles */ - void *data; /*!< user data pointer */ -} usb_host_drv; - -#endif /* USE_HOST_MODE */ - -typedef struct _usb_core_driver { - usb_core_basic bp; /*!< USB basic parameters */ - usb_core_regs regs; /*!< USB registers */ - -#ifdef USE_DEVICE_MODE - usb_perp_dev dev; /*!< USB peripheral device */ -#endif /* USE_DEVICE_MODE */ - -#ifdef USE_HOST_MODE - usb_host_drv host; /*!< USB peripheral host */ -#endif /* USE_HOST_MODE */ -} usb_core_driver; - -/* static inline function definitions */ - -/*! - \brief get the global interrupts - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval interrupt status -*/ -__STATIC_INLINE uint32_t usb_coreintr_get(usb_core_regs *usb_regs) -{ - uint32_t reg_data = usb_regs->gr->GINTEN; - - reg_data &= usb_regs->gr->GINTF; - - return reg_data; -} - -/*! - \brief set USB RX FIFO size - \param[in] usb_regs: pointer to USB core registers - \param[in] size: assigned FIFO size - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_set_rxfifo(usb_core_regs *usb_regs, uint16_t size) -{ - usb_regs->gr->GRFLEN = size; -} - -/*! - \brief enable the global interrupts - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_globalint_enable(usb_core_regs *usb_regs) -{ - /* enable USB global interrupt */ - usb_regs->gr->GAHBCS |= GAHBCS_GINTEN; -} - -/*! - \brief disable the global interrupts - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_globalint_disable(usb_core_regs *usb_regs) -{ - /* disable USB global interrupt */ - usb_regs->gr->GAHBCS &= ~GAHBCS_GINTEN; -} - -/* function declarations */ -/* configure core capabilities */ -usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs, usb_core_enum usb_core); -/* initializes the USB controller registers and prepares the core device mode or host mode operation */ -usb_status usb_core_init(usb_core_basic usb_basic, usb_core_regs *usb_regs); -/* write a packet into the TX FIFO associated with the endpoint */ -usb_status usb_txfifo_write(usb_core_regs *usb_regs, uint8_t *src_buf, uint8_t fifo_num, uint16_t byte_count); -/* read a packet from the RX FIFO associated with the endpoint */ -void *usb_rxfifo_read(usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count); -/* flush a TX FIFO or all TX FIFOs */ -usb_status usb_txfifo_flush(usb_core_regs *usb_regs, uint8_t fifo_num); -/* flush the entire RX FIFO */ -usb_status usb_rxfifo_flush(usb_core_regs *usb_regs); -/* set endpoint or channel TX FIFO size */ -void usb_set_txfifo(usb_core_regs *usb_regs, uint8_t fifo, uint16_t size); -/* set USB current mode */ -void usb_curmode_set(usb_core_regs *usb_regs, uint8_t mode); - -#endif /* DRV_USB_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h deleted file mode 100644 index 09bc32f105c..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_dev.h +++ /dev/null @@ -1,197 +0,0 @@ -/*! - \file drv_usb_dev.h - \brief USB device low level driver header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USB_DEV_H -#define DRV_USB_DEV_H - -#include "usbd_conf.h" -#include "drv_usb_core.h" - -#define EP_IN(x) ((uint8_t)(0x80U | (x))) /*!< device IN endpoint */ -#define EP_OUT(x) ((uint8_t)(x)) /*!< device OUT endpoint */ - -enum usb_ctl_status { - USB_CTL_IDLE = 0U, /*!< USB control transfer idle state */ - USB_CTL_DATA_IN, /*!< USB control transfer data IN state */ - USB_CTL_LAST_DATA_IN, /*!< USB control transfer last data IN state */ - USB_CTL_DATA_OUT, /*!< USB control transfer data OUT state */ - USB_CTL_LAST_DATA_OUT, /*!< USB control transfer last data OUT state */ - USB_CTL_STATUS_IN, /*!< USB control transfer status IN state*/ - USB_CTL_STATUS_OUT /*!< USB control transfer status OUT state */ -}; - -/* static inline function definitions */ - -/*! - \brief configure the USB device to be disconnected - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_dev_disconnect(usb_core_driver *udev) -{ - udev->regs.dr->DCTL |= DCTL_SD; -} - -/*! - \brief configure the USB device to be connected - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_dev_connect(usb_core_driver *udev) -{ - udev->regs.dr->DCTL &= ~DCTL_SD; -} - -/*! - \brief set the USB device address - \param[in] udev: pointer to USB device - \param[in] dev_addr: device address for setting - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_devaddr_set(usb_core_driver *udev, uint8_t dev_addr) -{ - udev->regs.dr->DCFG &= ~DCFG_DAR; - udev->regs.dr->DCFG |= (uint32_t)dev_addr << 4; -} - -/*! - \brief read device all OUT endpoint interrupt register - \param[in] udev: pointer to USB device - \param[out] none - \retval interrupt status -*/ -__STATIC_INLINE uint32_t usb_oepintnum_read(usb_core_driver *udev) -{ - uint32_t value = udev->regs.dr->DAEPINT; - - value &= udev->regs.dr->DAEPINTEN; - - return (value & DAEPINT_OEPITB) >> 16; -} - -/*! - \brief read device OUT endpoint interrupt flag register - \param[in] udev: pointer to USB device - \param[in] ep_num: endpoint number - \param[out] none - \retval interrupt status -*/ -__STATIC_INLINE uint32_t usb_oepintr_read(usb_core_driver *udev, uint8_t ep_num) -{ - uint32_t value = udev->regs.er_out[ep_num]->DOEPINTF; - - value &= udev->regs.dr->DOEPINTEN; - - return value; -} - -/*! - \brief read device all IN endpoint interrupt register - \param[in] udev: pointer to USB device - \param[out] none - \retval interrupt status -*/ -__STATIC_INLINE uint32_t usb_iepintnum_read(usb_core_driver *udev) -{ - uint32_t value = udev->regs.dr->DAEPINT; - - value &= udev->regs.dr->DAEPINTEN; - - return value & DAEPINT_IEPITB; -} - -/*! - \brief set remote wakeup signaling - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_rwkup_set(usb_core_driver *udev) -{ - if(udev->dev.pm.dev_remote_wakeup) { - /* enable remote wakeup signaling */ - udev->regs.dr->DCTL |= DCTL_RWKUP; - } -} - -/*! - \brief reset remote wakeup signaling - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_rwkup_reset(usb_core_driver *udev) -{ - if(udev->dev.pm.dev_remote_wakeup) { - /* disable remote wakeup signaling */ - udev->regs.dr->DCTL &= ~DCTL_RWKUP; - } -} - -/* function declarations */ -/* initialize USB core registers for device mode */ -usb_status usb_devcore_init(usb_core_driver *udev); -/* enable the USB device mode interrupts */ -usb_status usb_devint_enable(usb_core_driver *udev); -/* active the USB endpoint 0 transaction */ -usb_status usb_transc0_active(usb_core_driver *udev, usb_transc *transc); -/* active the USB transaction */ -usb_status usb_transc_active(usb_core_driver *udev, usb_transc *transc); -/* deactivate the USB transaction */ -usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc); -/* configure USB transaction to start IN transfer */ -usb_status usb_transc_inxfer(usb_core_driver *udev, usb_transc *transc); -/* configure USB transaction to start OUT transfer */ -usb_status usb_transc_outxfer(usb_core_driver *udev, usb_transc *transc); -/* set the USB transaction STALL status */ -usb_status usb_transc_stall(usb_core_driver *udev, usb_transc *transc); -/* clear the USB transaction STALL status */ -usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc); -/* read device IN endpoint interrupt flag register */ -uint32_t usb_iepintr_read(usb_core_driver *udev, uint8_t ep_num); -/* configures OUT endpoint 0 to receive SETUP packets */ -void usb_ctlep_startout(usb_core_driver *udev); -/* active remote wakeup signaling */ -void usb_rwkup_active(usb_core_driver *udev); -/* active USB core clock */ -void usb_clock_active(usb_core_driver *udev); -/* USB device suspend */ -void usb_dev_suspend(usb_core_driver *udev); -/* stop the device and clean up FIFOs */ -void usb_dev_stop(usb_core_driver *udev); - -#endif /* DRV_USB_DEV_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h deleted file mode 100644 index 8ab66de1d2e..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_host.h +++ /dev/null @@ -1,115 +0,0 @@ -/*! - \file drv_usb_host.h - \brief USB host mode low level driver header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USB_HOST_H -#define DRV_USB_HOST_H - -#include "drv_usb_core.h" - -/*! - \brief get USB even frame - \param[in] udev: pointer to USB device - \param[out] none - \retval USB even or odd frame -*/ -__STATIC_INLINE uint8_t usb_frame_even(usb_core_driver *udev) -{ - return (uint8_t)!(udev->regs.hr->HFINFR & 0x01U); -} - -/*! - \brief configure USB clock of PHY - \param[in] udev: pointer to USB device - \param[in] clock: PHY clock - \param[out] none - \retval none -*/ -__STATIC_INLINE void usb_phyclock_config(usb_core_driver *udev, uint8_t clock) -{ - udev->regs.hr->HCTL &= ~HCTL_CLKSEL; - udev->regs.hr->HCTL |= clock; -} - -/*! - \brief read USB port - \param[in] udev: pointer to USB device - \param[out] none - \retval port status -*/ -__STATIC_INLINE uint32_t usb_port_read(usb_core_driver *udev) -{ - return *udev->regs.HPCS & ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); -} - -/*! - \brief get USB current speed - \param[in] udev: pointer to USB device - \param[out] none - \retval USB current speed -*/ -__STATIC_INLINE uint32_t usb_curspeed_get(usb_core_driver *udev) -{ - return *udev->regs.HPCS & HPCS_PS; -} - -/*! - \brief get USB current frame - \param[in] udev: pointer to USB device - \param[out] none - \retval USB current frame -*/ -__STATIC_INLINE uint32_t usb_curframe_get(usb_core_driver *udev) -{ - return (udev->regs.hr->HFINFR & 0xFFFFU); -} - -/* function declarations */ -/* initializes USB core for host mode */ -usb_status usb_host_init(usb_core_driver *udev); -/* control the VBUS to power */ -void usb_portvbus_switch(usb_core_driver *udev, uint8_t state); -/* reset host port */ -uint32_t usb_port_reset(usb_core_driver *udev); -/* initialize host pipe */ -usb_status usb_pipe_init(usb_core_driver *udev, uint8_t pipe_num); -/* prepare host pipe for transferring packets */ -usb_status usb_pipe_xfer(usb_core_driver *udev, uint8_t pipe_num); -/* halt host pipe */ -usb_status usb_pipe_halt(usb_core_driver *udev, uint8_t pipe_num); -/* configure host pipe to do ping operation */ -usb_status usb_pipe_ping(usb_core_driver *udev, uint8_t pipe_num); -/* stop the USB host and clean up FIFO */ -void usb_host_stop(usb_core_driver *udev); - -#endif /* DRV_USB_HOST_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h deleted file mode 100644 index 6a1dcd08b46..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_hw.h +++ /dev/null @@ -1,62 +0,0 @@ -/*! - \file drv_usb_hw.h - \brief usb hardware configuration header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USB_HW_H -#define DRV_USB_HW_H - -#include "usb_conf.h" - -/* function declarations */ -/* configure USB clock */ -void usb_rcu_config(void); -/* configure USB data line gpio */ -void usb_gpio_config(void); -/* configure USB interrupt */ -void usb_intr_config(void); -/* initializes delay unit using Timer2 */ -void usb_timer_init(void); -/* delay in micro seconds */ -void usb_udelay(const uint32_t usec); -/* delay in milliseconds */ -void usb_mdelay(const uint32_t msec); -/* configures system clock after wakeup from STOP mode */ -void system_clk_config_stop(void); -#ifdef USE_HOST_MODE -/* configure USB VBus */ -void usb_vbus_config(void); -/* drive USB VBus */ -void usb_vbus_drive(uint8_t State); -#endif /* USE_HOST_MODE */ - -#endif /* DRV_USB_HW_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h deleted file mode 100644 index 38fec2cb552..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usb_regs.h +++ /dev/null @@ -1,656 +0,0 @@ -/*! - \file drv_usb_regs.h - \brief USB cell registers definition and handle macros - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USB_REGS_H -#define DRV_USB_REGS_H - -#include "usb_conf.h" - -#define USBHS_REG_BASE 0x40040000L /*!< base address of USBHS registers */ -#define USBFS_REG_BASE 0x50000000L /*!< base address of USBFS registers */ - -#define USBFS_MAX_TX_FIFOS 15U /*!< FIFO number */ - -#define USBFS_MAX_PACKET_SIZE 64U /*!< USBFS max packet size */ -#define USBFS_MAX_CHANNEL_COUNT 8U /*!< USBFS host channel count */ -#define USBFS_MAX_EP_COUNT 4U /*!< USBFS device endpoint count */ -#define USBFS_MAX_FIFO_WORDLEN 320U /*!< USBFS max FIFO size in words */ - -#define USBHS_MAX_PACKET_SIZE 512U /*!< USBHS max packet size */ -#define USBHS_MAX_CHANNEL_COUNT 12U /*!< USBHS host channel count */ -#define USBHS_MAX_EP_COUNT 6U /*!< USBHS device endpoint count */ -#define USBHS_MAX_FIFO_WORDLEN 1280U /*!< USBHS max FIFO size in words */ - -#define USB_DATA_FIFO_OFFSET 0x1000U /*!< USB data FIFO offset */ -#define USB_DATA_FIFO_SIZE 0x1000U /*!< USB data FIFO size */ - -typedef enum { - USB_CORE_ENUM_HS = 0U, /*!< USB core type is HS */ - USB_CORE_ENUM_FS = 1U /*!< USB core type is FS */ -} usb_core_enum; - -enum USB_SPEED { - USB_SPEED_UNKNOWN = 0U, /*!< USB speed unknown */ - USB_SPEED_LOW, /*!< USB speed low */ - USB_SPEED_FULL, /*!< USB speed full */ - USB_SPEED_HIGH /*!< USB speed high */ -}; - -enum usb_reg_offset { - USB_REG_OFFSET_CORE = 0x0000U, /*!< global OTG control and status register */ - USB_REG_OFFSET_DEV = 0x0800U, /*!< device mode control and status registers */ - USB_REG_OFFSET_EP = 0x0020U, - USB_REG_OFFSET_EP_IN = 0x0900U, /*!< device IN endpoint 0 control register */ - USB_REG_OFFSET_EP_OUT = 0x0B00U, /*!< device OUT endpoint 0 control register */ - USB_REG_OFFSET_HOST = 0x0400U, /*!< host control register */ - USB_REG_OFFSET_CH = 0x0020U, - USB_REG_OFFSET_PORT = 0x0440U, /*!< host port control and status register */ - USB_REG_OFFSET_CH_INOUT = 0x0500U, /*!< Host channel-x control registers */ - USB_REG_OFFSET_PWRCLKCTL = 0x0E00U /*!< power and clock register */ -}; - -typedef struct { - __IO uint32_t GOTGCS; /*!< USB global OTG control and status register 000h */ - __IO uint32_t GOTGINTF; /*!< USB global OTG interrupt flag register 004h */ - __IO uint32_t GAHBCS; /*!< USB global AHB control and status register 008h */ - __IO uint32_t GUSBCS; /*!< USB global USB control and status register 00Ch */ - __IO uint32_t GRSTCTL; /*!< USB global reset control register 010h */ - __IO uint32_t GINTF; /*!< USB global interrupt flag register 014h */ - __IO uint32_t GINTEN; /*!< USB global interrupt enable register 018h */ - __IO uint32_t GRSTATR; /*!< USB receive status debug read register 01Ch */ - __IO uint32_t GRSTATP; /*!< USB receive status and pop register 020h */ - __IO uint32_t GRFLEN; /*!< USB global receive FIFO length register 024h */ - __IO uint32_t DIEP0TFLEN_HNPTFLEN; /*!< USB device IN endpoint 0/host non-periodic transmit FIFO length register 028h */ - __IO uint32_t HNPTFQSTAT; /*!< USB host non-periodic FIFO/queue status register 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< USB global core configuration register 038h */ - __IO uint32_t CID; /*!< USB core ID register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 040h-0FFh */ - __IO uint32_t HPTFLEN; /*!< USB host periodic transmit FIFO length register 100h */ - __IO uint32_t DIEPTFLEN[15]; /*!< USB device IN endpoint transmit FIFO length register 104h */ -} usb_gr; - -typedef struct { - __IO uint32_t HCTL; /*!< USB host control register 400h */ - __IO uint32_t HFT; /*!< USB host frame interval register 404h */ - __IO uint32_t HFINFR; /*!< USB host frame information remaining register 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTFQSTAT; /*!< USB host periodic transmit FIFO/queue status register 410h */ - __IO uint32_t HACHINT; /*!< USB host all channels interrupt register 414h */ - __IO uint32_t HACHINTEN; /*!< USB host all channels interrupt enable register 418h */ -} usb_hr; - -typedef struct { - __IO uint32_t HCHCTL; /*!< USB host channel control register 500h */ - __IO uint32_t HCHSTCTL; /*!< Reserved 504h */ - __IO uint32_t HCHINTF; /*!< USB host channel interrupt flag register 508h */ - __IO uint32_t HCHINTEN; /*!< USB host channel interrupt enable register 50Ch */ - __IO uint32_t HCHLEN; /*!< USB host channel transfer length register 510h */ - __IO uint32_t HCHDMAADDR; /*!< USB host channel-x DMA address register 514h*/ - uint32_t Reserved[2]; -} usb_pr; - -typedef struct { - __IO uint32_t DCFG; /*!< USB device configuration register 800h */ - __IO uint32_t DCTL; /*!< USB device control register 804h */ - __IO uint32_t DSTAT; /*!< USB device status register 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPINTEN; /*!< USB device IN endpoint common interrupt enable register 810h */ - __IO uint32_t DOEPINTEN; /*!< USB device OUT endpoint common interrupt enable register 814h */ - __IO uint32_t DAEPINT; /*!< USB device all endpoints interrupt register 818h */ - __IO uint32_t DAEPINTEN; /*!< USB device all endpoints interrupt enable register 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved24; /*!< Reserved 824h */ - __IO uint32_t DVBUSDT; /*!< USB device VBUS discharge time register 828h */ - __IO uint32_t DVBUSPT; /*!< USB device VBUS pulsing time register 82Ch */ - __IO uint32_t DTHRCTL; /*!< device threshold control 830h */ - __IO uint32_t DIEPFEINTEN; /*!< USB Device IN endpoint FIFO empty interrupt enable register 834h */ - __IO uint32_t DEP1INT; /*!< USB device endpoint 1 interrupt register 838h */ - __IO uint32_t DEP1INTEN; /*!< USB device endpoint 1 interrupt enable register 83Ch */ - uint32_t Reserved40; /*!< Reserved 840h */ - __IO uint32_t DIEP1INTEN; /*!< USB device IN endpoint-1 interrupt enable register 844h */ - uint32_t Reserved48[15]; /*!< Reserved 848-880h */ - __IO uint32_t DOEP1INTEN; /*!< USB device OUT endpoint-1 interrupt enable register 884h */ -} usb_dr; - -typedef struct { - __IO uint32_t DIEPCTL; /*!< USB device IN endpoint control register 900h + (EpNum * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (EpNum * 20h) + 04h */ - __IO uint32_t DIEPINTF; /*!< USB device IN endpoint interrupt flag register 900h + (EpNum * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (EpNum * 20h) + 0Ch */ - __IO uint32_t DIEPLEN; /*!< USB device IN endpoint transfer length register 900h + (EpNum * 20h) + 10h */ - __IO uint32_t DIEPDMAADDR; /*!< Device IN endpoint-x DMA address register 900h + (EpNum * 20h) + 14h */ - __IO uint32_t DIEPTFSTAT; /*!< USB device IN endpoint transmit FIFO status register 900h + (EpNum * 20h) + 18h */ -} usb_erin; - -typedef struct { - __IO uint32_t DOEPCTL; /*!< USB device IN endpoint control register B00h + (EpNum * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (EpNum * 20h) + 04h */ - __IO uint32_t DOEPINTF; /*!< USB device IN endpoint interrupt flag register B00h + (EpNum * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (EpNum * 20h) + 0Ch */ - __IO uint32_t DOEPLEN; /*!< USB device IN endpoint transfer length register B00h + (EpNum * 20h) + 10h */ - __IO uint32_t DOEPDMAADDR; /*!< Device OUT endpoint-x DMA address register B00h + (EpNum * 20h) + 0Ch */ -} usb_erout; - -typedef struct _usb_regs { - usb_gr *gr; /*!< USBFS global registers */ - usb_dr *dr; /*!< Device control and status registers */ - usb_hr *hr; /*!< Host control and status registers */ - usb_erin *er_in[6]; /*!< USB device IN endpoint register */ - usb_erout *er_out[6]; /*!< USB device OUT endpoint register */ - usb_pr *pr[15]; /*!< USB Host channel-x control register */ - - __IO uint32_t *HPCS; /*!< USB host port control and status register */ - __IO uint32_t *DFIFO[USBFS_MAX_TX_FIFOS]; - __IO uint32_t *PWRCLKCTL; /*!< USB power and clock control register */ -} usb_core_regs; - -/* global OTG control and status register bits definitions */ -#define GOTGCS_BSV BIT(19) /*!< B-Session Valid */ -#define GOTGCS_ASV BIT(18) /*!< A-session valid */ -#define GOTGCS_DI BIT(17) /*!< debounce interval */ -#define GOTGCS_IDPS BIT(16) /*!< id pin status */ -#define GOTGCS_DHNPEN BIT(11) /*!< device HNP enable */ -#define GOTGCS_HHNPEN BIT(10) /*!< host HNP enable */ -#define GOTGCS_HNPREQ BIT(9) /*!< HNP request */ -#define GOTGCS_HNPS BIT(8) /*!< HNP successes */ -#define GOTGCS_SRPREQ BIT(1) /*!< SRP request */ -#define GOTGCS_SRPS BIT(0) /*!< SRP successes */ - -/* global OTG interrupt flag register bits definitions */ -#define GOTGINTF_DF BIT(19) /*!< debounce finish */ -#define GOTGINTF_ADTO BIT(18) /*!< A-device timeout */ -#define GOTGINTF_HNPDET BIT(17) /*!< host negotiation request detected */ -#define GOTGINTF_HNPEND BIT(9) /*!< HNP end */ -#define GOTGINTF_SRPEND BIT(8) /*!< SRP end */ -#define GOTGINTF_SESEND BIT(2) /*!< session end */ - -/* global AHB control and status register bits definitions */ -#define GAHBCS_PTXFTH BIT(8) /*!< periodic TX FIFO threshold */ -#define GAHBCS_TXFTH BIT(7) /*!< TX FIFO threshold */ -#define GAHBCS_DMAEN BIT(5) /*!< DMA function Enable */ -#define GAHBCS_BURST BITS(1, 4) /*!< the AHB burst type used by DMA */ -#define GAHBCS_GINTEN BIT(0) /*!< global interrupt enable */ - -/* global USB control and status register bits definitions */ -#define GUSBCS_FDM BIT(30) /*!< force device mode */ -#define GUSBCS_FHM BIT(29) /*!< force host mode */ -#define GUSBCS_ULPIEOI BIT(21) /*!< ULPI external over-current indicator */ -#define GUSBCS_ULPIEVD BIT(20) /*!< ULPI external VBUS driver */ -#define GUSBCS_UTT BITS(10, 13) /*!< USB turnaround time */ -#define GUSBCS_HNPCEN BIT(9) /*!< HNP capability enable */ -#define GUSBCS_SRPCEN BIT(8) /*!< SRP capability enable */ -#define GUSBCS_EMBPHY BIT(6) /*!< embedded PHY selected */ -#define GUSBCS_HS_CUR_FE BIT(4) /*!< HS current software enable */ -#define GUSBCS_TOC BITS(0, 2) /*!< timeout calibration */ - -/* global reset control register bits definitions */ -#define GRSTCTL_DMAIDL BIT(31) /*!< DMA idle state */ -#define GRSTCTL_DMABSY BIT(30) /*!< DMA busy */ -#define GRSTCTL_TXFNUM BITS(6, 10) /*!< tx FIFO number */ -#define GRSTCTL_TXFF BIT(5) /*!< tx FIFO flush */ -#define GRSTCTL_RXFF BIT(4) /*!< rx FIFO flush */ -#define GRSTCTL_HFCRST BIT(2) /*!< host frame counter reset */ -#define GRSTCTL_HCSRST BIT(1) /*!< HCLK soft reset */ -#define GRSTCTL_CSRST BIT(0) /*!< core soft reset */ - -/* global interrupt flag register bits definitions */ -#define GINTF_WKUPIF BIT(31) /*!< wakeup interrupt flag */ -#define GINTF_SESIF BIT(30) /*!< session interrupt flag */ -#define GINTF_DISCIF BIT(29) /*!< disconnect interrupt flag */ -#define GINTF_IDPSC BIT(28) /*!< id pin status change */ -#define GINTF_PTXFEIF BIT(26) /*!< periodic tx FIFO empty interrupt flag */ -#define GINTF_HCIF BIT(25) /*!< host channels interrupt flag */ -#define GINTF_HPIF BIT(24) /*!< host port interrupt flag */ -#define GINTF_PXNCIF BIT(21) /*!< periodic transfer not complete interrupt flag */ -#define GINTF_ISOONCIF BIT(21) /*!< isochronous OUT transfer not complete interrupt flag */ -#define GINTF_ISOINCIF BIT(20) /*!< isochronous IN transfer not complete interrupt flag */ -#define GINTF_OEPIF BIT(19) /*!< OUT endpoint interrupt flag */ -#define GINTF_IEPIF BIT(18) /*!< IN endpoint interrupt flag */ -#define GINTF_EOPFIF BIT(15) /*!< end of periodic frame interrupt flag */ -#define GINTF_ISOOPDIF BIT(14) /*!< isochronous OUT packet dropped interrupt flag */ -#define GINTF_ENUMFIF BIT(13) /*!< enumeration finished */ -#define GINTF_RST BIT(12) /*!< USB reset */ -#define GINTF_SP BIT(11) /*!< USB suspend */ -#define GINTF_ESP BIT(10) /*!< early suspend */ -#define GINTF_GONAK BIT(7) /*!< global OUT NAK effective */ -#define GINTF_GNPINAK BIT(6) /*!< global IN non-periodic NAK effective */ -#define GINTF_NPTXFEIF BIT(5) /*!< non-periodic tx FIFO empty interrupt flag */ -#define GINTF_RXFNEIF BIT(4) /*!< rx FIFO non-empty interrupt flag */ -#define GINTF_SOF BIT(3) /*!< start of frame */ -#define GINTF_OTGIF BIT(2) /*!< OTG interrupt flag */ -#define GINTF_MFIF BIT(1) /*!< mode fault interrupt flag */ -#define GINTF_COPM BIT(0) /*!< current operation mode */ - -/* global interrupt enable register bits definitions */ -#define GINTEN_WKUPIE BIT(31) /*!< wakeup interrupt enable */ -#define GINTEN_SESIE BIT(30) /*!< session interrupt enable */ -#define GINTEN_DISCIE BIT(29) /*!< disconnect interrupt enable */ -#define GINTEN_IDPSCIE BIT(28) /*!< id pin status change interrupt enable */ -#define GINTEN_PTXFEIE BIT(26) /*!< periodic tx FIFO empty interrupt enable */ -#define GINTEN_HCIE BIT(25) /*!< host channels interrupt enable */ -#define GINTEN_HPIE BIT(24) /*!< host port interrupt enable */ -#define GINTEN_IPXIE BIT(21) /*!< periodic transfer not complete interrupt enable */ -#define GINTEN_ISOONCIE BIT(21) /*!< isochronous OUT transfer not complete interrupt enable */ -#define GINTEN_ISOINCIE BIT(20) /*!< isochronous IN transfer not complete interrupt enable */ -#define GINTEN_OEPIE BIT(19) /*!< OUT endpoints interrupt enable */ -#define GINTEN_IEPIE BIT(18) /*!< IN endpoints interrupt enable */ -#define GINTEN_EOPFIE BIT(15) /*!< end of periodic frame interrupt enable */ -#define GINTEN_ISOOPDIE BIT(14) /*!< isochronous OUT packet dropped interrupt enable */ -#define GINTEN_ENUMFIE BIT(13) /*!< enumeration finish enable */ -#define GINTEN_RSTIE BIT(12) /*!< USB reset interrupt enable */ -#define GINTEN_SPIE BIT(11) /*!< USB suspend interrupt enable */ -#define GINTEN_ESPIE BIT(10) /*!< early suspend interrupt enable */ -#define GINTEN_GONAKIE BIT(7) /*!< global OUT NAK effective interrupt enable */ -#define GINTEN_GNPINAKIE BIT(6) /*!< global non-periodic IN NAK effective interrupt enable */ -#define GINTEN_NPTXFEIE BIT(5) /*!< non-periodic TX FIFO empty interrupt enable */ -#define GINTEN_RXFNEIE BIT(4) /*!< receive FIFO non-empty interrupt enable */ -#define GINTEN_SOFIE BIT(3) /*!< start of frame interrupt enable */ -#define GINTEN_OTGIE BIT(2) /*!< OTG interrupt enable */ -#define GINTEN_MFIE BIT(1) /*!< mode fault interrupt enable */ - -/* global receive status read and pop register bits definitions */ -#define GRSTATRP_RPCKST BITS(17, 20) /*!< received packet status */ -#define GRSTATRP_DPID BITS(15, 16) /*!< data PID */ -#define GRSTATRP_BCOUNT BITS(4, 14) /*!< byte count */ -#define GRSTATRP_CNUM BITS(0, 3) /*!< channel number */ -#define GRSTATRP_EPNUM BITS(0, 3) /*!< endpoint number */ - -/* global receive FIFO length register bits definitions */ -#define GRFLEN_RXFD BITS(0, 15) /*!< rx FIFO depth */ - -/* host non-periodic transmit FIFO length register bits definitions */ -#define HNPTFLEN_HNPTXFD BITS(16, 31) /*!< non-periodic TX FIFO depth */ -#define HNPTFLEN_HNPTXRSAR BITS(0, 15) /*!< non-periodic TX RAM start address */ - -/* USB IN endpoint 0 transmit FIFO length register bits definitions */ -#define DIEP0TFLEN_IEP0TXFD BITS(16, 31) /*!< IN Endpoint 0 TX FIFO depth */ -#define DIEP0TFLEN_IEP0TXRSAR BITS(0, 15) /*!< IN Endpoint 0 TX RAM start address */ - -/* host non-periodic transmit FIFO/queue status register bits definitions */ -#define HNPTFQSTAT_NPTXRQTOP BITS(24, 30) /*!< top entry of the non-periodic TX request queue */ -#define HNPTFQSTAT_NPTXRQS BITS(16, 23) /*!< non-periodic TX request queue space */ -#define HNPTFQSTAT_NPTXFS BITS(0, 15) /*!< non-periodic TX FIFO space */ -#define HNPTFQSTAT_CNUM BITS(27, 30) /*!< channel number*/ -#define HNPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ -#define HNPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ -#define HNPTFQSTAT_TMF BIT(24) /*!< terminate flag */ - -/* global core configuration register bits definitions */ -#define GCCFG_VBUSIG BIT(21) /*!< vbus ignored */ -#define GCCFG_SOFOEN BIT(20) /*!< SOF output enable */ -#define GCCFG_VBUSBCEN BIT(19) /*!< the VBUS B-device comparer enable */ -#define GCCFG_VBUSACEN BIT(18) /*!< the VBUS A-device comparer enable */ -#define GCCFG_PWRON BIT(16) /*!< power on */ - -/* core ID register bits definitions */ -#define CID_CID BITS(0, 31) /*!< core ID */ - -/* host periodic transmit FIFO length register bits definitions */ -#define HPTFLEN_HPTXFD BITS(16, 31) /*!< host periodic TX FIFO depth */ -#define HPTFLEN_HPTXFSAR BITS(0, 15) /*!< host periodic TX RAM start address */ - -/* device IN endpoint transmit FIFO length register bits definitions */ -#define DIEPTFLEN_IEPTXFD BITS(16, 31) /*!< IN endpoint TX FIFO x depth */ -#define DIEPTFLEN_IEPTXRSAR BITS(0, 15) /*!< IN endpoint FIFOx TX x RAM start address */ - -/* host control register bits definitions */ -#define HCTL_SPDFSLS BIT(2) /*!< speed limited to FS and LS */ -#define HCTL_CLKSEL BITS(0, 1) /*!< clock select for USB clock */ - -/* host frame interval register bits definitions */ -#define HFT_FRI BITS(0, 15) /*!< frame interval */ - -/* host frame information remaining register bits definitions */ -#define HFINFR_FRT BITS(16, 31) /*!< frame remaining time */ -#define HFINFR_FRNUM BITS(0, 15) /*!< frame number */ - -/* host periodic transmit FIFO/queue status register bits definitions */ -#define HPTFQSTAT_PTXREQT BITS(24, 31) /*!< top entry of the periodic TX request queue */ -#define HPTFQSTAT_PTXREQS BITS(16, 23) /*!< periodic TX request queue space */ -#define HPTFQSTAT_PTXFS BITS(0, 15) /*!< periodic TX FIFO space */ -#define HPTFQSTAT_OEFRM BIT(31) /*!< odd/eveb frame */ -#define HPTFQSTAT_CNUM BITS(27, 30) /*!< channel number */ -#define HPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ -#define HPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ -#define HPTFQSTAT_TMF BIT(24) /*!< terminate flag */ - -#define TFQSTAT_TXFS BITS(0, 15) -#define TFQSTAT_CNUM BITS(27, 30) - -/* host all channels interrupt register bits definitions */ -#define HACHINT_HACHINT BITS(0, 11) /*!< host all channel interrupts */ - -/* host all channels interrupt enable register bits definitions */ -#define HACHINTEN_CINTEN BITS(0, 11) /*!< channel interrupt enable */ - -/* host port control and status register bits definitions */ -#define HPCS_PS BITS(17, 18) /*!< port speed */ -#define HPCS_PTEST BITS(13, 16) /*!< port test control */ -#define HPCS_PP BIT(12) /*!< port power */ -#define HPCS_PLST BITS(10, 11) /*!< port line status */ -#define HPCS_PRST BIT(8) /*!< port reset */ -#define HPCS_PSP BIT(7) /*!< port suspend */ -#define HPCS_PREM BIT(6) /*!< port resume */ -#define HPCS_PEDC BIT(3) /*!< port enable/disable change */ -#define HPCS_PE BIT(2) /*!< port enable */ -#define HPCS_PCD BIT(1) /*!< port connect detected */ -#define HPCS_PCST BIT(0) /*!< port connect status */ - -/* host channel-x control register bits definitions */ -#define HCHCTL_CEN BIT(31) /*!< channel enable */ -#define HCHCTL_CDIS BIT(30) /*!< channel disable */ -#define HCHCTL_ODDFRM BIT(29) /*!< odd frame */ -#define HCHCTL_DAR BITS(22, 28) /*!< device address */ -#define HCHCTL_MPC BITS(20, 21) /*!< multiple packet count */ -#define HCHCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ -#define HCHCTL_LSD BIT(17) /*!< low-speed device */ -#define HCHCTL_EPDIR BIT(15) /*!< endpoint direction */ -#define HCHCTL_EPNUM BITS(11, 14) /*!< endpoint number */ -#define HCHCTL_MPL BITS(0, 10) /*!< maximum packet length */ - -/* host channel-x split transaction register bits definitions */ -#define HCHSTCTL_SPLEN BIT(31) /*!< enable high-speed split transaction */ -#define HCHSTCTL_CSPLT BIT(16) /*!< complete-split enable */ -#define HCHSTCTL_ISOPCE BITS(14, 15) /*!< isochronous OUT payload continuation encoding */ -#define HCHSTCTL_HADDR BITS(7, 13) /*!< HUB address */ -#define HCHSTCTL_PADDR BITS(0, 6) /*!< port address */ - -/* host channel-x interrupt flag register bits definitions */ -#define HCHINTF_DTER BIT(10) /*!< data toggle error */ -#define HCHINTF_REQOVR BIT(9) /*!< request queue overrun */ -#define HCHINTF_BBER BIT(8) /*!< babble error */ -#define HCHINTF_USBER BIT(7) /*!< USB bus Error */ -#define HCHINTF_NYET BIT(6) /*!< NYET */ -#define HCHINTF_ACK BIT(5) /*!< ACK */ -#define HCHINTF_NAK BIT(4) /*!< NAK */ -#define HCHINTF_STALL BIT(3) /*!< STALL */ -#define HCHINTF_DMAER BIT(2) /*!< DMA error */ -#define HCHINTF_CH BIT(1) /*!< channel halted */ -#define HCHINTF_TF BIT(0) /*!< transfer finished */ - -/* host channel-x interrupt enable register bits definitions */ -#define HCHINTEN_DTERIE BIT(10) /*!< data toggle error interrupt enable */ -#define HCHINTEN_REQOVRIE BIT(9) /*!< request queue overrun interrupt enable */ -#define HCHINTEN_BBERIE BIT(8) /*!< babble error interrupt enable */ -#define HCHINTEN_USBERIE BIT(7) /*!< USB bus error interrupt enable */ -#define HCHINTEN_NYETIE BIT(6) /*!< NYET interrupt enable */ -#define HCHINTEN_ACKIE BIT(5) /*!< ACK interrupt enable */ -#define HCHINTEN_NAKIE BIT(4) /*!< NAK interrupt enable */ -#define HCHINTEN_STALLIE BIT(3) /*!< STALL interrupt enable */ -#define HCHINTEN_DMAERIE BIT(2) /*!< DMA error interrupt enable */ -#define HCHINTEN_CHIE BIT(1) /*!< channel halted interrupt enable */ -#define HCHINTEN_TFIE BIT(0) /*!< transfer finished interrupt enable */ - -/* host channel-x transfer length register bits definitions */ -#define HCHLEN_PING BIT(31) /*!< PING token request */ -#define HCHLEN_DPID BITS(29, 30) /*!< data PID */ -#define HCHLEN_PCNT BITS(19, 28) /*!< packet count */ -#define HCHLEN_TLEN BITS(0, 18) /*!< transfer length */ - -/* host channel-x DMA address register bits definitions */ -#define HCHDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ - -#define PORT_SPEED(x) (((uint32_t)(x) << 17) & HPCS_PS) /*!< Port speed */ - -#define PORT_SPEED_HIGH PORT_SPEED(0U) /*!< high speed */ -#define PORT_SPEED_FULL PORT_SPEED(1U) /*!< full speed */ -#define PORT_SPEED_LOW PORT_SPEED(2U) /*!< low speed */ - -#define PIPE_CTL_DAR(x) (((uint32_t)(x) << 22) & HCHCTL_DAR) /*!< device address */ -#define PIPE_CTL_EPTYPE(x) (((uint32_t)(x) << 18) & HCHCTL_EPTYPE) /*!< endpoint type */ -#define PIPE_CTL_EPNUM(x) (((uint32_t)(x) << 11) & HCHCTL_EPNUM) /*!< endpoint number */ -#define PIPE_CTL_EPDIR(x) (((uint32_t)(x) << 15) & HCHCTL_EPDIR) /*!< endpoint direction */ -#define PIPE_CTL_EPMPL(x) (((uint32_t)(x) << 0) & HCHCTL_MPL) /*!< maximum packet length */ -#define PIPE_CTL_LSD(x) (((uint32_t)(x) << 17) & HCHCTL_LSD) /*!< low-Speed device */ - -#define PIPE_XFER_PCNT(x) (((uint32_t)(x) << 19) & HCHLEN_PCNT) /*!< packet count */ -#define PIPE_XFER_DPID(x) (((uint32_t)(x) << 29) & HCHLEN_DPID) /*!< data PID */ - -#define PIPE_DPID_DATA0 PIPE_XFER_DPID(0U) /*!< DATA0 */ -#define PIPE_DPID_DATA1 PIPE_XFER_DPID(2U) /*!< DATA1 */ -#define PIPE_DPID_DATA2 PIPE_XFER_DPID(1U) /*!< DATA2 */ -#define PIPE_DPID_SETUP PIPE_XFER_DPID(3U) /*!< MDATA (non-control)/SETUP (control) */ - -extern const uint32_t PIPE_DPID[2]; - -/* device configuration registers bits definitions */ -#define DCFG_EOPFT BITS(11, 12) /*!< end of periodic frame time */ -#define DCFG_DAR BITS(4, 10) /*!< device address */ -#define DCFG_NZLSOH BIT(2) /*!< non-zero-length status OUT handshake */ -#define DCFG_DS BITS(0, 1) /*!< device speed */ - -/* device control registers bits definitions */ -#define DCTL_POIF BIT(11) /*!< power-on initialization finished */ -#define DCTL_CGONAK BIT(10) /*!< clear global OUT NAK */ -#define DCTL_SGONAK BIT(9) /*!< set global OUT NAK */ -#define DCTL_CGINAK BIT(8) /*!< clear global IN NAK */ -#define DCTL_SGINAK BIT(7) /*!< set global IN NAK */ -#define DCTL_DTEST BITS(4, 6) /*!< device test control */ -#define DCTL_GONS BIT(3) /*!< global OUT NAK status */ -#define DCTL_GINS BIT(2) /*!< global IN NAK status */ -#define DCTL_SD BIT(1) /*!< soft disconnect */ -#define DCTL_RWKUP BIT(0) /*!< remote wakeup */ - -/* device status registers bits definitions */ -#define DSTAT_FNRSOF BITS(8, 21) /*!< the frame number of the received SOF. */ -#define DSTAT_ES BITS(1, 2) /*!< enumerated speed */ -#define DSTAT_SPST BIT(0) /*!< suspend status */ - -/* device IN endpoint common interrupt enable registers bits definitions */ -#define DIEPINTEN_NAKEN BIT(13) /*!< NAK handshake sent by USB interrupt enable bit */ -#define DIEPINTEN_TXFEEN BIT(7) /*!< transmit FIFO empty interrupt enable bit */ -#define DIEPINTEN_IEPNEEN BIT(6) /*!< IN endpoint NAK effective interrupt enable bit */ -#define DIEPINTEN_EPTXFUDEN BIT(4) /*!< endpoint TX FIFO underrun interrupt enable bit */ -#define DIEPINTEN_CITOEN BIT(3) /*!< control In Timeout interrupt enable bit */ -#define DIEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ -#define DIEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ - -/* device OUT endpoint common interrupt enable registers bits definitions */ -#define DOEPINTEN_NYETEN BIT(14) /*!< NYET handshake is sent interrupt enable bit */ -#define DOEPINTEN_BTBSTPEN BIT(6) /*!< back-to-back SETUP packets interrupt enable bit */ -#define DOEPINTEN_EPRXFOVREN BIT(4) /*!< endpoint RX FIFO overrun interrupt enable bit */ -#define DOEPINTEN_STPFEN BIT(3) /*!< SETUP phase finished interrupt enable bit */ -#define DOEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ -#define DOEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ - -/* device all endpoints interrupt registers bits definitions */ -#define DAEPINT_OEPITB BITS(16, 21) /*!< device all OUT endpoint interrupt bits */ -#define DAEPINT_IEPITB BITS(0, 5) /*!< device all IN endpoint interrupt bits */ - -/* device all endpoints interrupt enable registers bits definitions */ -#define DAEPINTEN_OEPIE BITS(16, 21) /*!< OUT endpoint interrupt enable */ -#define DAEPINTEN_IEPIE BITS(0, 3) /*!< IN endpoint interrupt enable */ - -/* device Vbus discharge time registers bits definitions */ -#define DVBUSDT_DVBUSDT BITS(0, 15) /*!< device VBUS discharge time */ - -/* device Vbus pulsing time registers bits definitions */ -#define DVBUSPT_DVBUSPT BITS(0, 11) /*!< device VBUS pulsing time */ - -/* device IN endpoint FIFO empty interrupt enable register bits definitions */ -#define DIEPFEINTEN_IEPTXFEIE BITS(0, 5) /*!< IN endpoint TX FIFO empty interrupt enable bits */ - -/* device endpoint 0 control register bits definitions */ -#define DEP0CTL_EPEN BIT(31) /*!< endpoint enable */ -#define DEP0CTL_EPD BIT(30) /*!< endpoint disable */ -#define DEP0CTL_SNAK BIT(27) /*!< set NAK */ -#define DEP0CTL_CNAK BIT(26) /*!< clear NAK */ -#define DIEP0CTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ -#define DEP0CTL_STALL BIT(21) /*!< STALL handshake */ -#define DOEP0CTL_SNOOP BIT(20) /*!< snoop mode */ -#define DEP0CTL_EPTYPE BITS(18, 19) /*!< endpoint type */ -#define DEP0CTL_NAKS BIT(17) /*!< NAK status */ -#define DEP0CTL_EPACT BIT(15) /*!< endpoint active */ -#define DEP0CTL_MPL BITS(0, 1) /*!< maximum packet length */ - -/* device endpoint x control register bits definitions */ -#define DEPCTL_EPEN BIT(31) /*!< endpoint enable */ -#define DEPCTL_EPD BIT(30) /*!< endpoint disable */ -#define DEPCTL_SODDFRM BIT(29) /*!< set odd frame */ -#define DEPCTL_SD1PID BIT(29) /*!< set DATA1 PID */ -#define DEPCTL_SEVNFRM BIT(28) /*!< set even frame */ -#define DEPCTL_SD0PID BIT(28) /*!< set DATA0 PID */ -#define DEPCTL_SNAK BIT(27) /*!< set NAK */ -#define DEPCTL_CNAK BIT(26) /*!< clear NAK */ -#define DIEPCTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ -#define DEPCTL_STALL BIT(21) /*!< STALL handshake */ -#define DOEPCTL_SNOOP BIT(20) /*!< snoop mode */ -#define DEPCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ -#define DEPCTL_NAKS BIT(17) /*!< NAK status */ -#define DEPCTL_EOFRM BIT(16) /*!< even/odd frame */ -#define DEPCTL_DPID BIT(16) /*!< endpoint data PID */ -#define DEPCTL_EPACT BIT(15) /*!< endpoint active */ -#define DEPCTL_MPL BITS(0, 10) /*!< maximum packet length */ - -/* device IN endpoint-x interrupt flag register bits definitions */ -#define DIEPINTF_NAK BIT(13) /*!< NAK handshake sent by USB */ -#define DIEPINTF_TXFE BIT(7) /*!< transmit FIFO empty */ -#define DIEPINTF_IEPNE BIT(6) /*!< IN endpoint NAK effective */ -#define DIEPINTF_EPTXFUD BIT(4) /*!< endpoint TX FIFO underrun */ -#define DIEPINTF_CITO BIT(3) /*!< control In Timeout interrupt */ -#define DIEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ -#define DIEPINTF_TF BIT(0) /*!< transfer finished */ - -/* device OUT endpoint-x interrupt flag register bits definitions */ -#define DOEPINTF_NYET BIT(14) /*!< NYET handshake is sent */ -#define DOEPINTF_BTBSTP BIT(6) /*!< back-to-back SETUP packets */ -#define DOEPINTF_EPRXFOVR BIT(4) /*!< endpoint RX FIFO overrun */ -#define DOEPINTF_STPF BIT(3) /*!< SETUP phase finished */ -#define DOEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ -#define DOEPINTF_TF BIT(0) /*!< transfer finished */ - -/* device IN endpoint 0 transfer length register bits definitions */ -#define DIEP0LEN_PCNT BITS(19, 20) /*!< packet count */ -#define DIEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ - -/* device OUT endpoint 0 transfer length register bits definitions */ -#define DOEP0LEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ -#define DOEP0LEN_PCNT BIT(19) /*!< packet count */ -#define DOEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ - -/* device OUT endpoint-x transfer length register bits definitions */ -#define DOEPLEN_RXDPID BITS(29, 30) /*!< received data PID */ -#define DOEPLEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ -#define DIEPLEN_MCNT BITS(29, 30) /*!< multi count */ -#define DEPLEN_PCNT BITS(19, 28) /*!< packet count */ -#define DEPLEN_TLEN BITS(0, 18) /*!< transfer length */ - -/* device IN endpoint-x DMA address register bits definitions */ -#define DIEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ - -/* device OUT endpoint-x DMA address register bits definitions */ -#define DOEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ - -/* device IN endpoint-x transmit FIFO status register bits definitions */ -#define DIEPTFSTAT_IEPTFS BITS(0, 15) /*!< IN endpoint TX FIFO space remaining */ - -/* USB power and clock registers bits definition */ -#define PWRCLKCTL_SHCLK BIT(1) /*!< stop HCLK */ -#define PWRCLKCTL_SUCLK BIT(0) /*!< stop the USB clock */ - -#define RSTAT_GOUT_NAK 1U /*!< global OUT NAK (triggers an interrupt) */ -#define RSTAT_DATA_UPDT 2U /*!< OUT data packet received */ -#define RSTAT_XFER_COMP 3U /*!< OUT transfer completed (triggers an interrupt) */ -#define RSTAT_SETUP_COMP 4U /*!< SETUP transaction completed (triggers an interrupt) */ -#define RSTAT_SETUP_UPDT 6U /*!< SETUP data packet received */ - -#define DSTAT_EM_HS_PHY_30MHZ_60MHZ 0U /*!< USB enumerate speed use high-speed PHY clock in 30MHz or 60MHz */ -#define DSTAT_EM_FS_PHY_30MHZ_60MHZ 1U /*!< USB enumerate speed use full-speed PHY clock in 30MHz or 60MHz */ -#define DSTAT_EM_LS_PHY_6MHZ 2U /*!< USB enumerate speed use low-speed PHY clock in 6MHz */ -#define DSTAT_EM_FS_PHY_48MHZ 3U /*!< USB enumerate speed use full-speed PHY clock in 48MHz */ - -#define DPID_DATA0 0U /*!< device endpoint data PID is DATA0 */ -#define DPID_DATA1 2U /*!< device endpoint data PID is DATA1 */ -#define DPID_DATA2 1U /*!< device endpoint data PID is DATA2 */ -#define DPID_MDATA 3U /*!< device endpoint data PID is MDATA */ - -#define GAHBCS_DMAINCR(regval) (GAHBCS_BURST & ((regval) << 1)) /*!< AHB burst type used by DMA*/ - -#define DMA_INCR0 GAHBCS_DMAINCR(0U) /*!< single burst type used by DMA*/ -#define DMA_INCR1 GAHBCS_DMAINCR(1U) /*!< 4-beat incrementing burst type used by DMA*/ -#define DMA_INCR4 GAHBCS_DMAINCR(3U) /*!< 8-beat incrementing burst type used by DMA*/ -#define DMA_INCR8 GAHBCS_DMAINCR(5U) /*!< 16-beat incrementing burst type used by DMA*/ -#define DMA_INCR16 GAHBCS_DMAINCR(7U) /*!< 32-beat incrementing burst type used by DMA*/ - -#define DCFG_PFRI(regval) (DCFG_EOPFT & ((regval) << 11)) /*!< end of periodic frame time configuration */ - -#define FRAME_INTERVAL_80 DCFG_PFRI(0U) /*!< 80% of the frame time */ -#define FRAME_INTERVAL_85 DCFG_PFRI(1U) /*!< 85% of the frame time */ -#define FRAME_INTERVAL_90 DCFG_PFRI(2U) /*!< 90% of the frame time */ -#define FRAME_INTERVAL_95 DCFG_PFRI(3U) /*!< 95% of the frame time */ - -#define DCFG_DEVSPEED(regval) (DCFG_DS & ((regval) << 0)) /*!< device speed configuration */ - -#define USB_SPEED_EXP_HIGH DCFG_DEVSPEED(0U) /*!< device external PHY high speed */ -#define USB_SPEED_EXP_FULL DCFG_DEVSPEED(1U) /*!< device external PHY full speed */ -#define USB_SPEED_INP_FULL DCFG_DEVSPEED(3U) /*!< device internal PHY full speed */ - -#define DEP0_MPL(regval) (DEP0CTL_MPL & ((regval) << 0)) /*!< maximum packet length configuration */ - -#define EP0MPL_64 DEP0_MPL(0U) /*!< maximum packet length 64 bytes */ -#define EP0MPL_32 DEP0_MPL(1U) /*!< maximum packet length 32 bytes */ -#define EP0MPL_16 DEP0_MPL(2U) /*!< maximum packet length 16 bytes */ -#define EP0MPL_8 DEP0_MPL(3U) /*!< maximum packet length 8 bytes */ - -#define DOEP0_TLEN(regval) (DOEP0LEN_TLEN & ((regval) << 0)) /*!< transfer length */ -#define DOEP0_PCNT(regval) (DOEP0LEN_PCNT & ((regval) << 19)) /*!< packet count */ -#define DOEP0_STPCNT(regval) (DOEP0LEN_STPCNT & ((regval) << 29)) /*!< SETUP packet count */ - -#define USB_ULPI_PHY 1U /*!< ULPI interface external PHY */ -#define USB_EMBEDDED_PHY 2U /*!< embedded PHY */ - -#define GRXSTS_PKTSTS_IN 2U -#define GRXSTS_PKTSTS_IN_XFER_COMP 3U -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U -#define GRXSTS_PKTSTS_CH_HALTED 7U - -#define HCTL_30_60MHZ 0U /*!< USB clock 30-60MHZ */ -#define HCTL_48MHZ 1U /*!< USB clock 48MHZ */ -#define HCTL_6MHZ 2U /*!< USB clock 6MHZ */ - -#define EP0_OUT ((uint8_t)0x00U) /*!< endpoint OUT 0 */ -#define EP0_IN ((uint8_t)0x80U) /*!< endpoint IN 0 */ -#define EP1_OUT ((uint8_t)0x01U) /*!< endpoint OUT 1 */ -#define EP1_IN ((uint8_t)0x81U) /*!< endpoint IN 1 */ -#define EP2_OUT ((uint8_t)0x02U) /*!< endpoint OUT 2 */ -#define EP2_IN ((uint8_t)0x82U) /*!< endpoint IN 2 */ -#define EP3_OUT ((uint8_t)0x03U) /*!< endpoint OUT 3 */ -#define EP3_IN ((uint8_t)0x83U) /*!< endpoint IN 3 */ -#define EP4_OUT ((uint8_t)0x04U) /*!< endpoint OUT 4 */ -#define EP4_IN ((uint8_t)0x84U) /*!< endpoint IN 4 */ -#define EP5_OUT ((uint8_t)0x05U) /*!< endpoint OUT 5 */ -#define EP5_IN ((uint8_t)0x85U) /*!< endpoint IN 5 */ - -#endif /* DRV_USB_REGS_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h deleted file mode 100644 index 351690ecf31..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbd_int.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - \file drv_usbd_int.h - \brief USB device mode interrupt header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USBD_INT_H -#define DRV_USBD_INT_H - -#include "drv_usb_dev.h" - -/* function declarations */ -/* USB device-mode interrupts global service routine handler */ -void usbd_isr(usb_core_driver *udev); -#ifdef USB_HS_DEDICATED_EP1_ENABLED -/* USB dedicated IN endpoint 1 interrupt service routine handler */ -uint32_t usbd_int_dedicated_ep1in(usb_core_driver *udev); -/* USB dedicated OUT endpoint 1 interrupt service routine handler */ -uint32_t usbd_int_dedicated_ep1out(usb_core_driver *udev); -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - -#endif /* DRV_USBD_INT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h deleted file mode 100644 index 74c56b6c4bd..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Include/drv_usbh_int.h +++ /dev/null @@ -1,53 +0,0 @@ -/*! - \file drv_usbh_int.h.h - \brief USB host mode interrupt management header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef DRV_USBH_INT_H -#define DRV_USBH_INT_H - -#include "drv_usb_host.h" -#include "usbh_core.h" - -typedef struct _usbh_ev_cb { - uint8_t (*connect)(usbh_host *uhost); - uint8_t (*disconnect)(usbh_host *uhost); - uint8_t (*SOF)(usbh_host *uhost); -} usbh_ev_cb; - -extern usbh_ev_cb *usbh_int_fop; - -/* function declarations */ -/* handle global host interrupt */ -uint32_t usbh_isr(usb_core_driver *udev); - -#endif /* DRV_USBH_INT_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c deleted file mode 100644 index 0b650f632d2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_core.c +++ /dev/null @@ -1,371 +0,0 @@ -/*! - \file drv_usb_core.c - \brief USB core driver which can operate in host and device mode - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usb_core.h" -#include "drv_usb_hw.h" - -/* local function prototypes ('static') */ -static void usb_core_reset(usb_core_regs *usb_regs); - -/*! - \brief configure USB core basic - \param[in] usb_basic: pointer to USB capabilities - \param[in] usb_regs: USB core registers - \param[in] usb_core: USB core - \param[out] none - \retval operation status -*/ -usb_status usb_basic_init(usb_core_basic *usb_basic, \ - usb_core_regs *usb_regs, \ - usb_core_enum usb_core) -{ - /* configure USB default transfer mode as FIFO mode */ - usb_basic->transfer_mode = (uint8_t)USB_USE_FIFO; - - /* USB default speed is full-speed */ - usb_basic->core_speed = (uint8_t)USB_SPEED_FULL; - - usb_basic->core_enum = (uint8_t)usb_core; - - switch(usb_core) { - case USB_CORE_ENUM_HS: - usb_basic->base_reg = (uint32_t)USBHS_REG_BASE; - - /* set the host channel numbers */ - usb_basic->num_pipe = USBHS_MAX_CHANNEL_COUNT; - - /* set the device endpoint numbers */ - usb_basic->num_ep = USBHS_MAX_EP_COUNT; - -#ifdef USB_ULPI_PHY_ENABLED - usb_basic->phy_itf = USB_ULPI_PHY; -#else - usb_basic->phy_itf = USB_EMBEDDED_PHY; -#endif /* USB_ULPI_PHY_ENABLED */ - -#ifdef USB_HS_INTERNAL_DMA_ENABLED - usb_basic->transfer_mode = USB_USE_DMA; -#endif /* USB_HS_INTERNAL_DMA_ENABLED */ - -#ifdef USB_HS_CORE - /* configure the SOF output and the low power support */ - usb_basic->sof_enable = USBHS_SOF_OUTPUT; - usb_basic->low_power = USBHS_LOW_POWER; -#endif /* USB_HS_CORE */ - break; - - case USB_CORE_ENUM_FS: - usb_basic->base_reg = (uint32_t)USBFS_REG_BASE; - - /* set the host channel numbers */ - usb_basic->num_pipe = USBFS_MAX_CHANNEL_COUNT; - - /* set the device endpoint numbers */ - usb_basic->num_ep = USBFS_MAX_EP_COUNT; - - /* USBFS core use embedded physical layer */ - usb_basic->phy_itf = USB_EMBEDDED_PHY; - -#ifdef USB_FS_CORE - /* configure the SOF output and the low power support */ - usb_basic->sof_enable = USBFS_SOF_OUTPUT; - usb_basic->low_power = USBFS_LOW_POWER; -#endif /* USB_FS_CORE */ - break; - - default: - return USB_FAIL; - } - - /* assign main registers address */ - *usb_regs = (usb_core_regs) { - .gr = (usb_gr *)(usb_basic->base_reg + USB_REG_OFFSET_CORE), - .hr = (usb_hr *)(usb_basic->base_reg + USB_REG_OFFSET_HOST), - .dr = (usb_dr *)(usb_basic->base_reg + USB_REG_OFFSET_DEV), - - .HPCS = (uint32_t *)(usb_basic->base_reg + USB_REG_OFFSET_PORT), - .PWRCLKCTL = (uint32_t *)(usb_basic->base_reg + USB_REG_OFFSET_PWRCLKCTL) - }; - - /* assign device endpoint registers address */ - for(uint8_t i = 0U; i < usb_basic->num_ep; i++) { - usb_regs->er_in[i] = (usb_erin *) \ - (usb_basic->base_reg + USB_REG_OFFSET_EP_IN + (i * USB_REG_OFFSET_EP)); - - usb_regs->er_out[i] = (usb_erout *)\ - (usb_basic->base_reg + USB_REG_OFFSET_EP_OUT + (i * USB_REG_OFFSET_EP)); - } - - /* assign host pipe registers address */ - for(uint8_t i = 0U; i < usb_basic->num_pipe; i++) { - usb_regs->pr[i] = (usb_pr *) \ - (usb_basic->base_reg + USB_REG_OFFSET_CH_INOUT + (i * USB_REG_OFFSET_CH)); - - usb_regs->DFIFO[i] = (uint32_t *) \ - (usb_basic->base_reg + USB_DATA_FIFO_OFFSET + (i * USB_DATA_FIFO_SIZE)); - } - - return USB_OK; -} - -/*! - \brief initializes the USB controller registers and - prepares the core device mode or host mode operation - \param[in] usb_basic: pointer to USB capabilities - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval operation status -*/ -usb_status usb_core_init(usb_core_basic usb_basic, usb_core_regs *usb_regs) -{ - if(USB_ULPI_PHY == usb_basic.phy_itf) { - usb_regs->gr->GCCFG &= ~GCCFG_PWRON; - - if(usb_basic.sof_enable) { - usb_regs->gr->GCCFG |= GCCFG_SOFOEN; - } - - /* initialize the ULPI interface */ - usb_regs->gr->GUSBCS &= ~(GUSBCS_EMBPHY | GUSBCS_ULPIEOI); - -#ifdef USBHS_EXTERNAL_VBUS_ENABLED - /* use external VBUS driver */ - usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; -#else - /* use internal VBUS driver */ - usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; -#endif /* USBHS_EXTERNAL_VBUS_ENABLED */ - - /* soft reset the core */ - usb_core_reset(usb_regs); - } else { - usb_regs->gr->GUSBCS |= GUSBCS_EMBPHY; - - /* soft reset the core */ - usb_core_reset(usb_regs); - - /* active the transceiver and enable VBUS sensing */ - usb_regs->gr->GCCFG |= GCCFG_PWRON | GCCFG_VBUSACEN | GCCFG_VBUSBCEN; - -#ifndef VBUS_SENSING_ENABLED - usb_regs->gr->GCCFG |= GCCFG_VBUSIG; -#endif /* VBUS_SENSING_ENABLED */ - - /* enable SOF output */ - if(usb_basic.sof_enable) { - usb_regs->gr->GCCFG |= GCCFG_SOFOEN; - } - - usb_mdelay(20U); - } - - if((uint8_t)USB_USE_DMA == usb_basic.transfer_mode) { - usb_regs->gr->GAHBCS &= ~GAHBCS_BURST; - usb_regs->gr->GAHBCS |= DMA_INCR8 | GAHBCS_DMAEN; - } - -#ifdef USE_OTG_MODE - - /* enable USB OTG features */ - usb_regs->gr->GUSBCS |= GUSBCS_HNPCEN | GUSBCS_SRPCEN; - - /* enable the USB wakeup and suspend interrupts */ - usb_regs->gr->GINTF = 0xBFFFFFFFU; - - usb_regs->gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE | \ - GINTEN_OTGIE | GINTEN_SESIE | GINTEN_CIDPSCIE; - -#endif /* USE_OTG_MODE */ - - return USB_OK; -} - -/*! - \brief write a packet into the TX FIFO associated with the endpoint - \param[in] usb_regs: pointer to USB core registers - \param[in] src_buf: pointer to source buffer - \param[in] fifo_num: FIFO number which is in (0..3 or 0..5) - \param[in] byte_count: packet byte count - \param[out] none - \retval operation status -*/ -usb_status usb_txfifo_write(usb_core_regs *usb_regs, \ - uint8_t *src_buf, \ - uint8_t fifo_num, \ - uint16_t byte_count) -{ - uint32_t word_count = (byte_count + 3U) / 4U; - - __IO uint32_t *fifo = usb_regs->DFIFO[fifo_num]; - - while(word_count-- > 0U) { - *fifo = *((uint32_t *)src_buf); - - src_buf += 4U; - } - - return USB_OK; -} - -/*! - \brief read a packet from the RX FIFO associated with the endpoint - \param[in] usb_regs: pointer to USB core registers - \param[in] dest_buf: pointer to destination buffer - \param[in] byte_count: packet byte count - \param[out] none - \retval void type pointer -*/ -void *usb_rxfifo_read(usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count) -{ - uint32_t word_count = (byte_count + 3U) / 4U; - - __IO uint32_t *fifo = usb_regs->DFIFO[0]; - - while(word_count-- > 0U) { - *(uint32_t *)dest_buf = *fifo; - - dest_buf += 4U; - } - - return ((void *)dest_buf); -} - -/*! - \brief flush a TX FIFO or all TX FIFOs - \param[in] usb_regs: pointer to USB core registers - \param[in] fifo_num: FIFO number which is in (0..3 or 0..5) - \param[out] none - \retval operation status -*/ -usb_status usb_txfifo_flush(usb_core_regs *usb_regs, uint8_t fifo_num) -{ - usb_regs->gr->GRSTCTL = ((uint32_t)fifo_num << 6) | GRSTCTL_TXFF; - - /* wait for TX FIFO flush bit is set */ - while(usb_regs->gr->GRSTCTL & GRSTCTL_TXFF) { - /* no operation */ - } - - /* wait for 3 PHY clocks*/ - usb_udelay(3U); - - return USB_OK; -} - -/*! - \brief flush the entire RX FIFO - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval operation status -*/ -usb_status usb_rxfifo_flush(usb_core_regs *usb_regs) -{ - usb_regs->gr->GRSTCTL = GRSTCTL_RXFF; - - /* wait for RX FIFO flush bit is set */ - while(usb_regs->gr->GRSTCTL & GRSTCTL_RXFF) { - /* no operation */ - } - - /* wait for 3 PHY clocks */ - usb_udelay(3U); - - return USB_OK; -} - -/*! - \brief set endpoint or channel TX FIFO size - \param[in] usb_regs: pointer to USB core registers - \param[in] fifo: TX FIFO number - \param[in] size: assigned TX FIFO size - \param[out] none - \retval none -*/ -void usb_set_txfifo(usb_core_regs *usb_regs, uint8_t fifo, uint16_t size) -{ - uint32_t tx_offset = usb_regs->gr->GRFLEN; - - if(0U == fifo) { - usb_regs->gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)size << 16) | tx_offset; - } else { - tx_offset += (usb_regs->gr->DIEP0TFLEN_HNPTFLEN) >> 16; - - for(uint8_t i = 0U; i < (fifo - 1U); i++) { - tx_offset += (usb_regs->gr->DIEPTFLEN[i] >> 16); - } - - /* multiply Tx_Size by 2 to get higher performance */ - usb_regs->gr->DIEPTFLEN[fifo - 1U] = ((uint32_t)size << 16) | tx_offset; - } -} - -/*! - \brief set USB current mode - \param[in] usb_regs: pointer to USB core registers - \param[in] mode: USB current mode - \param[out] none - \retval none -*/ -void usb_curmode_set(usb_core_regs *usb_regs, uint8_t mode) -{ - usb_regs->gr->GUSBCS &= ~(GUSBCS_FDM | GUSBCS_FHM); - - if(DEVICE_MODE == mode) { - usb_regs->gr->GUSBCS |= GUSBCS_FDM; - } else if(HOST_MODE == mode) { - usb_regs->gr->GUSBCS |= GUSBCS_FHM; - } else { - /* OTG mode and other mode can not be here! */ - } -} - -/*! - \brief configure USB core to soft reset - \param[in] usb_regs: pointer to USB core registers - \param[out] none - \retval none -*/ -static void usb_core_reset(usb_core_regs *usb_regs) -{ - /* enable core soft reset */ - usb_regs->gr->GRSTCTL |= GRSTCTL_CSRST; - - /* wait for the core to be soft reset */ - while(usb_regs->gr->GRSTCTL & GRSTCTL_CSRST) { - /* no operation */ - } - - /* wait for additional 3 PHY clocks */ - usb_udelay(3U); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c deleted file mode 100644 index 0cb2744e9ee..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_dev.c +++ /dev/null @@ -1,660 +0,0 @@ -/*! - \file drv_usb_dev.c - \brief USB device mode low level driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usb_hw.h" -#include "drv_usb_dev.h" - -/* endpoint 0 max packet length */ -static const uint8_t EP0_MAXLEN[4] = { - [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = EP0MPL_64, - [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = EP0MPL_64, - [DSTAT_EM_FS_PHY_48MHZ] = EP0MPL_64, - [DSTAT_EM_LS_PHY_6MHZ] = EP0MPL_8 -}; - -#ifdef USB_FS_CORE - -/* USBFS endpoint TX FIFO size */ -static uint16_t USBFS_TX_FIFO_SIZE[USBFS_MAX_EP_COUNT] = { - (uint16_t)TX0_FIFO_FS_SIZE, - (uint16_t)TX1_FIFO_FS_SIZE, - (uint16_t)TX2_FIFO_FS_SIZE, - (uint16_t)TX3_FIFO_FS_SIZE -}; - -#endif /* USBFS_CORE */ - -#ifdef USB_HS_CORE - -/* USBHS endpoint TX FIFO size */ -uint16_t USBHS_TX_FIFO_SIZE[USBHS_MAX_EP_COUNT] = { - (uint16_t)TX0_FIFO_HS_SIZE, - (uint16_t)TX1_FIFO_HS_SIZE, - (uint16_t)TX2_FIFO_HS_SIZE, - (uint16_t)TX3_FIFO_HS_SIZE, - (uint16_t)TX4_FIFO_HS_SIZE, - (uint16_t)TX5_FIFO_HS_SIZE -}; - -#endif /* USBHS_CORE */ - -/*! - \brief initialize USB core registers for device mode - \param[in] udev: pointer to USB device - \param[out] none - \retval operation status -*/ -usb_status usb_devcore_init(usb_core_driver *udev) -{ - uint8_t i = 0U; - - /* restart the PHY clock (maybe don't need to...) */ - *udev->regs.PWRCLKCTL = 0U; - - /* configure periodic frame interval to default value */ - udev->regs.dr->DCFG &= ~DCFG_EOPFT; - udev->regs.dr->DCFG |= FRAME_INTERVAL_80; - - udev->regs.dr->DCFG &= ~DCFG_DS; - -#ifdef USB_FS_CORE - if((uint8_t)USB_CORE_ENUM_FS == udev->bp.core_enum) { - /* set full-speed PHY */ - udev->regs.dr->DCFG |= USB_SPEED_INP_FULL; - - /* set RX FIFO size */ - usb_set_rxfifo(&udev->regs, RX_FIFO_FS_SIZE); - - /* set endpoint 0 to 3's TX FIFO length and RAM address */ - for(i = 0U; i < USBFS_MAX_EP_COUNT; i++) { - usb_set_txfifo(&udev->regs, i, USBFS_TX_FIFO_SIZE[i]); - } - } -#endif /* USB_FS_CORE */ - -#ifdef USB_HS_CORE - if(USB_CORE_ENUM_HS == udev->bp.core_enum) { - if(USB_ULPI_PHY == udev->bp.phy_itf) { - udev->regs.dr->DCFG |= USB_SPEED_EXP_HIGH; - } else {/* set high speed PHY in full speed mode */ - udev->regs.dr->DCFG |= USB_SPEED_EXP_FULL; - } - - /* Set RX FIFO size */ - usb_set_rxfifo(&udev->regs, RX_FIFO_HS_SIZE); - - /* set endpoint 0 to 6's TX FIFO length and RAM address */ - for(i = 0U; i < USBHS_MAX_EP_COUNT; i++) { - usb_set_txfifo(&udev->regs, i, USBHS_TX_FIFO_SIZE[i]); - } - } -#endif /* USB_FS_CORE */ - - /* make sure all FIFOs are flushed */ - - /* flush all TX FIFOs */ - (void)usb_txfifo_flush(&udev->regs, 0x10U); - - /* flush entire RX FIFO */ - (void)usb_rxfifo_flush(&udev->regs); - - /* clear all pending device interrupts */ - udev->regs.dr->DIEPINTEN = 0U; - udev->regs.dr->DOEPINTEN = 0U; - udev->regs.dr->DAEPINT = 0xFFFFFFFFU; - udev->regs.dr->DAEPINTEN = 0U; - - /* configure all IN/OUT endpoints */ - for(i = 0U; i < udev->bp.num_ep; i++) { - if(udev->regs.er_in[i]->DIEPCTL & DEPCTL_EPEN) { - udev->regs.er_in[i]->DIEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; - } else { - udev->regs.er_in[i]->DIEPCTL = 0U; - } - - /* set IN endpoint transfer length to 0 */ - udev->regs.er_in[i]->DIEPLEN = 0U; - - /* clear all pending IN endpoint interrupts */ - udev->regs.er_in[i]->DIEPINTF = 0xFFU; - - if(udev->regs.er_out[i]->DOEPCTL & DEPCTL_EPEN) { - udev->regs.er_out[i]->DOEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; - } else { - udev->regs.er_out[i]->DOEPCTL = 0U; - } - - /* set OUT endpoint transfer length to 0 */ - udev->regs.er_out[i]->DOEPLEN = 0U; - - /* clear all pending OUT endpoint interrupts */ - udev->regs.er_out[i]->DOEPINTF = 0xFFU; - } - - udev->regs.dr->DIEPINTEN |= DIEPINTEN_EPTXFUDEN; - - (void)usb_devint_enable(udev); - - return USB_OK; -} - -/*! - \brief enable the USB device mode interrupts - \param[in] udev: pointer to USB device - \param[out] none - \retval operation status -*/ -usb_status usb_devint_enable(usb_core_driver *udev) -{ - /* clear any pending USB OTG interrupts */ - udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; - - /* clear any pending interrupts */ - udev->regs.gr->GINTF = 0xBFFFFFFFU; - - /* enable the USB wakeup and suspend interrupts */ - udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; - - /* enable device_mode-related interrupts */ - if((uint8_t)USB_USE_FIFO == udev->bp.transfer_mode) { - udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; - } - - udev->regs.gr->GINTEN |= GINTEN_RSTIE | GINTEN_ENUMFIE | GINTEN_IEPIE | \ - GINTEN_OEPIE | GINTEN_SOFIE | GINTEN_ISOONCIE | GINTEN_ISOINCIE; - -#ifdef VBUS_SENSING_ENABLED - udev->regs.gr->GINTEN |= GINTEN_SESIE | GINTEN_OTGIE; -#endif /* VBUS_SENSING_ENABLED */ - - return USB_OK; -} - -/*! - \brief active the USB endpoint0 transaction - \param[in] udev: pointer to USB device - \param[in] transc: the USB endpoint0 transaction - \param[out] none - \retval operation status -*/ -usb_status usb_transc0_active(usb_core_driver *udev, usb_transc *transc) -{ - __IO uint32_t *reg_addr = NULL; - - uint32_t enum_speed = udev->regs.dr->DSTAT & DSTAT_ES; - - /* get the endpoint number */ - uint8_t ep_num = transc->ep_addr.num; - - if(ep_num) { - /* not endpoint 0 */ - return USB_FAIL; - } - - if(transc->ep_addr.dir) { - reg_addr = &udev->regs.er_in[0]->DIEPCTL; - } else { - reg_addr = &udev->regs.er_out[0]->DOEPCTL; - } - - /* endpoint 0 is activated after USB clock is enabled */ - *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); - - /* set endpoint 0 maximum packet length */ - *reg_addr |= EP0_MAXLEN[enum_speed]; - - /* activate endpoint */ - *reg_addr |= ((uint32_t)transc->ep_type << 18) | ((uint32_t)ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; - - return USB_OK; -} - -/*! - \brief active the USB transaction - \param[in] udev: pointer to USB device - \param[in] transc: the USB transaction - \param[out] none - \retval status -*/ -usb_status usb_transc_active(usb_core_driver *udev, usb_transc *transc) -{ - __IO uint32_t *reg_addr = NULL; - uint32_t epinten = 0U; - uint32_t enum_speed = udev->regs.dr->DSTAT & DSTAT_ES; - - /* get the endpoint number */ - uint8_t ep_num = transc->ep_addr.num; - - /* enable endpoint interrupt number */ - if(transc->ep_addr.dir) { - reg_addr = &udev->regs.er_in[ep_num]->DIEPCTL; - - epinten = 1U << ep_num; - } else { - reg_addr = &udev->regs.er_out[ep_num]->DOEPCTL; - - epinten = 1U << (16U + ep_num); - } - - /* if the endpoint is not active, need change the endpoint control register */ - if(!(*reg_addr & DEPCTL_EPACT)) { - *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); - - /* set endpoint maximum packet length */ - if(0U == ep_num) { - *reg_addr |= EP0_MAXLEN[enum_speed]; - } else { - *reg_addr |= transc->max_len; - } - - /* activate endpoint */ - *reg_addr |= ((uint32_t)transc->ep_type << 18) | ((uint32_t)ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; - } - -#ifdef USB_HS_DEDICATED_EP1_ENABLED - if((1U == ep_num) && (USB_CORE_ENUM_HS == udev->bp.core_enum)) { - udev->regs.dr->DEP1INTEN |= epinten; - } else -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - { - /* enable the interrupts for this endpoint */ - udev->regs.dr->DAEPINTEN |= epinten; - } - - return USB_OK; -} - -/*! - \brief deactivate the USB transaction - \param[in] udev: pointer to USB device - \param[in] transc: the USB transaction - \param[out] none - \retval status -*/ -usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc) -{ - uint32_t epinten = 0U; - - uint8_t ep_num = transc->ep_addr.num; - - /* disable endpoint interrupt number */ - if(transc->ep_addr.dir) { - epinten = 1U << ep_num; - - udev->regs.er_in[ep_num]->DIEPCTL &= ~DEPCTL_EPACT; - } else { - epinten = 1U << (ep_num + 16U); - - udev->regs.er_out[ep_num]->DOEPCTL &= ~DEPCTL_EPACT; - } - -#ifdef USB_HS_DEDICATED_EP1_ENABLED - if((1U == ep_num) && (USB_CORE_ENUM_HS == udev->bp.core_enum)) { - udev->regs.dr->DEP1INTEN &= ~epinten; - } else -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - { - /* disable the interrupts for this endpoint */ - udev->regs.dr->DAEPINTEN &= ~epinten; - } - - return USB_OK; -} - -/*! - \brief configure USB transaction to start IN transfer - \param[in] udev: pointer to USB device - \param[in] transc: the USB IN transaction - \param[out] none - \retval operation status -*/ -usb_status usb_transc_inxfer(usb_core_driver *udev, usb_transc *transc) -{ - usb_status status = USB_OK; - - uint8_t ep_num = transc->ep_addr.num; - - __IO uint32_t epctl = udev->regs.er_in[ep_num]->DIEPCTL; - __IO uint32_t eplen = udev->regs.er_in[ep_num]->DIEPLEN; - - eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); - - /* zero length packet or endpoint 0 */ - if(0U == transc->xfer_len) { - /* set transfer packet count to 1 */ - eplen |= 1U << 19; - } else { - /* set transfer packet count */ - if(0U == ep_num) { - transc->xfer_len = USB_MIN(transc->xfer_len, transc->max_len); - - eplen |= 1U << 19; - } else { - eplen |= (((transc->xfer_len - 1U) + transc->max_len) / transc->max_len) << 19; - } - - /* set endpoint transfer length */ - eplen |= transc->xfer_len; - - if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { - eplen |= DIEPLEN_MCNT & (1U << 29); - } - } - - udev->regs.er_in[ep_num]->DIEPLEN = eplen; - - if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { - if(((udev->regs.dr->DSTAT & DSTAT_FNRSOF) >> 8) & 0x01U) { - epctl |= DEPCTL_SEVNFRM; - } else { - epctl |= DEPCTL_SODDFRM; - } - } - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - udev->regs.er_in[ep_num]->DIEPDMAADDR = transc->dma_addr; - } - - /* enable the endpoint and clear the NAK */ - epctl |= DEPCTL_CNAK | DEPCTL_EPEN; - - udev->regs.er_in[ep_num]->DIEPCTL = epctl; - - if((uint8_t)USB_USE_FIFO == udev->bp.transfer_mode) { - if((uint8_t)USB_EPTYPE_ISOC != transc->ep_type) { - /* enable the TX FIFO empty interrupt for this endpoint */ - if(transc->xfer_len > 0U) { - udev->regs.dr->DIEPFEINTEN |= 1U << ep_num; - } - } else { - (void)usb_txfifo_write(&udev->regs, transc->xfer_buf, ep_num, (uint16_t)transc->xfer_len); - } - } - - return status; -} - -/*! - \brief configure USB transaction to start OUT transfer - \param[in] udev: pointer to USB device - \param[in] transc: the USB OUT transaction - \param[out] none - \retval status -*/ -usb_status usb_transc_outxfer(usb_core_driver *udev, usb_transc *transc) -{ - usb_status status = USB_OK; - - uint8_t ep_num = transc->ep_addr.num; - - uint32_t epctl = udev->regs.er_out[ep_num]->DOEPCTL; - uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; - - eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); - - /* zero length packet or endpoint 0 */ - if((0U == transc->xfer_len) || (0U == ep_num)) { - /* set the transfer length to max packet size */ - eplen |= transc->max_len; - - /* set the transfer packet count to 1 */ - eplen |= 1U << 19; - } else { - /* configure the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - uint32_t packet_count = (transc->xfer_len + transc->max_len - 1U) / transc->max_len; - - eplen |= packet_count << 19; - eplen |= packet_count * transc->max_len; - -#ifdef INT_HIGH_BW - if(transc->ep_type == (uint8_t)USB_EPTYPE_INTR) { - eplen |= DIEPLEN_MCNT & (3U << 29); - } -#endif /* INT_HIGH_BW */ - } - - udev->regs.er_out[ep_num]->DOEPLEN = eplen; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - udev->regs.er_out[ep_num]->DOEPDMAADDR = transc->dma_addr; - } - - if((uint8_t)USB_EPTYPE_ISOC == transc->ep_type) { - if(transc->frame_num) { - epctl |= DEPCTL_SD1PID; - } else { - epctl |= DEPCTL_SD0PID; - } - } - - /* enable the endpoint and clear the NAK */ - epctl |= DEPCTL_EPEN | DEPCTL_CNAK; - - udev->regs.er_out[ep_num]->DOEPCTL = epctl; - - return status; -} - -/*! - \brief set the USB transaction STALL status - \param[in] udev: pointer to USB device - \param[in] transc: the USB transaction - \param[out] none - \retval status -*/ -usb_status usb_transc_stall(usb_core_driver *udev, usb_transc *transc) -{ - __IO uint32_t *reg_addr = NULL; - - uint8_t ep_num = transc->ep_addr.num; - - if(transc->ep_addr.dir) { - reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); - - /* set the endpoint disable bit */ - if(*reg_addr & DEPCTL_EPEN) { - *reg_addr |= DEPCTL_EPD; - } - } else { - /* set the endpoint STALL bit */ - reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); - } - - /* set the endpoint STALL bit */ - *reg_addr |= DEPCTL_STALL; - - return USB_OK; -} - -/*! - \brief clear the USB transaction STALL status - \param[in] udev: pointer to USB device - \param[in] transc: the USB transaction - \param[out] none - \retval operation status -*/ -usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc) -{ - __IO uint32_t *reg_addr = NULL; - - uint8_t ep_num = transc->ep_addr.num; - - if(transc->ep_addr.dir) { - reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); - } else { - reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); - } - - /* clear the endpoint STALL bit */ - *reg_addr &= ~DEPCTL_STALL; - - /* reset data PID of the periodic endpoints */ - if(((uint8_t)USB_EPTYPE_INTR == transc->ep_type) || ((uint8_t)USB_EPTYPE_BULK == transc->ep_type)) { - *reg_addr |= DEPCTL_SD0PID; - } - - return USB_OK; -} - -/*! - \brief read device IN endpoint interrupt flag register - \param[in] udev: pointer to USB device - \param[in] ep_num: endpoint number - \param[out] none - \retval interrupt value -*/ -uint32_t usb_iepintr_read(usb_core_driver *udev, uint8_t ep_num) -{ - uint32_t value = 0U, fifoemptymask, commonintmask; - - commonintmask = udev->regs.dr->DIEPINTEN; - fifoemptymask = udev->regs.dr->DIEPFEINTEN; - - /* check FIFO empty interrupt enable bit */ - commonintmask |= ((fifoemptymask >> ep_num) & 0x1U) << 7; - - value = udev->regs.er_in[ep_num]->DIEPINTF & commonintmask; - - return value; -} - -/*! - \brief configures OUT endpoint 0 to receive SETUP packets - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_ctlep_startout(usb_core_driver *udev) -{ - /* set OUT endpoint 0 receive length to 24 bytes, 1 packet and 3 SETUP packets */ - udev->regs.er_out[0]->DOEPLEN = DOEP0_TLEN(8U * 3U) | DOEP0_PCNT(1U) | DOEP0_STPCNT(3U); - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - udev->regs.er_out[0]->DOEPDMAADDR = (uint32_t)&udev->dev.control.req; - - /* endpoint enable */ - udev->regs.er_out[0]->DOEPCTL |= DEPCTL_EPACT | DEPCTL_EPEN; - } -} - -/*! - \brief active remote wakeup signaling - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_rwkup_active(usb_core_driver *udev) -{ - if(udev->dev.pm.dev_remote_wakeup) { - if(udev->regs.dr->DSTAT & DSTAT_SPST) { - if(udev->bp.low_power) { - /* ungate USB core clock */ - *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); - } - - /* active remote wakeup signaling */ - udev->regs.dr->DCTL |= DCTL_RWKUP; - - usb_mdelay(5U); - - udev->regs.dr->DCTL &= ~DCTL_RWKUP; - } - } -} - -/*! - \brief active USB core clock - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_clock_active(usb_core_driver *udev) -{ - if(udev->bp.low_power) { - if(udev->regs.dr->DSTAT & DSTAT_SPST) { - /* ungate USB Core clock */ - *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); - } - } -} - -/*! - \brief USB device suspend - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_dev_suspend(usb_core_driver *udev) -{ - __IO uint32_t devstat = udev->regs.dr->DSTAT; - - if((udev->bp.low_power) && (devstat & DSTAT_SPST)) { - /* switch-off the USB clocks */ - *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; - - /* enter DEEP_SLEEP mode with LDO in low power mode */ - pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); - } -} - -/*! - \brief stop the device and clean up FIFOs - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_dev_stop(usb_core_driver *udev) -{ - uint32_t i; - - udev->dev.cur_status = 1U; - - /* clear all interrupt flag and enable bits */ - for(i = 0U; i < udev->bp.num_ep; i++) { - udev->regs.er_in[i]->DIEPINTF = 0xFFU; - udev->regs.er_out[i]->DOEPINTF = 0xFFU; - } - - udev->regs.dr->DIEPINTEN = 0U; - udev->regs.dr->DOEPINTEN = 0U; - udev->regs.dr->DAEPINTEN = 0U; - udev->regs.dr->DAEPINT = 0xFFFFFFFFU; - - /* flush the FIFO */ - (void)usb_rxfifo_flush(&udev->regs); - (void)usb_txfifo_flush(&udev->regs, 0x10U); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c deleted file mode 100644 index 51de1523138..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usb_host.c +++ /dev/null @@ -1,472 +0,0 @@ -/*! - \file drv_usb_host.c - \brief USB host mode low level driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usb_hw.h" -#include "drv_usb_host.h" - -const uint32_t PIPE_DPID[2] = { - PIPE_DPID_DATA0, - PIPE_DPID_DATA1 -}; - -/*! - \brief initializes USB core for host mode - \param[in] udev: pointer to selected USB host - \param[out] none - \retval operation status -*/ -usb_status usb_host_init(usb_core_driver *udev) -{ - uint32_t i = 0U, inten = 0U; - - uint32_t nptxfifolen = 0U; - uint32_t ptxfifolen = 0U; - - /* restart the PHY Clock */ - *udev->regs.PWRCLKCTL = 0U; - - /* configure USB clock of PHY */ - if(USB_ULPI_PHY == udev->bp.phy_itf) { - usb_phyclock_config(udev, HCTL_30_60MHZ); - } else { - usb_phyclock_config(udev, HCTL_48MHZ); - } - - /* support FS/LS only */ - udev->regs.hr->HCTL &= ~HCTL_SPDFSLS; - - /* configure data FIFOs size */ -#ifdef USB_FS_CORE - if(USB_CORE_ENUM_FS == udev->bp.core_enum) { - /* set RX FIFO size */ - udev->regs.gr->GRFLEN = USB_RX_FIFO_FS_SIZE; - - /* set non-periodic TX FIFO size and address */ - nptxfifolen |= USB_RX_FIFO_FS_SIZE; - nptxfifolen |= USB_HTX_NPFIFO_FS_SIZE << 16; - udev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; - - /* set periodic TX FIFO size and address */ - ptxfifolen |= USB_RX_FIFO_FS_SIZE + USB_HTX_NPFIFO_FS_SIZE; - ptxfifolen |= USB_HTX_PFIFO_FS_SIZE << 16; - udev->regs.gr->HPTFLEN = ptxfifolen; - } -#endif /* USB_FS_CORE */ - -#ifdef USB_HS_CORE - if(USB_CORE_ENUM_HS == udev->bp.core_enum) { - /* set RX FIFO size */ - udev->regs.gr->GRFLEN = USB_RX_FIFO_HS_SIZE; - - /* set non-periodic TX FIFO size and address */ - nptxfifolen |= USB_RX_FIFO_HS_SIZE; - nptxfifolen |= USB_HTX_NPFIFO_HS_SIZE << 16; - udev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; - - /* set periodic TX FIFO size and address */ - ptxfifolen |= USB_RX_FIFO_HS_SIZE + USB_HTX_NPFIFO_HS_SIZE; - ptxfifolen |= USB_HTX_PFIFO_HS_SIZE << 16; - udev->regs.gr->HPTFLEN = ptxfifolen; - } -#endif /* USB_HS_CORE */ - -#ifdef USE_OTG_MODE - /* clear host set HNP enable in the usb_otg control register */ - udev->regs.gr->GOTGCS &= ~GOTGCS_HHNPEN; -#endif /* USE_OTG_MODE */ - - /* make sure the FIFOs are flushed */ - - /* flush all TX FIFOs in device or host mode */ - usb_txfifo_flush(&udev->regs, 0x10U); - - /* flush the entire RX FIFO */ - usb_rxfifo_flush(&udev->regs); - - /* disable all interrupts */ - udev->regs.gr->GINTEN = 0U; - - /* clear any pending USB OTG interrupts */ - udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; - - /* enable the USB wakeup and suspend interrupts */ - udev->regs.gr->GINTF = 0xBFFFFFFFU; - - /* clear all pending host channel interrupts */ - for(i = 0U; i < udev->bp.num_pipe; i++) { - udev->regs.pr[i]->HCHINTF = 0xFFFFFFFFU; - udev->regs.pr[i]->HCHINTEN = 0U; - } - -#ifndef USE_OTG_MODE - usb_portvbus_switch(udev, 1U); -#endif /* USE_OTG_MODE */ - - udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; - - /* enable host_mode-related interrupts */ - if(USB_USE_FIFO == udev->bp.transfer_mode) { - inten = GINTEN_RXFNEIE; - } - - inten |= GINTEN_SESIE | GINTEN_HPIE | GINTEN_HCIE | GINTEN_ISOINCIE; - - udev->regs.gr->GINTEN |= inten; - - inten = GINTEN_DISCIE | GINTEN_SOFIE; - - udev->regs.gr->GINTEN &= ~inten; - - return USB_OK; -} - -/*! - \brief control the VBUS to power - \param[in] udev: pointer to selected USB host - \param[in] state: VBUS state - \param[out] none - \retval none -*/ -void usb_portvbus_switch(usb_core_driver *udev, uint8_t state) -{ - uint32_t port = 0U; - - /* enable or disable the external charge pump */ - usb_vbus_drive(state); - - /* turn on the host port power. */ - port = usb_port_read(udev); - - if(!(port & HPCS_PP) && (1U == state)) { - port |= HPCS_PP; - } - - if((port & HPCS_PP) && (0U == state)) { - port &= ~HPCS_PP; - } - - *udev->regs.HPCS = port; - - usb_mdelay(200U); -} - -/*! - \brief reset host port - \param[in] udev: pointer to USB device - \param[out] none - \retval operation status -*/ -uint32_t usb_port_reset(usb_core_driver *udev) -{ - __IO uint32_t port = usb_port_read(udev); - - *udev->regs.HPCS = port | HPCS_PRST; - - usb_mdelay(20U); /* see note */ - - *udev->regs.HPCS = port & ~HPCS_PRST; - - usb_mdelay(20U); - - return 1U; -} - -/*! - \brief initialize host pipe - \param[in] udev: pointer to USB device - \param[in] pipe_num: host pipe number which is in (0..7) - \param[out] none - \retval operation status -*/ -usb_status usb_pipe_init(usb_core_driver *udev, uint8_t pipe_num) -{ - usb_status status = USB_OK; - - __IO uint32_t pp_ctl = 0U; - __IO uint32_t pp_inten = HCHINTEN_TFIE; - - usb_pipe *pp = &udev->host.pipe[pipe_num]; - - /* clear old interrupt conditions for this host channel */ - udev->regs.pr[pipe_num]->HCHINTF = 0xFFFFFFFFU; - - if(USB_USE_DMA == udev->bp.transfer_mode) { - pp_inten |= HCHINTEN_DMAERIE; - } - - if(pp->ep.dir) { - pp_inten |= HCHINTEN_BBERIE; - } - - /* enable channel interrupts required for this transfer */ - switch(pp->ep.type) { - case USB_EPTYPE_CTRL: - case USB_EPTYPE_BULK: - pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE \ - | HCHINTEN_DTERIE | HCHINTEN_NAKIE; - - if(!pp->ep.dir) { - if(PORT_SPEED_HIGH == pp->dev_speed) { - pp_inten |= HCHINTEN_NYETIE; - pp_inten |= HCHINTEN_ACKIE; - } - } - break; - - case USB_EPTYPE_INTR: - pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE | HCHINTEN_DTERIE \ - | HCHINTEN_NAKIE | HCHINTEN_REQOVRIE; - break; - - case USB_EPTYPE_ISOC: - pp_inten |= HCHINTEN_REQOVRIE | HCHINTEN_ACKIE; - - if(pp->ep.dir) { - pp_inten |= HCHINTEN_USBERIE; - } - break; - - default: - break; - } - - udev->regs.pr[pipe_num]->HCHINTEN = pp_inten; - - /* enable the top level host channel interrupt */ - udev->regs.hr->HACHINTEN |= 1U << pipe_num; - - /* make sure host channel interrupts are enabled */ - udev->regs.gr->GINTEN |= GINTEN_HCIE; - - /* program the host channel control register */ - pp_ctl |= PIPE_CTL_DAR(pp->dev_addr); - pp_ctl |= PIPE_CTL_EPNUM(pp->ep.num); - pp_ctl |= PIPE_CTL_EPDIR(pp->ep.dir); - pp_ctl |= PIPE_CTL_EPTYPE(pp->ep.type); - pp_ctl |= PIPE_CTL_LSD(PORT_SPEED_LOW == pp->dev_speed); - - pp_ctl |= pp->ep.mps; - pp_ctl |= ((uint32_t)(USB_EPTYPE_INTR == pp->ep.type) << 29) & HCHCTL_ODDFRM; - - udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; - - return status; -} - -/*! - \brief prepare host channel for transferring packets - \param[in] udev: pointer to USB device - \param[in] pipe_num: host pipe number which is in (0..7) - \param[out] none - \retval operation status -*/ -usb_status usb_pipe_xfer(usb_core_driver *udev, uint8_t pipe_num) -{ - usb_status status = USB_OK; - - uint16_t dword_len = 0U; - uint16_t packet_count = 0U; - - __IO uint32_t pp_ctl = 0U; - - usb_pipe *pp = &udev->host.pipe[pipe_num]; - - uint16_t max_packet_len = pp->ep.mps; - - /* compute the expected number of packets associated to the transfer */ - if(pp->xfer_len > 0U) { - packet_count = (uint16_t)((pp->xfer_len + max_packet_len - 1U) / max_packet_len); - - if(packet_count > HC_MAX_PACKET_COUNT) { - packet_count = HC_MAX_PACKET_COUNT; - pp->xfer_len = (uint16_t)(packet_count * max_packet_len); - } - } else { - packet_count = 1U; - } - - if(pp->ep.dir) { - pp->xfer_len = (uint16_t)(packet_count * max_packet_len); - } - - /* initialize the host channel transfer information */ - udev->regs.pr[pipe_num]->HCHLEN = pp->xfer_len | pp->DPID | PIPE_XFER_PCNT(packet_count); - - if(USB_USE_DMA == udev->bp.transfer_mode) { - udev->regs.pr[pipe_num]->HCHDMAADDR = (unsigned int)pp->xfer_buf; - } - - pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; - - if(usb_frame_even(udev)) { - pp_ctl |= HCHCTL_ODDFRM; - } else { - pp_ctl &= ~HCHCTL_ODDFRM; - } - - /* set host channel enabled */ - pp_ctl |= HCHCTL_CEN; - pp_ctl &= ~HCHCTL_CDIS; - - udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; - - if(USB_USE_FIFO == udev->bp.transfer_mode) { - if((0U == pp->ep.dir) && (pp->xfer_len > 0U)) { - switch(pp->ep.type) { - /* non-periodic transfer */ - case USB_EPTYPE_CTRL: - case USB_EPTYPE_BULK: - dword_len = (uint16_t)((pp->xfer_len + 3U) / 4U); - - /* check if there is enough space in FIFO space */ - if(dword_len > (udev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { - /* need to process data in nptxfempty interrupt */ - udev->regs.gr->GINTEN |= GINTEN_NPTXFEIE; - } - break; - - /* periodic transfer */ - case USB_EPTYPE_INTR: - case USB_EPTYPE_ISOC: - dword_len = (uint16_t)((pp->xfer_len + 3U) / 4U); - - /* check if there is enough space in FIFO space */ - if(dword_len > (udev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { - /* need to process data in ptxfempty interrupt */ - udev->regs.gr->GINTEN |= GINTEN_PTXFEIE; - } - break; - - default: - break; - } - - /* write packet into the TX FIFO */ - usb_txfifo_write(&udev->regs, pp->xfer_buf, pipe_num, (uint16_t)pp->xfer_len); - } - } - - return status; -} - -/*! - \brief halt pipe - \param[in] udev: pointer to USB device - \param[in] pipe_num: host pipe number which is in (0..7) - \param[out] none - \retval operation status -*/ -usb_status usb_pipe_halt(usb_core_driver *udev, uint8_t pipe_num) -{ - __IO uint32_t pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; - - uint8_t ep_type = (uint8_t)((pp_ctl & HCHCTL_EPTYPE) >> 18U); - - pp_ctl |= HCHCTL_CEN | HCHCTL_CDIS; - - switch(ep_type) { - case USB_EPTYPE_CTRL: - case USB_EPTYPE_BULK: - if(0U == (udev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { - pp_ctl &= ~HCHCTL_CEN; - } - break; - - case USB_EPTYPE_INTR: - case USB_EPTYPE_ISOC: - if(0U == (udev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { - pp_ctl &= ~HCHCTL_CEN; - } - break; - - default: - break; - } - - udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; - - return USB_OK; -} - -/*! - \brief configure host pipe to do ping operation - \param[in] udev: pointer to USB device - \param[in] pipe_num: host pipe number which is in (0..7 or 0..11) - \param[out] none - \retval operation status -*/ -usb_status usb_pipe_ping(usb_core_driver *udev, uint8_t pipe_num) -{ - uint32_t pp_ctl = 0U; - - udev->regs.pr[pipe_num]->HCHLEN = HCHLEN_PING; - - pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; - - pp_ctl |= HCHCTL_CEN; - pp_ctl &= ~HCHCTL_CDIS; - - udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; - - return USB_OK; -} - -/*! - \brief stop the USB host and clean up FIFO - \param[in] udev: pointer to USB device - \param[out] none - \retval none -*/ -void usb_host_stop(usb_core_driver *udev) -{ - uint32_t i; - __IO uint32_t pp_ctl = 0U; - - udev->regs.hr->HACHINTEN = 0x0U; - udev->regs.hr->HACHINT = 0xFFFFFFFFU; - - /* flush out any leftover queued requests. */ - for(i = 0U; i < udev->bp.num_pipe; i++) { - pp_ctl = udev->regs.pr[i]->HCHCTL; - - pp_ctl &= ~(HCHCTL_CEN | HCHCTL_EPDIR); - pp_ctl |= HCHCTL_CDIS; - - udev->regs.pr[i]->HCHCTL = pp_ctl; - } - - /* flush the FIFO */ - usb_rxfifo_flush(&udev->regs); - usb_txfifo_flush(&udev->regs, 0x10U); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c deleted file mode 100644 index 2a0ed2a578b..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbd_int.c +++ /dev/null @@ -1,576 +0,0 @@ -/*! - \file drv_usbd_int.c - \brief USB device mode interrupt routines - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usbd_int.h" -#include "usbd_transc.h" - -static const uint8_t USB_SPEED[4] = { - [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = (uint8_t)USB_SPEED_HIGH, - [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = (uint8_t)USB_SPEED_FULL, - [DSTAT_EM_FS_PHY_48MHZ] = (uint8_t)USB_SPEED_FULL, - [DSTAT_EM_LS_PHY_6MHZ] = (uint8_t)USB_SPEED_LOW -}; - -/* local function prototypes ('static') */ -static uint32_t usbd_int_epout(usb_core_driver *udev); -static uint32_t usbd_int_epin(usb_core_driver *udev); -static uint32_t usbd_int_rxfifo(usb_core_driver *udev); -static uint32_t usbd_int_reset(usb_core_driver *udev); -static uint32_t usbd_int_enumfinish(usb_core_driver *udev); -static uint32_t usbd_int_suspend(usb_core_driver *udev); -static uint32_t usbd_emptytxfifo_write(usb_core_driver *udev, uint32_t ep_num); - -/*! - \brief USB device-mode interrupts global service routine handler - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -void usbd_isr(usb_core_driver *udev) -{ - if(HOST_MODE != (udev->regs.gr->GINTF & GINTF_COPM)) { - uint32_t intr = udev->regs.gr->GINTF; - intr &= udev->regs.gr->GINTEN; - - /* there are no interrupts, avoid spurious interrupt */ - if(!intr) { - return; - } - - /* OUT endpoints interrupts */ - if(intr & GINTF_OEPIF) { - (void)usbd_int_epout(udev); - } - - /* IN endpoints interrupts */ - if(intr & GINTF_IEPIF) { - (void)usbd_int_epin(udev); - } - - /* suspend interrupt */ - if(intr & GINTF_SP) { - (void)usbd_int_suspend(udev); - } - - /* wakeup interrupt */ - if(intr & GINTF_WKUPIF) { - if(USBD_SUSPENDED == udev->dev.cur_status) { - /* inform upper layer by the resume event */ - udev->dev.cur_status = udev->dev.backup_status; - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_WKUPIF; - } - - /* start of frame interrupt */ - if(intr & GINTF_SOF) { - if(udev->dev.class_core->SOF) { - (void)udev->dev.class_core->SOF(udev); - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_SOF; - } - - /* receive FIFO not empty interrupt */ - if(intr & GINTF_RXFNEIF) { - (void)usbd_int_rxfifo(udev); - } - - /* USB reset interrupt */ - if(intr & GINTF_RST) { - (void)usbd_int_reset(udev); - } - - /* enumeration has been done interrupt */ - if(intr & GINTF_ENUMFIF) { - (void)usbd_int_enumfinish(udev); - } - - /* incomplete synchronization IN transfer interrupt*/ - if(intr & GINTF_ISOINCIF) { - if(NULL != udev->dev.class_core->incomplete_isoc_in) { - (void)udev->dev.class_core->incomplete_isoc_in(udev); - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_ISOINCIF; - } - - /* incomplete synchronization OUT transfer interrupt*/ - if(intr & GINTF_ISOONCIF) { - if(NULL != udev->dev.class_core->incomplete_isoc_out) { - (void)udev->dev.class_core->incomplete_isoc_out(udev); - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_ISOONCIF; - } - -#ifdef VBUS_SENSING_ENABLED - - /* session request interrupt */ - if(intr & GINTF_SESIF) { - udev->regs.gr->GINTF = GINTF_SESIF; - } - - /* OTG mode interrupt */ - if(intr & GINTF_OTGIF) { - if(udev->regs.gr->GOTGINTF & GOTGINTF_SESEND) { - - } - - /* clear OTG interrupt */ - udev->regs.gr->GINTF = GINTF_OTGIF; - } -#endif /* VBUS_SENSING_ENABLED */ - } -} - -#ifdef USB_HS_DEDICATED_EP1_ENABLED - -/*! - \brief USB dedicated OUT endpoint 1 interrupt service routine handler - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -uint32_t usbd_int_dedicated_ep1out(usb_core_driver *udev) -{ - uint32_t oepintr = 0U; - uint32_t oeplen = 0U; - - oepintr = udev->regs.er_out[1]->DOEPINTF; - oepintr &= udev->regs.dr->DOEP1INTEN; - - /* transfer complete */ - if(oepintr & DOEPINTF_TF) { - /* clear the bit in DOEPINTn for this interrupt */ - udev->regs.er_out[1]->DOEPINTF = DOEPINTF_TF; - - if(USB_USE_DMA == udev->bp.transfer_mode) { - usb_transc *transc = &udev->dev.transc_out[1]; - uint32_t set_len = ((transc->xfer_len + transc->max_len - 1U) / transc->max_len) * transc->max_len; - oeplen = udev->regs.er_out[1]->DOEPLEN; - - /* to do : handle more than one single max packet size packet */ - udev->dev.transc_out[1].xfer_count = set_len - (oeplen & DEPLEN_TLEN); - } - - /* RX complete */ - usbd_out_transc(udev, 1U); - } - - return 1U; -} - -/*! - \brief USB dedicated IN endpoint 1 interrupt service routine handler - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -uint32_t usbd_int_dedicated_ep1in(usb_core_driver *udev) -{ - uint32_t inten, intr, emptyen; - - inten = udev->regs.dr->DIEP1INTEN; - emptyen = udev->regs.dr->DIEPFEINTEN; - - inten |= ((emptyen >> 1U) & 0x1U) << 7; - - intr = udev->regs.er_in[1]->DIEPINTF & inten; - - if(intr & DIEPINTF_TF) { - udev->regs.dr->DIEPFEINTEN &= ~(0x1U << 1); - - udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TF; - - /* TX complete */ - usbd_in_transc(udev, 1U); - } - - if(intr & DIEPINTF_TXFE) { - usbd_emptytxfifo_write(udev, 1U); - - udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TXFE; - } - - return 1U; -} - -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - -/*! - \brief indicates that an OUT endpoint has a pending interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -static uint32_t usbd_int_epout(usb_core_driver *udev) -{ - uint32_t epintnum = 0U; - uint8_t ep_num = 0U; - - for(epintnum = usb_oepintnum_read(udev); epintnum; epintnum >>= 1, ep_num++) { - if(epintnum & 0x01U) { - __IO uint32_t oepintr = usb_oepintr_read(udev, ep_num); - - /* transfer complete interrupt */ - if(oepintr & DOEPINTF_TF) { - /* clear the bit in DOEPINTF for this interrupt */ - udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_TF; - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - usb_transc *transc = &udev->dev.transc_out[ep_num]; - __IO uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; - uint32_t set_len = ((transc->xfer_len + transc->max_len - 1U) / transc->max_len) * transc->max_len; - - udev->dev.transc_out[ep_num].xfer_count = set_len - (eplen & DEPLEN_TLEN); - } - - /* inform upper layer: data ready */ - (void)usbd_out_transc(udev, ep_num); - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - if((0U == ep_num) && ((uint8_t)USB_CTL_STATUS_OUT == udev->dev.control.ctl_state)) { - usb_ctlep_startout(udev); - } - } - } - - /* SETUP phase finished interrupt (control endpoints) */ - if(oepintr & DOEPINTF_STPF) { - /* inform the upper layer that a SETUP packet is available */ - (void)usbd_setup_transc(udev); - - udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_STPF; - } - } - } - - return 1U; -} - -/*! - \brief indicates that an IN endpoint has a pending interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -static uint32_t usbd_int_epin(usb_core_driver *udev) -{ - uint32_t epintnum = 0U; - uint8_t ep_num = 0U; - - for(epintnum = usb_iepintnum_read(udev); epintnum; epintnum >>= 1, ep_num++) { - if(epintnum & 0x1U) { - __IO uint32_t iepintr = usb_iepintr_read(udev, ep_num); - - if(iepintr & DIEPINTF_TF) { - udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TF; - - /* data transmission is completed */ - (void)usbd_in_transc(udev, ep_num); - - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - if((0U == ep_num) && ((uint8_t)USB_CTL_STATUS_IN == udev->dev.control.ctl_state)) { - usb_ctlep_startout(udev); - } - } - } - - if(iepintr & DIEPINTF_TXFE) { - usbd_emptytxfifo_write(udev, (uint32_t)ep_num); - - udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TXFE; - } - } - } - - return 1U; -} - -/*! - \brief handle the RX status queue level interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -static uint32_t usbd_int_rxfifo(usb_core_driver *udev) -{ - usb_transc *transc = NULL; - - uint8_t data_PID = 0U; - uint32_t bcount = 0U; - - __IO uint32_t devrxstat = 0U; - - /* disable the RX status queue non-empty interrupt */ - udev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; - - /* get the status from the top of the FIFO */ - devrxstat = udev->regs.gr->GRSTATP; - - uint8_t ep_num = (uint8_t)(devrxstat & GRSTATRP_EPNUM); - - transc = &udev->dev.transc_out[ep_num]; - - bcount = (devrxstat & GRSTATRP_BCOUNT) >> 4; - data_PID = (uint8_t)((devrxstat & GRSTATRP_DPID) >> 15); - - switch((devrxstat & GRSTATRP_RPCKST) >> 17) { - case RSTAT_GOUT_NAK: - break; - - case RSTAT_DATA_UPDT: - if(bcount > 0U) { - (void)usb_rxfifo_read(&udev->regs, transc->xfer_buf, (uint16_t)bcount); - - transc->xfer_buf += bcount; - transc->xfer_count += bcount; - } - break; - - case RSTAT_XFER_COMP: - /* trigger the OUT endpoint interrupt */ - break; - - case RSTAT_SETUP_COMP: - /* trigger the OUT endpoint interrupt */ - break; - - case RSTAT_SETUP_UPDT: - if((0U == transc->ep_addr.num) && (8U == bcount) && (DPID_DATA0 == data_PID)) { - /* copy the SETUP packet received in FIFO into the setup buffer in RAM */ - (void)usb_rxfifo_read(&udev->regs, (uint8_t *)&udev->dev.control.req, (uint16_t)bcount); - - transc->xfer_count += bcount; - } - break; - - default: - break; - } - - /* enable the RX status queue level interrupt */ - udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; - - return 1U; -} - -/*! - \brief handle USB reset interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval status -*/ -static uint32_t usbd_int_reset(usb_core_driver *udev) -{ - uint32_t i; - - /* clear the remote wakeup signaling */ - udev->regs.dr->DCTL &= ~DCTL_RWKUP; - - /* flush the TX FIFO */ - (void)usb_txfifo_flush(&udev->regs, 0U); - - for(i = 0U; i < udev->bp.num_ep; i++) { - udev->regs.er_in[i]->DIEPINTF = 0xFFU; - udev->regs.er_out[i]->DOEPINTF = 0xFFU; - } - - /* clear all pending device endpoint interrupts */ - udev->regs.dr->DAEPINT = 0xFFFFFFFFU; - - /* enable endpoint 0 interrupts */ - udev->regs.dr->DAEPINTEN = 1U | (1U << 16); - - /* enable OUT endpoint interrupts */ - udev->regs.dr->DOEPINTEN = DOEPINTEN_STPFEN | DOEPINTEN_TFEN; - -#ifdef USB_HS_DEDICATED_EP1_ENABLED - udev->regs.dr->DOEP1INTEN = DOEPINTEN_STPFEN | DOEPINTEN_TFEN; -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - - /* enable IN endpoint interrupts */ - udev->regs.dr->DIEPINTEN = DIEPINTEN_TFEN; - -#ifdef USB_HS_DEDICATED_EP1_ENABLED - udev->regs.dr->DIEP1INTEN = DIEPINTEN_TFEN; -#endif /* USB_HS_DEDICATED_EP1_ENABLED */ - - /* reset device address */ - udev->regs.dr->DCFG &= ~DCFG_DAR; - - /* configure endpoint 0 to receive SETUP packets */ - usb_ctlep_startout(udev); - - /* clear USB reset interrupt */ - udev->regs.gr->GINTF = GINTF_RST; - - udev->dev.transc_out[0] = (usb_transc) { - .ep_type = USB_EPTYPE_CTRL, - .max_len = USB_FS_EP0_MAX_LEN - }; - - (void)usb_transc_active(udev, &udev->dev.transc_out[0]); - - udev->dev.transc_in[0] = (usb_transc) { - .ep_addr = { - .dir = 1U - }, - - .ep_type = USB_EPTYPE_CTRL, - .max_len = USB_FS_EP0_MAX_LEN - }; - - (void)usb_transc_active(udev, &udev->dev.transc_in[0]); - - /* upon reset call user call back */ - udev->dev.cur_status = (uint8_t)USBD_DEFAULT; - - return 1U; -} - -/*! - \brief handle USB speed enumeration finish interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval status -*/ -static uint32_t usbd_int_enumfinish(usb_core_driver *udev) -{ - uint8_t enum_speed = (uint8_t)((udev->regs.dr->DSTAT & DSTAT_ES) >> 1); - - udev->regs.dr->DCTL &= ~DCTL_CGINAK; - udev->regs.dr->DCTL |= DCTL_CGINAK; - - udev->regs.gr->GUSBCS &= ~GUSBCS_UTT; - - /* set USB turn-around time based on device speed and PHY interface */ - if((uint8_t)USB_SPEED_HIGH == USB_SPEED[enum_speed]) { - udev->bp.core_speed = (uint8_t)USB_SPEED_HIGH; - - udev->regs.gr->GUSBCS |= 0x09U << 10; - } else { - udev->bp.core_speed = (uint8_t)USB_SPEED_FULL; - - udev->regs.gr->GUSBCS |= 0x05U << 10; - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_ENUMFIF; - - return 1U; -} - -/*! - \brief USB suspend interrupt handler - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -static uint32_t usbd_int_suspend(usb_core_driver *udev) -{ - __IO uint8_t low_power = udev->bp.low_power; - __IO uint8_t suspend = (uint8_t)(udev->regs.dr->DSTAT & DSTAT_SPST); - __IO uint8_t is_configured = ((uint8_t)USBD_CONFIGURED == udev->dev.cur_status) ? 1U : 0U; - - udev->dev.backup_status = udev->dev.cur_status; - udev->dev.cur_status = (uint8_t)USBD_SUSPENDED; - - if(low_power && suspend && is_configured) { - /* switch-off the USB clocks */ - *udev->regs.PWRCLKCTL |= PWRCLKCTL_SUCLK | PWRCLKCTL_SHCLK; - - /* enter DEEP_SLEEP mode with LDO in low power mode */ - pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); - } - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_SP; - - return 1U; -} - -/*! - \brief check FIFO for the next packet to be loaded - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier which is in (0..3) - \param[out] none - \retval status -*/ -static uint32_t usbd_emptytxfifo_write(usb_core_driver *udev, uint32_t ep_num) -{ - uint32_t len; - uint32_t word_count; - - usb_transc *transc = &udev->dev.transc_in[ep_num]; - - len = transc->xfer_len - transc->xfer_count; - - /* get the data length to write */ - if(len > transc->max_len) { - len = transc->max_len; - } - - word_count = (len + 3U) / 4U; - - while(((udev->regs.er_in[ep_num]->DIEPTFSTAT & DIEPTFSTAT_IEPTFS) >= word_count) && \ - (transc->xfer_count < transc->xfer_len)) { - len = transc->xfer_len - transc->xfer_count; - - if(len > transc->max_len) { - len = transc->max_len; - } - - /* write FIFO in word(4bytes) */ - word_count = (len + 3U) / 4U; - - /* write the FIFO */ - (void)usb_txfifo_write(&udev->regs, transc->xfer_buf, (uint8_t)ep_num, (uint16_t)len); - - transc->xfer_buf += len; - transc->xfer_count += len; - - if(transc->xfer_count == transc->xfer_len) { - /* disable the device endpoint FIFO empty interrupt */ - udev->regs.dr->DIEPFEINTEN &= ~(0x01U << ep_num); - } - } - - return 1U; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c deleted file mode 100644 index d103a184635..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/driver/Source/drv_usbh_int.c +++ /dev/null @@ -1,639 +0,0 @@ -/*! - \file drv_usbh_int.c - \brief USB host mode interrupt handler file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usbh_int.h" - -#if defined (__CC_ARM) /*!< ARM compiler */ - #pragma O0 -#elif defined (__GNUC__) /*!< GNU compiler */ - #pragma GCC optimize ("O0") -#elif defined (__TASKING__) /*!< TASKING compiler */ - #pragma optimize=0 -#endif /* __CC_ARM */ - -/* local function prototypes ('static') */ -static uint32_t usbh_int_port(usb_core_driver *udev); -static uint32_t usbh_int_pipe(usb_core_driver *udev); -static uint32_t usbh_int_pipe_in(usb_core_driver *udev, uint32_t pp_num); -static uint32_t usbh_int_pipe_out(usb_core_driver *udev, uint32_t pp_num); -static uint32_t usbh_int_rxfifonoempty(usb_core_driver *udev); -static uint32_t usbh_int_txfifoempty(usb_core_driver *udev, usb_pipe_mode pp_mode); - -/*! - \brief handle global host interrupt - \param[in] udev: pointer to USB core instance - \param[out] none - \retval operation status -*/ -uint32_t usbh_isr(usb_core_driver *udev) -{ - uint32_t retval = 0U; - - __IO uint32_t intr = 0U; - - /* check if host mode */ - if(HOST_MODE == (udev->regs.gr->GINTF & GINTF_COPM)) { - intr = usb_coreintr_get(&udev->regs); - - if(!intr) { - return 0U; - } - - if(intr & GINTF_SOF) { - usbh_int_fop->SOF(udev->host.data); - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_SOF; - } - - if(intr & GINTF_RXFNEIF) { - retval |= usbh_int_rxfifonoempty(udev); - } - - if(intr & GINTF_NPTXFEIF) { - retval |= usbh_int_txfifoempty(udev, PIPE_NON_PERIOD); - } - - if(intr & GINTF_PTXFEIF) { - retval |= usbh_int_txfifoempty(udev, PIPE_PERIOD); - } - - if(intr & GINTF_HCIF) { - retval |= usbh_int_pipe(udev); - } - - if(intr & GINTF_HPIF) { - retval |= usbh_int_port(udev); - } - - if(intr & GINTF_WKUPIF) { - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_WKUPIF; - } - - if(intr & GINTF_DISCIF) { - usbh_int_fop->disconnect(udev->host.data); - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_DISCIF; - } - - if(intr & GINTF_ISOONCIF) { - udev->regs.pr[0]->HCHCTL |= HCHCTL_CEN | HCHCTL_CDIS; - - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_ISOONCIF; - } - - if(intr & GINTF_SESIF) { - usb_portvbus_switch(udev, 1U); - - udev->regs.gr->GINTF = GINTF_SESIF; - } - } - - return retval; -} - -/*! - \brief handle USB pipe halt - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pp_num: host channel number which is in (0..7) - \param[in] pp_int: pipe interrupt - \param[in] pp_status: pipe status - \param[out] none - \retval none -*/ -static inline void usb_pp_halt(usb_core_driver *udev, \ - uint8_t pp_num, \ - uint32_t pp_int, \ - usb_pipe_status pp_status) -{ - udev->regs.pr[pp_num]->HCHINTEN |= HCHINTEN_CHIE; - - usb_pipe_halt(udev, pp_num); - - udev->regs.pr[pp_num]->HCHINTF = pp_int; - - udev->host.pipe[pp_num].pp_status = pp_status; -} - -/*! - \brief handle the host port interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -#if defined (__ICCARM__) /*!< IAR compiler */ - #pragma optimize = none -#endif /* __ICCARM */ -static uint32_t usbh_int_port(usb_core_driver *udev) -{ - uint32_t retval = 0U; - - /* note: when the USB PHY use USB HS PHY, the flag is needed */ - uint8_t port_reset = 0U; - - __IO uint32_t port_state = *udev->regs.HPCS; - - /* clear the interrupt bit in GINTF */ - port_state &= ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); - - /* port connect detected */ - if(*udev->regs.HPCS & HPCS_PCD) { - port_state |= HPCS_PCD; - - usbh_int_fop->connect(udev->host.data); - - retval |= 1U; - } - - /* port enable changed */ - if(*udev->regs.HPCS & HPCS_PEDC) { - port_state |= HPCS_PEDC; - - if(*udev->regs.HPCS & HPCS_PE) { - uint32_t port_speed = usb_curspeed_get(udev); - uint32_t clock_type = udev->regs.hr->HCTL & HCTL_CLKSEL; - - udev->host.connect_status = 1U; - - if(PORT_SPEED_LOW == port_speed) { - udev->regs.hr->HFT = 6000U; - - if(HCTL_6MHZ != clock_type) { - if(USB_EMBEDDED_PHY == udev->bp.phy_itf) { - usb_phyclock_config(udev, HCTL_6MHZ); - } - - port_reset = 1U; - } - } else if(PORT_SPEED_FULL == port_speed) { - udev->regs.hr->HFT = 48000U; - - if(HCTL_48MHZ != clock_type) { - if(USB_EMBEDDED_PHY == udev->bp.phy_itf) { - usb_phyclock_config(udev, HCTL_48MHZ); - } - - port_reset = 1U; - } - } else { - /* for high speed device and others */ - port_reset = 1U; - } - - udev->host.port_enabled = 1U; - - udev->regs.gr->GINTEN |= GINTEN_DISCIE | GINTEN_SOFIE; - } else { - udev->host.port_enabled = 0U; - } - } - - if(port_reset) { - usb_port_reset(udev); - } - - /* clear port interrupts */ - *udev->regs.HPCS = port_state; - - return retval; -} - -/*! - \brief handle all host channels interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -static uint32_t usbh_int_pipe(usb_core_driver *udev) -{ - uint32_t pp_num = 0U; - uint32_t retval = 0U; - - for(pp_num = 0U; pp_num < udev->bp.num_pipe; pp_num++) { - if((udev->regs.hr->HACHINT & HACHINT_HACHINT) & (1UL << pp_num)) { - if(udev->regs.pr[pp_num]->HCHCTL & HCHCTL_EPDIR) { - retval |= usbh_int_pipe_in(udev, pp_num); - } else { - retval |= usbh_int_pipe_out(udev, pp_num); - } - } - } - - return retval; -} - -/*! - \brief handle the IN channel interrupt - \param[in] udev: pointer to USB device instance - \param[in] pp_num: host channel number which is in (0..7) - \param[out] none - \retval operation status -*/ -#if defined (__ICCARM__) /*!< IAR compiler */ - #pragma optimize = none -#endif /* __ICCARM */ -static uint32_t usbh_int_pipe_in(usb_core_driver *udev, uint32_t pp_num) -{ - usb_pr *pp_reg = udev->regs.pr[pp_num]; - - usb_pipe *pp = &udev->host.pipe[pp_num]; - - uint32_t intr_pp = pp_reg->HCHINTF; - intr_pp &= pp_reg->HCHINTEN; - - uint8_t ep_type = (uint8_t)((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18); - - if(intr_pp & HCHINTF_ACK) { - pp_reg->HCHINTF = HCHINTF_ACK; - } else if(intr_pp & HCHINTF_STALL) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_STALL, PIPE_STALL); - pp_reg->HCHINTF = HCHINTF_NAK; - - /* note: When there is a 'STALL', reset also NAK, - else, the udev->host.pp_status = HC_STALL - will be overwritten by 'NAK' in code below */ - intr_pp &= ~HCHINTF_NAK; - } else if(intr_pp & HCHINTF_DTER) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_DTER, PIPE_DTGERR); - pp_reg->HCHINTF = HCHINTF_NAK; - } else { - /* no operation */ - } - - if(intr_pp & HCHINTF_REQOVR) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_REQOVR, PIPE_REQOVR); - } else if(intr_pp & HCHINTF_TF) { - if((uint8_t)USB_USE_DMA == udev->bp.transfer_mode) { - udev->host.backup_xfercount[pp_num] = pp->xfer_len - (pp_reg->HCHLEN & HCHLEN_TLEN); - } - - pp->pp_status = PIPE_XF; - pp->err_count = 0U; - - pp_reg->HCHINTF = HCHINTF_TF; - - switch(ep_type) { - case USB_EPTYPE_CTRL: - case USB_EPTYPE_BULK: - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_XF); - - pp->data_toggle_in ^= 1U; - break; - - case USB_EPTYPE_INTR: - case USB_EPTYPE_ISOC: - pp_reg->HCHCTL |= HCHCTL_ODDFRM; - pp->urb_state = URB_DONE; - break; - - default: - break; - } - } else if(intr_pp & HCHINTF_CH) { - pp_reg->HCHINTEN &= ~HCHINTEN_CHIE; - - switch(pp->pp_status) { - case PIPE_XF: - pp->urb_state = URB_DONE; - break; - - case PIPE_STALL: - pp->urb_state = URB_STALL; - break; - - case PIPE_TRACERR: - case PIPE_DTGERR: - pp->err_count = 0U; - pp->urb_state = URB_ERROR; - - pp->data_toggle_in ^= 1U; - break; - - case PIPE_IDLE: - case PIPE_HALTED: - case PIPE_NAK: - case PIPE_NYET: - case PIPE_BBERR: - case PIPE_REQOVR: - default: - if((uint8_t)USB_EPTYPE_INTR == ep_type) { - pp->data_toggle_in ^= 1U; - } - break; - } - - pp_reg->HCHINTF = HCHINTF_CH; - } else if(intr_pp & HCHINTF_USBER) { - pp->err_count++; - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_USBER, PIPE_TRACERR); - } else if(intr_pp & HCHINTF_NAK) { - switch(ep_type) { - case USB_EPTYPE_CTRL: - case USB_EPTYPE_BULK: - /* re-activate the channel */ - pp_reg->HCHCTL = (pp_reg->HCHCTL | HCHCTL_CEN) & ~HCHCTL_CDIS; - break; - - case USB_EPTYPE_INTR: - pp_reg->HCHINTEN |= HCHINTEN_CHIE; - - (void)usb_pipe_halt(udev, (uint8_t)pp_num); - break; - - default: - break; - } - - pp->pp_status = PIPE_NAK; - - pp_reg->HCHINTF = HCHINTF_NAK; - } else { - /* no operation */ - } - - return 1U; -} - -/*! - \brief handle the OUT channel interrupt - \param[in] udev: pointer to USB device instance - \param[in] pp_num: host channel number which is in (0..7) - \param[out] none - \retval operation status -*/ -#if defined (__ICCARM__) /*!< IAR compiler */ - #pragma optimize = none -#endif /* __ICCARM */ -static uint32_t usbh_int_pipe_out(usb_core_driver *udev, uint32_t pp_num) -{ - usbh_host *uhost = udev->host.data; - usb_pr *pp_reg = udev->regs.pr[pp_num]; - usb_pipe *pp = &udev->host.pipe[pp_num]; - uint32_t intr_pp = pp_reg->HCHINTF; - intr_pp &= pp_reg->HCHINTEN; - - if(intr_pp & HCHINTF_ACK) { - if(1U == udev->host.pipe[pp_num].do_ping) { - udev->host.pipe[pp_num].do_ping = 0U; - pp->err_count = 0U; - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_ACK, PIPE_NAK); - } - - pp_reg->HCHINTF = HCHINTF_ACK; - } else if(intr_pp & HCHINTF_STALL) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_STALL, PIPE_STALL); - } else if(intr_pp & HCHINTF_DTER) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_DTER, PIPE_DTGERR); - pp_reg->HCHINTF = HCHINTF_NAK; - } else if(intr_pp & HCHINTF_REQOVR) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_REQOVR, PIPE_REQOVR); - } else if(intr_pp & HCHINTF_TF) { - pp->err_count = 0U; - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_TF, PIPE_XF); - } else if(intr_pp & HCHINTF_NAK) { - if(0U == udev->host.pipe[pp_num].do_ping) { - if(1U == udev->host.pipe[pp_num].supp_ping) { - udev->host.pipe[pp_num].do_ping = 1U; - } - } - - pp->err_count = 0U; - if(USB_USE_FIFO == udev->bp.transfer_mode) { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_NAK); - } else { - pp_reg->HCHINTF = HCHINTF_NAK; - } - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NAK, PIPE_NAK); - } else if(intr_pp & HCHINTF_USBER) { - pp->err_count++; - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_USBER, PIPE_TRACERR); - } else if(intr_pp & HCHINTF_NYET) { - if(CTL_STATUS_OUT != uhost->control.ctl_state) { - if(0U == udev->host.pipe[pp_num].do_ping) { - if(1U == udev->host.pipe[pp_num].supp_ping) { - udev->host.pipe[pp_num].do_ping = 1U; - } - } - - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NYET, PIPE_NYET); - } else { - usb_pp_halt(udev, (uint8_t)pp_num, HCHINTF_NYET, PIPE_XF); - } - - pp->err_count = 0U; - } else if(intr_pp & HCHINTF_CH) { - udev->regs.pr[pp_num]->HCHINTEN &= ~HCHINTEN_CHIE; - - switch(pp->pp_status) { - case PIPE_XF: - pp->urb_state = URB_DONE; - - if((uint8_t)USB_EPTYPE_BULK == ((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18)) { - pp->data_toggle_out ^= 1U; - } - break; - - case PIPE_NAK: - pp->urb_state = URB_NOTREADY; - break; - case PIPE_NYET: - pp->urb_state = URB_DONE; - - if((uint8_t)USB_EPTYPE_BULK == ((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18)) { - pp->data_toggle_out ^= 1U; - } - break; - - case PIPE_STALL: - pp->urb_state = URB_STALL; - break; - - case PIPE_TRACERR: - if(3U == pp->err_count) { - pp->urb_state = URB_ERROR; - pp->err_count = 0U; - } - break; - - case PIPE_IDLE: - case PIPE_HALTED: - case PIPE_BBERR: - case PIPE_REQOVR: - case PIPE_DTGERR: - default: - break; - } - - pp_reg->HCHINTF = HCHINTF_CH; - } else { - /* no operation */ - } - - return 1U; -} - -/*! - \brief handle the RX FIFO non-empty interrupt - \param[in] udev: pointer to USB device instance - \param[out] none - \retval operation status -*/ -#if defined (__ICCARM__) /*!< IAR compiler */ - #pragma optimize = none -#endif /* __ICCARM */ -static uint32_t usbh_int_rxfifonoempty(usb_core_driver *udev) -{ - uint32_t count = 0U, xfer_count = 0U; - - __IO uint8_t pp_num = 0U; - __IO uint32_t rx_stat = 0U; - - /* disable the RX status queue level interrupt */ - udev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; - - rx_stat = udev->regs.gr->GRSTATP; - pp_num = (uint8_t)(rx_stat & GRSTATRP_CNUM); - - switch((rx_stat & GRSTATRP_RPCKST) >> 17) { - case GRXSTS_PKTSTS_IN: - count = (rx_stat & GRSTATRP_BCOUNT) >> 4; - - /* read the data into the host buffer. */ - if((count > 0U) && (NULL != udev->host.pipe[pp_num].xfer_buf)) { - (void)usb_rxfifo_read(&udev->regs, udev->host.pipe[pp_num].xfer_buf, (uint16_t)count); - - /* manage multiple transfer packet */ - udev->host.pipe[pp_num].xfer_buf += count; - udev->host.pipe[pp_num].xfer_count += count; - - xfer_count = udev->host.pipe[pp_num].xfer_count; - - udev->host.backup_xfercount[pp_num] = xfer_count; - - if(udev->regs.pr[pp_num]->HCHLEN & HCHLEN_PCNT) { - /* re-activate the channel when more packets are expected */ - uint32_t pp_ctl = udev->regs.pr[pp_num]->HCHCTL; - - pp_ctl |= HCHCTL_CEN; - pp_ctl &= ~HCHCTL_CDIS; - - udev->regs.pr[pp_num]->HCHCTL = pp_ctl; - } - } - break; - - case GRXSTS_PKTSTS_IN_XFER_COMP: - break; - - case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: - count = (rx_stat & GRSTATRP_BCOUNT) >> 4; - - while(count > 0U) { - rx_stat = udev->regs.gr->GRSTATP; - count--; - } - break; - - case GRXSTS_PKTSTS_CH_HALTED: - break; - - default: - break; - } - - /* enable the RX status queue level interrupt */ - udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; - - return 1U; -} - -/*! - \brief handle the TX FIFO empty interrupt - \param[in] udev: pointer to USB device instance - \param[in] pp_mode: pipe mode - \param[out] none - \retval operation status -*/ -#if defined (__ICCARM__) /*!< IAR compiler */ - #pragma optimize = none -#endif /* __ICCARM */ -static uint32_t usbh_int_txfifoempty(usb_core_driver *udev, usb_pipe_mode pp_mode) -{ - uint8_t pp_num = 0U; - uint16_t word_count = 0U, len = 0U; - __IO uint32_t *txfiforeg = 0U, txfifostate = 0U; - - if(PIPE_NON_PERIOD == pp_mode) { - txfiforeg = &udev->regs.gr->HNPTFQSTAT; - } else if(PIPE_PERIOD == pp_mode) { - txfiforeg = &udev->regs.hr->HPTFQSTAT; - } else { - return 0U; - } - - txfifostate = *txfiforeg; - - pp_num = (uint8_t)((txfifostate & TFQSTAT_CNUM) >> 27); - - word_count = (uint16_t)(udev->host.pipe[pp_num].xfer_len + 3U) / 4U; - - while(((txfifostate & TFQSTAT_TXFS) >= word_count) && (0U != udev->host.pipe[pp_num].xfer_len)) { - len = (uint16_t)(txfifostate & TFQSTAT_TXFS) * 4U; - - if(len > udev->host.pipe[pp_num].xfer_len) { - /* last packet */ - len = (uint16_t)udev->host.pipe[pp_num].xfer_len; - - if(PIPE_NON_PERIOD == pp_mode) { - udev->regs.gr->GINTEN &= ~GINTEN_NPTXFEIE; - } else { - udev->regs.gr->GINTEN &= ~GINTEN_PTXFEIE; - } - } - - word_count = (uint16_t)((udev->host.pipe[pp_num].xfer_len + 3U) / 4U); - usb_txfifo_write(&udev->regs, udev->host.pipe[pp_num].xfer_buf, pp_num, len); - - udev->host.pipe[pp_num].xfer_buf += len; - udev->host.pipe[pp_num].xfer_len -= len; - udev->host.pipe[pp_num].xfer_count += len; - - txfifostate = *txfiforeg; - } - - return 1U; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h deleted file mode 100644 index 118e27ba023..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_hid_core.h +++ /dev/null @@ -1,116 +0,0 @@ -/*! - \file usbh_hid_core.h - \brief header file for the usbh_hid_core.c - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_HID_CORE_H -#define USBH_HID_CORE_H - -#include "usb_hid.h" -#include "usbh_enum.h" -#include "usbh_transc.h" - -#define HID_MIN_POLL 10U /*!< HID minimum polling */ -#define HID_REPORT_SIZE 16U /*!< HID report size */ -#define HID_QUEUE_SIZE 10U /*!< HID queue size */ - -#define USB_HID_DESC_SIZE 9U /*!< HID descriptor size */ - -/* states for HID state machine */ -typedef enum { - HID_INIT = 0U, /*!< HID init state */ - HID_IDLE, /*!< HID idle state */ - HID_SEND_DATA, /*!< HID send data state */ - HID_BUSY, /*!< HID busy state */ - HID_GET_DATA, /*!< HID get data state */ - HID_SYNC, /*!< HID synchronous state */ - HID_POLL, /*!< HID polling state */ - HID_ERROR /*!< HID error state */ -} hid_state; - -/* state types of HID control request */ -typedef enum { - HID_REQ_INIT = 0U, /*!< HID init request */ - HID_REQ_IDLE, /*!< HID idle request */ - HID_REQ_GET_REPORT_DESC, /*!< get report descriptor request */ - HID_REQ_GET_HID_DESC, /*!< get HID descriptor request */ - HID_REQ_SET_IDLE, /*!< set idle request */ - HID_REQ_SET_PROTOCOL, /*!< set protocol request */ - HID_REQ_SET_REPORT /*!< set report request */ -} hid_ctlstate; - -/* HID types */ -typedef enum { - HID_MOUSE = 0x01U, /*!< HID mouse type */ - HID_KEYBOARD = 0x02U, /*!< HID keyboard type */ - HID_UNKNOWN = 0xFFU /*!< unknown type */ -} hid_type; - -typedef struct { - uint8_t *buf; /*!< data FIFO buff pointer */ - uint16_t head; /*!< data FIFO header */ - uint16_t tail; /*!< data FIFO tail */ - uint16_t size; /*!< data FIFO size */ - uint8_t lock; /*!< data FIFO lock */ -} data_fifo; - -/* structure for HID process */ -typedef struct _hid_process { - uint8_t pipe_in; /*!< pipe IN */ - uint8_t pipe_out; /*!< pipe OUT */ - uint8_t ep_addr; /*!< endpoint address */ - uint8_t ep_in; /*!< endpoint IN */ - uint8_t ep_out; /*!< endpoint OUT */ - uint8_t *pdata; /*!< HID data pointer */ - __IO uint8_t data_ready; /*!< HID data ready */ - uint16_t len; /*!< HID data length */ - uint16_t poll; /*!< HID polling */ - __IO uint32_t timer; /*!< HID timer */ - usb_desc_hid hid_desc; /*!< HID descriptor */ - hid_state state; /*!< HID state structure */ - hid_ctlstate ctl_state; /*!< control request state structure */ - usbh_status (*init)(usb_core_driver *udev, usbh_host *uhost); - usbh_status (*decode)(uint8_t *data); -} usbh_hid_handler; - -extern usbh_class usbh_hid; - -/* function declarations */ -/* set HID report */ -usbh_status usbh_set_report(usb_core_driver *udev, \ - usbh_host *uhost, \ - uint8_t report_type, \ - uint8_t report_ID, \ - uint8_t report_len, \ - uint8_t *report_buf); - -#endif /* USBH_HID_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h deleted file mode 100644 index f6f175bc0b8..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Include/usbh_standard_hid.h +++ /dev/null @@ -1,96 +0,0 @@ -/*! - \file usbh_standard_hid.h - \brief header file for usbh_standard_hid.c - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_STANDARD_HID_H -#define USBH_STANDARD_HID_H - -#include "usbh_hid_core.h" - -//#define AZERTY_KEYBOARD -#define QWERTY_KEYBOARD - -#define MOUSE_BUTTON_1 0x01U /*!< mouse button 1 */ -#define MOUSE_BUTTON_2 0x02U /*!< mouse button 2 */ -#define MOUSE_BUTTON_3 0x04U /*!< mouse button 3 */ - -#define KBD_LEFT_CTRL 0x01U /*!< keyboard left ctrl key */ -#define KBD_LEFT_SHIFT 0x02U /*!< keyboard left shift key */ -#define KBD_LEFT_ALT 0x04U /*!< keyboard left alt key */ -#define KBD_LEFT_GUI 0x08U /*!< keyboard left gui key */ -#define KBD_RIGHT_CTRL 0x10U /*!< keyboard right ctrl key */ -#define KBD_RIGHT_SHIFT 0x20U /*!< keyboard right shift key */ -#define KBD_RIGHT_ALT 0x40U /*!< keyboard right alt key */ -#define KBD_RIGHT_GUI 0x80U /*!< keyboard right gui key */ - -#define KBD_PRESSED_MAX_NUM 6U /*!< keyboard pressed maximum number */ - -typedef struct _mouse_report_data { - uint8_t x; /*!< X coordinate value */ - uint8_t y; /*!< Y coordinate value */ - uint8_t buttons[3]; /*!< button buff */ -} mouse_report_data; - -typedef struct { - uint8_t state; /*!< keyboard state */ - uint8_t lctrl; /*!< keyboard left ctrl */ - uint8_t lshift; /*!< keyboard left shift */ - uint8_t lalt; /*!< keyboard left alt */ - uint8_t lgui; /*!< keyboard left gui */ - uint8_t rctrl; /*!< keyboard right ctrl */ - uint8_t rshift; /*!< keyboard right shift */ - uint8_t ralt; /*!< keyboard right alt */ - uint8_t rgui; /*!< keyboard right gui */ - uint8_t keys[6]; /*!< keyboard keys buff */ -} hid_keybd_info; - -/* function declarations */ -/* initialize mouse */ -void usr_mouse_init(void); -/* process mouse data */ -void usr_mouse_process_data(mouse_report_data *data); -/* initialize mouse function */ -usbh_status usbh_hid_mouse_init(usb_core_driver *udev, usbh_host *uhost); -/* decode mouse information */ -usbh_status usbh_hid_mouse_decode(uint8_t *data); - -/* initialize keyboard */ -void usr_keybrd_init(void); -/* process keyboard data */ -void usr_keybrd_process_data(uint8_t pbuf); -/* initialize the keyboard function */ -usbh_status usbh_hid_keybrd_init(usb_core_driver *udev, usbh_host *uhost); -/* decode keyboard information */ -usbh_status usbh_hid_keybrd_decode(uint8_t *data); - -#endif /* USBH_STANDARD_HID_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c deleted file mode 100644 index 0501db83cde..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_hid_core.c +++ /dev/null @@ -1,582 +0,0 @@ -/*! - \file usbh_hid_core.c - \brief USB host HID class driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include -#include "usbh_pipe.h" -#include "usbh_hid_core.h" -#include "usbh_standard_hid.h" - -/* local function prototypes ('static') */ -static void usbh_hiddesc_parse(usb_desc_hid *hid_desc, uint8_t *buf); -static void usbh_hid_itf_deinit(usbh_host *uhost); -static usbh_status usbh_hid_itf_init(usbh_host *uhost); -static usbh_status usbh_hid_class_req(usbh_host *uhost); -static usbh_status usbh_hid_handle(usbh_host *uhost); -static usbh_status usbh_hid_reportdesc_get(usbh_host *uhost, uint16_t len); -static usbh_status usbh_hid_sof(usbh_host *uhost); -static usbh_status usbh_hid_desc_get(usbh_host *uhost, uint16_t len); -static usbh_status usbh_set_idle(usbh_host *uhost, uint8_t duration, uint8_t report_ID); -static usbh_status usbh_set_protocol(usbh_host *uhost, uint8_t protocol); - -usbh_class usbh_hid = { - USB_HID_CLASS, - usbh_hid_itf_init, - usbh_hid_itf_deinit, - usbh_hid_class_req, - usbh_hid_handle, - usbh_hid_sof -}; - -/*! - \brief get report - \param[in] uhost: pointer to USB host - \param[in] report_type: duration for HID set idle request - \param[in] report_ID: targeted report ID for HID set idle request - \param[in] report_len: length of data report to be send - \param[in] report_buf: report buffer - \param[out] none - \retval operation status -*/ -usbh_status usbh_get_report(usbh_host *uhost, \ - uint8_t report_type, \ - uint8_t report_ID, \ - uint8_t report_len, \ - uint8_t *report_buf) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, - .bRequest = GET_REPORT, - .wValue = (report_type << 8) | report_ID, - .wIndex = 0U, - .wLength = report_len - }; - - usbh_ctlstate_config(uhost, report_buf, report_len); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set report - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[in] report_type: duration for HID set idle request - \param[in] report_ID: targeted report ID for HID set idle request - \param[in] report_len: length of data report to be send - \param[in] report_buf: report buffer - \param[out] none - \retval operation status -*/ -usbh_status usbh_set_report(usb_core_driver *udev, \ - usbh_host *uhost, \ - uint8_t report_type, \ - uint8_t report_ID, \ - uint8_t report_len, \ - uint8_t *report_buf) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, - .bRequest = SET_REPORT, - .wValue = (report_type << 8) | report_ID, - .wIndex = 0U, - .wLength = report_len - }; - - usbh_ctlstate_config(uhost, report_buf, report_len); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief deinitialize the host pipes used for the HID class - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -void usbh_hid_itf_deinit(usbh_host *uhost) -{ - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - if(0x00U != hid->pipe_in) { - usb_pipe_halt(uhost->data, hid->pipe_in); - - usbh_pipe_free(uhost->data, hid->pipe_in); - - /* reset the pipe as free */ - hid->pipe_in = 0U; - } - - if(0x00U != hid->pipe_out) { - usb_pipe_halt(uhost->data, hid->pipe_out); - - usbh_pipe_free(uhost->data, hid->pipe_out); - - /* reset the channel as free */ - hid->pipe_out = 0U; - } -} - -/*! - \brief return device type - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[out] none - \retval hid_type -*/ -hid_type usbh_hid_device_type_get(usb_core_driver *udev, usbh_host *uhost) -{ - hid_type type = HID_UNKNOWN; - uint8_t interface_protocol; - - if(HOST_CLASS_HANDLER == uhost->cur_state) { - interface_protocol = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bInterfaceProtocol; - - if(USB_HID_PROTOCOL_KEYBOARD == interface_protocol) { - type = HID_KEYBOARD; - } else { - if(USB_HID_PROTOCOL_MOUSE == interface_protocol) { - type = HID_MOUSE; - } - } - } - - return type; -} - -/*! - \brief return HID device poll time - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[out] none - \retval poll time (ms) -*/ -uint8_t usbh_hid_poll_interval_get(usb_core_driver *udev, usbh_host *uhost) -{ - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - if((HOST_CLASS_ENUM == uhost->cur_state) || \ - (HOST_USER_INPUT == uhost->cur_state) || \ - (HOST_CLASS_CHECK == uhost->cur_state) || \ - (HOST_CLASS_HANDLER == uhost->cur_state)) { - return (uint8_t)(hid->poll); - } else { - return 0U; - } -} - -/*! - \brief initialize the hid class - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_itf_init(usbh_host *uhost) -{ - uint8_t num = 0U, ep_num = 0U, interface = 0U; - usbh_status status = USBH_BUSY; - - interface = usbh_interface_find(&uhost->dev_prop, USB_HID_CLASS, USB_HID_SUBCLASS_BOOT_ITF, 0xFFU); - - if(0xFFU == interface) { - uhost->usr_cb->dev_not_supported(); - - status = USBH_FAIL; - } else { - usbh_interface_select(&uhost->dev_prop, interface); - - static usbh_hid_handler hid_handler; - - memset((void *)&hid_handler, 0U, sizeof(usbh_hid_handler)); - - hid_handler.state = HID_ERROR; - - uint8_t itf_protocol = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bInterfaceProtocol; - if(USB_HID_PROTOCOL_KEYBOARD == itf_protocol) { - hid_handler.init = usbh_hid_keybrd_init; - hid_handler.decode = usbh_hid_keybrd_decode; - } else if(USB_HID_PROTOCOL_MOUSE == itf_protocol) { - hid_handler.init = usbh_hid_mouse_init; - hid_handler.decode = usbh_hid_mouse_decode; - } else { - status = USBH_FAIL; - } - - hid_handler.state = HID_INIT; - hid_handler.ctl_state = HID_REQ_INIT; - hid_handler.ep_addr = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].bEndpointAddress; - hid_handler.len = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].wMaxPacketSize; - hid_handler.poll = uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[0].bInterval; - - if(hid_handler.poll < HID_MIN_POLL) { - hid_handler.poll = HID_MIN_POLL; - } - - /* check for available number of endpoints */ - /* find the number of endpoints in the interface descriptor */ - /* choose the lower number in order not to overrun the buffer allocated */ - ep_num = USB_MIN(uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].itf_desc.bNumEndpoints, USBH_MAX_EP_NUM); - - /* decode endpoint IN and OUT address from interface descriptor */ - for(num = 0U; num < ep_num; num++) { - usb_desc_ep *ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[uhost->dev_prop.cur_itf][0].ep_desc[num]; - - uint8_t ep_addr = ep_desc->bEndpointAddress; - - if(ep_addr & 0x80U) { - hid_handler.ep_in = ep_addr; - hid_handler.pipe_in = usbh_pipe_allocate(uhost->data, ep_addr); - - /* open channel for IN endpoint */ - usbh_pipe_create(uhost->data, \ - &uhost->dev_prop, \ - hid_handler.pipe_in, \ - USB_EPTYPE_INTR, \ - hid_handler.len); - - usbh_pipe_toggle_set(uhost->data, hid_handler.pipe_in, 0U); - } else { - hid_handler.ep_out = ep_addr; - hid_handler.pipe_out = usbh_pipe_allocate(uhost->data, ep_addr); - - /* open channel for OUT endpoint */ - usbh_pipe_create(uhost->data, \ - &uhost->dev_prop, \ - hid_handler.pipe_out, \ - USB_EPTYPE_INTR, \ - hid_handler.len); - - usbh_pipe_toggle_set(uhost->data, hid_handler.pipe_out, 0U); - } - } - - uhost->active_class->class_data = (void *)&hid_handler; - - status = USBH_OK; - } - - return status; -} - -/*! - \brief handle HID class requests for HID class - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_class_req(usbh_host *uhost) -{ - usbh_status status = USBH_BUSY; - usbh_status class_req_status = USBH_BUSY; - - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - /* handle HID control state machine */ - switch(hid->ctl_state) { - case HID_REQ_INIT: - case HID_REQ_GET_HID_DESC: - /* get HID descriptor */ - if(USBH_OK == usbh_hid_desc_get(uhost, USB_HID_DESC_SIZE)) { - usbh_hiddesc_parse(&hid->hid_desc, uhost->dev_prop.data); - - hid->ctl_state = HID_REQ_GET_REPORT_DESC; - } - break; - - case HID_REQ_GET_REPORT_DESC: - /* get report descriptor */ - if(USBH_OK == usbh_hid_reportdesc_get(uhost, hid->hid_desc.wDescriptorLength)) { - hid->ctl_state = HID_REQ_SET_IDLE; - } - break; - - case HID_REQ_SET_IDLE: - class_req_status = usbh_set_idle(uhost, 0U, 0U); - - /* set idle */ - if(USBH_OK == class_req_status) { - hid->ctl_state = HID_REQ_SET_PROTOCOL; - } else { - if(USBH_NOT_SUPPORTED == class_req_status) { - hid->ctl_state = HID_REQ_SET_PROTOCOL; - } - } - break; - - case HID_REQ_SET_PROTOCOL: - /* set protocol */ - if(USBH_OK == usbh_set_protocol(uhost, 0U)) { - hid->ctl_state = HID_REQ_IDLE; - - /* all requests performed */ - status = USBH_OK; - } - break; - - case HID_REQ_IDLE: - default: - break; - } - - return status; -} - -/*! - \brief manage state machine for HID data transfers - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_handle(usbh_host *uhost) -{ - usbh_status status = USBH_OK; - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - switch(hid->state) { - case HID_INIT: - hid->init(uhost->data, uhost); - hid->state = HID_IDLE; - break; - - case HID_IDLE: - hid->state = HID_SYNC; - status = USBH_OK; - break; - - case HID_SYNC: - /* sync with start of even frame */ - if(1U == usb_frame_even(uhost->data)) { - hid->state = HID_GET_DATA; - } - break; - - case HID_GET_DATA: - usbh_data_recev(uhost->data, hid->pdata, hid->pipe_in, hid->len); - - hid->state = HID_POLL; - hid->timer = usb_curframe_get(uhost->data); - hid->data_ready = 0U; - break; - - case HID_POLL: - if(URB_DONE == usbh_urbstate_get(uhost->data, hid->pipe_in)) { - if(0U == hid->data_ready) { - hid->data_ready = 1U; - - hid->decode(hid->pdata); - } - } else { - /* check IN endpoint STALL status */ - if(URB_STALL == usbh_urbstate_get(uhost->data, hid->pipe_in)) { - /* issue clear feature on interrupt IN endpoint */ - if(USBH_OK == (usbh_clrfeature(uhost, hid->ep_addr, hid->pipe_in))) { - /* change state to issue next IN token */ - hid->state = HID_GET_DATA; - } - } - } - break; - - default: - break; - } - return status; -} - -/*! - \brief send get report descriptor command to the device - \param[in] uhost: pointer to USB host - \param[in] len: HID report descriptor length - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_reportdesc_get(usbh_host *uhost, uint16_t len) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, - .bRequest = USB_GET_DESCRIPTOR, - .wValue = USBH_DESC(USB_DESCTYPE_REPORT), - .wIndex = 0U, - .wLength = len - }; - - usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief managing the SOF process - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_sof(usbh_host *uhost) -{ - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - if(HID_POLL == hid->state) { - uint32_t frame_count = usb_curframe_get(uhost->data); - - if((frame_count > hid->timer) && ((frame_count - hid->timer) >= hid->poll)) { - hid->state = HID_GET_DATA; - } else if((frame_count < hid->timer) && ((frame_count + 0x3FFFU - hid->timer) >= hid->poll)) { - hid->state = HID_GET_DATA; - } else { - /* no operation */ - } - } - - return USBH_OK; -} - -/*! - \brief send the command of get HID descriptor to the device - \param[in] uhost: pointer to USB host - \param[in] len: HID descriptor length - \param[out] none - \retval operation status -*/ -static usbh_status usbh_hid_desc_get(usbh_host *uhost, uint16_t len) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, - .bRequest = USB_GET_DESCRIPTOR, - .wValue = USBH_DESC(USB_DESCTYPE_HID), - .wIndex = 0U, - .wLength = len - }; - - usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set idle state - \param[in] uhost: pointer to USB host - \param[in] duration: duration for HID set idle request - \param[in] report_ID: targeted report ID for HID set idle request - \param[out] none - \retval operation status -*/ -static usbh_status usbh_set_idle(usbh_host *uhost, uint8_t duration, uint8_t report_ID) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, - .bRequest = SET_IDLE, - .wValue = (duration << 8) | report_ID, - .wIndex = 0U, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set protocol state - \param[in] uhost: pointer to USB host - \param[in] protocol: boot/report protocol - \param[out] none - \retval operation status -*/ -static usbh_status usbh_set_protocol(usbh_host *uhost, uint8_t protocol) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, - .bRequest = SET_PROTOCOL, - .wValue = !protocol, - .wIndex = 0U, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief parse the HID descriptor - \param[in] hid_desc: pointer to HID descriptor - \param[in] buf: pointer to buffer where the source descriptor is available - \param[out] none - \retval none -*/ -static void usbh_hiddesc_parse(usb_desc_hid *hid_desc, uint8_t *buf) -{ - hid_desc->header.bLength = *(uint8_t *)(buf + 0U); - hid_desc->header.bDescriptorType = *(uint8_t *)(buf + 1U); - hid_desc->bcdHID = BYTE_SWAP(buf + 2U); - hid_desc->bCountryCode = *(uint8_t *)(buf + 4U); - hid_desc->bNumDescriptors = *(uint8_t *)(buf + 5U); - hid_desc->bDescriptorType = *(uint8_t *)(buf + 6U); - hid_desc->wDescriptorLength = BYTE_SWAP(buf + 7U); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c deleted file mode 100644 index ebfa3d9f370..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/hid/Source/usbh_standard_hid.c +++ /dev/null @@ -1,271 +0,0 @@ -/*! - \file usbh_standard_hid.c - \brief USB host HID keyboard and mouse driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_standard_hid.h" - -mouse_report_data mouse_info; -hid_keybd_info keybd_info; - -__ALIGN_BEGIN uint8_t hid_mouse_info[8] __ALIGN_END = {0U}; -__ALIGN_BEGIN uint32_t keybd_report_data[2] __ALIGN_END; - -/* local constants */ -static const uint8_t kbd_codes[] = { - 0, 0, 0, 0, 31, 50, 48, 33, - 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */ - 52, 51, 25, 26, 17, 20, 32, 21, - 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */ - 4, 5, 6, 7, 8, 9, 10, 11, - 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */ - 28, 29, 42, 40, 41, 1, 53, 54, - 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */ - 118, 119, 120, 121, 122, 123, 124, 125, - 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */ - 79, 84, 83, 90, 95, 100, 105, 106, - 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */ - 96, 101, 99, 104, 45, 129, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */ - 0, 0, 0, 0, 0, 107, 0, 56, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ - 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */ -}; - -#ifdef QWERTY_KEYBOARD - -static const int8_t kbd_key[] = { - '\0', '`', '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', '\0', '\r', - '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', - 'i', 'o', 'p', '[', ']', '\\', - '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', - 'k', 'l', ';', '\'', '\0', '\n', - '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', - 'm', ',', '.', '/', '\0', '\0', - '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '7', '4', '1', - '\0', '/', '8', '5', '2', - '0', '*', '9', '6', '3', - '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0' -}; - -static const int8_t kbd_key_shift[] = { - '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', - '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', - 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G', - 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', - 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; - -#else - -static const int8_t kbd_key[] = { - '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u', - 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g', - 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x', - 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1', '\0', '/', - '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0', - '\n', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; - -static const int8_t kbd_key_shift[] = { - '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', - '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', - 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K', - 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N', - '?', '.', '/', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; - -#endif /* QWERTY_KEYBOARD */ - -/*! - \brief initialize the mouse function - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -usbh_status usbh_hid_mouse_init(usb_core_driver *udev, usbh_host *uhost) -{ - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - mouse_info.x = 0U; - mouse_info.y = 0U; - mouse_info.buttons[0] = 0U; - mouse_info.buttons[1] = 0U; - mouse_info.buttons[2] = 0U; - - if(hid->len > sizeof(hid_mouse_info)) { - hid->len = sizeof(hid_mouse_info); - } - - hid->pdata = (uint8_t *)(void *)hid_mouse_info; - - usr_mouse_init(); - - return USBH_OK; -} - -/*! - \brief decode mouse information - \param[in] data: pointer to input data - \param[out] none - \retval operation status -*/ -usbh_status usbh_hid_mouse_decode(uint8_t *data) -{ - mouse_info.buttons[0] = data[0] & MOUSE_BUTTON_1; - mouse_info.buttons[1] = data[0] & MOUSE_BUTTON_2; - mouse_info.buttons[2] = data[0] & MOUSE_BUTTON_3; - - mouse_info.x = data[1]; - mouse_info.y = data[2]; - - /* handle mouse data position */ - usr_mouse_process_data(&mouse_info); - - return USBH_FAIL; -} - -/*! - \brief initialize the keyboard function - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -usbh_status usbh_hid_keybrd_init(usb_core_driver *udev, usbh_host *uhost) -{ - usbh_hid_handler *hid = (usbh_hid_handler *)uhost->active_class->class_data; - - keybd_info.lctrl = keybd_info.lshift = 0U; - keybd_info.lalt = keybd_info.lgui = 0U; - keybd_info.rctrl = keybd_info.rshift = 0U; - keybd_info.ralt = keybd_info.rgui = 0U; - - for(uint32_t x = 0U; x < (sizeof(keybd_report_data) / sizeof(uint32_t)); x++) { - keybd_report_data[x] = 0U; - } - - if(hid->len > (sizeof(keybd_report_data) / sizeof(uint32_t))) { - hid->len = (sizeof(keybd_report_data) / sizeof(uint32_t)); - } - - hid->pdata = (uint8_t *)(void *)keybd_report_data; - - /* call user initialization*/ - usr_keybrd_init(); - - return USBH_OK; -} - -/*! - \brief get ASCII code - \param[in] info: keyboard information - \param[out] none - \retval output -*/ -uint8_t usbh_hid_ascii_code_get(hid_keybd_info *info) -{ - uint8_t output = 0U; - - if((1U == info->lshift) || (info->rshift)) { - output = kbd_key_shift[kbd_codes[info->keys[0]]]; - } else { - output = kbd_key[kbd_codes[info->keys[0]]]; - } - - return output; -} - -/*! - \brief decode keyboard information - \param[in] udev: pointer to USB core instance - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -usbh_status usbh_hid_keybrd_decode(uint8_t *data) -{ - uint8_t output = 0U; - - keybd_info.lshift = data[0] & KBD_LEFT_SHIFT; - keybd_info.rshift = data[0] & KBD_RIGHT_SHIFT; - - keybd_info.keys[0] = data[2]; - - if(keybd_info.lshift || keybd_info.rshift) { - output = kbd_key_shift[kbd_codes[keybd_info.keys[0]]]; - } else { - output = kbd_key[kbd_codes[keybd_info.keys[0]]]; - } - - if(0U != output) { - usr_keybrd_process_data(output); - } - - return USBH_OK; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h deleted file mode 100644 index 1ba83f601b2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_bbb.h +++ /dev/null @@ -1,148 +0,0 @@ -/*! - \file usbh_msc_bbb.h - \brief header file for usbh_msc_bbb.c - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_MSC_BBB_H -#define USBH_MSC_BBB_H - -#include "msc_bbb.h" -#include "usbh_core.h" - -#define USBH_MSC_BBB_CBW_TAG 0x20304050U /*!< MSC BBB CBW tag */ - -#define USBH_MSC_CSW_MAX_LENGTH 63U /*!< MSC CSW maximum length */ - -#define USBH_MSC_SEND_CSW_DISABLE 0U /*!< MSC send CSW disable */ -#define USBH_MSC_SEND_CSW_ENABLE 1U /*!< MSC send CSW enable */ - -#define USBH_MSC_DIR_IN 0U /*!< MSC data transfer IN */ -#define USBH_MSC_DIR_OUT 1U /*!< MSC data transfer OUT */ -#define USBH_MSC_BOTH_DIR 2U /*!< MSC data transfer IN/OUT */ - -#define USBH_MSC_PAGE_LENGTH 512U /*!< MSC memory page length */ - -#define CBW_CB_LENGTH 16U /*!< MSC CBW CB length */ -#define CBW_LENGTH 10U /*!< MSC CBW length */ -#define CBW_LENGTH_TEST_UNIT_READY 0U /*!< MSC CBW test unit ready length */ - -#define MAX_BULK_STALL_COUNT_LIMIT 0x04U /*!< if STALL is seen on bulk - endpoint continously, this means - that device and host has phase error - hence a reset is needed */ - -typedef union { - msc_bbb_cbw field; /*!< MSC BBB CBW structure */ - - uint8_t CBWArray[31]; /*!< MSC BBB CBW array buff */ -}usbh_cbw_pkt; - -typedef union { - msc_bbb_csw field; /*!< MSC BBB CSW structure */ - - uint8_t CSWArray[13]; /*!< MSC BBB CSW array buff */ -}usbh_csw_pkt; - -enum usbh_msc_state { - USBH_MSC_BBB_INIT_STATE = 0U, /*!< MSC BBB init state */ - USBH_MSC_BBB_RESET, /*!< MSC BBB reset state */ - USBH_MSC_GET_MAX_LUN, /*!< MSC init state */ - USBH_MSC_TEST_UNIT_READY, /*!< MSC test unit ready state */ - USBH_MSC_READ_CAPACITY10, /*!< MSC read capacity10 state */ - USBH_MSC_MODE_SENSE6, /*!< MSC sense6 mode state */ - USBH_MSC_REQUEST_SENSE, /*!< MSC request sense state */ - USBH_MSC_BBB_USB_TRANSFERS, /*!< MSC BBB transfers state */ - USBH_MSC_DEFAULT_APPLI_STATE, /*!< MSC default application state */ - USBH_MSC_CTRL_ERROR_STATE, /*!< MSC control error state */ - USBH_MSC_UNRECOVERED_STATE /*!< MSC unrecovered state */ -}; - -/* MSC BBB status types */ -typedef enum { - BBB_OK = 0U, /*!< MSC BBB OK status */ - BBB_FAIL, /*!< MSC BBB fail status */ - BBB_PHASE_ERROR, /*!< MSC BBB phase error status */ - BBB_BUSY /*!< MSC BBB busy status */ -} bbb_status; - -/* MSC BBB command state types */ -typedef enum { - BBB_CMD_IDLE = 0U, /*!< MSC BBB command idle state */ - BBB_CMD_SEND, /*!< MSC BBB command send state */ - BBB_CMD_WAIT /*!< MSC BBB command wait state */ -} bbb_cmd_state; - -/* CSW status definitions */ -typedef enum { - BBB_CSW_CMD_PASSED = 0U, /*!< MSC BBB CSW command passed status */ - BBB_CSW_CMD_FAILED, /*!< MSC BBB CSW command failed status */ - BBB_CSW_PHASE_ERROR /*!< MSC BBB CSW phase error status */ -} bbb_csw_status; - -/* MSC BBB state types */ -typedef enum { - BBB_SEND_CBW = 1U, /*!< MSC BBB send CBW state */ - BBB_SEND_CBW_WAIT, /*!< MSC BBB send CBW wait state */ - BBB_DATA_IN, /*!< MSC BBB data IN state */ - BBB_DATA_IN_WAIT, /*!< MSC BBB data IN wait state */ - BBB_DATA_OUT, /*!< MSC BBB data OUT state */ - BBB_DATA_OUT_WAIT, /*!< MSC BBB data OUT wait state */ - BBB_RECEIVE_CSW, /*!< MSC BBB receive CSW state */ - BBB_RECEIVE_CSW_WAIT, /*!< MSC BBB receive CSW wait state */ - BBB_ERROR_IN, /*!< MSC BBB error IN state */ - BBB_ERROR_OUT, /*!< MSC BBB error OUT state */ - BBB_UNRECOVERED_ERROR /*!< MSC BBB unrecovered error state */ -} bbb_state; - -typedef struct { - uint8_t *pbuf; /*!< MSC BBB data buff pointer */ - uint32_t data[16]; /*!< MSC BBB data buff */ - bbb_state state; /*!< MSC BBB state */ - bbb_state prev_state; /*!< MSC BBB previous state */ - bbb_cmd_state cmd_state; /*!< MSC BBB command state */ - usbh_cbw_pkt cbw; /*!< MSC CBW pocket structure */ - usbh_csw_pkt csw; /*!< MSC CSW pocket structure */ -} bbb_handle; - -/* function declarations */ -/* initialize the mass storage parameters */ -void usbh_msc_bbb_init(usbh_host *uhost); -/* manage the different states of BBB transfer and updates the status to upper layer */ -usbh_status usbh_msc_bbb_process(usbh_host *uhost, uint8_t lun); -/* manages the different error handling for STALL */ -usbh_status usbh_msc_bbb_abort(usbh_host *uhost, uint8_t direction); -/* reset MSC BBB request structure */ -usbh_status usbh_msc_bbb_reset(usbh_host *uhost); -/* decode the CSW received by the device and updates the same to upper layer */ -bbb_csw_status usbh_msc_csw_decode(usbh_host *uhost); - -#endif /* USBH_MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h deleted file mode 100644 index d35bf9cd711..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_core.h +++ /dev/null @@ -1,122 +0,0 @@ -/*! - \file usbh_core.h - \brief header file for the usbh_core.c - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_MSC_CORE_H -#define USBH_MSC_CORE_H - -#include "usb_msc.h" -#include "usbh_msc_scsi.h" -#include "usbh_msc_bbb.h" - -#define MSC_MAX_SUPPORTED_LUN 2U - -/* MSC state types */ -typedef enum { - MSC_INIT = 0U, /*!< MSC init state */ - MSC_IDLE, /*!< MSC idle state */ - MSC_TEST_UNIT_READY, /*!< MSC test unit ready state */ - MSC_READ_CAPACITY10, /*!< MSC read capacity10 state */ - MSC_READ_INQUIRY, /*!< MSC read inquiry state */ - MSC_REQUEST_SENSE, /*!< MSC request sense state */ - MSC_READ, /*!< MSC read state */ - MSC_WRITE, /*!< MSC write state */ - MSC_UNRECOVERED_ERROR, /*!< MSC unrecovered state */ - MSC_PERIODIC_CHECK /*!< MSC periodic check state */ -} msc_state; - -/* MSC error types */ -typedef enum { - MSC_OK = 0U, /*!< MSC no error */ - MSC_NOT_READY, /*!< MSC not ready */ - MSC_ERROR /*!< MSC error */ -} msc_error; - -/* MSC request types */ -typedef enum { - MSC_REQ_IDLE = 0U, /*!< MSC idle request state */ - MSC_REQ_RESET, /*!< MSC reset request state */ - MSC_REQ_GET_MAX_LUN, /*!< MSC get maximum LUN request state */ - MSC_REQ_ERROR /*!< MSC error request state */ -} msc_req_state; - -/* structure for LUN */ -typedef struct { - msc_state state; /*!< MSC LUN state */ - msc_error error; /*!< MSC LUN error */ - msc_scsi_sense sense; /*!< MSC SCSI sense */ - scsi_capacity capacity; /*!< MSC SCSI capacity */ - scsi_std_inquiry_data inquiry; /*!< MSC SCSI standard inquiry data */ - usbh_status prev_ready_state; /*!< MSC previous ready state */ - uint8_t state_changed; /*!< MSC state changed */ -} msc_lun; - -/* structure for MSC process */ -typedef struct _msc_process { - uint8_t pipe_in; /*!< MSC pipe IN */ - uint8_t pipe_out; /*!< MSC pipe OUT */ - uint8_t ep_in; /*!< MSC endpoint IN */ - uint8_t ep_out; /*!< MSC endpoint OUT */ - uint16_t ep_size_in; /*!< MSC endpoint IN size */ - uint16_t ep_size_out; /*!< MSC endpoint OUT size */ - uint8_t cur_lun; /*!< MSC current LUN */ - uint16_t rw_lun; /*!< MSC review LUN */ - uint32_t max_lun; /*!< MSC maximum LUN */ - msc_state state; /*!< MSC state */ - msc_error error; /*!< MSC error */ - msc_req_state req_state; /*!< MSC request state */ - msc_req_state prev_req_state; /*!< MSC previous request state */ - bbb_handle bbb; /*!< MSC BBB correlation parameter handle */ - msc_lun unit[MSC_MAX_SUPPORTED_LUN]; /*!< MSC LUN unit buff */ - uint32_t timer; /*!< MSC read/write timer */ -} usbh_msc_handler; - -extern usbh_class usbh_msc; - -/* function declarations */ -/* get MSC logic unit information */ -usbh_status usbh_msc_lun_info_get(usbh_host *uhost, uint8_t lun, msc_lun *info); -/* MSC read interface */ -usbh_status usbh_msc_read(usbh_host *uhost, \ - uint8_t lun, \ - uint32_t address, \ - uint8_t *pbuf, \ - uint32_t length); -/* MSC write interface */ -usbh_status usbh_msc_write(usbh_host *uhost, \ - uint8_t lun, \ - uint32_t address, \ - uint8_t *pbuf, \ - uint32_t length); - -#endif /* USBH_MSC_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h deleted file mode 100644 index a4df7e91bac..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Include/usbh_msc_scsi.h +++ /dev/null @@ -1,97 +0,0 @@ -/*! - \file usbh_msc_scsi.h - \brief header file for usbh_msc_scsi.c - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_MSC_SCSI_H -#define USBH_MSC_SCSI_H - -#include "msc_scsi.h" -#include "usbh_enum.h" - -#define DESC_REQUEST_SENSE 00U /*!< sense request descriptor */ -#define ALLOCATION_LENGTH_REQUEST_SENSE 63U /*!< sense request allocation length */ -#define XFER_LEN_MODE_SENSE6 63U /*!< MSC sense6 mode transfer length */ - -#define MASK_MODE_SENSE_WRITE_PROTECT 0x80U /*!< sense write protect mask mode */ -#define MODE_SENSE_PAGE_CONTROL_FIELD 0x00U /*!< sense page control field mode */ -#define MODE_SENSE_PAGE_CODE 0x3FU /*!< sense page code mode */ -#define DISK_WRITE_PROTECTED 0x01U /*!< disk write protected */ - -/* capacity data */ -typedef struct { - uint32_t block_nbr; /*!< MSC SCSI block number */ - uint16_t block_size; /*!< MSC SCSI block size */ -} scsi_capacity; - -/* inquiry data */ -typedef struct { - uint8_t peripheral_qualifier; /*!< MSC SCSI standard peripheral qualifier */ - uint8_t device_type; /*!< MSC SCSI standard inquiry device types */ - uint8_t removable_media; /*!< MSC SCSI standard inquiry removable media */ - uint8_t vendor_id[9]; /*!< MSC SCSI standard inquiry vendor id buff */ - uint8_t product_id[17]; /*!< MSC SCSI standard inquiry product id buff */ - uint8_t revision_id[5]; /*!< MSC SCSI standard inquiry revision id buff */ -} scsi_std_inquiry_data; - -typedef struct { - uint32_t msc_capacity; /*!< MSC capacity */ - uint32_t msc_sense_key; /*!< MSC sense key */ - uint16_t msc_page_len; /*!< MSC memory page length */ - uint8_t msc_write_protect; /*!< MSC write protect */ -}usbh_msc_parameter; - -/* function declarations */ -/* send 'inquiry' command to the device */ -usbh_status usbh_msc_scsi_inquiry(usbh_host *uhost, uint8_t lun, scsi_std_inquiry_data *inquiry); -/* send 'test unit ready' command to the device */ -usbh_status usbh_msc_test_unitready(usbh_host *uhost, uint8_t lun); -/* send the read capacity command to the device */ -usbh_status usbh_msc_read_capacity10(usbh_host *uhost, uint8_t lun, scsi_capacity *capacity); -/* send the mode sense6 command to the device */ -usbh_status usbh_msc_mode_sense6(usbh_host *uhost, uint8_t lun); -/* send the request sense command to the device */ -usbh_status usbh_msc_request_sense(usbh_host *uhost, uint8_t lun, msc_scsi_sense *sense_data); -/* send the write10 command to the device */ -usbh_status usbh_msc_write10(usbh_host *uhost, \ - uint8_t lun, \ - uint8_t *data_buf, \ - uint32_t addr, \ - uint32_t byte_num); -/* send the read10 command to the device */ -usbh_status usbh_msc_read10(usbh_host *uhost, \ - uint8_t lun, \ - uint8_t *data_buf, \ - uint32_t addr, \ - uint32_t byte_num); - -#endif /* USBH_MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c deleted file mode 100644 index 85b8c32beb3..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_bbb.c +++ /dev/null @@ -1,360 +0,0 @@ -/*! - \file usbh_msc_bbb.c - \brief USB MSC BBB protocol related functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_pipe.h" -#include "usbh_transc.h" -#include "usbh_msc_core.h" -#include "usbh_msc_bbb.h" - -/*! - \brief initialize the mass storage parameters - \param[in] uhost: pointer to USB host handler - \param[out] none - \retval none -*/ -void usbh_msc_bbb_init(usbh_host *uhost) -{ - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - msc->bbb.cbw.field.dCBWSignature = BBB_CBW_SIGNATURE; - msc->bbb.cbw.field.dCBWTag = USBH_MSC_BBB_CBW_TAG; - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_SEND; -} - -/*! - \brief manage the different states of BBB transfer and updates the status to upper layer - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_bbb_process(usbh_host *uhost, uint8_t lun) -{ - bbb_csw_status csw_status = BBB_CSW_CMD_FAILED; - usbh_status status = USBH_BUSY; - usbh_status error = USBH_BUSY; - usb_urb_state urb_status = URB_IDLE; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.state) { - case BBB_SEND_CBW: - msc->bbb.cbw.field.bCBWLUN = lun; - msc->bbb.state = BBB_SEND_CBW_WAIT; - /* send CBW */ - usbh_data_send(uhost->data, \ - msc->bbb.cbw.CBWArray, \ - msc->pipe_out, \ - BBB_CBW_LENGTH); - break; - - case BBB_SEND_CBW_WAIT: - urb_status = usbh_urbstate_get(uhost->data, msc->pipe_out); - - if(URB_DONE == urb_status) { - if(0U != msc->bbb.cbw.field.dCBWDataTransferLength) { - if(USB_TRX_IN == (msc->bbb.cbw.field.bmCBWFlags & USB_TRX_MASK)) { - msc->bbb.state = BBB_DATA_IN; - } else { - msc->bbb.state = BBB_DATA_OUT; - } - } else { - msc->bbb.state = BBB_RECEIVE_CSW; - } - - } else if(URB_NOTREADY == urb_status) { - msc->bbb.state = BBB_SEND_CBW; - } else { - if(URB_STALL == urb_status) { - msc->bbb.state = BBB_ERROR_OUT; - } - } - break; - - case BBB_DATA_IN: - usbh_data_recev(uhost->data, \ - msc->bbb.pbuf, \ - msc->pipe_in, \ - msc->ep_size_in); - - msc->bbb.state = BBB_DATA_IN_WAIT; - break; - - case BBB_DATA_IN_WAIT: - urb_status = usbh_urbstate_get(uhost->data, msc->pipe_in); - - /* BBB DATA IN stage */ - if(URB_DONE == urb_status) { - if(msc->bbb.cbw.field.dCBWDataTransferLength > msc->ep_size_in) { - msc->bbb.pbuf += msc->ep_size_in; - msc->bbb.cbw.field.dCBWDataTransferLength -= msc->ep_size_in; - } else { - msc->bbb.cbw.field.dCBWDataTransferLength = 0U; - } - - if(msc->bbb.cbw.field.dCBWDataTransferLength > 0U) { - usbh_data_recev(uhost->data, \ - msc->bbb.pbuf, \ - msc->pipe_in, \ - msc->ep_size_in); - } else { - msc->bbb.state = BBB_RECEIVE_CSW; - } - } else if(URB_STALL == urb_status) { - /* this is data stage STALL condition */ - msc->bbb.state = BBB_ERROR_IN; - } else { - /* no operation */ - } - break; - - case BBB_DATA_OUT: - usbh_data_send(uhost->data, \ - msc->bbb.pbuf, \ - msc->pipe_out, \ - msc->ep_size_out); - - msc->bbb.state = BBB_DATA_OUT_WAIT; - break; - - case BBB_DATA_OUT_WAIT: - /* BBB DATA OUT stage */ - urb_status = usbh_urbstate_get(uhost->data, msc->pipe_out); - if(URB_DONE == urb_status) { - if(msc->bbb.cbw.field.dCBWDataTransferLength > msc->ep_size_out) { - msc->bbb.pbuf += msc->ep_size_out; - msc->bbb.cbw.field.dCBWDataTransferLength -= msc->ep_size_out; - } else { - msc->bbb.cbw.field.dCBWDataTransferLength = 0U; /* reset this value and keep in same state */ - } - - if(msc->bbb.cbw.field.dCBWDataTransferLength > 0U) { - usbh_data_send(uhost->data, \ - msc->bbb.pbuf, \ - msc->pipe_out, \ - msc->ep_size_out); - } else { - msc->bbb.state = BBB_RECEIVE_CSW; - } - } else if(URB_NOTREADY == urb_status) { - msc->bbb.state = BBB_DATA_OUT; - } else if(URB_STALL == urb_status) { - msc->bbb.state = BBB_ERROR_OUT; - } else { - /* no operation */ - } - break; - - case BBB_RECEIVE_CSW: - /* BBB CSW stage */ - usbh_data_recev(uhost->data, \ - msc->bbb.csw.CSWArray, \ - msc->pipe_in, \ - BBB_CSW_LENGTH); - - msc->bbb.state = BBB_RECEIVE_CSW_WAIT; - break; - - case BBB_RECEIVE_CSW_WAIT: - urb_status = usbh_urbstate_get(uhost->data, msc->pipe_in); - - /* decode CSW */ - if(URB_DONE == urb_status) { - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_SEND; - - csw_status = usbh_msc_csw_decode(uhost); - if(BBB_CSW_CMD_PASSED == csw_status) { - status = USBH_OK; - } else { - status = USBH_FAIL; - } - } else if(URB_STALL == urb_status) { - msc->bbb.state = BBB_ERROR_IN; - } else { - /* no operation */ - } - break; - - case BBB_ERROR_IN: - error = usbh_msc_bbb_abort(uhost, USBH_MSC_DIR_IN); - - if(USBH_OK == error) { - msc->bbb.state = BBB_RECEIVE_CSW; - } else if(USBH_UNRECOVERED_ERROR == status) { - /* this means that there is a STALL error limit, do reset recovery */ - msc->bbb.state = BBB_UNRECOVERED_ERROR; - } else { - /* no operation */ - } - break; - - case BBB_ERROR_OUT: - status = usbh_msc_bbb_abort(uhost, USBH_MSC_DIR_OUT); - - if(USBH_OK == status) { - uint8_t toggle = usbh_pipe_toggle_get(uhost->data, msc->pipe_out); - usbh_pipe_toggle_set(uhost->data, msc->pipe_out, 1U - toggle); - usbh_pipe_toggle_set(uhost->data, msc->pipe_in, 0U); - msc->bbb.state = BBB_ERROR_IN; - } else { - if(USBH_UNRECOVERED_ERROR == status) { - msc->bbb.state = BBB_UNRECOVERED_ERROR; - } - } - break; - - case BBB_UNRECOVERED_ERROR: - status = usbh_msc_bbb_reset(uhost); - if(USBH_OK == status) { - msc->bbb.state = BBB_SEND_CBW; - } - break; - - default: - break; - } - - return status; -} - -/*! - \brief manages the different error handling for stall - \param[in] uhost: pointer to USB host handler - \param[in] direction: data IN or OUT - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_bbb_abort(usbh_host *uhost, uint8_t direction) -{ - usbh_status status = USBH_BUSY; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(direction) { - case USBH_MSC_DIR_IN : - /* send clrfeature command on bulk IN endpoint */ - status = usbh_clrfeature(uhost, \ - msc->ep_in, \ - msc->pipe_in); - break; - - case USBH_MSC_DIR_OUT : - /*send clrfeature command on bulk OUT endpoint */ - status = usbh_clrfeature(uhost, \ - msc->ep_out, \ - msc->pipe_out); - break; - - default: - break; - } - - return status; -} - -/*! - \brief reset MSC BBB transfer - \param[in] uhost: pointer to USB host handler - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_bbb_reset(usbh_host *uhost) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_REQTYPE_CLASS | USB_RECPTYPE_ITF, - .bRequest = BBB_RESET, - .wValue = 0U, - .wIndex = 0U, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief decode the CSW received by the device and updates the same to upper layer - \param[in] uhost: pointer to USB host - \param[out] none - \retval on success USBH_MSC_OK, on failure USBH_MSC_FAIL - \notes - Refer to USB Mass-Storage Class: BBB (www.usb.org) - 6.3.1 Valid CSW Conditions : - The host shall consider the CSW valid when: - 1. dCSWSignature is equal to 53425355h - 2. the CSW is 13 (Dh) bytes in length, - 3. dCSWTag matches the dCBWTag from the corresponding CBW. -*/ -bbb_csw_status usbh_msc_csw_decode(usbh_host *uhost) -{ - bbb_csw_status status = BBB_CSW_CMD_FAILED; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - /* checking if the transfer length is different than 13 */ - if(BBB_CSW_LENGTH != usbh_xfercount_get(uhost->data, msc->pipe_in)) { - status = BBB_CSW_PHASE_ERROR; - } else { - /* CSW length is correct */ - - /* check validity of the CSW Signature and CSWStatus */ - if(BBB_CSW_SIGNATURE == msc->bbb.csw.field.dCSWSignature) { - /* check condition 1. dCSWSignature is equal to 53425355h */ - if(msc->bbb.csw.field.dCSWTag == msc->bbb.cbw.field.dCBWTag) { - /* check condition 3. dCSWTag matches the dCBWTag from the corresponding CBW */ - if(0U == msc->bbb.csw.field.bCSWStatus) { - status = BBB_CSW_CMD_PASSED; - } else if(1U == msc->bbb.csw.field.bCSWStatus) { - status = BBB_CSW_CMD_FAILED; - } else if(2U == msc->bbb.csw.field.bCSWStatus) { - status = BBB_CSW_PHASE_ERROR; - } else { - /* no operation */ - } - } - } else { - /* if the CSW signature is not valid, we shall return the phase error to - upper layers for reset recovery */ - status = BBB_CSW_PHASE_ERROR; - } - } - - return status; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c deleted file mode 100644 index 5e19cae3b39..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_core.c +++ /dev/null @@ -1,551 +0,0 @@ -/*! - \file usbh_core.c - \brief USB MSC(mass storage device) class driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_msc_core.h" -#include "usbh_pipe.h" -#include "usbh_transc.h" -#include - -/* local function prototypes ('static') */ -static void usbh_msc_itf_deinit(usbh_host *uhost); -static usbh_status usbh_msc_itf_init(usbh_host *uhost); -static usbh_status usbh_msc_req(usbh_host *uhost); -static usbh_status usbh_msc_handle(usbh_host *uhost); -static usbh_status usbh_msc_maxlun_get(usbh_host *uhost, uint8_t *maxlun); -static usbh_status usbh_msc_rdwr_process(usbh_host *uhost, uint8_t lun); - -usbh_class usbh_msc = { - USB_CLASS_MSC, - usbh_msc_itf_init, - usbh_msc_itf_deinit, - usbh_msc_req, - usbh_msc_handle -}; - -/*! - \brief get MSC logic unit information - \param[in] uhost: pointer to USB host - \param[in] lun: logic unit number - \param[in] info: pointer to logic unit information - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_lun_info_get(usbh_host *uhost, uint8_t lun, msc_lun *info) -{ - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - if(HOST_CLASS_HANDLER == uhost->cur_state) { - memcpy(info, &msc->unit[lun], sizeof(msc_lun)); - - return USBH_OK; - } else { - return USBH_FAIL; - } -} - -/*! - \brief MSC read interface - \param[in] uhost: pointer to USB host - \param[in] lun: logic unit number - \param[in] address: address to be read - \param[in] pbuf: pointer to user buffer - \param[in] length: length to be read - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_read(usbh_host *uhost, \ - uint8_t lun, \ - uint32_t address, \ - uint8_t *pbuf, \ - uint32_t length) -{ - uint32_t timeout = 0U; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - usb_core_driver *udev = (usb_core_driver *)uhost->data; - - if((0U == udev->host.connect_status) || \ - (HOST_CLASS_HANDLER != uhost->cur_state) || \ - (MSC_IDLE != msc->unit[lun].state)) { - return USBH_FAIL; - } - - msc->state = MSC_READ; - msc->unit[lun].state = MSC_READ; - msc->rw_lun = lun; - - usbh_msc_read10(uhost, lun, pbuf, address, length); - - timeout = uhost->control.timer; - - while(USBH_BUSY == usbh_msc_rdwr_process(uhost, lun)) { - if(((uhost->control.timer - timeout) > (10000U * length)) || (0U == udev->host.connect_status)) { - msc->state = MSC_IDLE; - return USBH_FAIL; - } - } - - msc->state = MSC_IDLE; - - return USBH_OK; -} - -/*! - \brief MSC write interface - \param[in] uhost: pointer to USB host - \param[in] lun: logic unit number - \param[in] address: address to be written - \param[in] pbuf: pointer to user buffer - \param[in] length: length to be written - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_write(usbh_host *uhost, \ - uint8_t lun, \ - uint32_t address, \ - uint8_t *pbuf, \ - uint32_t length) -{ - uint32_t timeout = 0U; - usb_core_driver *udev = (usb_core_driver *)uhost->data; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - if((0U == udev->host.connect_status) || \ - (HOST_CLASS_HANDLER != uhost->cur_state) || \ - (MSC_IDLE != msc->unit[lun].state)) { - return USBH_FAIL; - } - - msc->state = MSC_WRITE; - msc->unit[lun].state = MSC_WRITE; - msc->rw_lun = lun; - - usbh_msc_write10(uhost, lun, pbuf, address, length); - - timeout = uhost->control.timer; - - while(USBH_BUSY == usbh_msc_rdwr_process(uhost, lun)) { - if(((uhost->control.timer - timeout) > (10000U * length)) || (0U == udev->host.connect_status)) { - msc->state = MSC_IDLE; - return USBH_FAIL; - } - } - - msc->state = MSC_IDLE; - - return USBH_OK; -} - -/*! - \brief de-initialize interface by freeing host channels allocated to interface - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static void usbh_msc_itf_deinit(usbh_host *uhost) -{ - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - if(msc->pipe_out) { - usb_pipe_halt(uhost->data, msc->pipe_out); - usbh_pipe_free(uhost->data, msc->pipe_out); - - msc->pipe_out = 0U; - } - - if(msc->pipe_in) { - usb_pipe_halt(uhost->data, msc->pipe_in); - usbh_pipe_free(uhost->data, msc->pipe_in); - - msc->pipe_in = 0U; - } -} - -/*! - \brief interface initialization for MSC class - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_msc_itf_init(usbh_host *uhost) -{ - usbh_status status = USBH_OK; - - uint8_t interface = usbh_interface_find(&uhost->dev_prop, MSC_CLASS, USB_MSC_SUBCLASS_SCSI, MSC_PROTOCOL); - - if(0xFFU == interface) { - uhost->usr_cb->dev_not_supported(); - - status = USBH_FAIL; - } else { - static usbh_msc_handler msc_handler; - - memset((void *)&msc_handler, 0U, sizeof(usbh_msc_handler)); - - uhost->active_class->class_data = (void *)&msc_handler; - - usbh_interface_select(&uhost->dev_prop, interface); - - usb_desc_ep *ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[interface][0].ep_desc[0]; - - if(ep_desc->bEndpointAddress & 0x80U) { - msc_handler.ep_in = ep_desc->bEndpointAddress; - msc_handler.ep_size_in = ep_desc->wMaxPacketSize; - } else { - msc_handler.ep_out = ep_desc->bEndpointAddress; - msc_handler.ep_size_out = ep_desc->wMaxPacketSize; - } - - ep_desc = &uhost->dev_prop.cfg_desc_set.itf_desc_set[interface][0].ep_desc[1]; - - if(ep_desc->bEndpointAddress & 0x80U) { - msc_handler.ep_in = ep_desc->bEndpointAddress; - msc_handler.ep_size_in = ep_desc->wMaxPacketSize; - } else { - msc_handler.ep_out = ep_desc->bEndpointAddress; - msc_handler.ep_size_out = ep_desc->wMaxPacketSize; - } - - msc_handler.state = MSC_INIT; - msc_handler.error = MSC_OK; - msc_handler.req_state = MSC_REQ_IDLE; - msc_handler.pipe_out = usbh_pipe_allocate(uhost->data, msc_handler.ep_out); - msc_handler.pipe_in = usbh_pipe_allocate(uhost->data, msc_handler.ep_in); - - usbh_msc_bbb_init(uhost); - - /* open the new channels */ - usbh_pipe_create(uhost->data, \ - &uhost->dev_prop, \ - msc_handler.pipe_out, \ - USB_EPTYPE_BULK, \ - msc_handler.ep_size_out); - - usbh_pipe_create(uhost->data, \ - &uhost->dev_prop, \ - msc_handler.pipe_in, \ - USB_EPTYPE_BULK, \ - msc_handler.ep_size_in); - - usbh_pipe_toggle_set(uhost->data, msc_handler.pipe_out, 0U); - usbh_pipe_toggle_set(uhost->data, msc_handler.pipe_in, 0U); - } - - return status; -} - -/*! - \brief initialize the MSC state machine - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_msc_req(usbh_host *uhost) -{ - usbh_status status = USBH_BUSY; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->req_state) { - case MSC_REQ_IDLE: - case MSC_REQ_GET_MAX_LUN: - /* issue Get_MaxLun request */ - status = usbh_msc_maxlun_get(uhost, (uint8_t *)&msc->max_lun); - - if(USBH_OK == status) { - msc->max_lun = ((uint8_t)msc->max_lun > MSC_MAX_SUPPORTED_LUN) ? MSC_MAX_SUPPORTED_LUN : (uint8_t)msc->max_lun + 1U; - - for(uint8_t i = 0U; i < msc->max_lun; i++) { - msc->unit[i].prev_ready_state = USBH_FAIL; - msc->unit[i].state_changed = 0U; - } - } else { - if(USBH_NOT_SUPPORTED == status) { - msc->max_lun = 0U; - status = USBH_OK; - } - } - break; - - case MSC_REQ_ERROR: - /* issue clearfeature request */ - if(USBH_OK == usbh_clrfeature(uhost, 0x00U, uhost->control.pipe_out_num)) { - msc->req_state = msc->prev_req_state; - } - break; - - default: - break; - } - - return status; -} - -/*! - \brief MSC state machine handler - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static usbh_status usbh_msc_handle(usbh_host *uhost) -{ - usbh_status status = USBH_BUSY; - uint8_t scsi_status = USBH_BUSY; - uint8_t ready_status = USBH_BUSY; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->state) { - case MSC_INIT: - if(msc->cur_lun < msc->max_lun) { - msc->unit[msc->cur_lun].error = MSC_NOT_READY; - - switch(msc->unit[msc->cur_lun].state) { - case MSC_INIT: - msc->unit[msc->cur_lun].state = MSC_READ_INQUIRY; - msc->timer = uhost->control.timer; - break; - - case MSC_READ_INQUIRY: - scsi_status = usbh_msc_scsi_inquiry(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].inquiry); - - if(USBH_OK == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_TEST_UNIT_READY; - } else if(USBH_FAIL == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; - } else { - if(USBH_UNRECOVERED_ERROR == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->unit[msc->cur_lun].error = MSC_ERROR; - } - } - break; - - case MSC_TEST_UNIT_READY: - /* issue SCSI command TestUnitReady */ - ready_status = usbh_msc_test_unitready(uhost, msc->cur_lun); - - if(USBH_OK == ready_status) { - if(USBH_OK != msc->unit[msc->cur_lun].prev_ready_state) { - msc->unit[msc->cur_lun].state_changed = 1U; - } else { - msc->unit[msc->cur_lun].state_changed = 0U; - } - - msc->unit[msc->cur_lun].state = MSC_READ_CAPACITY10; - msc->unit[msc->cur_lun].error = MSC_OK; - msc->unit[msc->cur_lun].prev_ready_state = USBH_OK; - } else if(USBH_FAIL == ready_status) { - if(USBH_FAIL != msc->unit[msc->cur_lun].prev_ready_state) { - msc->unit[msc->cur_lun].state_changed = 1U; - } else { - msc->unit[msc->cur_lun].state_changed = 0U; - } - - msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; - msc->unit[msc->cur_lun].error = MSC_NOT_READY; - msc->unit[msc->cur_lun].prev_ready_state = USBH_FAIL; - } else { - if(USBH_UNRECOVERED_ERROR == ready_status) { - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->unit[msc->cur_lun].error = MSC_ERROR; - } - } - break; - - case MSC_READ_CAPACITY10: - /* issue READ_CAPACITY10 SCSI command */ - scsi_status = usbh_msc_read_capacity10(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].capacity); - - if(USBH_OK == scsi_status) { - if(1U == msc->unit[msc->cur_lun].state_changed) { - } - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->unit[msc->cur_lun].error = MSC_OK; - msc->cur_lun ++; - } else if(USBH_FAIL == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_REQUEST_SENSE; - } else { - if(USBH_UNRECOVERED_ERROR == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->unit[msc->cur_lun].error = MSC_ERROR; - } - } - break; - - case MSC_REQUEST_SENSE: - /* issue RequestSense SCSI command for retrieving error code */ - scsi_status = usbh_msc_request_sense(uhost, msc->cur_lun, &msc->unit[msc->cur_lun].sense); - if(USBH_OK == scsi_status) { - if((UNIT_ATTENTION == msc->unit[msc->cur_lun].sense.SenseKey) || (NOT_READY == msc->unit[msc->cur_lun].sense.SenseKey)) { - if((uhost->control.timer - msc->timer) < 10000U) { - msc->unit[msc->cur_lun].state = MSC_TEST_UNIT_READY; - break; - } - } - - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->cur_lun++; - } else if(USBH_FAIL == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_UNRECOVERED_ERROR; - } else { - if(MSC_UNRECOVERED_ERROR == scsi_status) { - msc->unit[msc->cur_lun].state = MSC_IDLE; - msc->unit[msc->cur_lun].error = MSC_ERROR; - } - } - break; - - case MSC_UNRECOVERED_ERROR: - msc->cur_lun++; - break; - - default: - break; - } - } else { - msc->cur_lun = 0U; - msc->state = MSC_IDLE; - } - break; - - case MSC_IDLE: - uhost->usr_cb->dev_user_app(); - status = USBH_OK; - break; - - default: - break; - } - - return status; -} - -/*! - \brief get max lun of the mass storage device - \param[in] uhost: pointer to USB host - \param[in] maxlun: pointer to max lun - \param[out] none - \retval operation status -*/ -static usbh_status usbh_msc_maxlun_get(usbh_host *uhost, uint8_t *maxlun) -{ - usbh_status status = USBH_BUSY; - - if(CTL_IDLE == uhost->control.ctl_state) { - uhost->control.setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_REQTYPE_CLASS | USB_RECPTYPE_ITF, - .bRequest = BBB_GET_MAX_LUN, - .wValue = 0U, - .wIndex = 0U, - .wLength = 1U - }; - - usbh_ctlstate_config(uhost, maxlun, 1U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief get max lun of the mass storage device - \param[in] uhost: pointer to USB host - \param[in] lun: logic unit number - \param[out] none - \retval operation status -*/ -static usbh_status usbh_msc_rdwr_process(usbh_host *uhost, uint8_t lun) -{ - usbh_status error = USBH_BUSY; - usbh_status scsi_status = USBH_BUSY; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - /* switch msc req state machine */ - switch(msc->unit[lun].state) { - case MSC_READ: - scsi_status = usbh_msc_read10(uhost, lun, NULL, 0U, 0U); - - if(USBH_OK == scsi_status) { - msc->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } else if(USBH_FAIL == scsi_status) { - msc->unit[lun].state = MSC_REQUEST_SENSE; - } else { - if(USBH_UNRECOVERED_ERROR == scsi_status) { - msc->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } - } - break; - - case MSC_WRITE: - scsi_status = usbh_msc_write10(uhost, lun, NULL, 0U, 0U); - - if(USBH_OK == scsi_status) { - msc->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } else if(USBH_FAIL == scsi_status) { - msc->unit[lun].state = MSC_REQUEST_SENSE; - } else { - if(USBH_UNRECOVERED_ERROR == scsi_status) { - msc->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } - } - break; - - case MSC_REQUEST_SENSE: - scsi_status = usbh_msc_request_sense(uhost, lun, &msc->unit[lun].sense); - - if(USBH_OK == scsi_status) { - msc->unit[lun].state = MSC_IDLE; - msc->unit[lun].error = MSC_ERROR; - - error = USBH_FAIL; - } - - if(USBH_FAIL == scsi_status) { - } else { - if(USBH_UNRECOVERED_ERROR == scsi_status) { - msc->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } - } - break; - - default: - break; - } - - return error; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c deleted file mode 100644 index a97a40b0c98..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_fatfs.c +++ /dev/null @@ -1,232 +0,0 @@ -/*! - \file usbh_msc_fatfs.c - \brief USB MSC host FATFS related functions - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "diskio.h" -#include "usbh_msc_core.h" - -static volatile DSTATUS state = STA_NOINIT; /* disk status */ - -extern usbh_host usb_host_msc; - -/*! - \brief initialize the disk drive - \param[in] drv: physical drive number (0) - \param[out] none - \retval operation status -*/ -DSTATUS disk_initialize(BYTE drv) -{ - usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; - - if(udev->host.connect_status) { - state &= ~STA_NOINIT; - } - - return state; -} - -/*! - \brief get disk status - \param[in] drv: physical drive number (0) - \param[out] none - \retval operation status -*/ -DSTATUS disk_status(BYTE drv) -{ - if(drv) { - return STA_NOINIT; /* supports only single drive */ - } - - return state; -} - -/*! - \brief read sectors - \param[in] drv: physical drive number (0) - \param[in] buff: pointer to the data buffer to store read data - \param[in] sector: start sector number (LBA) - \param[in] count: sector count (1..255) - \param[out] none - \retval operation status -*/ -DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count) -{ - BYTE status = USBH_OK; - usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; - - if(drv || (!count)) { - return RES_PARERR; - } - - if(state & STA_NOINIT) { - return RES_NOTRDY; - } - - if(udev->host.connect_status) { - do { - status = usbh_msc_read(&usb_host_msc, drv, sector, buff, count); - - if(!udev->host.connect_status) { - return RES_ERROR; - } - } while(USBH_BUSY == status); - } - - if(USBH_OK == status) { - return RES_OK; - } - - return RES_ERROR; -} - -#if _READONLY == 0U - -/*! - \brief write sectors - \param[in] drv: physical drive number (0) - \param[in] buff: pointer to the data buffer to store read data - \param[in] sector: start sector number (LBA) - \param[in] count: sector count (1..255) - \param[out] none - \retval operation status -*/ -DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count) -{ - BYTE status = USBH_OK; - usb_core_driver *udev = (usb_core_driver *)usb_host_msc.data; - - if((!count) || drv) { - return RES_PARERR; - } - - if(state & STA_NOINIT) { - return RES_NOTRDY; - } - - if(state & STA_PROTECT) { - return RES_WRPRT; - } - - if(udev->host.connect_status) { - do { - status = usbh_msc_write(&usb_host_msc, drv, sector, (BYTE *)buff, count); - - if(!udev->host.connect_status) { - return RES_ERROR; - } - } while(USBH_BUSY == status); - } - - if(USBH_OK == status) { - return RES_OK; - } - - return RES_ERROR; -} - -#endif /* _READONLY == 0 */ - -/*! - \brief I/O control function - \param[in] drv: physical drive number (0) - \param[in] ctrl: control code - \param[in] buff: pointer to the data buffer to store read data - \param[out] none - \retval operation status -*/ -DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff) -{ - DRESULT res = RES_OK; - msc_lun info; - - if(drv) { - return RES_PARERR; - } - - res = RES_ERROR; - - if(state & STA_NOINIT) { - return RES_NOTRDY; - } - - switch(ctrl) { - /* make sure that no pending write process */ - case CTRL_SYNC: - res = RES_OK; - break; - - /* get number of sectors on the disk (dword) */ - case GET_SECTOR_COUNT: - if(USBH_OK == usbh_msc_lun_info_get(&usb_host_msc, drv, &info)) { - *(DWORD *)buff = (DWORD)info.capacity.block_nbr; - res = RES_OK; - } - break; - - /* get r/w sector size (word) */ - case GET_SECTOR_SIZE: - if(USBH_OK == usbh_msc_lun_info_get(&usb_host_msc, drv, &info)) { - *(WORD *)buff = (DWORD)info.capacity.block_size; - res = RES_OK; - } - break; - - /* get erase block size in unit of sector (dword) */ - case GET_BLOCK_SIZE: - *(DWORD *)buff = 512U; - break; - - default: - res = RES_PARERR; - break; - } - - return res; -} - -/*! - \brief get fat time - \param[in] none - \param[out] none - \retval time value -*/ -DWORD get_fattime(void) -{ - return ((DWORD)(2019U - 1980U) << 25) /* year 2019 */ - | ((DWORD)1U << 21) /* month 1 */ - | ((DWORD)1U << 16) /* day 1 */ - | ((DWORD)0U << 11) /* hour 0 */ - | ((DWORD)0U << 5) /* min 0 */ - | ((DWORD)0U >> 1); /* sec 0 */ -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c deleted file mode 100644 index 13b0686136a..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/class/msc/Source/usbh_msc_scsi.c +++ /dev/null @@ -1,396 +0,0 @@ -/*! - \file usbh_msc_scsi.c - \brief USB MSC SCSI commands implementation - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_msc_core.h" -#include "usbh_msc_scsi.h" - -/*! - \brief send 'Inquiry' command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[in] inquiry: pointer to the inquiry structure - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_scsi_inquiry(usbh_host *uhost, uint8_t lun, scsi_std_inquiry_data *inquiry) -{ - usbh_status error = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the cbw and relevant field*/ - msc->bbb.cbw.field.dCBWDataTransferLength = STANDARD_INQUIRY_DATA_LEN; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_INQUIRY; - msc->bbb.cbw.field.CBWCB[1] = (lun << 5); - msc->bbb.cbw.field.CBWCB[4] = 0x24U; - - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; - error = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - error = usbh_msc_bbb_process(uhost, lun); - - if(USBH_OK == error) { - memset(inquiry, 0U, sizeof(scsi_std_inquiry_data)); - - /* assign inquiry data */ - inquiry->device_type = msc->bbb.pbuf[0] & 0x1FU; - inquiry->peripheral_qualifier = msc->bbb.pbuf[0] >> 5; - - if(0x80U == ((uint32_t)msc->bbb.pbuf[1] & 0x80U)) { - inquiry->removable_media = 1U; - } else { - inquiry->removable_media = 0U; - } - - memcpy(inquiry->vendor_id, &msc->bbb.pbuf[8], 8U); - memcpy(inquiry->product_id, &msc->bbb.pbuf[16], 16U); - memcpy(inquiry->revision_id, &msc->bbb.pbuf[32], 4U); - } - break; - - default: - break; - } - - return error; -} - -/*! - \brief send 'Test unit ready' command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_test_unitready(usbh_host *uhost, uint8_t lun) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the CBW and relevant field */ - msc->bbb.cbw.field.dCBWDataTransferLength = CBW_LENGTH_TEST_UNIT_READY; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_OUT; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_TEST_UNIT_READY; - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - break; - - default: - break; - } - - return status; -} - -/*! - \brief send the read capacity command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[in] capacity: pointer to SCSI capacity - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_read_capacity10(usbh_host *uhost, uint8_t lun, scsi_capacity *capacity) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the CBW and relevant field */ - msc->bbb.cbw.field.dCBWDataTransferLength = READ_CAPACITY10_DATA_LEN; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_READ_CAPACITY10; - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - - if(USBH_OK == status) { - capacity->block_nbr = msc->bbb.pbuf[3] | \ - ((uint32_t)msc->bbb.pbuf[2] << 8) | \ - ((uint32_t)msc->bbb.pbuf[1] << 16) | \ - ((uint32_t)msc->bbb.pbuf[0] << 24); - - capacity->block_size = (uint16_t)(msc->bbb.pbuf[7] | ((uint32_t)msc->bbb.pbuf[6] << 8)); - } - break; - - default: - break; - } - - return status; -} - -/*! - \brief send the mode sense6 command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_mode_sense6(usbh_host *uhost, uint8_t lun) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the CBW and relevant field */ - msc->bbb.cbw.field.dCBWDataTransferLength = XFER_LEN_MODE_SENSE6; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_MODE_SENSE6; - msc->bbb.cbw.field.CBWCB[2] = MODE_SENSE_PAGE_CONTROL_FIELD | MODE_SENSE_PAGE_CODE; - msc->bbb.cbw.field.CBWCB[4] = XFER_LEN_MODE_SENSE6; - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - - if(USBH_OK == status) { - if(msc->bbb.data[2] & MASK_MODE_SENSE_WRITE_PROTECT) { - - } else { - - } - } - break; - - default: - break; - } - - - return status; -} - -/*! - \brief send the Request Sense command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[in] sense_data: pointer to sense data - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_request_sense(usbh_host *uhost, uint8_t lun, msc_scsi_sense *sense_data) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the CBW and relevant field */ - msc->bbb.cbw.field.dCBWDataTransferLength = ALLOCATION_LENGTH_REQUEST_SENSE; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_REQUEST_SENSE; - msc->bbb.cbw.field.CBWCB[1] = (lun << 5); - msc->bbb.cbw.field.CBWCB[4] = ALLOCATION_LENGTH_REQUEST_SENSE; - - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = (uint8_t *)(void *)msc->bbb.data; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - - if(USBH_OK == status) { - /* get sense data */ - sense_data->SenseKey = msc->bbb.pbuf[2] & 0x0FU; - sense_data->ASC = msc->bbb.pbuf[12]; - sense_data->ASCQ = msc->bbb.pbuf[13]; - } - break; - - default: - break; - } - - return status; -} - -/*! - \brief send the write10 command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[in] data_buf: data buffer contains the data to write - \param[in] addr: address to which the data will be written - \param[in] sector_num: number of sector to be written - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_write10(usbh_host *uhost, uint8_t lun, uint8_t *data_buf, uint32_t addr, uint32_t sector_num) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - msc->bbb.cbw.field.dCBWDataTransferLength = sector_num * msc->unit[lun].capacity.block_size; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_OUT; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_WRITE10; - - /* logical block address */ - msc->bbb.cbw.field.CBWCB[2] = (((uint8_t *)&addr)[3]); - msc->bbb.cbw.field.CBWCB[3] = (((uint8_t *)&addr)[2]); - msc->bbb.cbw.field.CBWCB[4] = (((uint8_t *)&addr)[1]); - msc->bbb.cbw.field.CBWCB[5] = (((uint8_t *)&addr)[0]); - - /* transfer length */ - msc->bbb.cbw.field.CBWCB[7] = (((uint8_t *)§or_num)[1]); - msc->bbb.cbw.field.CBWCB[8] = (((uint8_t *)§or_num)[0]); - - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = data_buf; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - break; - - default: - break; - } - - return status; -} - -/*! - \brief send the read10 command to the device - \param[in] uhost: pointer to USB host handler - \param[in] lun: logic unit number - \param[in] data_buf: data buffer contains the data to write - \param[in] addr: address to which the data will be read - \param[in] sector_num: number of sector to be read - \param[out] none - \retval operation status -*/ -usbh_status usbh_msc_read10(usbh_host *uhost, uint8_t lun, uint8_t *data_buf, uint32_t addr, uint32_t sector_num) -{ - usbh_status status = USBH_FAIL; - usbh_msc_handler *msc = (usbh_msc_handler *)uhost->active_class->class_data; - - switch(msc->bbb.cmd_state) { - case BBB_CMD_SEND: - /* prepare the CBW and relevant field */ - msc->bbb.cbw.field.dCBWDataTransferLength = sector_num * msc->unit[lun].capacity.block_size; - msc->bbb.cbw.field.bmCBWFlags = USB_TRX_IN; - msc->bbb.cbw.field.bCBWCBLength = CBW_LENGTH; - - memset(msc->bbb.cbw.field.CBWCB, 0U, CBW_CB_LENGTH); - - msc->bbb.cbw.field.CBWCB[0] = SCSI_READ10; - - /* logical block address */ - msc->bbb.cbw.field.CBWCB[2] = (((uint8_t *)&addr)[3]); - msc->bbb.cbw.field.CBWCB[3] = (((uint8_t *)&addr)[2]); - msc->bbb.cbw.field.CBWCB[4] = (((uint8_t *)&addr)[1]); - msc->bbb.cbw.field.CBWCB[5] = (((uint8_t *)&addr)[0]); - - /* transfer length */ - msc->bbb.cbw.field.CBWCB[7] = (((uint8_t *)§or_num)[1]); - msc->bbb.cbw.field.CBWCB[8] = (((uint8_t *)§or_num)[0]); - - msc->bbb.state = BBB_SEND_CBW; - msc->bbb.cmd_state = BBB_CMD_WAIT; - msc->bbb.pbuf = data_buf; - - status = USBH_BUSY; - break; - - case BBB_CMD_WAIT: - status = usbh_msc_bbb_process(uhost, lun); - break; - - default: - break; - } - - return status; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h deleted file mode 100644 index 8ec2236b17a..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_core.h +++ /dev/null @@ -1,262 +0,0 @@ -/*! - \file usbh_core.h - \brief USB host core state machine header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_CORE_H -#define USBH_CORE_H - -#include "usbh_conf.h" -#include "drv_usb_host.h" - -#define MSC_CLASS 0x08U /*!< USB MSC class */ -#define HID_CLASS 0x03U /*!< USB HID class */ -#define MSC_PROTOCOL 0x50U /*!< USB MSC protocol */ -#define CBI_PROTOCOL 0x01U /*!< USB CBI protocol */ - -#define USBH_MAX_ERROR_COUNT 3U /*!< USBH maximum error count */ - -#define USBH_DEV_ADDR_DEFAULT 0U /*!< USBH device address default */ -#define USBH_DEV_ADDR 1U /*!< USBH device address */ - -typedef enum { - USBH_OK = 0U, /*!< USB host OK status */ - USBH_BUSY, /*!< USB host busy status */ - USBH_FAIL, /*!< USB host fail status */ - USBH_NOT_SUPPORTED, /*!< USB host not support status */ - USBH_UNRECOVERED_ERROR, /*!< USB host unrecovered error status */ - USBH_SPEED_UNKNOWN_ERROR, /*!< USB host speed unknown error status */ - USBH_APPLY_DEINIT /*!< USB host apply deinit status */ -} usbh_status; - -/* USB host global operation state */ -typedef enum { - HOST_DEFAULT = 0U, /*!< USB host global operation default state */ - HOST_DETECT_DEV_SPEED, /*!< USB host global operation detect device speed state */ - HOST_DEV_CONNECT, /*!< USB host global operation device connect state */ - HOST_DEV_DETACHED, /*!< USB host global operation device detached state */ - HOST_DEV_ENUM, /*!< USB host global operation device enumeration state */ - HOST_PWR_FEATURE_SET, /*!< USB host global operation setting power feature state */ - HOST_CLASS_CHECK, /*!< USB host global operation class check state */ - HOST_CLASS_ENUM, /*!< USB host global operation class enumeration state */ - HOST_CLASS_HANDLER, /*!< USB host global operation class handler state */ - HOST_USER_INPUT, /*!< USB host global operation user input state */ - HOST_SUSPEND, /*!< USB host global operation suspend state */ - HOST_WAKEUP, /*!< USB host global operation wakeup state */ - HOST_ERROR /*!< USB host global operation error state */ -} usb_host_state; - -/* USB host enumeration state */ -typedef enum { - ENUM_DEFAULT = 0U, /*!< USB host enumeration default state */ - ENUM_GET_DEV_DESC, /*!< USB host enumeration get device descriptor state */ - ENUM_SET_ADDR, /*!< USB host enumeration set address state */ - ENUM_GET_CFG_DESC, /*!< USB host enumeration get configuration descriptor state */ - ENUM_GET_CFG_DESC_SET, /*!< USB host enumeration set configuration descriptor state */ - ENUM_GET_STR_DESC, /*!< USB host enumeration get string descriptor state */ -#ifdef USB_MTP - ENUM_GET_MTP_STR, /*!< USB host enumeration get MTP string state */ -#endif /* USB_MTP */ - ENUM_SET_CONFIGURATION, /*!< USB host enumeration set configuration state */ - ENUM_DEV_CONFIGURED /*!< USB host enumeration device configured state */ -} usbh_enum_state; - -/* USB host control transfer state */ -typedef enum { - CTL_IDLE = 0U, /*!< USB host control transfer idle state */ - CTL_SETUP, /*!< USB host control transfer SETUP state */ - CTL_SETUP_WAIT, /*!< USB host control transfer SETUP wait state */ - CTL_DATA_IN, /*!< USB host control transfer data IN state */ - CTL_DATA_IN_WAIT, /*!< USB host control transfer data IN wait state */ - CTL_DATA_OUT, /*!< USB host control transfer data OUT state */ - CTL_DATA_OUT_WAIT, /*!< USB host control transfer data OUT wait state */ - CTL_STATUS_IN, /*!< USB host control transfer status IN state */ - CTL_STATUS_IN_WAIT, /*!< USB host control transfer status IN wait state */ - CTL_STATUS_OUT, /*!< USB host control transfer status OUT state */ - CTL_STATUS_OUT_WAIT, /*!< USB host control transfer status OUT wait state */ - CTL_ERROR, /*!< USB host control transfer error state */ - CTL_FINISH /*!< USB host control transfer finish state */ -} usbh_ctl_state; - -/* user action state */ -typedef enum { - USR_IN_NO_RESP = 0U, /*!< user action IN no response state */ - USR_IN_RESP_OK = 1U /*!< user action IN response OK state */ -} usbh_user_status; - -/* USB host wakeup mode */ -typedef enum { - NORMAL_WORK = 0U, - GENERAL_WAKEUP = 1U, - REMOTE_WAKEUP = 2 -} usbh_wakeup_mode; - -/* control transfer information */ -typedef struct _usbh_control { - uint8_t pipe_in_num; /*!< the number of IN pipe*/ - uint8_t pipe_out_num; /*!< the number of OUT pipe */ - uint8_t max_len; /*!< maximum length of control transfer */ - uint8_t error_count; /*!< the count of control error */ - - uint8_t *buf; /*!< control transfer buffer */ - uint16_t ctl_len; /*!< the length of control transfer */ - __IO uint32_t timer; /*!< control transfer timer */ - - usb_setup setup; /*!< control transfer SETUP packet */ - usbh_ctl_state ctl_state; /*!< host control transfer state */ -} usbh_control; - -/* USB interface descriptor set */ -typedef struct _usb_desc_itf_set { - usb_desc_itf itf_desc; /*!< USB interface descriptor */ - usb_desc_ep ep_desc[USBH_MAX_EP_NUM]; /*!< USB endpoint descriptor */ -} usb_desc_itf_set; - -/* USB configure descriptor set */ -typedef struct _usb_desc_cfg_set { - usb_desc_config cfg_desc; /*!< USB configuration descriptor */ - usb_desc_itf_set itf_desc_set[USBH_MAX_INTERFACES_NUM][USBH_MAX_ALT_SETTING]; /*!< USB interface descriptor set*/ -} usb_desc_cfg_set; - -/* USB device property */ -typedef struct { - uint8_t data[USBH_DATA_BUF_MAX_LEN]; /*!< if DMA is used, the data array must be located in the first position */ - uint8_t cur_itf; /*!< USB device current interface */ - uint8_t addr; /*!< USB device address */ - - uint32_t speed; /*!< USB device speed */ - - usb_desc_dev dev_desc; /*!< USB device descriptor */ - usb_desc_cfg_set cfg_desc_set; /*!< USB interface descriptor set */ - -#if (1U == USBH_CFG_DESC_KEEP) - uint8_t cfgdesc_rawdata[USBH_CFGSET_MAX_LEN]; /*!< USB configuration descriptor raw data*/ -#endif /* (1U == USBH_CFG_DESC_KEEP) */ -} usb_dev_prop; - -struct _usbh_host; - -/* device class callbacks */ -typedef struct { - uint8_t class_code; /*!< USB class type */ - usbh_status (*class_init)(struct _usbh_host *phost); - void (*class_deinit)(struct _usbh_host *phost); - usbh_status (*class_requests)(struct _usbh_host *phost); - usbh_status (*class_machine)(struct _usbh_host *phost); - usbh_status (*class_sof)(struct _usbh_host *uhost); - void *class_data; /*!< USB class data pointer */ -} usbh_class; - -/* user callbacks */ -typedef struct { - void (*dev_init)(void); - void (*dev_deinit)(void); - void (*dev_attach)(void); - void (*dev_reset)(void); - void (*dev_detach)(void); - void (*dev_over_currented)(void); - void (*dev_speed_detected)(uint32_t dev_speed); - void (*dev_devdesc_assigned)(void *dev_desc); - void (*dev_address_set)(void); - - void (*dev_cfgdesc_assigned)(usb_desc_config *cfg_desc, \ - usb_desc_itf *itf_desc, \ - usb_desc_ep *ep_desc); - - void (*dev_mfc_str)(void *mfc_str); - void (*dev_prod_str)(void *prod_str); - void (*dev_seral_str)(void *serial_str); - void (*dev_enumerated)(void); - usbh_user_status (*dev_user_input)(void); - int (*dev_user_app)(void); - void (*dev_not_supported)(void); - void (*dev_error)(void); -} usbh_user_cb; - -/* host information */ -typedef struct _usbh_host { - usb_host_state cur_state; /*!< host state machine value */ - usb_host_state backup_state; /*!< backup of previous state machine value */ - usbh_enum_state enum_state; /*!< enumeration state machine */ - usbh_control control; /*!< USB host control state machine */ - usb_dev_prop dev_prop; /*!< USB device property */ - - usbh_class *uclass[USBH_MAX_SUPPORTED_CLASS]; /*!< USB host supported class */ - usbh_class *active_class; /*!< USB active class */ - usbh_user_cb *usr_cb; /*!< USB user callback */ - - uint8_t class_num; /*!< USB class number */ - - void *data; /*!< used for... */ - - uint8_t suspend_flag; /*!< host suspend flag */ - uint8_t dev_supp_remote_wkup; /*!< record device remote wakeup function */ - usbh_wakeup_mode wakeup_mode; /*!< record wakeup mode */ -} usbh_host; - -/*! - \brief get USB URB state - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[out] none - \retval URB state -*/ -static inline usb_urb_state usbh_urbstate_get(usb_core_driver *udev, uint8_t pp_num) -{ - return udev->host.pipe[pp_num].urb_state; -} - -/*! - \brief get USB transfer data count - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[out] none - \retval transfer data count -*/ -static inline uint32_t usbh_xfercount_get(usb_core_driver *udev, uint8_t pp_num) -{ - return udev->host.backup_xfercount[pp_num]; -} - -/* function declarations */ -/* USB host stack initializations */ -void usbh_init(usbh_host *uhost, usb_core_driver *udev, usb_core_enum usb_core, usbh_user_cb *user_cb); -/* USB host register device class */ -usbh_status usbh_class_register(usbh_host *uhost, usbh_class *puclass); -/* de-initialize USB host */ -usbh_status usbh_deinit(usbh_host *uhost); -/* USB host core main state machine process */ -void usbh_core_task(usbh_host *uhost); -/* handle the error on USB host side */ -void usbh_error_handler(usbh_host *uhost, usbh_status err_type); - -#endif /* USBH_CORE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h deleted file mode 100644 index 82bffa3d6aa..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_enum.h +++ /dev/null @@ -1,70 +0,0 @@ -/*! - \file usbh_enum.h - \brief USB host mode USB enumeration header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_ENUM_H -#define USBH_ENUM_H - -#include "usbh_core.h" - -/* function declarations */ -/* configure USB control status parameters */ -void usbh_ctlstate_config(usbh_host *uhost, uint8_t *buf, uint16_t len); -/* get device descriptor from the USB device */ -usbh_status usbh_devdesc_get(usbh_host *uhost, uint8_t len); -/* get configuration descriptor from the USB device */ -usbh_status usbh_cfgdesc_get(usbh_host *uhost, uint16_t len); -/* get string descriptor from the USB device */ -usbh_status usbh_strdesc_get(usbh_host *uhost,uint8_t str_index, uint8_t *buf, uint16_t len); -/* set the address to the connected device */ -usbh_status usbh_setaddress(usbh_host *uhost, uint8_t dev_addr); -/* set the configuration value to the connected device */ -usbh_status usbh_setcfg(usbh_host *uhost, uint16_t config); -/* set the interface value to the connected device */ -usbh_status usbh_setinterface(usbh_host *uhost, uint8_t itf_num, uint8_t alter_setting); -/* set or enable a specific device feature */ -usbh_status usbh_setdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex); -/* clear or disable a specific device feature */ -usbh_status usbh_clrdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex); -/* clear or disable a specific feature */ -usbh_status usbh_clrfeature(usbh_host *uhost, uint8_t ep_addr, uint8_t pp_num); -/* get the next descriptor header */ -usb_desc_header *usbh_nextdesc_get(uint8_t *pbuf, uint16_t *ptr); -/* select an interface */ -usbh_status usbh_interface_select(usb_dev_prop *udev, uint8_t interface); -/* find the interface index for a specific class */ -uint8_t usbh_interface_find(usb_dev_prop *udev, uint8_t main_class, uint8_t sub_class, uint8_t protocol); -/* find the interface index for a specific class interface and alternate setting number */ -uint8_t usbh_interfaceindex_find(usb_dev_prop *udev, uint8_t interface_number, uint8_t alt_settings); - -#endif /* USBH_ENUM_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h deleted file mode 100644 index 285de18682f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_pipe.h +++ /dev/null @@ -1,102 +0,0 @@ -/*! - \file usbh_pipe.h - \brief USB host mode pipe header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_PIPE_H -#define USBH_PIPE_H - -#include "usbh_core.h" - -/* host pipe maximum */ -#define HP_MAX 8U - -/* host pipe status */ -#define HP_OK 0x0000U /*!< host pipe status */ -#define HP_USED 0x8000U /*!< host pipe used status */ -#define HP_ERROR 0xFFFFU /*!< host pipe error status */ -#define HP_USED_MASK 0x7FFFU /*!< host pipe used mask */ - -/*! - \brief set toggle for a pipe - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[in] toggle: toggle (0/1) - \param[out] none - \retval none -*/ -__STATIC_INLINE void usbh_pipe_toggle_set(usb_core_driver *udev, uint8_t pp_num, uint8_t toggle) -{ - if(udev->host.pipe[pp_num].ep.dir) { - udev->host.pipe[pp_num].data_toggle_in = toggle; - } else { - udev->host.pipe[pp_num].data_toggle_out = toggle; - } -} - -/*! - \brief get toggle flag of pipe - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[out] none - \retval toggle flag -*/ -__STATIC_INLINE uint8_t usbh_pipe_toggle_get(usb_core_driver *udev, uint8_t pp_num) -{ - if(udev->host.pipe[pp_num].ep.dir) { - return udev->host.pipe[pp_num].data_toggle_in; - } else { - return udev->host.pipe[pp_num].data_toggle_out; - } -} - -/* function declarations */ -/* create a pipe */ -uint8_t usbh_pipe_create(usb_core_driver *udev, \ - usb_dev_prop *dev, \ - uint8_t pp_num, \ - uint8_t ep_type, \ - uint16_t ep_mpl); -/* modify a pipe */ -uint8_t usbh_pipe_update(usb_core_driver *udev, \ - uint8_t pp_num, \ - uint8_t dev_addr, \ - uint32_t dev_speed, \ - uint16_t ep_mpl); -/* allocate a new pipe */ -uint8_t usbh_pipe_allocate(usb_core_driver *udev, uint8_t ep_addr); -/* free a pipe */ -uint8_t usbh_pipe_free(usb_core_driver *udev, uint8_t pp_num); -/* delete all USB host pipe */ -uint8_t usbh_pipe_delete(usb_core_driver *udev); - -#endif /* USBH_PIPE_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h deleted file mode 100644 index 2427a8a5948..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Include/usbh_transc.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - \file usbh_transc.h - \brief USB host mode transactions header file - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USBH_TRANSC_H -#define USBH_TRANSC_H - -#include "usbh_core.h" - -/* function declarations */ -/* send the SETUP packet to the USB device */ -usbh_status usbh_ctlsetup_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num); -/* send a data packet to the USB device */ -usbh_status usbh_data_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len); -/* receive a data packet from the USB device */ -usbh_status usbh_data_recev(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len); -/* USB control transfer handler */ -usbh_status usbh_ctl_handler(usbh_host *uhost); - -#endif /* USBH_TRANSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c deleted file mode 100644 index 45b3dd2f143..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_core.c +++ /dev/null @@ -1,655 +0,0 @@ -/*! - \file usbh_core.c - \brief USB host core state machine driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "drv_usb_hw.h" -#include "usbh_pipe.h" -#include "usbh_enum.h" -#include "usbh_core.h" -#include "drv_usbh_int.h" - -/* local function prototypes ('static') */ -static uint8_t usb_ev_sof(usbh_host *uhost); -static uint8_t usb_ev_connect(usbh_host *uhost); -static uint8_t usb_ev_disconnect(usbh_host *uhost); -static usbh_status usbh_enum_task(usbh_host *uhost); -#if USBFS_LOW_POWER || USBHS_LOW_POWER -static void usb_hwp_suspend(usb_core_driver *udev); -static void usb_hwp_resume(usb_core_driver *udev); -#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ - -usbh_ev_cb usbh_int_op = { - usb_ev_connect, - usb_ev_disconnect, - usb_ev_sof -}; - -usbh_ev_cb *usbh_int_fop = &usbh_int_op; - -/*! - \brief USB host stack initializations - \param[in] uhost: pointer to USB host - \param[in] udev: pointer to USB device instance - \param[in] usb_core: USB core type - \param[in] user_cb: pointer to user callback - \param[out] none - \retval none -*/ -void usbh_init(usbh_host *uhost, usb_core_driver *udev, usb_core_enum usb_core, usbh_user_cb *user_cb) -{ - /* link driver to the stack */ - udev->host.data = (void *)uhost; - uhost->data = (void *)udev; - - /* host deinitialization */ - usbh_deinit(uhost); - - uhost->usr_cb = user_cb; - - udev->host.connect_status = 0U; - - for(uint8_t i = 0U; i < USBFS_MAX_TX_FIFOS; i++) { - udev->host.pipe[i].err_count = 0U; - udev->host.pipe[i].pp_status = PIPE_IDLE; - udev->host.backup_xfercount[i] = 0U; - } - - udev->host.pipe[0].ep.mps = 8U; - - usb_basic_init(&udev->bp, &udev->regs, usb_core); - -#ifndef DUAL_ROLE_MODE_ENABLED - usb_globalint_disable(&udev->regs); - - usb_core_init(udev->bp, &udev->regs); - -#ifndef USE_OTG_MODE - usb_curmode_set(&udev->regs, HOST_MODE); -#endif /* USE_OTG_MODE */ - - usb_host_init(udev); - - usb_globalint_enable(&udev->regs); -#endif /* DUAL_ROLE_MODE_ENABLED */ - - /* upon initialize call usr call back */ - uhost->usr_cb->dev_init(); -} - -/*! - \brief USB host register device class - \param[in] uhost: pointer to USB host instance - \param[in] uclass: pointer to USB device class - \param[out] none - \retval operation status -*/ -usbh_status usbh_class_register(usbh_host *uhost, usbh_class *uclass) -{ - usbh_status status = USBH_OK; - - if(NULL != uclass) { - if(uhost->class_num < USBH_MAX_SUPPORTED_CLASS) { - uhost->uclass[uhost->class_num++] = uclass; - } else { - status = USBH_FAIL; - } - } else { - status = USBH_FAIL; - } - - return status; -} - -/*! - \brief deinitialize USB host - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -usbh_status usbh_deinit(usbh_host *uhost) -{ - usb_core_driver *udev = (usb_core_driver *)uhost->data; - - /* software initialize */ - uhost->cur_state = HOST_DEFAULT; - uhost->backup_state = HOST_DEFAULT; - uhost->enum_state = ENUM_DEFAULT; - - uhost->control.ctl_state = CTL_IDLE; - uhost->control.max_len = USB_FS_EP0_MAX_LEN; - - uhost->dev_prop.addr = USBH_DEV_ADDR_DEFAULT; - uhost->dev_prop.speed = PORT_SPEED_FULL; - uhost->dev_prop.cur_itf = 0xFFU; - - usbh_pipe_free(udev, uhost->control.pipe_in_num); - usbh_pipe_free(udev, uhost->control.pipe_out_num); - - return USBH_OK; -} - -/*! - \brief USB host core main state machine process - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -void usbh_core_task(usbh_host *uhost) -{ - volatile usbh_status status = USBH_FAIL; - usb_core_driver *udev = (usb_core_driver *)uhost->data; - - /* check for host port events */ - if(((0U == udev->host.connect_status) || (0U == udev->host.port_enabled)) && (HOST_DEFAULT != uhost->cur_state)) { - if(HOST_DEV_DETACHED != uhost->cur_state) { - uhost->cur_state = HOST_DEV_DETACHED; - } - } - - switch(uhost->cur_state) { - case HOST_DEFAULT: - if(udev->host.connect_status) { - uhost->cur_state = HOST_DETECT_DEV_SPEED; - - usb_mdelay(100U); - - usb_port_reset(udev); - - uhost->usr_cb->dev_reset(); - } - break; - - case HOST_DETECT_DEV_SPEED: - if(udev->host.port_enabled) { - uhost->cur_state = HOST_DEV_CONNECT; - - uhost->dev_prop.speed = usb_curspeed_get(udev); - - uhost->usr_cb->dev_speed_detected(uhost->dev_prop.speed); - - usb_mdelay(50U); - } - break; - - case HOST_DEV_CONNECT: - uhost->usr_cb->dev_attach(); - uhost->control.pipe_out_num = usbh_pipe_allocate(udev, 0x00U); - uhost->control.pipe_in_num = usbh_pipe_allocate(udev, 0x80U); - - /* open IN control pipe */ - usbh_pipe_create(udev, \ - &uhost->dev_prop, \ - uhost->control.pipe_in_num, \ - USB_EPTYPE_CTRL, \ - (uint16_t)uhost->control.max_len); - - /* open OUT control pipe */ - usbh_pipe_create(udev, \ - &uhost->dev_prop, \ - uhost->control.pipe_out_num, \ - USB_EPTYPE_CTRL, \ - (uint16_t)uhost->control.max_len); - - uhost->cur_state = HOST_DEV_ENUM; - break; - - case HOST_DEV_ENUM: - /* check for enumeration status */ - if(USBH_OK == usbh_enum_task(uhost)) { - /* the function shall return USBH_OK when full enumeration is complete */ - - /* user callback for end of device basic enumeration */ - uhost->usr_cb->dev_enumerated(); - -#if USBFS_LOW_POWER || USBHS_LOW_POWER - uhost->cur_state = HOST_SUSPEND; - - /* judge device remote wakeup function */ - if((uhost->dev_prop.cfg_desc_set.cfg_desc.bmAttributes) & (1U << 5)) { - uhost->dev_supp_remote_wkup = 1U; - } else { - uhost->dev_supp_remote_wkup = 0U; - } -#else - uhost->cur_state = HOST_PWR_FEATURE_SET; -#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ - } - break; - - case HOST_PWR_FEATURE_SET: - if((uhost->dev_prop.cfg_desc_set.cfg_desc.bmAttributes) & (1U << 5)) { - if(USBH_OK == usbh_setdevfeature(uhost, FEATURE_SELECTOR_REMOTEWAKEUP, 0U)) { - uhost->cur_state = HOST_CLASS_CHECK; - } - } else { - uhost->cur_state = HOST_CLASS_CHECK; - } - break; - - case HOST_CLASS_CHECK: - if(0U == uhost->class_num) { - uhost->cur_state = HOST_ERROR; - } else { - uhost->active_class = NULL; - - uint8_t itf_class = uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].itf_desc.bInterfaceClass; - - for(uint8_t index = 0U; index < uhost->class_num; index++) { - if((uhost->uclass[index]->class_code == itf_class) || (0xFFU == itf_class)) { - uhost->active_class = uhost->uclass[index]; - } - } - - if(NULL != uhost->active_class) { - uhost->cur_state = HOST_USER_INPUT; - } else { - uhost->cur_state = HOST_ERROR; - } - } - break; - - case HOST_USER_INPUT: - /* the function should return user response true to move to class state */ - if(USR_IN_RESP_OK == uhost->usr_cb->dev_user_input()) { - if((USBH_OK == uhost->active_class->class_init(uhost))) { - uhost->cur_state = HOST_CLASS_ENUM; - } - } - break; - -#if USBFS_LOW_POWER || USBHS_LOW_POWER - case HOST_SUSPEND: - if(uhost->dev_supp_remote_wkup) { - /* send set feature command*/ - if(USBH_OK == usbh_setdevfeature(uhost, FEATURE_SELECTOR_REMOTEWAKEUP, 0U)) { - - usb_hwp_suspend(udev); - - usb_mdelay(20U); - uhost->suspend_flag = 1U; - uhost->usr_cb->dev_user_input(); - - /* MCU enter deep-sleep*/ - pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); - uhost->cur_state = HOST_WAKEUP; - } - } else { - /* host suspend */ - usb_hwp_suspend(udev); - - usb_mdelay(20U); - uhost->suspend_flag = 1U; - uhost->usr_cb->dev_user_input(); - - /* MCU enter deep-sleep */ - pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_DISABLE, WFI_CMD); - uhost->cur_state = HOST_WAKEUP; - } - break; - - case HOST_WAKEUP: - /* judge suspend status */ - if(0U == uhost->suspend_flag) { - usb_hwp_resume(udev); - usb_mdelay(500U); - - if(uhost->dev_supp_remote_wkup) { - if(USBH_OK == usbh_clrdevfeature(uhost, FEATURE_SELECTOR_DEV, 0U)) { - /* user callback for initialization */ - uhost->usr_cb->dev_init(); - uhost->cur_state = HOST_CLASS_CHECK; - } - } else { - uhost->cur_state = HOST_CLASS_CHECK; - } - } - break; -#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ - - case HOST_CLASS_ENUM: - /* process class standard control requests state machine */ - status = uhost->active_class->class_requests(uhost); - - if(USBH_OK == status) { - uhost->cur_state = HOST_CLASS_HANDLER; - } else { - usbh_error_handler(uhost, status); - } - break; - - case HOST_CLASS_HANDLER: - /* process class state machine */ - status = uhost->active_class->class_machine(uhost); - - usbh_error_handler(uhost, status); - break; - - case HOST_ERROR: - /* deinitialize host for new enumeration */ - usbh_deinit(uhost); - uhost->usr_cb->dev_deinit(); - uhost->active_class->class_deinit(uhost); - break; - - case HOST_DEV_DETACHED: - /* manage user disconnect operations*/ - uhost->usr_cb->dev_detach(); - - /* re-initialize host for new enumeration */ - usbh_deinit(uhost); - uhost->usr_cb->dev_deinit(); - uhost->active_class->class_deinit(uhost); - usbh_pipe_delete(udev); - uhost->cur_state = HOST_DEFAULT; - break; - - default: - break; - } -} - -/*! - \brief handle the error on USB host side - \param[in] uhost: pointer to USB host - \param[in] err_type: type of error or busy/OK state - \param[out] none - \retval none -*/ -void usbh_error_handler(usbh_host *uhost, usbh_status err_type) -{ - /* error unrecovered or not supported device speed */ - if((USBH_SPEED_UNKNOWN_ERROR == err_type) || (USBH_UNRECOVERED_ERROR == err_type)) { - uhost->usr_cb->dev_error(); - - uhost->cur_state = HOST_ERROR; - } else if(USBH_APPLY_DEINIT == err_type) { - uhost->cur_state = HOST_ERROR; - - /* user callback for initialization */ - uhost->usr_cb->dev_init(); - } else { - /* no operation */ - } -} - -/*! - \brief USB SOF event function from the interrupt - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static uint8_t usb_ev_sof(usbh_host *uhost) -{ - /* update timer variable */ - uhost->control.timer++; - - /* this callback could be used to implement a scheduler process */ - if(NULL != uhost->active_class) { - if(NULL != uhost->active_class->class_sof) { - uhost->active_class->class_sof(uhost); - } - } - - return 0U; -} - -/*! - \brief USB connect event function from the interrupt - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static uint8_t usb_ev_connect(usbh_host *uhost) -{ - usb_core_driver *udev = (usb_core_driver *)uhost->data; - udev->host.connect_status = 1U; - - return 0U; -} - -/*! - \brief USB disconnect event function from the interrupt - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -static uint8_t usb_ev_disconnect(usbh_host *uhost) -{ - usb_core_driver *udev = (usb_core_driver *)uhost->data; - udev->host.connect_status = 0U; - - return 0U; -} - -/*! - \brief handle the USB enumeration task - \param[in] uhost: pointer to host - \param[out] none - \retval none -*/ -static usbh_status usbh_enum_task(usbh_host *uhost) -{ - uint8_t str_buf[512]; - usbh_status status = USBH_BUSY; - usb_core_driver *udev = (usb_core_driver *)uhost->data; - - static uint8_t index_mfc_str = 0U, index_prod_str = 0U, index_serial_str = 0U; - - switch(uhost->enum_state) { - case ENUM_DEFAULT: - /* get device descriptor for only 1st 8 bytes : to get ep0 max packet size */ - if(USBH_OK == usbh_devdesc_get(uhost, 8U)) { - uhost->control.max_len = uhost->dev_prop.dev_desc.bMaxPacketSize0; - - /* modify control channels configuration for maximum packet size */ - usbh_pipe_update(udev, \ - uhost->control.pipe_out_num, \ - 0U, 0U, \ - (uint16_t)uhost->control.max_len); - - usbh_pipe_update(udev, \ - uhost->control.pipe_in_num, \ - 0U, 0U, \ - (uint16_t)uhost->control.max_len); - - uhost->enum_state = ENUM_GET_DEV_DESC; - } - break; - - case ENUM_GET_DEV_DESC: - /* get full device descriptor */ - if(USBH_OK == usbh_devdesc_get(uhost, USB_DEV_DESC_LEN)) { - uhost->usr_cb->dev_devdesc_assigned(&uhost->dev_prop.dev_desc); - - index_mfc_str = uhost->dev_prop.dev_desc.iManufacturer; - index_prod_str = uhost->dev_prop.dev_desc.iProduct; - index_serial_str = uhost->dev_prop.dev_desc.iSerialNumber; - - uhost->enum_state = ENUM_SET_ADDR; - } - break; - - case ENUM_SET_ADDR: - /* set address */ - if(USBH_OK == usbh_setaddress(uhost, USBH_DEV_ADDR)) { - usb_mdelay(2U); - - uhost->dev_prop.addr = USBH_DEV_ADDR; - - /* user callback for device address assigned */ - uhost->usr_cb->dev_address_set(); - - /* modify control channels to update device address */ - usbh_pipe_update(udev, \ - uhost->control.pipe_in_num, \ - uhost->dev_prop.addr, \ - 0U, 0U); - - usbh_pipe_update(udev, \ - uhost->control.pipe_out_num, \ - uhost->dev_prop.addr, \ - 0U, 0U); - - uhost->enum_state = ENUM_GET_CFG_DESC; - } - break; - - case ENUM_GET_CFG_DESC: - /* get standard configuration descriptor */ - if(USBH_OK == usbh_cfgdesc_get(uhost, USB_CFG_DESC_LEN)) { - uhost->enum_state = ENUM_GET_CFG_DESC_SET; - } - break; - - case ENUM_GET_CFG_DESC_SET: - /* get full configure descriptor (config, interface, endpoints) */ - if(USBH_OK == usbh_cfgdesc_get(uhost, uhost->dev_prop.cfg_desc_set.cfg_desc.wTotalLength)) { - /* user callback for configuration descriptors available */ - uhost->usr_cb->dev_cfgdesc_assigned(&uhost->dev_prop.cfg_desc_set.cfg_desc, \ - &uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].itf_desc, \ - &uhost->dev_prop.cfg_desc_set.itf_desc_set[0][0].ep_desc[0]); - - uhost->enum_state = ENUM_GET_STR_DESC; - } - break; - - case ENUM_GET_STR_DESC: - if(index_mfc_str) { - if(USBH_OK == usbh_strdesc_get(uhost, \ - uhost->dev_prop.dev_desc.iManufacturer, \ - str_buf, \ - 0xFFU)) { - /* user callback for manufacturing string */ - uhost->usr_cb->dev_mfc_str(str_buf); - - index_mfc_str = 0U; - } - } else { - if(index_prod_str) { - /* check that product string is available */ - if(USBH_OK == usbh_strdesc_get(uhost, \ - uhost->dev_prop.dev_desc.iProduct, \ - str_buf, \ - 0xFFU)) { - uhost->usr_cb->dev_prod_str(str_buf); - - index_prod_str = 0U; - } - } else { - if(index_serial_str) { - if(USBH_OK == usbh_strdesc_get(uhost, \ - uhost->dev_prop.dev_desc.iSerialNumber, \ - str_buf, \ - 0xFFU)) { - uhost->usr_cb->dev_seral_str(str_buf); - uhost->enum_state = ENUM_SET_CONFIGURATION; - index_serial_str = 0U; - } - } else { - uhost->enum_state = ENUM_SET_CONFIGURATION; - } - } - } - break; - - case ENUM_SET_CONFIGURATION: - if(USBH_OK == usbh_setcfg(uhost, (uint16_t)uhost->dev_prop.cfg_desc_set.cfg_desc.bConfigurationValue)) { - uhost->enum_state = ENUM_DEV_CONFIGURED; - } - break; - - case ENUM_DEV_CONFIGURED: - status = USBH_OK; - break; - - default: - break; - } - - return status; -} - -#if USBFS_LOW_POWER || USBHS_LOW_POWER - -/*! - \brief handles the USB resume from suspend mode - \param[in] udev: pointer to selected USB device - \param[out] none - \retval none -*/ -static void usb_hwp_resume(usb_core_driver *udev) -{ - __IO uint32_t hprt = 0U; - - /* switch-on the clocks */ - *udev->regs.PWRCLKCTL &= ~PWRCLKCTL_SUCLK; - - *udev->regs.PWRCLKCTL &= ~PWRCLKCTL_SHCLK; - - hprt = usb_port_read(udev); - - hprt &= ~HPCS_PSP; - hprt |= HPCS_PREM; - - *udev->regs.HPCS = hprt; - - usb_mdelay(20U); - - hprt &= ~HPCS_PREM; - - *udev->regs.HPCS = hprt; -} - -/*! - \brief handles the USB enter to suspend mode - \param[in] udev: pointer to selected USB device - \param[out] none - \retval none -*/ -static void usb_hwp_suspend(usb_core_driver *udev) -{ - __IO uint32_t hprt = 0U; - - hprt = usb_port_read(udev); - - hprt |= HPCS_PSP; - - *udev->regs.HPCS = hprt; - - /* switch-off the clocks */ - *udev->regs.PWRCLKCTL |= PWRCLKCTL_SUCLK; - - *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; -} - -#endif /* USBFS_LOW_POWER || USBHS_LOW_POWER */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c deleted file mode 100644 index bbeb76ac1cc..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_enum.c +++ /dev/null @@ -1,693 +0,0 @@ -/*! - \file usbh_enum.c - \brief USB host mode enumeration driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_pipe.h" -#include "usbh_transc.h" -#include "usbh_enum.h" - -/* local function prototypes ('static') */ -static void usbh_devdesc_parse(usb_desc_dev *dev_desc, uint8_t *buf, uint16_t len); -static void usbh_cfgdesc_parse(usb_desc_config *cfg_desc, uint8_t *buf); -static void usbh_cfgset_parse(usb_dev_prop *udev, uint8_t *buf); -static void usbh_itfdesc_parse(usb_desc_itf *itf_desc, uint8_t *buf); -static void usbh_epdesc_parse(usb_desc_ep *ep_desc, uint8_t *buf); -static void usbh_strdesc_parse(uint8_t *psrc, uint8_t *pdest, uint16_t len); - -/*! - \brief configure USB control status parameters - \param[in] uhost: pointer to USB host - \param[in] buf: control transfer data buffer pointer - \param[in] len: length of the data buffer - \param[out] none - \retval none -*/ -void usbh_ctlstate_config(usbh_host *uhost, uint8_t *buf, uint16_t len) -{ - /* prepare the transactions */ - uhost->control.buf = buf; - uhost->control.ctl_len = len; - - uhost->control.ctl_state = CTL_SETUP; -} - -/*! - \brief get device descriptor from the USB device - \param[in] uhost: pointer to USB host - \param[in] len: length of the descriptor - \param[out] none - \retval operation status -*/ -usbh_status usbh_devdesc_get(usbh_host *uhost, uint8_t len) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_GET_DESCRIPTOR, - .wValue = USBH_DESC(USB_DESCTYPE_DEV), - .wIndex = 0U, - .wLength = len - }; - - usbh_ctlstate_config(uhost, uhost->dev_prop.data, (uint16_t)len); - } - - status = usbh_ctl_handler(uhost); - - if(USBH_OK == status) { - /* commands successfully sent and response received */ - usbh_devdesc_parse(&uhost->dev_prop.dev_desc, uhost->dev_prop.data, (uint16_t)len); - } - - return status; -} - -/*! - \brief get configuration descriptor from the USB device - \param[in] uhost: pointer to USB host - \param[in] len: length of the descriptor - \param[out] none - \retval operation status -*/ -usbh_status usbh_cfgdesc_get(usbh_host *uhost, uint16_t len) -{ - uint8_t *pdata = NULL; - - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - -#if (USBH_CFG_DESC_KEEP == 1U) - pdata = uhost->dev_prop.cfgdesc_rawdata; -#else - pdata = uhost->dev_prop.data; -#endif /* (USBH_CFG_DESC_KEEP == 1U) */ - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_GET_DESCRIPTOR, - .wValue = USBH_DESC(USB_DESCTYPE_CONFIG), - .wIndex = 0U, - .wLength = len - }; - - usbh_ctlstate_config(uhost, pdata, len); - } - - status = usbh_ctl_handler(uhost); - - if(USBH_OK == status) { - if(len <= USB_CFG_DESC_LEN) { - usbh_cfgdesc_parse(&uhost->dev_prop.cfg_desc_set.cfg_desc, pdata); - } else { - usbh_cfgset_parse(&uhost->dev_prop, pdata); - } - } - - return status; -} - -/*! - \brief get string descriptor from the USB device - \param[in] uhost: pointer to USB host - \param[in] str_index: index for the string descriptor - \param[in] buf: buffer pointer to the string descriptor - \param[in] len: length of the descriptor - \param[out] none - \retval operation status -*/ -usbh_status usbh_strdesc_get(usbh_host *uhost, \ - uint8_t str_index, \ - uint8_t *buf, \ - uint16_t len) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_GET_DESCRIPTOR, - .wValue = USBH_DESC(USB_DESCTYPE_STR) | str_index, - .wIndex = 0x0409U, - .wLength = len - }; - - usbh_ctlstate_config(uhost, uhost->dev_prop.data, len); - } - - status = usbh_ctl_handler(uhost); - - if(USBH_OK == status) { - /* commands successfully sent and response received */ - usbh_strdesc_parse(uhost->dev_prop.data, buf, len); - } - - return status; -} - -/*! - \brief set the address to the connected device - \param[in] uhost: pointer to USB host - \param[in] dev_addr: device address to assign - \param[out] none - \retval operation status -*/ -usbh_status usbh_setaddress(usbh_host *uhost, uint8_t dev_addr) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_SET_ADDRESS, - .wValue = (uint16_t)dev_addr, - .wIndex = 0U, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set the configuration value to the connected device - \param[in] uhost: pointer to USB host - \param[in] config_index: configuration value - \param[out] none - \retval operation status -*/ -usbh_status usbh_setcfg(usbh_host *uhost, uint16_t config_index) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_SET_CONFIGURATION, - .wValue = config_index, - .wIndex = 0U, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set the interface value to the connected device - \param[in] uhost: pointer to USB host - \param[in] itf_num: interface number - \param[in] set: alternated setting value - \param[out] none - \retval operation status -*/ -usbh_status usbh_setinterface(usbh_host *uhost, uint8_t itf_num, uint8_t set) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, - .bRequest = USB_SET_INTERFACE, - .wValue = set, - .wIndex = itf_num, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief set the interface value to the connected device - \param[in] uhost: pointer to USB host - \param[in] feature_selector: feature selector - \param[in] windex: index value - \param[out] none - \retval operation status -*/ -usbh_status usbh_setdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_SET_FEATURE, - .wValue = feature_selector, - .wIndex = windex, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief clear the interface value to the connected device - \param[in] uhost: pointer to USB host - \param[in] feature_selector: feature selector - \param[in] windex: index value - \param[out] none - \retval operation status -*/ -usbh_status usbh_clrdevfeature(usbh_host *uhost, uint8_t feature_selector, uint16_t windex) -{ - usbh_status status = USBH_BUSY; - - usbh_control *usb_ctl = &uhost->control; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, - .bRequest = USB_CLEAR_FEATURE, - .wValue = feature_selector, - .wIndex = windex, - .wLength = 0U - }; - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief clear or disable a specific feature - \param[in] uhost: pointer to USB host - \param[in] ep_addr: endpoint address - \param[in] pp_num: pipe number - \param[out] none - \retval operation status -*/ -usbh_status usbh_clrfeature(usbh_host *uhost, uint8_t ep_addr, uint8_t pp_num) -{ - usbh_status status = USBH_BUSY; - usbh_control *usb_ctl = &uhost->control; - usb_core_driver *udev = (usb_core_driver *)uhost->data; - - if(CTL_IDLE == usb_ctl->ctl_state) { - usb_ctl->setup.req = (usb_req) { - .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_EP | USB_REQTYPE_STRD, - .bRequest = USB_CLEAR_FEATURE, - .wValue = FEATURE_SELECTOR_EP, - .wIndex = ep_addr, - .wLength = 0U - }; - - if(EP_ID(ep_addr) == udev->host.pipe[pp_num].ep.num) { - usbh_pipe_toggle_set(udev, pp_num, 0U); - } else { - return USBH_FAIL; - } - - usbh_ctlstate_config(uhost, NULL, 0U); - } - - status = usbh_ctl_handler(uhost); - - return status; -} - -/*! - \brief get the next descriptor header - \param[in] pbuf: pointer to buffer where the configuration descriptor set is available - \param[in] ptr: data pointer inside the configuration descriptor set - \param[out] none - \retval return descriptor header -*/ -usb_desc_header *usbh_nextdesc_get(uint8_t *pbuf, uint16_t *ptr) -{ - usb_desc_header *pnext; - - *ptr += ((usb_desc_header *)pbuf)->bLength; - - pnext = (usb_desc_header *)((uint8_t *)pbuf + ((usb_desc_header *)pbuf)->bLength); - - return (pnext); -} - -/*! - \brief get the next descriptor header - \param[in] udev: pointer to device property - \param[in] interface: interface number - \param[out] none - \retval operation status -*/ -usbh_status usbh_interface_select(usb_dev_prop *udev, uint8_t interface) -{ - usbh_status status = USBH_OK; - - if(interface < udev->cfg_desc_set.cfg_desc.bNumInterfaces) { - udev->cur_itf = interface; - } else { - status = USBH_FAIL; - } - - return status; -} - -/*! - \brief find the interface index for a specific class - \param[in] udev: pointer to device property - \param[in] main_class: class code - \param[in] sub_class: subclass code - \param[in] protocol: protocol code - \param[out] none - \retval interface index in the configuration structure - \note interface index 0xFF means interface index not found -*/ -uint8_t usbh_interface_find(usb_dev_prop *udev, uint8_t main_class, uint8_t sub_class, uint8_t protocol) -{ - usb_desc_itf *pif; - - uint8_t if_ix = 0U; - - pif = (usb_desc_itf *)0U; - - while(if_ix < udev->cfg_desc_set.cfg_desc.bNumInterfaces) { - pif = &udev->cfg_desc_set.itf_desc_set[if_ix][0].itf_desc; - - if(((pif->bInterfaceClass == main_class) || (0xFFU == main_class)) && \ - ((pif->bInterfaceSubClass == sub_class) || (0xFFU == sub_class)) && \ - ((pif->bInterfaceProtocol == protocol) || (0xFFU == protocol))) { - return if_ix; - } - - if_ix++; - } - - return 0xFFU; -} - -/*! - \brief find the interface index for a specific class interface and alternate setting number - \param[in] udev: pointer to device property - \param[in] interface_number: interface number - \param[in] alt_settings: alternate setting number - \param[out] none - \retval interface index in the configuration structure - \note interface index 0xFF means interface index not found -*/ -uint8_t usbh_interfaceindex_find(usb_dev_prop *udev, uint8_t interface_number, uint8_t alt_settings) -{ - usb_desc_itf *pif; - - uint8_t if_ix = 0U; - - pif = (usb_desc_itf *)0U; - - while(if_ix < USBH_MAX_INTERFACES_NUM) { - pif = &udev->cfg_desc_set.itf_desc_set[if_ix][alt_settings].itf_desc; - - if((pif->bInterfaceNumber == interface_number) && (pif->bAlternateSetting == alt_settings)) { - return if_ix; - } - - if_ix++; - } - - return 0xFFU; -} - -/*! - \brief parse the device descriptor - \param[in] dev_desc: pointer to USB device descriptor buffer - \param[in] buf: pointer to the source descriptor buffer - \param[in] len: length of the descriptor - \param[out] none - \retval none -*/ -static void usbh_devdesc_parse(usb_desc_dev *dev_desc, uint8_t *buf, uint16_t len) -{ - *dev_desc = (usb_desc_dev) { - .header = { - .bLength = *(uint8_t *)(buf + 0U), - .bDescriptorType = *(uint8_t *)(buf + 1U) - }, - - .bcdUSB = BYTE_SWAP(buf + 2U), - .bDeviceClass = *(uint8_t *)(buf + 4U), - .bDeviceSubClass = *(uint8_t *)(buf + 5U), - .bDeviceProtocol = *(uint8_t *)(buf + 6U), - .bMaxPacketSize0 = *(uint8_t *)(buf + 7U) - }; - - if(len > 8U) { - /* for 1st time after device connection, host may issue only 8 bytes for device descriptor length */ - dev_desc->idVendor = BYTE_SWAP(buf + 8U); - dev_desc->idProduct = BYTE_SWAP(buf + 10U); - dev_desc->bcdDevice = BYTE_SWAP(buf + 12U); - dev_desc->iManufacturer = *(uint8_t *)(buf + 14U); - dev_desc->iProduct = *(uint8_t *)(buf + 15U); - dev_desc->iSerialNumber = *(uint8_t *)(buf + 16U); - dev_desc->bNumberConfigurations = *(uint8_t *)(buf + 17U); - } -} - -/*! - \brief parse the configuration descriptor - \param[in] cfg_desc: pointer to USB configuration descriptor buffer - \param[in] buf: pointer to the source descriptor buffer - \param[out] none - \retval none -*/ -static void usbh_cfgdesc_parse(usb_desc_config *cfg_desc, uint8_t *buf) -{ - /* parse configuration descriptor */ - *cfg_desc = (usb_desc_config) { - .header = { - .bLength = *(uint8_t *)(buf + 0U), - .bDescriptorType = *(uint8_t *)(buf + 1U), - }, - - .wTotalLength = BYTE_SWAP(buf + 2U), - .bNumInterfaces = *(uint8_t *)(buf + 4U), - .bConfigurationValue = *(uint8_t *)(buf + 5U), - .iConfiguration = *(uint8_t *)(buf + 6U), - .bmAttributes = *(uint8_t *)(buf + 7U), - .bMaxPower = *(uint8_t *)(buf + 8U) - }; -} - -/*! - \brief parse the configuration descriptor set - \param[in] udev: pointer to device property - \param[in] buf: pointer to the source descriptor buffer - \param[out] none - \retval none -*/ -static void usbh_cfgset_parse(usb_dev_prop *udev, uint8_t *buf) -{ - usb_desc_ep *ep = NULL; - usb_desc_itf_set *itf = NULL; - usb_desc_itf itf_value; - usb_desc_config *cfg = NULL; - - usb_desc_header *pdesc = (usb_desc_header *)buf; - - uint8_t itf_index = 0U, ep_index = 0U, alt_setting = 0U; - uint8_t pre_itf_index = 0U; - uint16_t ptr = 0U; - - /* parse configuration descriptor */ - usbh_cfgdesc_parse(&udev->cfg_desc_set.cfg_desc, buf); - cfg = &udev->cfg_desc_set.cfg_desc; - ptr = USB_CFG_DESC_LEN; - - if(cfg->bNumInterfaces > USBH_MAX_INTERFACES_NUM) { - return; - } - - while(ptr < cfg->wTotalLength) { - pdesc = usbh_nextdesc_get((uint8_t *)pdesc, &ptr); - - if(USB_DESCTYPE_ITF == pdesc->bDescriptorType) { - itf_index = *(((uint8_t *)pdesc) + 2U); - - if(pre_itf_index != itf_index) { - alt_setting = 0U; - } - - itf = &udev->cfg_desc_set.itf_desc_set[itf_index][alt_setting]; - - alt_setting++; - - if((*((uint8_t *)pdesc + 3U)) < 3U) { - usbh_itfdesc_parse(&itf_value, (uint8_t *)pdesc); - - /* parse endpoint descriptors relative to the current interface */ - if(itf_value.bNumEndpoints > USBH_MAX_EP_NUM) { - return; - } - - usbh_itfdesc_parse(&itf->itf_desc, (uint8_t *)&itf_value); - - /* store the previous interface index */ - pre_itf_index = itf_index; - - if(0U == itf_value.bNumEndpoints) { - continue; - } - - for(ep_index = 0U; ep_index < itf_value.bNumEndpoints;) { - pdesc = usbh_nextdesc_get((void *)pdesc, &ptr); - - if(USB_DESCTYPE_EP == pdesc->bDescriptorType) { - ep = &itf->ep_desc[ep_index]; - - usbh_epdesc_parse(ep, (uint8_t *)pdesc); - - ep_index++; - } - } - } - } - } -} - -/*! - \brief parse the interface descriptor - \param[in] itf_desc: pointer to USB interface descriptor buffer - \param[in] buf: pointer to the source descriptor buffer - \param[out] none - \retval none -*/ -static void usbh_itfdesc_parse(usb_desc_itf *itf_desc, uint8_t *buf) -{ - *itf_desc = (usb_desc_itf) { - .header = { - .bLength = *(uint8_t *)(buf + 0U), - .bDescriptorType = *(uint8_t *)(buf + 1U), - }, - - .bInterfaceNumber = *(uint8_t *)(buf + 2U), - .bAlternateSetting = *(uint8_t *)(buf + 3U), - .bNumEndpoints = *(uint8_t *)(buf + 4U), - .bInterfaceClass = *(uint8_t *)(buf + 5U), - .bInterfaceSubClass = *(uint8_t *)(buf + 6U), - .bInterfaceProtocol = *(uint8_t *)(buf + 7U), - .iInterface = *(uint8_t *)(buf + 8U) - }; -} - -/*! - \brief parse the endpoint descriptor - \param[in] ep_desc: pointer to USB endpoint descriptor buffer - \param[in] buf: pointer to the source descriptor buffer - \param[out] none - \retval none -*/ -static void usbh_epdesc_parse(usb_desc_ep *ep_desc, uint8_t *buf) -{ - *ep_desc = (usb_desc_ep) { - .header = { - .bLength = *(uint8_t *)(buf + 0U), - .bDescriptorType = *(uint8_t *)(buf + 1U) - }, - - .bEndpointAddress = *(uint8_t *)(buf + 2U), - .bmAttributes = *(uint8_t *)(buf + 3U), - .wMaxPacketSize = BYTE_SWAP(buf + 4U), - .bInterval = *(uint8_t *)(buf + 6U) - }; -} - -/*! - \brief parse the string descriptor - \param[in] psrc: source pointer containing the descriptor data - \param[in] pdest: destination address pointer - \param[in] len: length of the descriptor - \param[out] none - \retval none -*/ -static void usbh_strdesc_parse(uint8_t *psrc, uint8_t *pdest, uint16_t len) -{ - uint16_t str_len = 0U, index = 0U; - - /* the Unicode string descriptor is not NULL-terminated. The string length is - * computed by subtracting two from the value of the first byte of the descriptor. - */ - - /* check which is lower size, the size of string or the length of bytes read from the device */ - if(USB_DESCTYPE_STR == psrc[1]) { - /* make sure the descriptor is string type */ - - /* psrc[0] contains size of descriptor, subtract 2 to get the length of string */ - str_len = USB_MIN((uint16_t)psrc[0] - 2U, len); - - psrc += 2U; /* adjust the offset ignoring the string length and descriptor type */ - - for(index = 0U; index < str_len; index += 2U) { - /* copy only the string and ignore the Unicode id, hence add the source */ - *pdest = psrc[index]; - - pdest++; - } - - *pdest = 0U; /* mark end of string */ - } -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c deleted file mode 100644 index ff5cff63abe..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_pipe.c +++ /dev/null @@ -1,181 +0,0 @@ -/*! - \file usbh_pipe.c - \brief USB host mode pipe operation driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_pipe.h" - -/* local function prototypes ('static') */ -static uint16_t usbh_freepipe_get(usb_core_driver *udev); - -/*! - \brief create a pipe - \param[in] udev: pointer to USB core instance - \param[in] dev: USB device - \param[in] pp_num: pipe number - \param[in] ep_type: endpoint type - \param[in] ep_mpl: endpoint max packet length - \param[out] none - \retval operation status -*/ -uint8_t usbh_pipe_create(usb_core_driver *udev, \ - usb_dev_prop *dev, \ - uint8_t pp_num, \ - uint8_t ep_type, \ - uint16_t ep_mpl) -{ - usb_pipe *pp = &udev->host.pipe[pp_num]; - - pp->dev_addr = dev->addr; - pp->dev_speed = dev->speed; - pp->ep.type = ep_type; - pp->ep.mps = ep_mpl; - - if((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { - pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); - } - - usb_pipe_init(udev, pp_num); - - return HP_OK; -} - -/*! - \brief modify a pipe - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[in] dev_addr: device address - \param[in] dev_speed: device speed - \param[in] ep_mpl: endpoint max packet length - \param[out] none - \retval operation status -*/ -uint8_t usbh_pipe_update(usb_core_driver *udev, \ - uint8_t pp_num, \ - uint8_t dev_addr, \ - uint32_t dev_speed, \ - uint16_t ep_mpl) -{ - usb_pipe *pp = &udev->host.pipe[pp_num]; - - if((pp->dev_addr != dev_addr) && (dev_addr)) { - pp->dev_addr = dev_addr; - } - - if((pp->dev_speed != dev_speed) && (dev_speed)) { - pp->dev_speed = dev_speed; - - if((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { - pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); - } - } - - if((pp->ep.mps != ep_mpl) && (ep_mpl)) { - pp->ep.mps = ep_mpl; - } - - usb_pipe_init(udev, pp_num); - - return HP_OK; -} - -/*! - \brief allocate a new pipe - \param[in] udev: pointer to USB core instance - \param[in] ep_addr: endpoint address - \param[out] none - \retval operation status -*/ -uint8_t usbh_pipe_allocate(usb_core_driver *udev, uint8_t ep_addr) -{ - uint16_t pp_num = usbh_freepipe_get(udev); - - if(HP_ERROR != pp_num) { - udev->host.pipe[pp_num].in_used = 1U; - udev->host.pipe[pp_num].ep.dir = EP_DIR(ep_addr); - udev->host.pipe[pp_num].ep.num = EP_ID(ep_addr); - } - - return (uint8_t)pp_num; -} - -/*! - \brief free a pipe - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[out] none - \retval operation status -*/ -uint8_t usbh_pipe_free(usb_core_driver *udev, uint8_t pp_num) -{ - if(pp_num < HP_MAX) { - udev->host.pipe[pp_num].in_used = 0U; - } - - return USBH_OK; -} - -/*! - \brief delete all USB host pipe - \param[in] udev: pointer to USB core instance - \param[out] none - \retval operation status -*/ -uint8_t usbh_pipe_delete(usb_core_driver *udev) -{ - uint8_t pp_num = 0U; - - for(pp_num = 2U; pp_num < HP_MAX; pp_num++) { - udev->host.pipe[pp_num] = (usb_pipe) {0}; - } - - return USBH_OK; -} - -/*! - \brief get a free pipe number for allocation - \param[in] udev: pointer to USB core instance - \param[out] none - \retval operation status -*/ -static uint16_t usbh_freepipe_get(usb_core_driver *udev) -{ - uint8_t pp_num = 0U; - - for(pp_num = 0U; pp_num < HP_MAX; pp_num++) { - if(0U == udev->host.pipe[pp_num].in_used) { - return (uint16_t)pp_num; - } - } - - return HP_ERROR; -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c deleted file mode 100644 index 2c2da9d9802..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/host/core/Source/usbh_transc.c +++ /dev/null @@ -1,369 +0,0 @@ -/*! - \file usbh_transc.c - \brief USB host mode transactions driver - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "usbh_pipe.h" -#include "usbh_transc.h" - -/* local function prototypes ('static') */ -static usb_urb_state usbh_urb_wait(usbh_host *uhost, uint8_t pp_num, uint32_t wait_time); -static void usbh_setup_transc(usbh_host *uhost); -static void usbh_data_in_transc(usbh_host *uhost); -static void usbh_data_out_transc(usbh_host *uhost); -static void usbh_status_in_transc(usbh_host *uhost); -static void usbh_status_out_transc(usbh_host *uhost); -static uint32_t usbh_request_submit(usb_core_driver *udev, uint8_t pp_num); - -/*! - \brief send the SETUP packet to the USB device - \param[in] udev: pointer to USB core instance - \param[in] buf: data buffer which will be sent to USB device - \param[in] pp_num: pipe number - \param[out] none - \retval operation status -*/ -usbh_status usbh_ctlsetup_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num) -{ - usb_pipe *pp = &udev->host.pipe[pp_num]; - - pp->DPID = PIPE_DPID_SETUP; - pp->xfer_buf = buf; - pp->xfer_len = USB_SETUP_PACKET_LEN; - - return (usbh_status)usbh_request_submit(udev, pp_num); -} - -/*! - \brief send a data packet to the USB device - \param[in] udev: pointer to USB core instance - \param[in] buf: data buffer which will be sent to USB device - \param[in] pp_num: pipe number - \param[in] len: length of the data to be sent - \param[out] none - \retval operation status -*/ -usbh_status usbh_data_send(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len) -{ - usb_pipe *pp = &udev->host.pipe[pp_num]; - - pp->xfer_buf = buf; - pp->xfer_len = len; - - switch(pp->ep.type) { - case USB_EPTYPE_CTRL: - if(0U == len) { - pp->data_toggle_out = 1U; - } - - pp->DPID = PIPE_DPID[pp->data_toggle_out]; - break; - - case USB_EPTYPE_INTR: - pp->DPID = PIPE_DPID[pp->data_toggle_out]; - - pp->data_toggle_out ^= 1U; - break; - - case USB_EPTYPE_BULK: - pp->DPID = PIPE_DPID[pp->data_toggle_out]; - break; - - case USB_EPTYPE_ISOC: - pp->DPID = PIPE_DPID[0]; - break; - - default: - break; - } - - usbh_request_submit(udev, pp_num); - - return USBH_OK; -} - -/*! - \brief receive a data packet from the USB device - \param[in] udev: pointer to USB core instance - \param[in] buf: data buffer which will be received from USB device - \param[in] pp_num: pipe number - \param[in] len: length of the data to be received - \param[out] none - \retval operation status -*/ -usbh_status usbh_data_recev(usb_core_driver *udev, uint8_t *buf, uint8_t pp_num, uint16_t len) -{ - usb_pipe *pp = &udev->host.pipe[pp_num]; - - pp->xfer_buf = buf; - pp->xfer_len = len; - - switch(pp->ep.type) { - case USB_EPTYPE_CTRL: - pp->DPID = PIPE_DPID[1]; - break; - - case USB_EPTYPE_INTR: - pp->DPID = PIPE_DPID[pp->data_toggle_in]; - - /* toggle DATA PID */ - pp->data_toggle_in ^= 1U; - break; - - case USB_EPTYPE_BULK: - pp->DPID = PIPE_DPID[pp->data_toggle_in]; - break; - - case USB_EPTYPE_ISOC: - pp->DPID = PIPE_DPID[0]; - break; - - default: - break; - } - - usbh_request_submit(udev, pp_num); - - return USBH_OK; -} - -/*! - \brief USB control transfer handler - \param[in] uhost: pointer to USB host - \param[out] none - \retval operation status -*/ -usbh_status usbh_ctl_handler(usbh_host *uhost) -{ - usbh_status status = USBH_BUSY; - - switch(uhost->control.ctl_state) { - case CTL_SETUP: - usbh_setup_transc(uhost); - break; - - case CTL_DATA_IN: - usbh_data_in_transc(uhost); - break; - - case CTL_DATA_OUT: - usbh_data_out_transc(uhost); - break; - - case CTL_STATUS_IN: - usbh_status_in_transc(uhost); - break; - - case CTL_STATUS_OUT: - usbh_status_out_transc(uhost); - break; - - case CTL_FINISH: - uhost->control.ctl_state = CTL_IDLE; - - status = USBH_OK; - break; - - case CTL_ERROR: - if(++uhost->control.error_count <= USBH_MAX_ERROR_COUNT) { - /* do the transmission again, starting from SETUP packet */ - uhost->control.ctl_state = CTL_SETUP; - } else { - status = USBH_FAIL; - } - break; - - default: - break; - } - - return status; -} - -/*! - \brief wait for USB URB(USB request block) state - \param[in] uhost: pointer to USB host - \param[in] pp_num: pipe number - \param[in] wait_time: wait time - \param[out] none - \retval USB URB state -*/ -static usb_urb_state usbh_urb_wait(usbh_host *uhost, uint8_t pp_num, uint32_t wait_time) -{ - uint32_t timeout = 0U; - usb_urb_state urb_status = URB_IDLE; - timeout = uhost->control.timer; - - while(URB_DONE != (urb_status = usbh_urbstate_get(uhost->data, pp_num))) { - if(URB_NOTREADY == urb_status) { - break; - } else if(URB_STALL == urb_status) { - uhost->control.ctl_state = CTL_SETUP; - break; - } else if(URB_ERROR == urb_status) { - uhost->control.ctl_state = CTL_ERROR; - break; - } else if((wait_time > 0U) && ((uhost->control.timer - timeout) > wait_time)) { - /* timeout for IN transfer */ - uhost->control.ctl_state = CTL_ERROR; - break; - } else { - /* no operation, just wait */ - } - } - - return urb_status; -} - -/*! - \brief USB SETUP transaction - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -static void usbh_setup_transc(usbh_host *uhost) -{ - /* send a SETUP packet */ - usbh_ctlsetup_send(uhost->data, \ - uhost->control.setup.data, \ - uhost->control.pipe_out_num); - - if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_out_num, 0U)) { - uint8_t dir = (uhost->control.setup.req.bmRequestType & USB_TRX_MASK); - - if(uhost->control.setup.req.wLength) { - if(USB_TRX_IN == dir) { - uhost->control.ctl_state = CTL_DATA_IN; - } else { - uhost->control.ctl_state = CTL_DATA_OUT; - } - } else { - if(USB_TRX_IN == dir) { - uhost->control.ctl_state = CTL_STATUS_OUT; - } else { - uhost->control.ctl_state = CTL_STATUS_IN; - } - } - } -} - -/*! - \brief USB data IN transaction - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -static void usbh_data_in_transc(usbh_host *uhost) -{ - usbh_data_recev(uhost->data, \ - uhost->control.buf, \ - uhost->control.pipe_in_num, \ - uhost->control.ctl_len); - - if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_in_num, DATA_STAGE_TIMEOUT)) { - uhost->control.ctl_state = CTL_STATUS_OUT; - } -} - -/*! - \brief USB data OUT transaction - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -static void usbh_data_out_transc(usbh_host *uhost) -{ - usbh_pipe_toggle_set(uhost->data, uhost->control.pipe_out_num, 1U); - - usbh_data_send(uhost->data, \ - uhost->control.buf, \ - uhost->control.pipe_out_num, \ - uhost->control.ctl_len); - - if(URB_DONE == usbh_urb_wait(uhost, uhost->control.pipe_out_num, DATA_STAGE_TIMEOUT)) { - uhost->control.ctl_state = CTL_STATUS_IN; - } -} - -/*! - \brief USB status IN transaction - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -static void usbh_status_in_transc(usbh_host *uhost) -{ - uint8_t pp_num = uhost->control.pipe_in_num; - - usbh_data_recev(uhost->data, NULL, pp_num, 0U); - - if(URB_DONE == usbh_urb_wait(uhost, pp_num, NODATA_STAGE_TIMEOUT)) { - uhost->control.ctl_state = CTL_FINISH; - } -} - -/*! - \brief USB status OUT transaction - \param[in] uhost: pointer to USB host - \param[out] none - \retval none -*/ -static void usbh_status_out_transc(usbh_host *uhost) -{ - uint8_t pp_num = uhost->control.pipe_out_num; - - usbh_data_send(uhost->data, NULL, pp_num, 0U); - - if(URB_DONE == usbh_urb_wait(uhost, pp_num, NODATA_STAGE_TIMEOUT)) { - uhost->control.ctl_state = CTL_FINISH; - } -} - -/*! - \brief prepare a pipe and start a transfer - \param[in] udev: pointer to USB core instance - \param[in] pp_num: pipe number - \param[out] none - \retval operation status -*/ -static uint32_t usbh_request_submit(usb_core_driver *udev, uint8_t pp_num) -{ - udev->host.pipe[pp_num].urb_state = URB_IDLE; - udev->host.pipe[pp_num].xfer_count = 0U; - - if(1U == udev->host.pipe[pp_num].do_ping) { - (void)usb_pipe_ping(udev, (uint8_t)pp_num); - return USB_OK; - } - - return (uint32_t)usb_pipe_xfer(udev, pp_num); -} diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h deleted file mode 100644 index 0e502e26409..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/cdc/usb_cdc.h +++ /dev/null @@ -1,180 +0,0 @@ -/*! - \file usb_cdc.h - \brief the header file of communication device class standard - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USB_CDC_H -#define USB_CDC_H - -#include "usb_ch9_std.h" - -/* communications device class code */ -#define USB_CLASS_CDC 0x02U - -/* communications interface class control protocol codes */ -#define USB_CDC_PROTOCOL_NONE 0x00U /*!< CDC none protocol */ -#define USB_CDC_PROTOCOL_AT 0x01U /*!< CDC AT protocol */ -#define USB_CDC_PROTOCOL_VENDOR 0xFFU /*!< CDC vendor protocol */ - -/* data interface class code */ -#define USB_CLASS_DATA 0x0AU - -#define USB_DESCTYPE_CDC_ACM 0x21U /*!< CDC descriptor type */ -#define USB_DESCTYPE_CS_INTERFACE 0x24U /*!< CDC interface descriptor type */ - -#define USB_CDC_ACM_CONFIG_DESC_SIZE 0x43U /*!< CDC configuration descriptor size */ - -/* class-specific notification codes for pstn subclasses */ -#define USB_CDC_NOTIFY_SERIAL_STATE 0x20U - -/* class-specific request codes */ -#define SEND_ENCAPSULATED_COMMAND 0x00U /*!< send encapsulated command request */ -#define GET_ENCAPSULATED_RESPONSE 0x01U /*!< get encapsulated response request */ -#define SET_COMM_FEATURE 0x02U /*!< set command feature request */ -#define GET_COMM_FEATURE 0x03U /*!< get command feature request */ -#define CLEAR_COMM_FEATURE 0x04U /*!< clear command feature request */ - -#define SET_AUX_LINE_STATE 0x10U /*!< set AUX line state code */ -#define SET_HOOK_STATE 0x11U /*!< set hook state code */ -#define PULSE_SETUP 0x12U /*!< pulse setup code */ -#define SEND_PULSE 0x13U /*!< send pulse code */ -#define SET_PULSE_TIME 0x14U /*!< set pulse time code */ -#define RING_AUX_JACK 0x15U /*!< ring AUX jack code */ - -#define SET_LINE_CODING 0x20U /*!< set line coding request */ -#define GET_LINE_CODING 0x21U /*!< get line coding request */ -#define SET_CONTROL_LINE_STATE 0x22U /*!< set control line state request */ -#define SEND_BREAK 0x23U /*!< send break request */ -#define NO_CMD 0xFFU /*!< no command request */ - -#define SET_RINGER_PARMS 0x30U /*!< set ringer parameter */ -#define GET_RINGER_PARMS 0x31U /*!< get ringer parameter */ -#define SET_OPERATION_PARMS 0x32U /*!< set operation parameter */ -#define GET_OPERATION_PARMS 0x33U /*!< get ringer parameter */ -#define SET_LINE_PARMS 0x34U /*!< set line parameter */ -#define GET_LINE_PARMS 0x35U /*!< get ringer parameter */ -#define DIAL_DIGITS 0x36U /*!< dial digits */ -#define SET_UNIT_PARAMETER 0x37U /*!< set unit parameter */ -#define GET_UNIT_PARAMETER 0x38U /*!< get unit parameter */ -#define CLEAR_UNIT_PARAMETER 0x39U /*!< clear unit parameter */ -#define GET_PROFILE 0x3AU /*!< get profile */ - -#define SET_ETHERNET_MULTICAST_FILTERS 0x40U /*!< set ethernet muilcast filters */ -#define SET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x41U /*!< set ethernet power management pattern filter */ -#define GET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x42U /*!< get ethernet power management pattern filter */ -#define SET_ETHERNET_PACKET_FILTER 0x43U /*!< set ethernet power pocket filter */ -#define GET_ETHERNET_STATISTIC 0x44U /*!< get ethernet statistic */ - -#define SET_ATM_DATA_FORMAT 0x50U /*!< set ATM data format */ -#define GET_ATM_DEVICE_STATISTICS 0x51U /*!< get ATM device statistics */ -#define SET_ATM_DEFAULT_VC 0x52U /*!< set ATM default VC */ -#define GET_ATM_VC_STATISTICS 0x53U /*!< get ATM VC statistics */ - -/* wValue for set control line state */ -#define CDC_ACTIVATE_CARRIER_SIGNAL_RTS 0x0002U /*!< CDC activate carrier signal RTS */ -#define CDC_DEACTIVATE_CARRIER_SIGNAL_RTS 0x0000U /*!< CDC deactivate carrier signal RTS */ -#define CDC_ACTIVATE_SIGNAL_DTR 0x0001U /*!< CDC activate signal DTR */ -#define CDC_DEACTIVATE_SIGNAL_DTR 0x0000U /*!< CDC deactivate signal DTR */ - -/* CDC subclass code */ -enum usb_cdc_subclass { - USB_CDC_SUBCLASS_RESERVED = 0U, /*!< reserved */ - USB_CDC_SUBCLASS_DLCM, /*!< direct line control mode */ - USB_CDC_SUBCLASS_ACM, /*!< abstract control mode */ - USB_CDC_SUBCLASS_TCM, /*!< telephone control mode */ - USB_CDC_SUBCLASS_MCM, /*!< multichannel control model */ - USB_CDC_SUBCLASS_CCM, /*!< CAPI control model */ - USB_CDC_SUBCLASS_ENCM, /*!< ethernet networking control model */ - USB_CDC_SUBCLASS_ANCM /*!< ATM networking control model */ -}; - -#pragma pack(1) - -/* cdc acm line coding structure */ -typedef struct { - uint32_t dwDTERate; /*!< data terminal rate */ - uint8_t bCharFormat; /*!< stop bits */ - uint8_t bParityType; /*!< parity */ - uint8_t bDataBits; /*!< data bits */ -} acm_line; - -/* notification structure */ -typedef struct { - uint8_t bmRequestType; /*!< type of request */ - uint8_t bNotification; /*!< communication interface class notifications */ - uint16_t wValue; /*!< value of notification */ - uint16_t wIndex; /*!< index of interface */ - uint16_t wLength; /*!< length of notification data */ -} acm_notification; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: header function descriptor */ - uint16_t bcdCDC; /*!< bcdCDC: low byte of spec release number (CDC1.10) */ -} usb_desc_header_func; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: call management function descriptor */ - uint8_t bmCapabilities; /*!< bmCapabilities: D0 is reset, D1 is ignored */ - uint8_t bDataInterface; /*!< bDataInterface: 1 interface used for call management */ -} usb_desc_call_managment_func; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: abstract control management descriptor */ - uint8_t bmCapabilities; /*!< bmCapabilities: D1 */ -} usb_desc_acm_func; - -typedef struct { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: union function descriptor */ - uint8_t bMasterInterface; /*!< bMasterInterface: communication class interface */ - uint8_t bSlaveInterface0; /*!< bSlaveInterface0: data class interface */ -} usb_desc_union_func; - -#pragma pack() - -typedef struct { - usb_desc_config config; /*!< configure descriptor */ - usb_desc_itf cmd_itf; /*!< CDC cmd interface descriptor */ - usb_desc_header_func cdc_header; /*!< CDC header function descriptor */ - usb_desc_call_managment_func cdc_call_managment; /*!< CDC call management descriptor */ - usb_desc_acm_func cdc_acm; /*!< CDC acm descriptor */ - usb_desc_union_func cdc_union; /*!< CDC union function descriptor */ - usb_desc_ep cdc_cmd_endpoint; /*!< CDC cmd endpoint descriptor */ - usb_desc_itf cdc_data_interface; /*!< CDC data interface descriptor */ - usb_desc_ep cdc_out_endpoint; /*!< CDC OUT endpoint descriptor */ - usb_desc_ep cdc_in_endpoint; /*!< CDC IN endpoint descriptor */ -} usb_cdc_desc_config_set; - -#endif /* USB_CDC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h deleted file mode 100644 index 84b12e0e110..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/hid/usb_hid.h +++ /dev/null @@ -1,81 +0,0 @@ -/*! - \file usb_hid.h - \brief definitions for the USB HID class - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USB_HID_H -#define USB_HID_H - -#include "usb_ch9_std.h" - -#define USB_HID_CLASS 0x03U /*!< HID class code */ - -#define USB_DESCTYPE_HID 0x21U /*!< HID descriptor type */ -#define USB_DESCTYPE_REPORT 0x22U /*!< report descriptor type */ - -/* HID subclass code */ -#define USB_HID_SUBCLASS_BOOT_ITF 0x01U - -/* HID protocol codes */ -#define USB_HID_PROTOCOL_KEYBOARD 0x01U /*!< HID keyboard protocol */ -#define USB_HID_PROTOCOL_MOUSE 0x02U /*!< HID mouse protocol */ - -#define GET_REPORT 0x01U /*!< get report request */ -#define GET_IDLE 0x02U /*!< get idle request */ -#define GET_PROTOCOL 0x03U /*!< get protocol request */ -#define SET_REPORT 0x09U /*!< set report request */ -#define SET_IDLE 0x0AU /*!< set idle request */ -#define SET_PROTOCOL 0x0BU /*!< set protocol request */ - -#pragma pack(1) - -typedef struct { - usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ - - uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ - uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ - uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ - uint8_t bDescriptorType; /*!< type of HID report */ - uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ -} usb_desc_hid; - -#pragma pack() - -typedef struct { - usb_desc_config config; /*!< configure descriptor */ - usb_desc_itf hid_itf; /*!< HID interface descriptor */ - usb_desc_hid hid_vendor; /*!< HID vendor descriptor */ - usb_desc_ep hid_epin; /*!< HID IN endpoint descriptor */ - usb_desc_ep hid_epout; /*!< HID OUT endpoint descriptor */ -}usb_hid_desc_config_set; - -#endif /* USB_HID_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h deleted file mode 100644 index 9b45f64a5d1..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_bbb.h +++ /dev/null @@ -1,69 +0,0 @@ -/*! - \file msc_bbb.h - \brief definitions for the USB MSC BBB(bulk/bulk/bulk) protocol - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef MSC_BBB_H -#define MSC_BBB_H - -#include "usb_ch9_std.h" - -#define BBB_CBW_SIGNATURE 0x43425355U /*!< MSC BBB CBW signature */ -#define BBB_CSW_SIGNATURE 0x53425355U /*!< MSC BBB CSW signature */ -#define BBB_CBW_LENGTH 31U /*!< MSC BBB CBW length */ -#define BBB_CSW_LENGTH 13U /*!< MSC BBB CSW length */ - -typedef struct { - uint32_t dCBWSignature; /*!< CBW signature */ - uint32_t dCBWTag; /*!< CBW tag */ - uint32_t dCBWDataTransferLength; /*!< CBW signature */ - uint8_t bmCBWFlags; /*!< CBW flags */ - uint8_t bCBWLUN; /*!< CBW LUN */ - uint8_t bCBWCBLength; /*!< CBW length */ - uint8_t CBWCB[16]; /*!< CBW CB */ -} msc_bbb_cbw; - -typedef struct { - uint32_t dCSWSignature; /*!< CSW signature */ - uint32_t dCSWTag; /*!< CSW tag */ - uint32_t dCSWDataResidue; /*!< CSW data residue */ - uint8_t bCSWStatus; /*!< CSW status */ -} msc_bbb_csw; - -/* CSW command status */ -enum msc_csw_status { - CSW_CMD_PASSED = 0U, /*!< CSW passed command status */ - CSW_CMD_FAILED, /*!< CSW failed command status */ - CSW_PHASE_ERROR /*!< CSW phase error status */ -}; - -#endif /* MSC_BBB_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h deleted file mode 100644 index c3f638410d2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/msc_scsi.h +++ /dev/null @@ -1,117 +0,0 @@ -/*! - \file msc_scsi.h - \brief definitions for the USB MSC SCSI commands - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef MSC_SCSI_H -#define MSC_SCSI_H - -#include "usb_ch9_std.h" - -/* SCSI commands */ -#define SCSI_FORMAT_UNIT 0x04U /*!< MSC SCSI format unit */ -#define SCSI_INQUIRY 0x12U /*!< MSC SCSI inquiry */ -#define SCSI_MODE_SELECT6 0x15U /*!< MSC SCSI select6 mode */ -#define SCSI_MODE_SELECT10 0x55U /*!< MSC SCSI select10 mode */ -#define SCSI_MODE_SENSE6 0x1AU /*!< MSC SCSI sense6 mode */ -#define SCSI_READ_TOC_DATA 0x43U /*!< MSC SCSI read TOC data */ -#define SCSI_MODE_SENSE10 0x5AU /*!< MSC SCSI sense10 mode */ -#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU /*!< MSC SCSI allow medium removal */ -#define SCSI_READ6 0x08U /*!< MSC SCSI read6 */ -#define SCSI_READ10 0x28U /*!< MSC SCSI read10 */ -#define SCSI_READ12 0xA8U /*!< MSC SCSI read12 */ -#define SCSI_READ16 0x88U /*!< MSC SCSI read16 */ - -#define SCSI_READ_CAPACITY10 0x25U /*!< MSC SCSI read capacity10 */ -#define SCSI_READ_CAPACITY16 0x9EU /*!< MSC SCSI read capacity16 */ - -#define SCSI_REQUEST_SENSE 0x03U /*!< MSC SCSI request sense */ -#define SCSI_START_STOP_UNIT 0x1BU /*!< MSC SCSI start stop unit */ -#define SCSI_TEST_UNIT_READY 0x00U /*!< MSC SCSI test unit ready */ -#define SCSI_WRITE6 0x0AU /*!< MSC SCSI write6 */ -#define SCSI_WRITE10 0x2AU /*!< MSC SCSI write10 */ -#define SCSI_WRITE12 0xAAU /*!< MSC SCSI write12 */ -#define SCSI_WRITE16 0x8AU /*!< MSC SCSI write16 */ - -#define SCSI_VERIFY10 0x2FU /*!< MSC SCSI verify10 */ -#define SCSI_VERIFY12 0xAFU /*!< MSC SCSI verify12 */ -#define SCSI_VERIFY16 0x8FU /*!< MSC SCSI verify16 */ - -#define SCSI_SEND_DIAGNOSTIC 0x1DU /*!< MSC SCSI send diagnostic */ -#define SCSI_READ_FORMAT_CAPACITIES 0x23U /*!< MSC SCSI read format capacities */ - -#define INVALID_CDB 0x20U /*!< invalid CDB */ -#define INVALID_FIELD_IN_COMMAND 0x24U /*!< invalid field in command */ -#define PARAMETER_LIST_LENGTH_ERROR 0x1AU /*!< parameter list length error */ -#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U /*!< invalid field in parameter list */ -#define ADDRESS_OUT_OF_RANGE 0x21U /*!< address out of range */ -#define MEDIUM_NOT_PRESENT 0x3AU /*!< medium not present */ -#define MEDIUM_HAVE_CHANGED 0x28U /*!< medium have changed */ -#define WRITE_PROTECTED 0x27U /*!< write protected */ -#define UNRECOVERED_READ_ERROR 0x11U /*!< unrecovered read error */ -#define WRITE_FAULT 0x03U /*!< write fault */ - -#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU /*!< read format capacity data length */ -#define READ_CAPACITY10_DATA_LEN 0x08U /*!< read capacity10 data length */ -#define MODE_SENSE10_DATA_LEN 0x08U /*!< sense10 mode data length */ -#define MODE_SENSE6_DATA_LEN 0x04U /*!< sense6 mode data length */ -#define READ_TOC_CMD_LEN 0x14U /*!< read TOC command length */ -#define REQUEST_SENSE_DATA_LEN 0x12U /*!< request sense data length */ -#define STANDARD_INQUIRY_DATA_LEN 0x24U /*!< standard inquiry data length */ -#define BLKVFY 0x04U /*!< block verify */ - -enum sense_state { - NO_SENSE = 0U, /*!< MSC SCSI Sense NO_SENSE state */ - RECOVERED_ERROR, /*!< MSC SCSI Sense RECOVERED_ERROR */ - NOT_READY, /*!< MSC SCSI Sense NOT READY state*/ - MEDIUM_ERROR, /*!< MSC SCSI Sense MEDIUM ERROR state*/ - HARDWARE_ERROR, /*!< MSC SCSI Sense HARDWARE ERROR state*/ - ILLEGAL_REQUEST, /*!< MSC SCSI Sense ILLEGAL REQUEST state*/ - UNIT_ATTENTION, /*!< MSC SCSI Sense UNIT ATTENTION state*/ - DATA_PROTECT, /*!< MSC SCSI Sense DATA PROTECT state*/ - BLANK_CHECK, /*!< MSC SCSI Sense BLANK CHECK state*/ - VENDOR_SPECIFIC, /*!< MSC SCSI Sense VENDOR SPECIFIC state*/ - COPY_ABORTED, /*!< MSC SCSI Sense COPY ABORTED state*/ - ABORTED_COMMAND, /*!< MSC SCSI Sense ABORTED COMMAND state*/ - RESERVED, /*!< MSC SCSI Sense RESERVED state*/ - VOLUME_OVERFLOW, /*!< MSC SCSI Sense VOLUME OVERFLOW state*/ - MISCOMPARE /*!< MSC SCSI Sense MISCOMPARE state*/ -}; - -typedef struct { - uint8_t SenseKey; /*!< MSC SCSI SenseKey */ - uint32_t Information; /*!< MSC SCSI sense Information */ - uint8_t ASC; /*!< MSC SCSI sense ASC */ - uint8_t ASCQ; /*!< MSC SCSI sense ASCQ */ -} msc_scsi_sense; - -#endif /* MSC_SCSI_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h deleted file mode 100644 index 36c04bbec8f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/class/msc/usb_msc.h +++ /dev/null @@ -1,68 +0,0 @@ -/*! - \file usb_msc.h - \brief definitions for the USB MSC class - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USB_MSC_H -#define USB_MSC_H - -#include "usb_ch9_std.h" - -/* mass storage device class code */ -#define USB_CLASS_MSC 0x08U - -/* mass storage subclass code */ -#define USB_MSC_SUBCLASS_RBC 0x01U /*!< MSC RBC subclass */ -#define USB_MSC_SUBCLASS_ATAPI 0x02U /*!< MSC ATAPI subclass */ -#define USB_MSC_SUBCLASS_UFI 0x04U /*!< MSC UFI subclass */ -#define USB_MSC_SUBCLASS_SCSI 0x06U /*!< MSC SCSI subclass */ -#define USB_MSC_SUBCLASS_LOCKABLE 0x07U /*!< MSC LOCKABLE subclass */ -#define USB_MSC_SUBCLASS_IEEE1667 0x08U /*!< MSC IEEE1667 subclass */ - -/* mass storage interface class control protocol codes */ -#define USB_MSC_PROTOCOL_CBI 0x00U /*!< MSC CBI protocol */ -#define USB_MSC_PROTOCOL_CBI_ALT 0x01U /*!< MSC CBI ALT protocol */ -#define USB_MSC_PROTOCOL_BBB 0x50U /*!< MSC BBB protocol */ - -/* mass storage request codes */ -#define USB_MSC_REQ_CODES_ADSC 0x00U /*!< MSC ADSC request */ -#define USB_MSC_REQ_CODES_GET 0xFCU /*!< MSC GET request */ -#define USB_MSC_REQ_CODES_PUT 0xFDU /*!< MSC PUT request */ -#define USB_MSC_REQ_CODES_GML 0xFEU /*!< MSC GML request */ -#define USB_MSC_REQ_CODES_BOMSR 0xFFU /*!< MSC BOMSR request */ - -#define BBB_GET_MAX_LUN 0xFEU /*!< MSC BBB get maximum LUN */ -#define BBB_RESET 0xFFU /*!< MSC BBB reset */ - -#define SCSI_CMD_LENGTH 16U /*!< MSC SCSI command length */ - -#endif /* USB_MSC_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h deleted file mode 100644 index 766cc8e5ad2..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/GD32F5xx_usb_library/ustd/common/usb_ch9_std.h +++ /dev/null @@ -1,248 +0,0 @@ -/*! - \file usb_ch9_std.h - \brief USB 2.0 standard defines - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef USB_CH9_STD_H -#define USB_CH9_STD_H - -#include "usb_conf.h" - -#define USB_DEV_QUALIFIER_DESC_LEN 0x0AU /*!< USB device qualifier descriptor length */ -#define USB_DEV_DESC_LEN 0x12U /*!< USB device descriptor length */ -#define USB_CFG_DESC_LEN 0x09U /*!< USB configuration descriptor length */ -#define USB_ITF_DESC_LEN 0x09U /*!< USB interface descriptor length */ -#define USB_EP_DESC_LEN 0x07U /*!< USB endpoint descriptor length */ -#define USB_IAD_DESC_LEN 0x08U /*!< USB IAD descriptor length */ -#define USB_OTG_DESC_LEN 0x03U /*!< USB device OTG descriptor length */ - -#define USB_SETUP_PACKET_LEN 0x08U /*!< USB SETUP packet length */ - -/* bit 7 of bmRequestType: data phase transfer direction */ -#define USB_TRX_MASK 0x80U /*!< USB transfer direction mask */ -#define USB_TRX_OUT 0x00U /*!< USB transfer OUT direction */ -#define USB_TRX_IN 0x80U /*!< USB transfer IN direction */ - -/* bit 6..5 of bmRequestType: request type */ -#define USB_REQTYPE_STRD 0x00U /*!< USB standard request */ -#define USB_REQTYPE_CLASS 0x20U /*!< USB class request */ -#define USB_REQTYPE_VENDOR 0x40U /*!< USB vendor request */ -#define USB_REQTYPE_MASK 0x60U /*!< USB request mask */ - -#define USBD_BUS_POWERED 0x00U /*!< USB bus power supply */ -#define USBD_SELF_POWERED 0x01U /*!< USB self power supply */ - -#define USB_STATUS_REMOTE_WAKEUP 2U /*!< USB is in remote wakeup status */ -#define USB_STATUS_SELF_POWERED 1U /*!< USB is in self powered status */ - -/* bit 4..0 of bmRequestType: recipient type */ -enum _usb_recp_type { - USB_RECPTYPE_DEV = 0x0U, /*!< USB device request type */ - USB_RECPTYPE_ITF = 0x1U, /*!< USB interface request type */ - USB_RECPTYPE_EP = 0x2U, /*!< USB endpoint request type */ - USB_RECPTYPE_MASK = 0x3U /*!< USB request type mask */ -}; - -/* bRequest value */ -enum _usb_request { - USB_GET_STATUS = 0x0U, /*!< USB get status request */ - USB_CLEAR_FEATURE = 0x1U, /*!< USB clear feature request */ - USB_RESERVED2 = 0x2U, - USB_SET_FEATURE = 0x3U, /*!< USB set feature request */ - USB_RESERVED4 = 0x4U, - USB_SET_ADDRESS = 0x5U, /*!< USB set address request */ - USB_GET_DESCRIPTOR = 0x6U, /*!< USB get descriptor request */ - USB_SET_DESCRIPTOR = 0x7U, /*!< USB set descriptor request */ - USB_GET_CONFIGURATION = 0x8U, /*!< USB get configuration request */ - USB_SET_CONFIGURATION = 0x9U, /*!< USB set configuration request */ - USB_GET_INTERFACE = 0xAU, /*!< USB get interface request */ - USB_SET_INTERFACE = 0xBU, /*!< USB set interface request */ - USB_SYNCH_FRAME = 0xCU /*!< USB synchronize frame request */ -}; - -/* descriptor types of USB specifications */ -enum _usb_desctype { - USB_DESCTYPE_DEV = 0x1U, /*!< USB device descriptor type */ - USB_DESCTYPE_CONFIG = 0x2U, /*!< USB configuration descriptor type */ - USB_DESCTYPE_STR = 0x3U, /*!< USB string descriptor type */ - USB_DESCTYPE_ITF = 0x4U, /*!< USB interface descriptor type */ - USB_DESCTYPE_EP = 0x5U, /*!< USB endpoint descriptor type */ - USB_DESCTYPE_DEV_QUALIFIER = 0x6U, /*!< USB device qualifier descriptor type */ - USB_DESCTYPE_OTHER_SPD_CONFIG = 0x7U, /*!< USB other speed configuration descriptor type */ - USB_DESCTYPE_ITF_POWER = 0x8U, /*!< USB interface power descriptor type */ - USB_DESCTYPE_IAD = 0xBU, /*!< USB interface association descriptor type */ - USB_DESCTYPE_BOS = 0xFU /*!< USB BOS descriptor type */ -}; - -/* USB Endpoint Descriptor bmAttributes bit definitions */ -/* bits 1..0 : transfer type */ -enum _usbx_type { - USB_EP_ATTR_CTL = 0x0U, /*!< USB control transfer type */ - USB_EP_ATTR_ISO = 0x1U, /*!< USB Isochronous transfer type */ - USB_EP_ATTR_BULK = 0x2U, /*!< USB Bulk transfer type */ - USB_EP_ATTR_INT = 0x3U /*!< USB Interrupt transfer type */ -}; - -/* bits 3..2 : Sync type (only if ISOCHRONOUS) */ -#define USB_EP_ATTR_NOSYNC 0x00U /*!< No Synchronization */ -#define USB_EP_ATTR_ASYNC 0x04U /*!< Asynchronous */ -#define USB_EP_ATTR_ADAPTIVE 0x08U /*!< Adaptive */ -#define USB_EP_ATTR_SYNC 0x0CU /*!< Synchronous */ -#define USB_EP_ATTR_SYNCTYPE 0x0CU /*!< Synchronous type */ - -/* bits 5..4 : usage type (only if ISOCHRONOUS) */ -#define USB_EP_ATTR_DATA 0x00U /*!< Data endpoint */ -#define USB_EP_ATTR_FEEDBACK 0x10U /*!< Feedback endpoint */ -#define USB_EP_ATTR_IMPLICIT_FEEDBACK_DATA 0x20U /*!< Implicit feedback Data endpoint */ -#define USB_EP_ATTR_USAGETYPE 0x30U /*!< Usage type */ - -/* endpoint max packet size bits12..11 */ -#define USB_EP_MPS_ADD_0 (0x00 << 11) /*!< None(1 transaction per microframe */ -#define USB_EP_MPS_ADD_1 (0x01 << 11) /*!< 1 additional(2 transaction per microframe */ -#define USB_EP_MPS_ADD_2 (0x02 << 11) /*!< 2 additional(3 transaction per microframe */ - -#define FEATURE_SELECTOR_EP 0x00U /*!< USB endpoint feature selector */ -#define FEATURE_SELECTOR_DEV 0x01U /*!< USB device feature selector */ -#define FEATURE_SELECTOR_REMOTEWAKEUP 0x01U /*!< USB feature selector remote wakeup */ - -#define BYTE_SWAP(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (uint16_t)(((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8)) - -#define BYTE_LOW(x) ((uint8_t)((x) & 0x00FFU)) -#define BYTE_HIGH(x) ((uint8_t)(((x) & 0xFF00U) >> 8)) - -#define USB_MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#define USB_DEFAULT_CONFIG 0U - -/* USB classes */ -#define USB_CLASS_HID 0x03U /*!< USB HID class */ -#define USB_CLASS_MSC 0x08U /*!< USB MSC class */ - -/* use the following values when USB host need to get descriptor */ -#define USBH_DESC(x) (((x)<< 8) & 0xFF00U) - -/* as per USB specs 9.2.6.4 :standard request with data request timeout: 5sec - standard request with no data stage timeout : 50ms */ -#define DATA_STAGE_TIMEOUT 5000U /*!< USB data stage timeout*/ -#define NODATA_STAGE_TIMEOUT 50U /*!< USB no data stage timeout*/ - -#pragma pack(1) - -/* USB standard device request structure */ -typedef struct _usb_req { - uint8_t bmRequestType; /*!< type of request */ - uint8_t bRequest; /*!< request of SETUP packet */ - uint16_t wValue; /*!< value of SETUP packet */ - uint16_t wIndex; /*!< index of SETUP packet */ - uint16_t wLength; /*!< length of SETUP packet */ -} usb_req; - -/* USB SETUP packet define */ -typedef union _usb_setup { - uint8_t data[8]; /*!< the data of USB SETUP packet */ - - usb_req req; /*!< USB standard device request */ -} usb_setup; - -/* USB descriptor defines */ - -typedef struct _usb_desc_header { - uint8_t bLength; /*!< size of the descriptor */ - uint8_t bDescriptorType; /*!< type of the descriptor */ -} usb_desc_header; - -typedef struct _usb_desc_dev { - usb_desc_header header; /*!< descriptor header, including type and size */ - - uint16_t bcdUSB; /*!< BCD of the supported USB specification */ - uint8_t bDeviceClass; /*!< USB device class */ - uint8_t bDeviceSubClass; /*!< USB device subclass */ - uint8_t bDeviceProtocol; /*!< USB device protocol */ - uint8_t bMaxPacketSize0; /*!< size of the control (address 0) endpoint's bank in bytes */ - uint16_t idVendor; /*!< vendor ID for the USB product */ - uint16_t idProduct; /*!< unique product ID for the USB product */ - uint16_t bcdDevice; /*!< product release (version) number */ - uint8_t iManufacturer; /*!< string index for the manufacturer's name */ - uint8_t iProduct; /*!< string index for the product name/details */ - uint8_t iSerialNumber; /*!< string index for the product's globally unique hexadecimal serial number */ - uint8_t bNumberConfigurations; /*!< total number of configurations supported by the device */ -} usb_desc_dev; - -typedef struct _usb_desc_config { - usb_desc_header header; /*!< descriptor header, including type and size */ - - uint16_t wTotalLength; /*!< size of the configuration descriptor header,and all sub descriptors inside the configuration */ - uint8_t bNumInterfaces; /*!< total number of interfaces in the configuration */ - uint8_t bConfigurationValue; /*!< configuration index of the current configuration */ - uint8_t iConfiguration; /*!< index of a string descriptor describing the configuration */ - uint8_t bmAttributes; /*!< configuration attributes */ - uint8_t bMaxPower; /*!< maximum power consumption of the device while in the current configuration */ -} usb_desc_config; - -typedef struct _usb_desc_itf { - usb_desc_header header; /*!< descriptor header, including type and size */ - - uint8_t bInterfaceNumber; /*!< index of the interface in the current configuration */ - uint8_t bAlternateSetting; /*!< alternate setting for the interface number */ - uint8_t bNumEndpoints; /*!< total number of endpoints in the interface */ - uint8_t bInterfaceClass; /*!< interface class ID */ - uint8_t bInterfaceSubClass; /*!< interface subclass ID */ - uint8_t bInterfaceProtocol; /*!< interface protocol ID */ - uint8_t iInterface; /*!< index of the string descriptor describing the interface */ -} usb_desc_itf; - -typedef struct _usb_desc_ep { - usb_desc_header header; /*!< descriptor header, including type and size. */ - - uint8_t bEndpointAddress; /*!< logical address of the endpoint */ - uint8_t bmAttributes; /*!< endpoint attributes */ - uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ - uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ -} usb_desc_ep; - -typedef struct _usb_desc_LANGID { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint16_t wLANGID; /*!< LANGID code */ -} usb_desc_LANGID; - -typedef struct _usb_desc_str { - usb_desc_header header; /*!< descriptor header, including type and size. */ - uint16_t unicode_string[128]; /*!< unicode string data */ -} usb_desc_str; - -#pragma pack() - -/* compute string descriptor length */ -#define USB_STRING_LEN(unicode_chars) (sizeof(usb_desc_header) + ((unicode_chars) << 1)) - -#endif /* USB_CH9_STD_H */ diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript deleted file mode 100644 index cc3f1a11d27..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/SConscript +++ /dev/null @@ -1,65 +0,0 @@ -import rtconfig -from building import * - -# get current directory -cwd = GetCurrentDir() - -# The set of source files associated with this SConscript file. - -src = Split(''' -CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_gpio.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_rcu.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_exti.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c -GD32F5xx_standard_peripheral/Source/gd32f5xx_syscfg.c -''') - -if GetDepend(['RT_USING_SERIAL']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_usart.c'] - -if GetDepend(['RT_USING_I2C']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_i2c.c'] - -if GetDepend(['RT_USING_SPI']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_spi.c'] - -if GetDepend(['RT_USING_CAN']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_can.c'] - -if GetDepend(['BSP_USING_ETH']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c'] - -if GetDepend(['RT_USING_ADC']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_adc.c'] - -if GetDepend(['RT_USING_DAC']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_dac.c'] - -if GetDepend(['RT_USING_RTC']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_rtc.c'] - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_pmu.c'] - -if GetDepend(['RT_USING_WDT']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_wwdgt.c'] - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_fwdgt.c'] - -if GetDepend(['RT_USING_SDIO']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_sdio.c'] - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_dma.c'] - -if GetDepend(['BSP_USING_SDRAM']): - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_fmc.c'] - src += ['GD32F5xx_standard_peripheral/Source/gd32f5xx_exmc.c'] - -path = [ - cwd + '/CMSIS/GD/GD32F5xx/Include', - cwd + '/CMSIS', - cwd + '/GD32F5xx_standard_peripheral/Include',] - -CPPDEFINES = ['USE_STDPERIPH_DRIVER'] - -group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) - -Return('group') diff --git a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt b/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt deleted file mode 100644 index 26b8487772f..00000000000 --- a/bsp/gd32/arm/libraries/GD32F5xx_Firmware_Library/change log.txt +++ /dev/null @@ -1,1390 +0,0 @@ -/*! - \file change log.txt - \brief change log for GD32F5xx firmware - - \version 2024-07-31, V1.1.0, firmware for GD32F5xx -*/ - -/* - Copyright (c) 2024, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -******************* V1.1.0 2024-06-07 ****************************************************************************************** -______________________Common______________________________________________________________________________________________ -Fix file: -gd32F5xx_it.c -fix reason: -The single bit ECC error and FPU interrupts are enabled by default, so an interrupt service function needs to be added. -V1.0.0: -none -V1.1.0: -#define SINGLE_ECC_ERROR_HANDLE(s) do{}while(1) -/*! - \brief this function handles SRAM and Flash single bit ECC non-correction exception - \param[in] none - \param[out] none - \retval none -*/ -void SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler(void) -{ - if((SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE0)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE1)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE2)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE3)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE4)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE5)) || - (SET == syscfg_interrupt_flag_get(SYSCFG_INT_FLAG_ECCSE6))) { - MULTI_ECC_ERROR_HANDLE("SRAM or FLASH single bit ECC error\r\n"); - } -} - -/*! - \brief this function handles FPU exception - \param[in] none - \param[out] none - \retval none -*/ -void FPU_IRQHandler(void) -{ - /* if FPU exception occurs, go to infinite loop */ - while(1) { - } -} - -Fix file: -gd32F5xx_it.h -fix reason: -Add the declaration of the SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler and FPU_IRQHandler function. -V1.0.0: -none -V1.1.0: -/* this function handles SRAM and Flash single bit ECC non-correction exception */ -void SYSCFG_SINGLE_BIT_ECC_ER_IRQHandler(void); -/* this function handles FPU exception */ -void FPU_IRQHandler(void); - -Fix file: -All functions in the file that involve the use of a serial port. -fix reason: -Modify the serial port redirection function to adapt to the Embedded Builder IDE. -V1.0.0: -/* retarget the C library printf function to the USART */ -int fputc(int ch, FILE *f) -{ - usart_data_transmit(EVAL_COM0, (uint8_t)ch); - while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); - return ch; -} -V1.1.0: -#ifdef GD_ECLIPSE_GCC -/* retarget the C library printf function to the USART, in Eclipse GCC environment */ -int __io_putchar(int ch) -{ - usart_data_transmit(EVAL_COM0, (uint8_t) ch ); - while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); - return ch; -} -#else -/* retarget the C library printf function to the USART */ -int fputc(int ch, FILE *f) -{ - usart_data_transmit(EVAL_COM0, (uint8_t)ch); - while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); - return ch; -} -#endif /* GD_ECLIPSE_GCC */ - -Fix file: -../Firmware/CMSIS/GD/GD32F5xx/Include/gd32f5xx.h -fix reason: -Add a firmware library version acquisition function to the firmware library. -V1.0.0: -/* GD32F5xx firmware library version number V1.0 */ -#define __GD32F5XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __GD32F5XX_STDPERIPH_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ -#define __GD32F5XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __GD32F5XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __GD32F5XX_STDPERIPH_VERSION ((__GD32F5XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__GD32F5XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__GD32F5XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__GD32F5XX_STDPERIPH_VERSION_RC)) -V1.1.0: -/* GD32F5xx firmware library version number V1.0 */ -#define __GD32F5xx_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __GD32F5xx_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __GD32F5xx_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __GD32F5xx_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __GD32F5xx_STDPERIPH_VERSION ((__GD32F5xx_STDPERIPH_VERSION_MAIN << 24)\ - |(__GD32F5xx_STDPERIPH_VERSION_SUB1 << 16)\ - |(__GD32F5xx_STDPERIPH_VERSION_SUB2 << 8)\ - |(__GD32F5xx_STDPERIPH_VERSION_RC)) - -Fix file: -../Firmware/CMSIS/GD/GD32F5xx/Include/system_gd32f5xx.h -fix reason: -Add a firmware library version acquisition function to the firmware library. -V1.0.0: -none -V1.1.0: -/* firmware version can be aquired by uncommenting the macro */ -#define __FIRMWARE_VERSION_DEFINE -#ifdef __FIRMWARE_VERSION_DEFINE -/* get firmware version */ -extern uint32_t gd32f5xx_firmware_version_get(void); -#endif /* __FIRMWARE_VERSION_DEFINE */ - -Fix file: -../Firmware/CMSIS/GD/GD32F5xx/Source/system_gd32f5xx.c -fix reason: -Add a firmware library version acquisition function to the firmware library. -V1.0.0: -none -V1.1.0: -#ifdef __FIRMWARE_VERSION_DEFINE -/*! - \brief get firmware version - \param[in] none - \param[out] none - \retval firmware version -*/ -uint32_t gd32f5xx_firmware_version_get(void) -{ - return __GD32F5XX_STDPERIPH_VERSION; -} -#endif /* __FIRMWARE_VERSION_DEFINE */ - -Fix file: -../Template/main.c -fix reason: -Display the firmware library version through USART in main function. -V1.0.0: -none -V1.1.0: -#ifdef __FIRMWARE_VERSION_DEFINE - uint32_t fw_ver = 0; -#endif - -#ifdef __FIRMWARE_VERSION_DEFINE - fw_ver = gd32f5xx_firmware_version_get(); - /* print firmware version */ - printf("\r\nGD32F5xx series firmware version: V%d.%d.%d", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8)); -#endif /* __FIRMWARE_VERSION_DEFINE */ -__________________________________________________________________________________________________________________________ - -______________________ENET________________________________________________________________________________________________ -Fix file: -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_enet.c -fix reason: -Default to disabling carrier sensing to prevent half-duplex issues. -V1.0.0: - | ENET_CARRIERSENSE_ENABLE | ENET_RECEIVEOWN_ENABLE \ -V1.1.0: - | ENET_CARRIERSENSE_DISABLE | ENET_RECEIVEOWN_ENABLE \ -__________________________________________________________________________________________________________________________ - -______________________TIMER_______________________________________________________________________________________________ -Fix file: -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_timer.c -fix reason: -Fixed the bug of interfaces timer_flag_clear/timer_interrupt_flag_clear. -void timer_flag_clear(uint32_t timer_periph, uint32_t flag) -{ - TIMER_INTF(timer_periph) &= (~(uint32_t)flag); -} - -void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) -{ - TIMER_INTF(timer_periph) &= (~(uint32_t)interrupt); -} - -V1.1.0: -void timer_flag_clear(uint32_t timer_periph, uint32_t flag) -{ - TIMER_INTF(timer_periph) = (~(uint32_t)flag); -} - -void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) -{ - TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); -} -_________________________________________________________________________________________________________________________ - -______________________MISC_______________________________________________________________________________________________ -Fix file: -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.c -fix reason: New function nvic_system_reset added. -V1.0.0: -none -V1.1.0: -/*! - \brief initiates a system reset request to reset the MCU - \param[in] none - \param[out] none - \retval none -*/ -void nvic_system_reset(void) -{ - NVIC_SystemReset(); -} - -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_misc.h -fix reason: New function nvic_system_reset declaration added. -V1.0.0: -none -V1.1.0: -/* initiates a system reset request to reset the MCU */ -void nvic_system_reset(void); -_________________________________________________________________________________________________________________________ - -______________________CAU_______________________________________________________________________________________________ -Fix file: -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.c -fix reason: Fixed the bug of interface cau_flag_get. -V1.0.0: -#define FLAG_MASK ((uint32_t)0x00000020U) - -FlagStatus cau_flag_get(uint32_t flag) -{ - uint32_t reg = 0U; - FlagStatus ret_flag = RESET; - - /* check if the flag is in CAU_STAT1 register */ - if(RESET != (flag & FLAG_MASK)) { - reg = CAU_STAT1; - } else { - /* the flag is in CAU_STAT0 register */ - reg = CAU_STAT0; - } - - /* check the status of the specified CAU flag */ - if(RESET != (reg & flag)) { - ret_flag = SET; - } - - return ret_flag; -} -V1.1.0: -FlagStatus cau_flag_get(uint32_t flag) -{ - uint32_t reg = 0U; - FlagStatus ret_flag = RESET; - - /* check if the flag is in CAU_STAT1 register */ - if(1U == (flag >> 31U)) { - reg = CAU_STAT1; - } else { - /* the flag is in CAU_STAT0 register */ - reg = CAU_STAT0; - } - - /* check the status of the specified CAU flag */ - if(0U != (reg & flag)) { - ret_flag = SET; - } - - return ret_flag; -} - -../Firmware/GD32F5xx_standard_peripheral/Source/gd32f5xx_cau.h -fix reason: New function nvic_system_reset declaration added. -V1.0.0: -#define CAU_FLAG_INFIFO CAU_STAT1_ISTA /*!< IN FIFO flag status */ -#define CAU_FLAG_OUTFIFO CAU_STAT1_OSTA /*!< OUT FIFO flag status */ -V1.1.0: -/* cau_stat1 register value */ -#define CAU_FLAG_INFIFO (CAU_STAT1_ISTA | BIT(31)) /*!< IN FIFO flag status */ -#define CAU_FLAG_OUTFIFO (CAU_STAT1_OSTA | BIT(31)) /*!< OUT FIFO flag status */ -_________________________________________________________________________________________________________________________ - -______________________USB________________________________________________________________________________________________ -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Include\usb_iap_core.h -fix reason: -Changing IAP commands due to IAP protocol modification -V1.0.0: -/* special commands with download request */ -#define IAP_OPTION_BYTE1 0x01U -#define IAP_ERASE 0x02U -#define IAP_DNLOAD 0x03U -#define IAP_LEAVE 0x04U -#define IAP_GETBIN_ADDRESS 0x05U -#define IAP_OPTION_BYTE2 0x06U -V1.1.0: -/* special commands with download request */ -#define IAP_READ_OPTION_BYTE 0x01U /*!< read option byte request */ -#define IAP_ERASE 0x02U /*!< erase request */ -#define IAP_DOWNLOAD 0x03U /*!< download request */ -#define IAP_LEAVE 0x04U /*!< leave request */ -#define IAP_GETBIN_ADDRESS 0x05U /*!< get bin address request */ -#define IAP_WRITE_OPTION_BYTE 0x06U /*!< write option byte request */ -#define IAP_UPLOAD 0x07U /*!< upload request */ -#define IAP_CHECK_RDP 0x08U /*!< check rdp state request */ - -#define OPERATION_SUCCESS 0x02U /*!< operation success status */ -#define OPERATION_FAIL 0x5FU /*!< operation fail status */ -#define LEAVE_FINISH 0x04U /*!< leave finish status */ -#define OB_WRITE_SUCCESS 0x03U /*!< OB write success status */ -#define IS_RDP_MODE 0xBBU /*!< MCU RDP status */ -#define IS_NORMAL_MODE 0xA5U /*!< MCU normal status */ - -#define IAP_HOST_ID 0x01U /*!< IAP host ID */ -#define IAP_DEVICE_ID 0x02U /*!< IAP device ID */ - - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing IAP DATA OUT function due to IAP protocol modification -V1.0.0: -/*! - \brief handle data out stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint identifier - \param[out] none - \retval none -*/ -static uint8_t iap_data_out (usb_dev *udev ,uint8_t ep_num) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - if (0x01U == iap->report_buf[0]) { - switch (iap->report_buf[1]) { - case IAP_DNLOAD: - iap_req_dnload(udev); - break; - - case IAP_ERASE: - iap_req_erase(udev); - break; - - case IAP_OPTION_BYTE1: - iap_req_optionbyte(udev, 0x01U); - break; - - case IAP_LEAVE: - iap_req_leave(udev); - break; - - case IAP_GETBIN_ADDRESS: - iap_address_send(udev); - break; - - case IAP_OPTION_BYTE2: - iap_req_optionbyte(udev, 0x02U); - break; - - default: - break; - } - } - - usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); - - return USBD_OK; -} -V1.1.0: -/*! - \brief handle data OUT stage - \param[in] udev: pointer to USB device instance - \param[in] ep_num: endpoint number - \param[out] none - \retval USB device operation status -*/ -static uint8_t iap_data_out(usb_dev *udev, uint8_t ep_num) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - if(IAP_HOST_ID == iap->report_buf[0]) { - switch(iap->report_buf[1]) { - case IAP_DOWNLOAD: - iap_req_download(udev); - break; - - case IAP_ERASE: - iap_req_erase(udev); - break; - - case IAP_READ_OPTION_BYTE: - iap_req_read_optionbyte(udev); - break; - - case IAP_LEAVE: - iap_req_leave(udev); - break; - - case IAP_GETBIN_ADDRESS: - iap_address_send(udev); - break; - - case IAP_WRITE_OPTION_BYTE: - iap_req_write_optionbyte(udev); - break; - - case IAP_UPLOAD: - iap_req_upload(udev); - break; - - case IAP_CHECK_RDP: - iap_check_rdp(udev); - break; - - default: - break; - } - } - - usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); - - return USBD_OK; -} - -Fix file: -\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing IAP download request function due to IAP protocol modification -V1.0.0: -/*! - \brief handle the IAP_DNLOAD request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_dnload(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - if (0U != iap->transfer_times) { - if (1U == iap->transfer_times) { - if (0U == iap->lps) { - iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); - } else { - iap_data_write(&iap->report_buf[2], iap->base_address, iap->file_length % TRANSFER_SIZE); - iap->lps = 0U; - } - - iap->dev_status[0] = 0x02U; - iap->dev_status[1] = 0x02U; - iap_report_send (udev, iap->dev_status, IAP_IN_PACKET); - } else { - iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); - - iap->base_address += TRANSFER_SIZE; - } - - iap->transfer_times--; - } -} -V1.1.0: -/*! - \brief handle the IAP_DOWNLOAD request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_download(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->dev_status[0] = IAP_DEVICE_ID; - - /* get the target address to download */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24; - - /* program the target address */ - if(FMC_READY == iap_data_write(&iap->report_buf[6], iap->base_address, TRANSFER_SIZE)) { - iap->dev_status[1] = OPERATION_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Adding IAP write option byte request function due to IAP protocol modification -V1.0.0: -none -V1.1.0: -/*! - \brief handle the IAP_WRITE_OPTION_BYTE request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_write_optionbyte(usb_dev *udev) -{ - uint32_t option_byte_addr = 0U; - uint16_t option_byte_size = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get option byte address address */ - option_byte_addr = iap->report_buf[2]; - option_byte_addr |= (uint32_t)iap->report_buf[3] << 8; - option_byte_addr |= (uint32_t)iap->report_buf[4] << 16; - option_byte_addr |= (uint32_t)iap->report_buf[5] << 24; - - /* get option byte address size */ - if(OPT_BYTE_ADDR == option_byte_addr) { - option_byte_size = OPT_BYTE_SIZE; - } - - iap->dev_status[0] = IAP_DEVICE_ID; - - /* write option byte address data */ - if(FMC_READY == option_byte_write(option_byte_addr, &iap->report_buf[6], option_byte_size)) { - iap->dev_status[1] = OB_WRITE_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - iap_report_send(udev, iap->dev_status, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing IAP erase flash request function due to IAP protocol modification -V1.0.0: -/*! - \brief handle the IAP_ERASE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_erase(usb_dev *udev) -{ - uint32_t addr = 0U; - - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get base address to erase */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= iap->report_buf[3] << 8U; - iap->base_address |= iap->report_buf[4] << 16U; - iap->base_address |= iap->report_buf[5] << 24U; - - /* get file length */ - iap->file_length = iap->report_buf[7]; - iap->file_length |= iap->report_buf[8] << 8U; - iap->file_length |= iap->report_buf[9] << 16U; - iap->file_length |= iap->report_buf[10] << 24U; - - iap->lps = iap->file_length % TRANSFER_SIZE; - if (0U == iap->lps) { - iap->transfer_times = iap->file_length / TRANSFER_SIZE; - } else { - iap->transfer_times = iap->file_length / TRANSFER_SIZE + 1U; - } - - /* check if the address is in protected area */ - if (IS_PROTECTED_AREA(iap->base_address)) { - return; - } - - addr = iap->base_address; - - /* unlock the flash program erase controller */ - fmc_unlock(); - - flash_erase(addr, iap->file_length, iap->report_buf); - - fmc_lock(); - - iap->dev_status[0] = 0x02U; - iap->dev_status[1] = 0x01U; - - usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); -} -V1.1.0: -/*! - \brief handle the IAP_ERASE request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_erase(usb_dev *udev) -{ - uint32_t addr = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get base address to erase */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24; - - /* get file length */ - iap->file_length = iap->report_buf[6]; - iap->file_length |= (uint32_t)iap->report_buf[7] << 8; - iap->file_length |= (uint32_t)iap->report_buf[8] << 16; - iap->file_length |= (uint32_t)iap->report_buf[9] << 24; - - /* check if the address is in protected area */ - if(IS_PROTECTED_AREA(iap->base_address)) { - return; - } - - addr = iap->base_address; - iap->dev_status[0] = IAP_DEVICE_ID; - - if(FMC_READY == flash_erase(addr, iap->file_length)) { - iap->dev_status[1] = OPERATION_SUCCESS; - } else { - iap->dev_status[1] = OPERATION_FAIL; - } - - usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing IAP read option byte request function due to IAP protocol modification -V1.0.0: -/*! - \brief handle the IAP_OPTION_BYTE request - \param[in] udev: pointer to USB device instance - \param[in] option_num: number of option byte - \param[out] none - \retval none -*/ -static void iap_req_optionbyte(usb_dev *udev, uint8_t option_num) -{ - uint8_t i = 0U; - uint32_t address = 0U; - - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->option_byte[0] = 0x02U; - - if (0x01U == option_num) { - address = OPT_BYTE_ADDR1; -#ifdef OPT_BYTE_ADDR2 - } else if (0x02U == option_num) { - address = OPT_BYTE_ADDR2; -#endif - } else { - return; - } - - for (i = 1U; i < 17U; i++) { - iap->option_byte[i] = *(uint8_t *)address; - address++; - } - - iap_report_send (udev, iap->option_byte, IAP_IN_PACKET); -} -V1.1.0: -/*! - \brief handle the IAP_READ_OPTION_BYTE request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_read_optionbyte(usb_dev *udev) -{ - uint8_t i = 0U; - uint32_t option_size = 0U, temp = 0U, option_address = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* read option address address */ - option_address = iap->report_buf[2] + (iap->report_buf[3] << 8) + (iap->report_buf[4] << 16) + (iap->report_buf[5] << 24); - - iap->option_byte[0] = IAP_DEVICE_ID; - - if(OPT_BYTE_ADDR == option_address) { - option_size = OPT_BYTE_SIZE; - } - - /* read option address content */ - for(i = 0U; i < (option_size / 4U); i++) { - temp = *(uint32_t *)option_address; - iap->option_byte[4 * i + 5] = temp >> 24; - iap->option_byte[4 * i + 4] = temp >> 16; - iap->option_byte[4 * i + 3] = temp >> 8; - iap->option_byte[4 * i + 2] = temp; - option_address = option_address + 4U; - } - iap->option_byte[1] = OPERATION_SUCCESS; - - iap_report_send(udev, iap->option_byte, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing leave IAP mode request function due to IAP protocol modification -V1.0.0: -/*! - \brief handle the IAP_LEAVE request - \param[in] udev: pointer to usb device instance - \param[out] none - \retval none -*/ -static void iap_req_leave(usb_dev *udev) -{ - /* lock the internal flash */ - fmc_lock(); - - /* generate system reset to allow jumping to the user code */ - NVIC_SystemReset(); -} -V1.1.0: -/*! - \brief handle the IAP_LEAVE request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_leave(usb_dev *udev) -{ - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* get base address to jump */ - iap->base_address = iap->report_buf[2]; - iap->base_address |= (uint32_t)iap->report_buf[3] << 8; - iap->base_address |= (uint32_t)iap->report_buf[4] << 16; - iap->base_address |= (uint32_t)iap->report_buf[5] << 24; - - iap->dev_status[0] = IAP_DEVICE_ID; - iap->dev_status[1] = LEAVE_FINISH; - - usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); - - usbd_disconnect(udev); - - /* reset register */ - register_reset(); - - /* jump to target */ - jump_to_execute(iap->base_address); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Changing IAP upload request function due to IAP protocol modification -V1.0.0: -none -V1.1.0: -/*! - \brief handle the IAP_UPLOAD request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_req_upload(usb_dev *udev) -{ - uint16_t packet_valid_length = 0U, i= 0U; - uint32_t bin_flash_addr = APP_LOADED_ADDR; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - iap->bin_addr[0] = IAP_DEVICE_ID; - - /* get target flash address */ - bin_flash_addr = iap->report_buf[2]; - bin_flash_addr |= (uint32_t)iap->report_buf[3] << 8; - bin_flash_addr |= (uint32_t)iap->report_buf[4] << 16; - bin_flash_addr |= (uint32_t)iap->report_buf[5] << 24; - - /* get current packet valid length */ - packet_valid_length = iap->report_buf[6]; - packet_valid_length |= iap->report_buf[7] << 8; - - /* get target flash address content */ - for(i = 0U; i < packet_valid_length; i++) { - iap->bin_addr[i + 1] = REG8(bin_flash_addr + i); - } - - iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\iap\Source\usb_iap_core.c -fix reason: -Adding IAP check read protected request function due to IAP protocol modification -V1.0.0: -none -V1.1.0: -/*! - \brief handle the IAP_CHECK_RDP request - \param[in] udev: pointer to USB device instance - \param[out] none - \retval none -*/ -static void iap_check_rdp(usb_dev *udev) -{ - uint8_t mode = 0U; - usbd_iap_handler *iap = (usbd_iap_handler *)udev->dev.class_data[USBD_IAP_INTERFACE]; - - /* check whether the SPC bit of FMC module is normal state */ - if(0xA5U != REG8(OPT_BYTE_ADDR)) { - mode = IS_RDP_MODE; - } else { - mode = IS_NORMAL_MODE; - } - - iap->bin_addr[0] = IAP_DEVICE_ID; - iap->bin_addr[1] = mode; - - iap_report_send(udev, iap->bin_addr, IAP_IN_PACKET); -} - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\class\msc\Include\usbd_msc_scsi.h -fix reason: -The statement here can be removed -V1.0.0: -extern const uint8_t msc_page00_inquiry_data[]; -extern const uint8_t msc_mode_sense6_data[]; -extern const uint8_t msc_mode_sense10_data[]; -V1.1.0: -none - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\core\Source\usbd_core.c -fix reason: -GD32F5xx can not support USB high-speed core, it has only one full-speed core -V1.0.0: -void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_desc *desc, usb_class_core *class_core) -V1.1.0: -void usbd_init(usb_core_driver *udev, usb_desc *desc, usb_class_core *class_core) - -Fix file: -..\Firmware\GD32F5xx_usb_library\device\core\Source\usbd_core.c -fix reason: -The endpoint size in the endpoint descriptor is the lower 11 bits -V1.0.0: -uint16_t max_len = ep_desc->wMaxPacketSize; -V1.1.0: -uint16_t max_len = ep_desc->wMaxPacketSize & EP_MAX_PACKET_SIZE_MASK; - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Include\drv_usb_core.h -fix reason: -Adding endpoint size mask -V1.0.0: -none -V1.1.0: -#define EP_MAX_PACKET_SIZE_MASK 0x07FFU /*!< endpoint maximum packet size mask */ - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Include\drv_usb_regs.h -fix reason: -Removing the core enumeration as GD32F5xx has only one full-speed core -V1.0.0: -typedef enum -{ - USB_CORE_ENUM_HS = 0, /*!< USB core type is HS */ - USB_CORE_ENUM_FS = 1 /*!< USB core type is FS */ -} usb_core_enum; -V1.1.0: -none - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_core.c -fix reason: -GD32F5xx can not support USB high-speed core, it has only one full-speed core -V1.0.0: -usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs, usb_core_enum usb_core) -V1.1.0: -usb_status usb_basic_init(usb_core_basic *usb_basic, usb_core_regs *usb_regs) - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_core.c -fix reason: -GD32F5xx have no ULPI -V1.0.0: -#ifdef USBHS_EXTERNAL_VBUS_ENABLED - /* use external VBUS driver */ - usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; -#else - /* use internal VBUS driver */ - usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; -#endif /* USBHS_EXTERNAL_VBUS_ENABLED */ -V1.1.0: -none - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_host.c -fix reason: -GD32F5xx can not support USB high-speed -V1.0.0: -if (!pp->ep.dir) { - if (PORT_SPEED_HIGH == pp->dev_speed) { - pp_inten |= HCHINTEN_NYETIE; - pp_inten |= HCHINTEN_ACKIE; - } -} -V1.1.0: -none - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usb_host.c -fix reason: -As GD32F5xx can not support USB high-speed, so it can not support PING protocol -V1.0.0: -/*! - \brief configure host pipe to do ping operation - \param[in] udev: pointer to USB device - \param[in] pipe_num: host pipe number which is in (0..7) - \param[out] none - \retval operation status -*/ -usb_status usb_pipe_ping (usb_core_driver *udev, uint8_t pipe_num) -{ - uint32_t pp_ctl = 0U; - - udev->regs.pr[pipe_num]->HCHLEN = HCHLEN_PING | (HCHLEN_PCNT & (1U << 19U)); - - pp_ctl = udev->regs.pr[pipe_num]->HCHCTL; - - pp_ctl |= HCHCTL_CEN; - pp_ctl &= ~HCHCTL_CDIS; - - udev->regs.pr[pipe_num]->HCHCTL = pp_ctl; - - return USB_OK; -} -V1.1.0: -none - - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c -fix reason: -The wakeup interrupt is repeated -V1.0.0: -if (intr & GINTF_WKUPIF) { - /* clear interrupt */ - udev->regs.gr->GINTF = GINTF_WKUPIF; -} -V1.1.0: -none - - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c -fix reason: -GD32F5xx is embedded PHY by default -V1.0.0: -if (USB_EMBEDDED_PHY == udev->bp.phy_itf) { -V1.1.0: -none - - -Fix file: -..\Firmware\GD32F5xx_usb_library\driver\Source\drv_usbh_int.c -fix reason: -As GD32F5xx can not support USB high-speed, so it can not support PING protocol -V1.0.0: -if (URB_PING == pp->urb_state) { - pp->err_count = 0U; - usb_pp_halt (udev, (uint8_t)pp_num, HCHINTF_TF, PIPE_XF); -} -V1.1.0: -none - - -Fix file: -..\Firmware\GD32F5xx_usb_library\host\class\hid\Include\usbh_standard_hid.h -fix reason: -The name of the structure has been changed since it is confusing -V1.0.0: -typedef struct _hid_mouse_info -{ - uint8_t x; - uint8_t y; - uint8_t buttons[3]; -} hid_mouse_info; -V1.1.0: -typedef struct _mouse_report_data { - uint8_t x; /*!< X coordinate value */ - uint8_t y; /*!< Y coordinate value */ - uint8_t buttons[3]; /*!< button buff */ -} mouse_report_data; - - -Fix file: -..\Firmware\GD32F5xx_usb_library\host\class\hid\Source\usbh_standard_hid.c -fix reason: -It is changed as the structure has been changed -V1.0.0: -hid_mouse_info mouse_info; - -uint8_t mouse_report_data[8] = {0U}; - -if(hid->len > sizeof(mouse_report_data)) { - hid->len = sizeof(mouse_report_data); -} - -hid->pdata = (uint8_t *)(void *)mouse_report_data; -V1.1.0: -mouse_report_data mouse_info; - -uint8_t hid_mouse_info[8] = {0U}; - -if(hid->len > sizeof(hid_mouse_info)) { - hid->len = sizeof(hid_mouse_info); -} - -hid->pdata = (uint8_t *)(void *)hid_mouse_info; - - -Fix file: -..\Firmware\GD32F5xx_usb_library\host\core\Source\usbh_pipe.c -fix reason: -As GD32F5xx can not support USB high-speed, so it can not support PING protocol -V1.0.0: -if ((USB_EPTYPE_BULK == pp->ep.type) || (USB_EPTYPE_CTRL == pp->ep.type)) { - pp->supp_ping = (uint8_t)(pp->dev_speed == PORT_SPEED_HIGH); -} -V1.1.0: -none - -Fix file: -..\Examples\USB\USB_Device\audio\inc\usb_conf.h -..\Examples\USB\USB_Device\cdc_acm\inc\usb_conf.h -..\Examples\USB\USB_Device\composite_dev_hid_printer\inc\usb_conf.h -..\Examples\USB\USB_Device\custom_hid\inc\usb_conf.h -..\Examples\USB\USB_Device\dev_firmware_update\inc\usb_conf.h -..\Examples\USB\USB_Device\in_application_program_hid\inc\usb_conf.h -..\Examples\USB\USB_Device\msc_cdrom\inc\usb_conf.h -..\Examples\USB\USB_Device\msc_udisk\inc\usb_conf.h -..\Examples\USB\USB_Device\standard_hid_keyboard\inc\usb_conf.h -..\Examples\USB\USB_Device\usb_printer\inc\usb_conf.h -..\Examples\USB\USB_Device\usb_host_hid_keyboard_mouse\inc\usb_conf.h -..\Examples\USB\USB_Device\usb_host_msc_udisk\inc\usb_conf.h -fix reason: -GD32F5xx can not support USB high-speed core, it has only one full-speed core -V1.0.0: -#ifdef USE_USB_FS - #define USB_FS_CORE -#endif - -#define __ALIGN_BEGIN -#define __ALIGN_END -V1.1.0: -none - -Fix file: -..\Examples\USB\USB_Device\audio\inc\app.c -..\Examples\USB\USB_Device\cdc_acm\inc\app.c -..\Examples\USB\USB_Device\composite_dev_hid_printer\inc\app.c -..\Examples\USB\USB_Device\custom_hid\inc\app.c -..\Examples\USB\USB_Device\dev_firmware_update\inc\app.c -..\Examples\USB\USB_Device\in_application_program_hid\inc\app.c -..\Examples\USB\USB_Device\msc_cdrom\inc\app.c -..\Examples\USB\USB_Device\msc_udisk\inc\app.c -..\Examples\USB\USB_Device\standard_hid_keyboard\inc\app.c -..\Examples\USB\USB_Device\usb_printer\inc\app.c -fix reason: -GD32F5xx can not support USB high-speed core, it has only one full-speed core -V1.0.0: -usbd_init (&usbd_printer, USB_CORE_ENUM_FS, ...); -V1.1.0: -usbd_init(&usbd_printer, ...); - - -Fix file: -..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c -fix reason: -Changing flash erase function due to IAP protocol modification -V1.0.0: -/*! - \brief erase flash - \param[in] address: erase start address - \param[in] file_length: file length - \param[in] report_buffer: report buffer - \param[out] none - \retval MAL_OK if all operations are OK, MAL_FAIL else -*/ -void flash_erase(uint32_t address, uint32_t file_length, uint8_t* report_buffer) -{ - uint16_t page_count = 0U, i = 0U; - - page_count = report_buffer[6]; - - /* clear pending flags */ - fmc_flag_clear (FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); - - for (i = 0U; i < page_count; i ++) { - /* call the standard flash erase-page function */ - fmc_page_erase(address); - - address += PAGE_SIZE; - } -} -V1.1.0: -/*! - \brief erase flash - \param[in] address: erase start address - \param[in] file_length: file length - \param[out] none - \retval state of FMC, refer to fmc_state_enum -*/ -fmc_state_enum flash_erase(uint32_t address, uint32_t file_length) -{ - uint16_t page_count = 0U, i = 0U; - fmc_state_enum fmc_state = FMC_READY; - - if(0U == (file_length % PAGE_SIZE)) { - page_count = (uint16_t)(file_length / PAGE_SIZE); - } else { - page_count = (uint16_t)(file_length / PAGE_SIZE + 1U); - } - - /* unlock the flash program erase controller */ - fmc_unlock(); - - /* clear pending flags */ - fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); - - for(i = 0U; i < page_count; i ++) { - /* call the standard flash erase-page function */ - fmc_state = fmc_page_erase(address); - - address += PAGE_SIZE; - } - - /* lock the flash program erase controller */ - fmc_lock(); - - return fmc_state; -} - -Fix file: -..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c -fix reason: -Changing flash write function due to IAP protocol modification -V1.0.0: -/*! - \brief write data to sectors of memory - \param[in] data: data to be written - \param[in] addr: sector address/code - \param[in] len: length of data to be written (in bytes) - \param[out] none - \retval MAL_OK if all operations are OK, MAL_FAIL else -*/ -void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len) -{ - uint32_t idx = 0U; - - /* check if the address is in protected area */ - if (IS_PROTECTED_AREA(addr)) { - return; - } - - /* unlock the flash program erase controller */ - fmc_unlock(); - - /* clear pending flags */ - fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); - - /* data received are word multiple */ - for (idx = 0U; idx < len; idx += 4) { - if (FMC_READY == fmc_word_program(addr, *(uint32_t *)(data + idx))) { - addr += 4U; - } else { - while(1){ - } - } - } - - fmc_lock(); -} -V1.1.0: -/*! - \brief write data to sectors of memory - \param[in] data: data to be written - \param[in] addr: sector address/code - \param[in] len: length of data to be written (in bytes) - \param[out] none - \retval MAL_OK if all operations are OK, MAL_FAIL else -*/ -fmc_state_enum iap_data_write(uint8_t *data, uint32_t addr, uint32_t len) -{ - uint32_t idx = 0U; - fmc_state_enum fmc_state = FMC_READY; - - /* check if the address is in protected area */ - if(IS_PROTECTED_AREA(addr)) { - return FMC_BUSY; - } - - /* unlock the flash program erase controller */ - fmc_unlock(); - - /* clear pending flags */ - fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); - - /* data received are word multiple */ - for(idx = 0U; idx < len; idx += 4) { - if(FMC_READY == fmc_word_program(addr, *(uint32_t *)(data + idx))) { - addr += 4U; - } else { - while(1){ - } - } - } - - /* lock the flash program erase controller */ - fmc_lock(); - - return fmc_state; -} - -Fix file: -..\Examples\USB\USB_Device\in_application_program_hid\src\flash_operation.c -fix reason: -Adding related operation due to IAP protocol modifications -V1.0.0: -none -V1.1.0: -fmc_state_enum option_byte_write(uint32_t mem_add, uint8_t *data, uint16_t len) - -void jump_to_execute(uint32_t addr) - -void register_reset(void) - -static fmc_state_enum fmc_state_get(void) - -static fmc_state_enum fmc_ready_wait(uint32_t timeout) - - -Fix file: -..\Examples\USB\USB_Device\standard_hid_keyboard\src\gd32f5xx_hw.c -fix reason: -Repeated definition -V1.0.0: -#ifdef USE_USBFS - #define USBFS_CORE -#endif /* USE_USBFS */ - -#ifdef USBFS_CORE - #define RX_FIFO_FS_SIZE 128 - #define TX0_FIFO_FS_SIZE 64 - #define TX1_FIFO_FS_SIZE 128 - #define TX2_FIFO_FS_SIZE 0 - #define TX3_FIFO_FS_SIZE 0 - - #define USBFS_LOW_PWR_MGMT_SUPPORT - #define USBFS_SOF_OUTPUT_ENABLED - -#endif /* USBFS_CORE */ -V1.1.0: -none - -Fix file: -..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\gd32f5xx_usb_hw.c -..\Examples\USB\USB_Host\usb_host_msc_udisk\src\gd32f5xx_usb_hw.c -fix reason: -There is no relevant action about USB over current and SOF output in the code -V1.0.0: -#define HOST_OVRCURR_PORT GPIOE -#define HOST_OVRCURR_LINE GPIO_PIN_1 -#define HOST_OVRCURR_PORT_SOURCE GPIO_PORT_SOURCE_GPIOE -#define HOST_OVRCURR_PIN_SOURCE GPIO_PINSOURCE1 -#define HOST_OVRCURR_PORT_RCC RCC_APB2PERIPH_GPIOE -#define HOST_OVRCURR_EXTI_LINE EXTI_LINE1 -#define HOST_OVRCURR_IRQn EXTI1_IRQn - -#define HOST_SOF_OUTPUT_RCC RCC_APB2PERIPH_GPIOA -#define HOST_SOF_PORT GPIOA -#define HOST_SOF_SIGNAL GPIO_PIN_8 -V1.1.0: -none - - -Fix file: -..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\gd32f5xx_usb_hw.c -..\Examples\USB\USB_Host\usb_host_msc_udisk\src\gd32f5xx_usb_hw.c -fix reason: -Repeated operation -V1.0.0: -/*! - \brief configure USB GPIO - \param[in] none - \param[out] none - \retval none -*/ -void usb_gpio_config (void) -{ -#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - EXTI_InitPara EXTI_InitStructure; -#endif - -#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - - EXTI_ClearIntBitState(EXTI_LINE18); - - /* USB wakeup EXTI line configuration */ - EXTI_InitStructure.EXTI_LINE = EXTI_LINE18; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LINEEnable = ENABLE; - EXTI_Init(&EXTI_InitStructure); - -#endif -} -V1.1.0: -none - - -Fix file: -..\Examples\USB\USB_Host\usb_host_hid_keyboard_mouse\src\lcd_font.c -..\Examples\USB\USB_Host\usb_host_msc_udisk\src\lcd_font.c -fix reason: -Chinese fonts compile with errors in some IDE -V1.0.0: -const typefont_GB162 hz16[] = { - "鏄?,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00, - "绀?,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00, - "娴?,0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08, - "璇?,0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02, - 0x00, -}; - -/* song typeface bold small 2 font */ -const typefont_GB242 hz24[] = -{ - "鏄?,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0x00,0x0F,0x03,0xC0,0x0C,0x00,0x40,0x1F,0xF8,0x60,0x18,0x00,0x60,0x08,0x00,0x40,0x0E,0x01,0xC0,0x07,0xFF,0x00,0x00,0x00,0x00,0x01,0x84,0x00,0x01,0x84,0x00,0x19,0x87,0x80,0x0F,0x8C,0xE0,0x07,0x8C,0x20,0x00,0xCC,0x00,0x03,0xFF,0xE0,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - "绀?,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xFF,0xE0,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x06,0x13,0x00,0x0C,0x13,0xC0,0x0C,0x18,0xF0,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - "娴?,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x39,0xFC,0x30,0x1F,0xCC,0x30,0x07,0x06,0xB0,0x0F,0x06,0xF0,0x19,0x07,0xB0,0x31,0x37,0xB0,0x31,0x36,0xF0,0x1F,0x27,0xF0,0x01,0x67,0xF0,0x01,0xE5,0xF0,0x01,0xE1,0xF0,0x00,0x41,0xF0,0x0C,0xF8,0xB0,0x3C,0xD8,0x30,0x00,0x8C,0x30,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - "璇?,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x60,0x0C,0x03,0x70,0x0C,0x03,0x30,0x00,0x3F,0xE0,0x00,0x3F,0x80,0x08,0x01,0x00,0x3C,0x01,0x80,0x04,0x7F,0x80,0x04,0x7D,0x80,0x0C,0x00,0x80,0x0C,0x10,0xC0,0x0C,0x10,0xC0,0x0C,0x18,0x40,0x0C,0x1C,0x60,0x0F,0x7E,0x60,0x06,0x70,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00, -}; -V1.1.0: -none -__________________________________________________________________________________________________________________________ - -__________________________________________________________________________________________________________________________ - diff --git a/bsp/gd32/arm/libraries/Kconfig b/bsp/gd32/arm/libraries/Kconfig index 986c4bb45da..869c54ac8af 100644 --- a/bsp/gd32/arm/libraries/Kconfig +++ b/bsp/gd32/arm/libraries/Kconfig @@ -31,7 +31,7 @@ config SOC_SERIES_GD32H7xx select ARCH_ARM_CORTEX_M7 select SOC_FAMILY_GD32 -config SOC_SERIES_GD32F5 +config SOC_SERIES_GD32F5xx bool select ARCH_ARM_CORTEX_M33 select SOC_FAMILY_GD32 \ No newline at end of file From 62a6eb0bd7c1d1a789056e99351b2fea87e8f9b5 Mon Sep 17 00:00:00 2001 From: Yaochenger <1516081466@qq.com> Date: Mon, 7 Jul 2025 11:29:49 +0800 Subject: [PATCH 3/3] add ci --- .github/ALL_BSP_COMPILE.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ALL_BSP_COMPILE.json b/.github/ALL_BSP_COMPILE.json index f375668e8d3..e5fbfff43b9 100644 --- a/.github/ALL_BSP_COMPILE.json +++ b/.github/ALL_BSP_COMPILE.json @@ -300,6 +300,7 @@ "gd32/arm/gd32470z-lckfb", "gd32/arm/gd32h759i-start", "gd32/arm/gd32e503v-eval", + "gd32/arm/gd32527I-eval", "n32/n32g43xcl-stb", "n32/n32g45xcl-stb", "n32/n32g45xml-stb",

ee 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̒vK(AcOrj@?;YxNrfLRob(<1HHZ4 zRuCvG$Rhv?MM7K@0bvZXGLukURf3&+HsRWh3;6bT{*HC=;;;VlPqBV|A@Y}J77-My{YwR;n;UOh{Y+J=vP>^bbG(CO;v!4JOw3jX}h{~RYyoM2G{ zux5=`02iXVx|%@o96^n&7r{3DJFM+FBO}Rg6k^23dJLehz8s3pr%*P7gTuBHl;W7m zA`=-E$?yFHhdx9{N3-rRh>D3P4+^%$0Z9b6T755zN>Xwa>h_=HoFxO)cIUA1BZtpw!A-t)vg7P}Eebws}+(04>4{3DvfxZUi$gSwd&Y6J=)cT(Oea!!i+A%=v?oi`0j*tnnn|~b<`Wvt{>sVDz>j|P3i^6I zR7!T?jdxB`+3+EVU|mze!os#NiT?x#Yk6IfbP2;>N8>IwzBP8$fFvw#LzoGjgP$A9~)xy3Ym>lLSl>WD|&!PE1`P z)=~ci22K;`NqLh+H-u#+=;tAK1i2YKMWA-#!;9j@o@z6 z?ihA7c>>!@tJ$6X`lr}NqwMz}g4uZTqY3iqK<1ImGIC6(u4H@pFg{I1(bI>9rYf|z zRj?iVSvK)!$prZgParUa{9tB;`O1HKgkYOB2oZ6O+V7AMg5xQV-Rlac0!!XBMZP50 zn3({+V{(|!kCG<@QW+a&zJ8z3LvxnUeHt{32F$`z&U{B8zLE}PS!nIq>H0X-z_;7 zT3ui4P{XNus-IQ!HV`^r9RaPmZ}(Zp`)`Z)rw{V1K*cS9V)gTXSMvY9+p+X}9ZQ2?eAoyUD-@Q;udwzI#@=G*S}>;JTA>G$3$qsqtc){6S%p)&i+ZQtjn?q$7` zCB>PFb{_Rl>+3mL%47|dP%{w9VUv_35USnK9N{PytVM_lX{70R%|d9=&)A3;3L;-z zTwxYaO*45s9^ANo9ooW@vXM-78p#Bx5+Dj!qG{6nWtq5Hd=;;~^(t1bUWUx_1?1DGVBNB8`q0wSY;BpEn!z>>WSP8Bzoy+175; zaEdZAFxXFk#(J~Kb`8r5mzz~u zZLi(A>S`OP@LVPUZ9!RCIgTDZ%=U)0Z-37KPM$i8h=@3B*|r^Npl87d+$2Gn^nVjxtlBu~>U5B-RRS482QYO1_8k`?N(cHX}%0PVni> zT&VqcSepuhD;RnR#=RZ_$xigKKfAjLc6-_|;uYXv*&|&9YU{CXZ6UUA-%P+BgpRH@ z6y#-d4ET_ekxm+!Ko3DuOq{mH4nk{NEppPr;0_%^@N7R{>BXRD8dISuXdjD1O$X4} zJ&UjZ!_QFP(2KU_dW;d+%ChWZy~H2HM?(22K&8kBlM~w9!o_+|lE$^_Jsjy7nFPsE z80Z_qs84Yz!+1W_VtERvi6&wqwZ$YAl;Kf?yWGglS;6yD?DsxXkhkyHg5uKa_&xz@ z7ZthD;c=Wgc?z4iZR8jZVBfiroxO|-Z?d@y3=xQyRn%}8DV}R2$4&?pnQoMpHZWfo zX)uc8m~G8}YKs{HGaa*m1g+`|cG5KI(H4HmIw~6Rc?ibBv4!n?;J{vNC|XIL8P2iQ zgB{y9G4C4$nwlBX!bmNI3^0W%Ax@is$bWRw+Gdu@rzv_;E=CEMse~$YTUe;u?iu5` zJ$oL(voCxU$>}**U9_6KhII)T!I8)I;qYUJuzW=xm9H2oY022SWi3{$$U-I+rx2Hq z^%4&wpqv(9o@V(+5gkh&ygUUF;ffDD&T<6U^RclJR9YgDknARioq}&-5Zb?gdfLbG zP2T1cD))kaWDu$WqU_~MCI%>!K7k-2X{`p6v$&=Mw6aqgvj)`tC7HGb9u*sFl6iW~ z@mOyX({lb&)bM=bB_oJ*-mI|*8KyB4$1+=vIyYE$|TLRr0QTI!bJJ~u6 z!cM>MQ^~om6AMnxrTcG-_otm;6MCn{`&l_3!f2Saq2o>-`lS% z-S(P0(tJC=Ki&S^5}DkVocxsSoq6AHes}L9oxi;e7f;T8?@ubvJs-YnQg!@g)8{Q8 z(7B}VcKCnKee$FOHs^jSX)G!E&kBh8>C3NFNWjS-bc)hZQ$@D#F*W<7UpCwzUKU z>k*e2L*dzrGiT1Dsi}=j(ubWpc461pJuc=J!%;T~)QryW20tW4P#LMXFX*aMgVJIu0wiS&}h(l~#G|MId zuIWlmW2%pw-V?tQ$aJvC1cej@*R*y>@=@@MqXx5V@}2h*EDf>UCv5vm(LiEsDg|GP zwTD)QMTEzYx5n_R3jraah;T<64Jf3G7L91Jl0daAcIGA^3!$du`Og-Q&Jt{pjq8vB zLKJUQPnuFYNhYY?w&I(BN{WO01yx4*oP}uRE$@+nB7v^G*~2LWJ3AV&bJuqB`|s-M zrvMIMnQX+|IrZ@zUAr_Wu(@CX%znJ_Dp##yC;J0E=#eS;$?q;i*&nu?Bw zHe2W=T9G4xK&OkKQG4b~Zi{Xvrxl7R#G(zv#Ky7w6X@pnpOBJ8JTN^u%08H2OH5cm zd|6TztX|=W6p=%1=JAf8XP}D;g#z5iB0DF8K-Pt#_3Lru&=WXvQ*YR=czE)EBX2M zk9aJOt3{;XIG0k~*V{*hc+?_3_=s;54WpY1y!>Xfvof)9^LpF6KQBKYZB%{>$g4_k zo+nTbz|+qi!{&`^arn?4D!qL;xPJ$Z9ovr-0!jJPd&j!jwxi@NE-D+rY+D}zq#}$= zAT~M}8EJ9+9ZKH!7(V-%kK&0Z9_1L?ij5oAaI8*oOm>=Egp?)mo%HlXvxLf}D3o;R zM{L$m50RFHu725WtMkZgWC37p_@4w78o~j~K@_A_Z4Y7vRhr9KiJdA9K$TbsbaaPl z`*ui3asXP4LNUDsLfNvq`@1Dz?{Q?(KYz@Zeg0UO`087S(!%?kx~Y85HKqAH9DwT_a$8`Zu!H=E z-Ev1iIC(8>uf-34o;v(#vHNs5X}%pD%dg7fd@ihmj>YouAO1Xa_|x64-|cYdWBwU` z**-{`&zpU@;NS^6r#OyIND$|cwbTFI`hIRyYs@(PCz}AWF-NF~x#D`=O6v)#^>QZ}E4(^Hco&H@=VWz5G)Q4^HCT z*(>;~zx+D_z&HZJO>l)Ofcy}D#}XL!5v;ipMNm3JfI3XZJ;S;`diWrI>6d>Q+X!eC zCsdC93SScy6-Qv1h3L3M3dJzY5(FhCCu8lp<;c!VK~!uE`5Fc2IFOW>MW8!O!7#*j z4>U__$*wWkL=t`1CH7zldX!Z%q(nJTZC0BR$`#92ff`Cn&Cmn z%1SW{#pL85y1H5@=t3!s6WF#h7#A%G*GaZMpMDg@ya+QCyn2qjny3kX6afv%?9Wc8ROSP>`)CYW(Y#oKN= z+AcBDolFp%Xo0*lGIJ4^kcb2-2jLV*aRkJ^2_M;WfB^-CK@yOVD}r1tf(TxNLL+!x zAzb8QAZv*Bx(|UXJdDo}z>r_dYHRn~H0=ajG9K`mnMqAM2NCGRLR(gj`-U(s;LPV^ z*hk^+RFs$ZNnjs|RP|qUyyN;&-NbqYBc8xIIx3kUtN_VL*;u<~E7H^Q zc`l7WI*T-zjGTfkNaVBH(o(JsVZjl=WH2U1*=Mp!Qmjpn2VivgX?_xpV_MS?;T(Si$%-2~9T3KG7QutS zpZ|Q5V{Bvch(Istz8^ikU1;y>#xTobO4bm;+;jv1LIU1>>l*&%uYZCc{^$&%*Z4UBt5->}8l&`TCI?YlMle>WYn6>aKfaRXz_gUftP=N}fvJ>VGyj8Ie^_yOw!y^U5W> z_S!4>!$10OXzA)iSxqxeU#deuXdaHAYQ<0AEGIuoL<9S#q@)#96@8>157=yEl92?O zq*snDg;xrX5FSzgkS9{nR9xbj2`N&cJjgrQPrSh?mrL$4!BjW~2wKO`)Ldznz5&)%v&xh&1l#f@m3yIM;FI5|c6wub%72t&dYWU# z&GG;E;|Fnrp!3?zbJ)9Q6Uxgjp|87%^b~^Tx@xr4S7OpTjGBt;NJ|RC+LbwMOCPRY zd<(-p4OpHThln5#UU+5~e(94(@%+Ev~C zm7+`yV9T$8+FZ736i3qOyc4PG}U|G4crwHfQRpiYjQ=2w7$& zO#LxMA12wO51AbBIroFKQ@4Fnw5B><|z`EwW0+|+6oGw~l;LNqn4kWSiW zQx-!B4y|;RWk-vbk82lDD2C?9Xb(K(n<1eT1_81#5}=SbyQ37xbq1dC z0SZLsM`1tI@3EcchKGB3t^f!@_r4n)6xKcb9Od(46kg3Obr=}xp+Fr(Q%f^EJ}+q| z1kvQZ0v_VijxQMjXP{#N5$M)=`7J6QHly4OoU!C28me-(n}&tUt%Kj0 zwXL>hL&|D4uDNjXU~NnwrAt19(^N_{^&LuD7rlqcVn01?`_s#Pp}M->LKj`TQI68$ zDx}1@smyqhniPZ$ML8H7>7$Yo&up^^=n7HO8icpcRN>V55;Qkj7S}7(z-?ZI3OHe+|{ue!H!vR^yH5;OFB}Lae zI)XUzqS%Bewgu^ApvUssvSp*aqrCVg($aIWtY9s9Mm@o+7dLN~qqwXZ*RPhLtfCe- ziz`r9*M{!40g|hWd@YG>7iNCc!W?R7i4d_)@k_O(^$*)o>sPd4gRqbMuhl0rlLGo2 zi&QWMhkB8e9F5(3cH*(42aymTgW8%(JoVHu^A%NSG5Mg&-6c3=)|4)7sT$>uVjsG& zVf_a4b0+*{S+qs3i%JyxLJA!Z-BY-HxzRypRxaC)iXZ8;xv_zL8;0cML}X^9bBwug z<>Gnde+iGJ*&qTJDl{e^;Lh03Eug2qqbWYPy@$vEI6DQ8B-_DkpYUf~rMK>8x5QRY`hK2+}`%qe1hSbyq zf}#KuCdD@^(c7iaK_IgqCg^lSD_1owr5(~@IIe&Clb@laqy*1A^9+GTG8t$#R<2w@ z#z{ayrl{Rb&Yn4k?c2AL7r61}8*f?t*KgQ}>sKz5c^=2Qjq90{l!Rif^l~1negX&z9CUw#l#q(jy3VCnwGCQY%)q z9jHL3EFJv>pb{Vg*B$Mh1eK!{GMNMw1T}oG0J(hLJst{q3LObSg-X#X=Dqv2;Mh}# zv55jkmWjdsA*+Kz4*8}A2_B|xVTOEhbF-Hr+MR&qD+&nS!Vnu5fwYVyB&WvN7J`wA zt(qK5K^n_@mLV%UlR_tyz(?B=ju1o>h{eZYWNge4Hf+BMf^M(RLu!~J=ncV`ZvZJN zQ3QTzh>n)^Hq87eC%prR;PugwZd+s&9UaB?A`KC&dCB*KLZ+z{j36;3mVK|fkJ&<$ zrluw|)HkB4s+xlEip5IQ%IM0<8r0R+Q{iYveQh&owI4PfFA;8OeDa?=yqcWET zDV&z3(1TfTEg%a*RE)M)mD0k|LVP(h6^O|27_)K;gxdOc0vI9{9yWSy%*j%ye@^^P9NO6BJ=*Vnia=CTp#ng9pM147?B$ae9w8rHflglMLvjt7CYW;(+{uMwoHBVz zmpRmeSZd^xtP`pd|IR;~RaFlgSME_t6Jk#kI z^d{qnKfMIsWH@QxOAyo!`Ot>SPDVMc-LRw(2_OmBE3}iWf#algQ)Zbw<6cu*hX#f@ zb~K|JjtMG3+TAKPE}lx2*A^}bJZsTXUsneew@KDLka;Scn1`R!RFGrLN0>jTq^!k? zm7B1FpF@K_G_YLb@-wBjrkJ`a;nd%k8*+{TkM=T?zHVRp|L=7v_EEdlvSG|NHIt&(p!;Wn3)H z=lLM%_V?OfE7P5ISMuL_zhx4*^FO^XPj!z!4?E|7m;X1DbJ-bR&ToxP=b87t-+(Cl zSIVCW4*7B_^v4Vtcz`+oM;i#$*cZr>HAndoT*=>$`N_g!{(D-OR8od?f*Xatk?_26 zz07v+kpG}IoycFd3?KjGhxphOzWcrJnYBtAT+|adh+z*658_Y$UJ`!1WsbXe9v@*$O7eyw$N^*DFtJON)6u3am} z%P;>3?;Sr)F5!ZTGe9yEubPxfD{Ldt;w16m%Wt$jR5N!pR52tX~qAdp$ z+P0Ws5o{CrhC0?9+g*swDNCv>tIA8DP)uIFfb!FmpQRQ&c*Z?ux4P}kNrm;j3) zKZLLxV!*cw{4@m2}5UBFRomo~M% zXk>WEWOj&LQl?Z6#bymcgv*VUs|rzFRZ2SOrXo;}iqZxuW1Z+3h{BDsVFZS)z=dl~ zmk`FBbs94D82KUks zjg3Tqe;@15vJildj>sQ50J%9i%sZ0fk05evgx6V*IZ&QYnoykBfnMT=u?ZZ1@1pJc z6A-9K6k2WWj8`d~T68w074(XQ$?KEjY#Ygo0J#tdT(Vpot5Po2GwLIOM0JY(>AS|g z#Y|7VZ|4Yi*uWg=9yDJ#H&C4KCWH4!Zr@Zy0vTY?mO?8RkXLKlVc!=U^B*m zvGEfZ>q!hHpYEGCi&0Zk4Mprw-jS@cKxlt|FVA^QF<0Nc``%fO`=?M|UX2qckDI?} zMn(pCWdV7?dW+5M^Z2kVHCxM>qxWm!z4}INrm-RGuL&j!U(MjiVk2Ov zCRa!#0Zs{o5egpdovp|sU7Z~!tdmod*$)9|BZ!KMilq>9!8<--3lm01N6eaP3&vdR z&pk(%H@*^Mn6w)%XY>U`>0?*i3Dm-D4EDzg;f>drB+Na&w zMK6?qED{qwFO`5Xwz0zcsBMx7Vq|?Iup~hCO;PBpdkI>6zA3Z11yk56RMf~wA3psn zzi6S2T3ee5B-n3!-hkoc2Wm*7~W~) z%C75P9xCr+M<2!0&m6`6NA}xHKzCOU%jP90(M?l`Vjo5F;J_l_5MTvq%Wc+LfjlYv z+D%Y0S#BdzUS#!`8=UA+^3$feSp=U~t|(sfyWUAfP>R8$2lisy_8lx#IO#bF+jhT* z=FT8QB^KdwaT7*-k_7_eUc|X0@Qc6rDGrZm)HT-dJnKh-7jP6^Td;jG3euO=m;aoF zZA1tJ!eOpRq@>EoG)aY_$7Tv-cv4@fQ4*7qY`R!hb06O)cLM=IO>=MEvKcE2SJ_xk z&&b2G&mJVe>PKr^59vWlpq^96GSWTU!um;y1{DDxc|b_07Td|)K??&p4hWbvb0Gk& zSs%Sqyip1+ALpTV<)OMzffYYgh^A@MZ|<^m#Kc9BkEK{Ys_q*%tS2bGO2w~-d`#fq zS(Pu|Ys%^548eUB6{<@%i=?qG7bw+RyIuA64`I~GKZEP!b=R+6!PXsnv3m7pw0Cx+ zw5$X%u`$TW&SYHzP+eVt)2C13?734&OpHNHbTrPLKVwRQ^1WGl(>DIuwR?{(HcCp; zCPOfV|2*$YO;2autEhl9b4+W|X*_vs8LDa<5fY}|EoBLHrsJP@;xK7Y3n8^Aku+yU z5B2ebr~C5>B?uMMnbn@K?1WfKtem(Sns_m`*R zU+VxIf3}O|qi_1u&SA#Rk@s`GP3`sCXG=GY-u&O1gI=_iX-Xl zm?S|W;YP(!vm#{Tnku$&&vB?QE4{r#xLI6kAk^gw<`|tcYt_(z{0V~zUdAol(&Y3A zPMtcAb?ermXzeBoBL42X?@;q@!>%3M@bOQ49NV^S#nGcjv2xW4{N&YF2`pRikD_%OEGDF^4S(=o{}6k2Y{jO{o3XK|h`@FO_V0fLyLauyj-9)4`0xRY zj?JLDvcde=R`_2?R48Y2AD_$Z?o0$Fp1%MU~`C}k!#jja7d0j$DRtf<_33Iif z>MLQdJk@Vn?e2^fS%tJHXPRY@6>}Q#2?-Ro5yt$z6tu;jAs@jBO5F5#58wn&~?do-CZRx_vLHAi>e?+X|R6)W1fD3k8yZ@?23s0V1~fc-5?TYz|^W)bwAZK-SW0VIy(r=#Y`8mlQ@SHv`x zu1suLx1Iod+>|Q;q8OH6yNvzTSN=8o|3$1`wVdOw&j5v1&PxUl^fh60c);jZ##7O? zEhyId3yy2eCXTZYMZ=Ko`gde^cXi3zbdci|KjydE^QG~m>kGgRIh@z&e# zn9Ga!>RWHVg_^nwTihl$oWjBa@*WQq`9pii-{AOfY;JYH|BUyRCG^D?pG5@gBn8g& zEd!wsm+lLM%2&*s&E=QD?ku@^3AJ_gW(JOm%is+>ON#dkISnfR_r;QkPJ&DTR8H86 z5$fS#$*B=@aAM#I=tdIJ%kjCN%*X+u0>j$ZR4rf+%^eSxmMG$Vr1^K=s`r8n{b1>C zX{q*cd^7KUER~kNzV!2c3!aMZzt8_EOOG@}{d7(_0LEWWzm-(yl@`8d=`ziy#ooJE z(tQit*ZHct+0VIWb#nfmhe`J;x4#Jf`&6d+HWYYq+FSSO7RM5@be>AOUqHsfw(y@n zA7@1^M}~guJI9>-BmIhjEgq8KvrPCNE1>hN|GiGTDPJZu_qH_w^5w@r@F&lp#Gc$v~*Ah1af>V0efMV_+Dx zUEJVcFNJ8lg(rIVo%hI8r}6fiCyW^igcg_FBoN9WlS?zJ&Uat_4gu>a3=WMTH!sho z>>qjL5$xEp+os`996yO=h50ym=uvBr-tKO*plDiOLFuK?MpAHVCHp(?oxz#Ymk1mZ z5kasv=JgSbu>KSzUV;^Eyde-Ouqh=#!RIF^1mu4nq3KNuP5;6z-K)djt`@kTZK8g# ztxegU;S_*U+GG)y53Sp+9eP{@WU&T@x;i_pF9aeLo=)|VRYSr41#SgsW%-rmN?j)q zDq*E*Vz)b(AmjzsC6dC;#r7Gc5NaUc*M5*Qc>1ZMICNyU#XLra>9*;eC47s_sthmRb#{?#r%vWBW16B8rxOTX|Eo_YQW?Ax~w^|kG` ztCcLxW1c>iI{-%?JBYRGHxTqsTDd%)0ggQ%9)IdE`UcujU0Y(Ya03Dq86m)wiO8rx zyzs(N{HtI8687!gPoOb{%93*9k?MnqiBS{UW(l+*=O~H#A*-KcpB)^79JLND5gy5M zSyOWjvGJj{^`}DiT)%#kKvChA0@2geiBZoGRuOo_aBOPvUPD8@`Gd-raPQt-7AG?y zS%w>dcr65zWjCB4BaLme4;wcX5jX{-t*y;usdm>2CrC_6rE=sBMK6K)`3sluqaVJ3 z&Mq%*mbRd#aR3#yorp_FC)jkOyQhmZI>zUR%?DVEU$$=FMi82AGaI99FUfe}0`-$D zd$M3E1ep3%t}L2i)p(mEs2dp>G+-xCs-2b89=0Hh%9s|tX(6(dFh!w|Kdi=tTtzNj zynrj0F5>33oA}w!-Zr-kZA0pga@(qPk5_xnPhi8wBJA0<6Gc>l6r)pMJScdQV`Le& z?pRMiUqGHCzfk$6Mwwq_enBqtk!uC{T!5^vL5PV9XMMH96G1rZpk1MS<0Gi6ypHtj z6tk`;B_&Y-tffM>!hAIQ$@iuSAO*DhhkUj$QgTB7LJU;P?I!}!Za2qs80$ubRn~oC zA+c+%q!;(rV#d`}(z0^$*eAv0AA1j%{1Ir!JV`J3b&DQahPI zN@5CP$gHKk8vqey+#_i~hyceY2U#gO#j;a8@^A5xp-5mWABC%+RxmM5rkr3Q8fK=0 z&_lwnt*tZ7P6F4lnrhHLT;;_OoMZ8{5a`^Q96)h9sL<{H<6ddub9bhN`8?>cbQg%I z=a2U%hv@xjVSev_P8TGEoqNP+bS%72x8BdOFwLKz&*#oMIq!4;fCT@Yp#A5Sj8WWC zhCA~&MTp532auUKZ9;Kk;PB2e&FAO;z1X2?V5Qrh<)vHY(NE|S=V-_n)a6UTyb9IZc$KBfK3}W^1P1#tQC{K z09-hG#X=?t{ZC;C(G>m)l_fW?^72YF)VC14#v7RE?(MME(^=U$1R=F3EvqsREWf&z z#&Uv@Zsg}vP>)UGy|>R|uwS4$1R<_zv~^Wd!O1`d6`vc|OHor>Pv9~{u;az2e&Km+ z*suy4H?G5qrZxof~4eV#iHwx?g<(XKyBG<~L z0PM2jX?L-~!G6-73#lnu^cRlEaE>F64f#oGTSn2v$A95j9C>`Nff)hN=K3bH;K|J+ zBR$Q4k{0cWCf|Ph9RfAEOlWF&9J}{z#YaE(9G-sqDe|8gl$8=dkBtyu1@rx3`1EH! zg0kaU z9DDi@Qc^QfR(73jukd35ICN+?R;?~XTzoufJebO8DQc_gk(@+Dg*ZXOLi|7mCHbRD zL6(9ozfg%0$A44{o&%{w#8U20*p`-3wgvW_4JNdE)^Y-_Y^#rAlxrrTg;=DMe4??b z5xoNgPEvP;o*UZiFXsM zwcyZ!M=UIxfN@b#5qVB2wD~|xRJe^HZ9Sfl5Q&0iIiw?nWYYpY%@$1>=8<*0e}GJr zI7uv)da^0YinH6x^TjOR8*jdbzTR%qnio+q;T+c~rrht@y8|Vq*RYlV`q-0?Qw9M) z`tc7C6cU7%)>e+6RJ{0+m&|g!ZOaz?tAF_~(a=NNIf>86 zYHIg7LUys_7vzf_bA|c;(tRZX7&-9^xcC95tZ2@;dnIQ|fAPb*;vtiPvL%k6clvqd zd1pBn9`~Chc+?Mk$bQ?i3m&)Wcz>EZZ?w-*uSgfpVnclru*%9wrO^6y0r=K~dPWLj zhy-_ttP+7Xg=?P#ry=qI6Kwe%R4jw#cAw;xlT6rpLkL`~< zNd`|KEPt=YhDHjeZkwvojEQ#4(RsClc1Ti8&WxOFWbufKb|Wy93{G_?9}x{Yb#^|r z$~`M93+d?u)dZ9R;qnQKbcd1QCnG)~#-`5Hmhxp(tkCF~C|jr^i%v&JhXE`-E5AOu zJ1Fj>nAUt?dj<;Q0eA7gV;~n0`=s{cPRu~ zEq_^j6>&g3vzc|(LbBA9Wb?UPy>b=ad+$BG{N3;JeLf1Uehdx_qP??|LT-q{B@$;( zpJ6_od^{K~{+18r0PoSlBh5lJH#Zp|(837?)NF3A#^3ziSMm0{ufXH$BcShNK2o-3 zO=0+lfA|i*{`GI;`qc`)`wU76>OzAeNf8k!E-uBN{^?io_uu>`e)7sItj9^dFU&&G z$S?N$-~T?o_E%rSkACnYy!qzatWyx{9YX;cN_yzS-+$}x@aKQ=zwooyUS&JAl8$7h z9wz-n6RbtEZ)VWaR!0z8O(NIAurPxAKJ3`F6&p9LH5%{gZYK!T+Jh<5NC)qmzzZLG z3L7@ABppwpyz)9)8!F5~6h>h2jj#V5!A%8$RtUPgx=~+WZ+)d{UcEz$gPNP`*!Pj_ zn^Lyf1p6t-z~DxL*I)hB&*8U!`#16Yhn_YX85$lyB$c}C>`eUDSH8fu_#=Gf-~I+t zlA|bzyoew;4WsgR_WVhLp&M*lxwuWEv$LITMZijcm7Gx0c^t>km}dar|G~FWQF#+p z)g{IsCMM(tk!YV<6`l|u%Q6I+1zGWSSFK)Uif&A-o8u#l_l>h0;Z%0?JCbz_Xa9w= z?={=0iS!xvN0@~#>*(x3Y)k_07dV|V#aY*73lKIjYhzzGL2Msp2-4)|92Xyk-o7^c z#b5pre&g3ZjNkjce~pIbO7>eQuHHC_KlsDn!7qODY5eWi{+Jk}gJar@Z-4u1_|-3e z2A}-o^Eh+*4Xoc-h`xbV{Pyqs27dk5zlg8>^`DV$+pPS;FdriS`VYVVAFztbauDk( zcL%u=N|}_>YrAx@gmQ06Oo*crxRT)gAodeDZri%Sc$_xTXln0AViMcS<$`xo03GJ? zl1rN0zh@gZtS`c$!$;U2!RR0CVvY(8H_JYZG(S+I1p-z@pNNZ#F}^i0C_WL1&D*!& z$dSh|!^T>%YPA}SO3Yg}HWc4@aBzTQH58$NZeE%-rBOTDedF7T)f|p)f@^IUk&uvJ z`Fc18wGhs@zMN|xGTj}7PBLqSc_2d$oT1>NfRQyr3@?lo75X*K?c8LK+)rXo_9>qX z`)AX*c4{uENb`tV#O64f2b1`;PqY6T1%@m}7V6@*4F13L0h0sJo#dZhR&v0nrf>y7 z9U$sh=k)vjY2fFX^j?+WZpY6n-JaJ6%U4ZxXE_%hOC`4U?QPAz(r*DR`>Ox|&8(Ny5fB=v3e@!T^DlYR?Wj*m}4A%rwl<{OvgZNmH-rzbR9 z!g}#Nid!h)DWDNwHgl`nkZixg@S}B8^wUq15eM6Xq_p&Og4GXU+qUiI3KSO`YdaHZb-sMV6n9SoKnsjUM+o$iQw#+9 zSFd{s_&g&+7#bMB$j~sRc%K$m2wZBVw5FUTM8)Ggo)NZ->ZAIqE?O8dO3*96PWgdO zuueYa?d3iCt;LyAh}AX<#iXhCC<{9!Ae)(yMX;1=);q1T*A({v!JsT>ni>`#)bxE! zT!Ky6M-l8OwxY(OVs{P<^+F+Fv>&=$CYCMBHvdEU7bYdf@*OD@itViT5E|>M(bmz5 z6@@Di6&Z=H_I3+_S54s2-qHl`sE5EkN}bBOsBIIJ23iL2!W~UmBb#*kbOUBXJ+Kg9z_Y5!%^K|#7GpD=SFe?zuit~I*)XJLWMWOxN{%rX>)wjW ziks+YYqaTqfvnQ9Qrk{DhcsSUR)*fWuu7w(v&e{eOpnh{2@OU#%UV@cfooTarOM0Z`!)`N7KnH$FZYZUR_E zx{wm9?M&ro93MwzQ&z;TX41k|eC`Wh#-SrS5g!{wepJWu1>&=x{TM#~#m`~W)*=G8 zFaq>a6o_+E#cJADU z!w2_bC(E;{a2fXO-DQAQQ~WXnNGWnhgd#dJg89kce3HB{+5lpN+yrEioDCuWa3hMC zNgD=?cqYkH75n%ya&iioPZ<8{ul^2iz4e~W#I%q{1aRDIbB|H)Ap4$xlnhV{yPB!^ zcTllkSG1mdaf}K}w^^dY0-W8kB>&~kMX6!3;z85hr{hhANm%h?Rx82u5=}KslMp)0 z3K2sg5HdZB5O<<6%lk`gG!C?&zzBYq;GBlfqc8%nocr#UJ_vZyJMHC*CacFH<#CP=mX>PkrLL)}4k+<|zx_~s z7JGjFy7G69+wWccxrOOo*Oy8Q%lQ6-f0jr~x5wSv!a4Yd$)AUQ&VTm<#`$aduItj? z4G3Bu??055F1Peh#{#)9Y4%{@xm#tizf86AxYWL)Q&M5GCZwVwrx9kUd*$ve+b&eM)4Zc(#Q)a!8L_^>B2RR zZE}q%)`#uU)!RTYH-rR&rdMA1G2VUmge@|Wg-$`-KlGvJC@43ev$GS=5PT*i#N#{P z`3{A3u>s197cSVlrHQ}x`WqGtGMpewg0*PfIxCYbE}F($wQ?1nd+r71^CbDk2!8t7 z>!@$+Kmftk#Ka5~q}mCGGifeC3feBgplLq^W|rkeR+W*_VLPYYezcN#dU_mV1gNs| z1OzdkDFvS=sOBO6J59T*eI-Z*j{E!iC^QENU3 zuT{7x32*twJAu0eC{#{O4=V(fc2pWBut`acC(sSX<;!Pr>C$ChBRD0vog^RKyLUTE z%P%1;A^=B@96~n*U`le1O?ek>Ty9ftaRkE(L|<30Xah}D2u3k9I)J>~EIjhaJ|w3m zqP)BUH*Q=rt8j4e6cSRx@$7R?l6MEAokB~#e*=Rf1avXzAz;kmv+)VBc;}ttIDY&D z>!E$Z6_arSk+HBaOwCQr<_D@UT530eeyu8Aw|hfF_WaPtZ!RTvBq43dan= zQVm*KI@n(FWgBI_g(z5_jS1f*D$487*wn@Q*&j1rtXr3h!opmm$E%l1(b6ExZ;Sz= zteiNkUYAO`bs`s>J1gZ%V9SXWS+pq+c?D^#PX=nL>ex@$p)F_Siyag+Wq@wQ$~@9s z4}rit6zUUHtnx@-v)Hhu0FOQX2-cFOYpNR1(9mLviuB45(s!pqTk)N;^p}>D8K~A4 zscrndY5N*H{^TJGhgMTlPx>1$ULd!HR08-%AKgz{AH;j_y~}>k%6^dk2C;kBcI?`_ zi3(vY+dY_lTWfyaQi$Rbqwp_(;|o+wCeh#1Wi(pGz8@YML`G%`UZR3fUQtdZZ=CYE z(Ke}YxuOW3BaxhxLfU6PD{LEih(ZvF*9b5v;Jo6SN>Q|E8!V@035E$WwU93%F~Nec zYcaH}@wO0}z)oXIim802H6Ekgk*x1>w&yzJ<}PQM<1oSJrRd22Je54@2`URk>sDJl zPfbfVHWGlkgR%dS?F5`zwir_5bC|TbWy=<9k6T`{6iZ>~qD% zm8(P1+9LBM*CIS^_HpszB|ftf>x=dnpnvUWZxOEzvTZ}ji>EAr|D}u9@b){WP+D4U zZb{;)a=+5%9-B67MJQ>hn*A6ak%$|`)hNDv1+7$m6h-9a?|zHVgyV}}{4D8e+~U4Q zX!~0-J<-|2q@_XVEHmb(29Bl$sE?2GO_YoQzq_+X*e>2tt8S0o@2Tl$@A5+S}O4@(FboN5~3ls9z7>B`sYZ3FoE2 zz*6a6z-y^|@Ad4`X{l#FNWS-zoau8-Vd|Jaw*coXn*OoNb+@Fl{XEjb^83H5&ibyO z{`xz=@7*3tCI4Vv2t@s{KJS(^UhFWs)4g*RQvS46_B^$)Tv{aHd=&`Qww=6}!&}o} za&r;m*PfrOV}^$wz|vkRRa9V~|nt5>h2fZdJ9jy#U1jvd3XCy!y<)@>N2aR25v zzD3abHhD-8%k5@LrW*zNwa`eGTid3O0yfMQfpCFLzEccc zz<8j)oqZR;zR)5!SX{ozX%ChaWSAe`M?Ufla`UoLQ(K3+s(N;+<6`mRN1nD=oM~zC z=6H@(1eD%Cid^N^=m-T7(q=Z6_6UfX9ksJ%@`df zDB`;&rUy{4GSPr$dwU07f9(XvMJUUm9loXrisMmTQ;O`&4BHO$?5UfkRK>@}vAqTe z5>nVV)2OVdMtNC18f!Z#vow1bj8Fc;F^+{uBvE-Pxj`_0^*Vt^G=W{W`I&y`L&p#s z8)jh#Z%~<%WqfLUmH^RRw^+4ID76LtSsC}GLGc+F>@DbYOTS#wFP+PN8iB=0cc8c78>hXFwi@Iox678 zSHJv4@&qk53dXuM>n$n3NfW|i*Ob~XK9TT?~gtDT8lW|-knM$S>@1zk37U9&XcWjm?Ix?F4!3!_PcSK~k z(Qijbo0akDV~^SAx4!lF_`&yoir4t=AHVuj0>$_6##_hn?(tLDwR00T6s;yGEF}+j zvF%cg?@F0e__|mE@AR}RD0Xg7_n?9M3+J!k{Q2u_Yi&WQ9m2G*D+G=8RKlnrct?Gv zEN|bwi~QuM<CsYAU zf=>aWVuLAZ--M{WsEGuIh4V8Fq~B z=_21>>bhJRdn_+sKL5V+7yma#5&F1rJV$?b zJgXK6KXZWb(W>Mg8AoNSd9_6pF&3$7^qr%>kN$nBB7jl;&)IVPO(rSj!g^$JJ9a`H z;6|9c04cdsysc$QC1&0z2$fw4*$EvYP#L5Uk|TTp2qG+GXF`sZn_IfLK1oAo{f{XaL7J2-yI_VS^J9-<~5hJ%L=Dci~JZrQ;Z zRso#lIDOKjNtiZunu;5^V)DN`ek&0v_>_ zbsW3P7|ZX2a3wg^61YlWapFa_Mr8gaW~USZG@@8569fWim05}Zlmk(3pE5}hz%3s0 zvI{0QvtmE!<10H!S_(ctwL3J-&nHaEMsi9lV&j7lpAd#F0zcUS6z7d#g334o6gk?p z4;YX=F@egvEAsMALjvBXBxiDNf)Ehk!8#JyCZMXi3VnUOB0r$j%kH)lCQZ(Qk3R*J z%|t%mf%=9zj(H%0L;cB%oiS_HY|NNG8$kpRlD)2>zD}7QghhuTH8mbnr%ym!d<4N& zJDQp$c4;?nWfN^i1jo=~>v*u4kL17N(wwvRlMN4xhpB0Jergp5G8teI8 zJIA43h1!wbb#daIzi=TkGLz6r<)MpxkZ}^HI5DFV<>%V#u2afZc|{fHAV>jNS-Zo- zF6u}-EVq84Vo+?7#*&@n+KNYp2uqdBn zlB;cPhnJB0LOo9OPs`lpCQ#**(@!&P$9=kw30n zyB?$|+4+=Y8Lb3sk|I}ZpoK|ERyAQ<{RX4536Hf0M~COHkj^#`zjTHs^8DgftZ>-p^Zu7hm{06|P|X;m^-O;<^r> zJ6#G3i%`y??F8~VtvCCVKp-4SdLTbD53?#+ah+_8uXhuznq)Q zj49-)D>;8N)TwiKx0z!lcBNhfwPHp7Ib+O_%5}<$0n&pTL4j@ku`)J{4!igO+ z=Zlt0gHR3{sa_$tP0>P=c18tE{bqPaELvq@{Ye;;RFA6UH&M3?7ql%m+$MP z%9V`M#fm&P*0YzZcdRZu>UR7bz3;*?lEvZp)A5<(JBRjqx#9qAj{841p}$ zrIn>@;(;oTM3Njs zj>JO4Le);F%JL#1s>m;7t9Tf4EH68bWVtdYGRXW}hFk0?g%L}H4*@Qspvdm30A~4I zc7!CYp~Q+5qeBTdBMOIPxDjUS$UjfvNg*e|PymO_QJ=9#0rYR*`z_pX<3=PTg%MbK z5e!)rP|h5ejpfUhVcy(@Sg=5Hr^m5Aam4D!q$v{#-e4S}$6ghtBD$ij@7 z(=l;!Hg06Q;^M-Ty`kCCqX6&X#S5^K!fMr;l}Jp8QafAX1oMWv}7JutzO19 zX7Jf40-Xru0HGxq3E+KV!?$GFVgv+g5FJI39h(fvD=xOSDao;zHFGlOHG-hQ6XBdo zc8POnhY!I^T1uKqX==505J>9a7vRh9-C?%?QIVl43{6zDFF~jPsR+`s4#u8Ae(y|R z8$mGRM*!D@1@ot=CN1!Fa*=5cLF@07V zCQnLNz(!69+Sih~mY%LHT)nCIo5RS^uF;mLkR5s+tdT(dDQbsVZH zY6&{q2^O@JlLSHpQBhIi&vwe16h|&SLPGphyw|ByrlYZ`6}hL+P|+~K z%hQMRu@Gj;S&1Vlr_8Vn#ef_f-e<;^6tqsc-&w-C8 zl_LVY#`-qooGFCGBq>`xF@8cel`S`=kd~BHqP76jKrFwyQSAuJcnh!S?vZd>qHK68 zFe!GVqU_2EfPgzWN)|hEIfYR6=)@ADjEREQN1!SE%n_4Zqv%g|Q`HG5`H%3iLHjV3 z2nlaQC5Av$>_lZPiRZRp3pqZ%=bLx2Um>KSIQSB@<(xWA!0(F<>(;VOUi>^k@rB}o za!j8-hkPN8Yb=;Q$KlXHD#pD%ShZ>ul|o4^9LsjTFZ=GI4UI0;!^CMMp)T zk$h{`tQjaM$R}8>#~{aD1;=-BIDbk$`OwfnH3ob49mI}pTRD~BC~RKkIcs2H%l z29r9?DJv^f?HHmWE73k&IksXt;Oyi^C1?UdLL(rFIoevgNQ+$rj15!-t!!^J@tPF| zgY0^`!rjB4^y{G_noOKH2Qz0Zgrr=~%gx8(W5>yF8&F@@hMrCfk`pIk-~Q8h^~G0k z`fMRio;c%a<*LudgRu$*6?uIRL2QhF`dl9|}jjNRdrX`G$ib_E5tFi;C${ zo2jp>ruIgSAt(rO$r-#!tBA%CKwgBL01k%`yjT(2QZddQ8ZnWG?C5T9=Ad-(GshA9 z2*E7nozfs8BBKx-9uAv%2#1aw!Leh<)Xs?PFvvT^@nNiYja{UJ7w^6l1p+QvM!&oG zJ(n2Of0eQ8zFeCw{p?uB&(fx`+9h?5Hf!|0QSxwr8JSmkhm806<9G#f#_SI%fKS6ASvcWrf;skF0%B|S4Wh?&t^fS2k z-tS=gj2Q?D2vhI<@PiNW&U^2nrnXKUpWS`;*AN>Yji>+o2W;QAg@QT)-~G;g1WYFE z+_4`;#dYkvcv16m@>08@TI~o0mjvo3xEyjK^S8p;)t#T~2oNO`lH@-(P*95f=OD*Z zQhiF!$063?s>WIP9z`aHTfD?Mwj4tNosyS(XwXGA;|LOlmEaXGdGUgGb{&LH@9=<^ z@H%#4QSl=8_6|_HpJJOT^V4VOCLk2vY9-L}#rJ>k0F`zF-gxtGh>H)!g1IvwX$yDm zJdDPMUINW<*4KxKD1S_z77MMX3)(4QP97^^{h<`r1JLTtQ~*-2aPboU4Q$_j0BtQ@ zoKGtH1Xm-@RwN`wLa)=Jxw)MJOfo9@ld@beJZMIEcn};p?KS+)OhIWtZ;uhtu^|LO zF7V;p%RSv);-zdykRJuMC{4~50t> zzCIM5k}q7sQT4*Z)01N&@l(B3JV{q)J;&Be!QBaqwU^^B^etJw0toaxNULIIVMkY& z?5bKhXP)r)ilWlNzO~t4G*@#xy5a4wLra?xu0vr2S}_CzI)dqL7!5TP;+zkofnZ~R zbC|?&2^FbB#h?;;pKjJ^p)54O!#$Ss>7|au#azS9rH#r=07^=0xW3#7v?TtnRs|O~ zP>`D~5(T0|g`FB4@L=0@1Qj-ZK7wg8(g@aF2t3MASJMnPXD?Wcl6|XJ#p0YYHH%{^ z;jAign7~Bn$8MKs6+>9GbSlT%OvSBL+5Fk90`~0aH<}6dCy-Kmxn9yxQc^-??kK$U zfy$&MF)0SO-?pA}3xZ4&UV7;xboLE$-H*UxYsJP*O9<3LVeIZhRaq^(`^b3e57{LWT zfaAvwsrZ3n2rf1#vJ)fxO?Divu1MF%1`C%iqkX-2Q9^%=GS>HFfsD(QvEM7-UF}#& zyGF;#0ctLM*X7$hHV7T7jCHhqxo0moPghpX1HaLqj{aZWSjw{kLPa=_)~9yXC`F~t z^W*%*iqthC$94iV2`JZgY8s@b zB{@JSg{mCeND=RN+1V7(;_9MN$6GZuEjV$a1RsC29oZ9;5EB=yJU{>b{2Oo@@*}h5 zSh0V4ofABL2i4JP3>kSsTslfi>M5`quzJl(YT73#kZkz+op8Nk2!*kC*kHd!! zVfLK4n73dNf`h{#@ib4J%)!gAzRo@k;(_nohp&J226Y^N$5(I1!Gn7d6cT`~TeeVO z#N)5eyo#rO`3!lO7XAGk4}wq)L5c*cHupCx;7)PC-f0MQ{9rUmfNu$O??dJ+x$h+u zlZ>C4<3#e*D-k(bYjg&%Ui*w+NfBUko2#2Qd2a4}Xu7hpX6jF9e2Y@sr0N=9q?) z&RjUZZ{m}W_E0!^QOLF8mfJR9?S{FCj}Jr6sY3khr@zO5%^x1lTDZFR;D#I5VC9OX zR1Es@`fKlD-@Y6ILO%*kD>Aa;aQ!W7DE!=T^zdocdw}B@N!c?DKQ99|Y@UUvlpyq5 zhw#?h2T)zvk6`a80^u5DPYA)P)w9(O*}i>earkH%H2P4|GiSo79g7xZsbkmH=02P{ zQOz+PAs7sTeW(dR5hKcL+{4`;r;b$-@JRX_0YC!?@^Qkraj^)F3Z^hFL`(As=R*&F zZwaZ?LmAZV$O2|_LPNcUYsd#WKZiZ(V1Eli*dWrg(otL{&RFi8LqF&VM21PT-d--2M2Rjo({g?3c8ZgK(juqj&cv zsPNnc&tiqnvWfL*5zP&6*ejoH@4 zH9Z2eQI2^N2}sPm&yzsj6-}h2uxRoEyM+L&h00MdYO6Z%&$o6WCOQtYs1O+o7SRo4|2|c!jH!iq#!= zu0uvfBI>GZU}OK@e0{45bF}W71@H?IJ7Ch?p#tpNlY^PFrm3TK;R^|IX?W((uPG4v zwYxSEEH-gHYYFZW@caw!axPlA=Gu{-oPyNk@rVwOMMe2pG`Hs9yWhJJFTMD89Nte5 z>f*^U5vNSqwH|?|E{N+-z%w}y=}qQJ;+l5%^r)D%!nZ3MB%Uz&rJoO#p>Qh8 z!^38x7FTG!!_ZEptgCOBT*sZfS?HEZ9r==yEu_+6)+?UyPGV-|;zq#dgaNad5Cu}% zBcL~S!O6`^rFdBFN;|vg_;jGMeHOs4^K;``GP0gtIB}i2k+zdlBk=s+e~*|*U+7hc zEb>RngsUx=JdPg~vMOCC2TC%Mh)0@qOmY#Mm3O=!2~=#JIQcH3>5Y~v6V9^bEJyif zYO*$qY%Rgf-R8@e(eXMz=2za2OON&C>KFxT7b};4|J4D-^W{8Hys*f7ue|S{ zE%KaH>DZ-IpYU%-U6&sV$9On?j{ZK{Mrjj)&$%7W(YgiDCr%0IQo(XQ;sN|sX=FA_1dM#%{@&pbryZp;#*oeR6`|gq8w-S^fmIcAsO^^+$}z|A+`$aXv7-S^(bshs1OJ8!nKRTBP?5SOYv zW)B@airyZR@*tO;1aWTEx(`wqx?ugrH7Yxe1iTj8cFAlc_M4Ie-!V1=Y`>WANOTa{ zX_j$kpOk{bapPyoWa%6@RmKk-N7-2wuV%jhKXnu*`O!66Crq81f!Mepj_C-}(=uQ( zS^{es1-~WbZpM4evV>gyAS%u@r^VK-6Svwc*+7T5_=5%h33KVZLSe324 zm?qqK%Ld+i5FdQ_riy2nl9+*lybAJpcWkSC@d_+mQS}3{1p;}c4N`9NqlYy z5*XgtXTz(nzlkHq_Y<5S!uqufF+MX9eWn&f#zf<9&%cB{d-h=Oo}FlED#5hr$;e2L zS9X@iPvqi_xBrQ)+qYu-?vLQ71Ln+`40qiKdN~JweEK`R?In^R_ ze5wk}zm@f!_d8nu;qLRop9~_9@J_C*&J5C@Rj0l3`ojbR4+;R~W69J={YqPRa z*)uO#xR}6cn6&l=a?a#(YLg-dSnNK`^Pq_<30^`BVdOPZcsU)8M5Kz(4-+K9!OlViP&y9>z7-Y{rUZYgHtK4?g+_ z$I+c@AOlqu6{sg*9v~ogr}FRWCMG_^Fd8gWs3aXJe-br|>5Y{jPsM8{-?Ed}%8sTV z+aNJ~JG;9$7J~%fVymCXd-Z7Pu=5^YSg1HTyOPH^c@mluoO0E;IZ+9K6JYOSbK$41859bjr0kaqRVz4@SkW;Z?Ct|Y^yBbT8 zBY}b5Si5Eg=g$M~YV(nD>`QF+Tv9?y2n>lo^{*lV>zuF~y(GIs_c?=ODH1bJ;*L3X zy+kNpNfF^E^_>^Wqry?@P#G4Kke2tKJC5Wh65mdCj2wUc?<=EYc(Lotl#A7O;dS-p z!aC%q%+LAveVH;^$EB{Z%Ej)#(o6a=Rylv)#ecurOK5wPz8#;*?~cy|9FBf}=}YQx z)WgRwxcEN-pYl&3(9xe#9KXvgV%s?=CmZK7`3O^&=j5jx1F34r;MLBo+KrI4Dfc*b zYlZo%j8MFk9VEGkSd7a~AV0*AXxp-^$zDc8p>%SEGr?GNTs*G5;TGI=_qVZX&05@Y z+gGt@@d^qwIc{^tt+(ES#~ynO>({L(AWET-pQeCAa7dU6S}!(I`}Q6{R8+Le3oo%W z!y_Y<^Uk*IJMr7!{u(jS(fH;)-@@$K^YF^c6u>9XQ1I#z78XhXM+WRVi0}x1Xel@b z$&A--T!e3Z_eR|Jy{};T>bV$kHM1WScJ9>fUB!0N#{Ll*I*W4>e~NRa?0oX4?4NQr zr02W{&IRZbtPYC<6Tb@x_D5Jm7=?%{BsJkM24FDs5Ih$vusd`549s7!02yiH(9_$a z#@*qWEhjue2f{~XJ_aFdP;4o+%CW~M+?)&kEj!vqL$5lHt*&g~ zy*7eraXj%<09pdJi@-m9CPzgh5T~%vuweF$^TzoXfbh{rA7JO!V^k6hh>43-cKeb~ zU5>rC@BAlTeBpV#_~O$rT3X=cI|8e{o%5haO+x{m{PmCV*FV2NAh?6zU|4}ER}U)^ z(gN|~Yk$B`e)dy5@#~*K<7vXU>~M}+57POw%TSK{ANUsTyZ8IZE!vMs)8h~kqs4$z zCt?$W2@YStz2EvVe(>o1aMwE_YeEXg+KLHNG6}re@!-SX$8C4qhT~_BU@`%)-bVvZ z0*R%|=i%KC-@rqU`~biH!!NLY(;8%vrX*WZ>bQ8N6ukA$%lO%oKSWGoBxztFe0<#z z6&Hf|q)2?Q<)8S$Bah+0;XSzS#!Un^ZtxHBLUKj|#{Bbw$dLri_0)=H~P*GcixWov)Hw}43rwKfUF=Ng|)HYS%-H+ZtQ(K)% z{NTj(W;PEXIwk>SrByh5@E8?~GgQnxRmw*Rp(N%Gjg8HC|DBKU*XRF+{DMMcWlfZY zufj@IS5;x}?qj5(8a(;SU!kM3QvpWd8v?rDc;hV;6_@ifU&TXes;iYAt0Q>q=xC*) zXH;ez5}Z9YE(Qe!d8D^G#k0hARp?E!KuNeRsZ&CAxsk6ZyH6^gY8PUXhJ%St7Mm&vA_fh_hB82bCs*&{aHgRpT-+X+DBl*iqJ3dDpNm^O0*)~@?D z|Bl1B^m&*+cMamh;xRcr4Kp*7ksa%Yaly_=@-ZUGvm2QKJ(v*Oi>#myj1O%_YG^g0 z{R$DJJBzr`7DNPeL+8>7Uk@tYE*4nL;&|SMA$u2G2=ZMB1MMdAJTiE)c1KYgi2pO? zk|6Z6MbNoy*V>e36A}_k;__0&BReDVz0pK1#ATR+E}&6R@n~x=U4&6n*TL{087}*z zgz-7yDFRjHVO9cK(s%h#vyyzgj?OEA`~S*+rHqcf13dlTJ`d8qOI?>Mj(aYowa?Ps zXgy#28U^uE95~UjUIbjqD=vLGo^@Of5c`>;{v7@6-@hMyMr;{n{i*~6qjd?Wr6rY@4)SKvEBZSq;Yz3Zy0{rz^X_&dwh8ksQfogo4S1pkyu{|M>%0x@-n) z16>FV@*oKFMM_#IHg8^mNC8c5cD~QR(G#yKy90FcJpu?FUh*6#xts|<)g@h&Jv;I( z87uamU51yBBY1vGYcqN%C?y`Iq%>`4Zc@3JCB#fsWd#Ad9kDUdm@qLLVvFf4&&!+$ z(B;oTDhsTYbvYA24&d0)T+W3Lo_p>!y!PscWa9ofd%7BCqZv8Ht1%C15Z}Hkc zUct|P@<$xllZ*CNJ34ul7PcZLYCPV0^CLX_*B3Eq!gRPH8162?s4VY9Q=JJveB=rI z?YU=h-*+B@-K--J2&X{uC3vaF!ujj*^CzFgU;pv~#-&a}Yl|7aUQx*I#oR{Jmq)*xbwKLviAGA?I=q9wCUl`>uN_#Iw~=uNx(MV`De@x)!TeY{ESc z+>WV}=ka|SxM=)g=MZ!g#h@>|;5QCe1^06-AG6R&JnjR$EJ zsB3J&`yYIS(`O6#yg0#Ski^Bta!`fhk+5IS{N;6gyk#r={DTl6F)`)%G%QNx{(kh) zAK~SfKEUoh`!OzKJZY1P0+lf_W!b)C4}SHVKjX!hUM5J1MkxDaB8@~v$E)1!&-~?C z+;i7Mko?^%SFdKfJmKZ(ja0Vb?RVb81K<5QKK$TgwUeGXKAY{*VCL-EN{RTE< z58g)_8RnQzB*5~4zppoD&zXUD-u(yefAD)aa^wJ(FI&#{29dUgRfx0W$B*KNkNyz9 z|NS2@J~Imm2}x=f)0N}6a^))g?5B_8&%b{fjSUUhxN(y(E9D73W%48}Te^(O-@Ul$ zrklwZ#7=O8%8y1l6}GC7j$&3K8xR*vf3xMoe1=?2AL#%8~geaRqIuBv{ zx{#KcNDwK<#x?@;Af%*5kv~MRO>JClwf)QLoIpOw5+gYt?x_P+Ao2|nNjEYv--D@DdM`Gy;@+KU$&-uV6!;lgen=x$q?ZvM_%Im>Rj@70McMAW#TnH4UjK1qjH1}Uc>N-Ck=jY^d{gLk-^B{jY+JE6CO?LE2 zJWQqiQlBVwva?3O=2&3-DQiy(0V6eTQEUb9NIrFWT#jxfZJU555gKATqn_vc#WP-l zON+uOyB)o~Miu0{qOykIFqq%DqrS0Oh0B4H50y+=t8VHzsjw)Q!tM|P0wZAP8^G32 z_n@Mp1f5;Ye7*pwDdXVp?~B)8e_eUQi+B8?LxaGbus8tE=mA?8truk`K+F zKZC+MoWj8elO|2Yq=^$Kumg|~pN#3#r?S0z6@#y)x&q5rF2PN=Y(Pa-F;1P?k7?60 zv1su^)jthE^~s#m1Wru~u*hz&0CklYS$2fa*@nvQuNqSd5jE!gOp4=U{*RZdiwFM@ zlc8bu+opt-tHwngxmm5f6tbNZWC`%|2}D_GC4sgaNjgH;h{7-FG9{eL@UVq~svq7y zdMsVK2+d6`C@!eRkd5yi@gTS>!hyXx{M`>aEqSG@j{MZ5Z0+3K^mzNtPYFERIJuHW z(M5%R8X6c;PE0K=CVcqLew;d9slcQNN#XI5*(o_OjS52*UVUi`8fyoXbByfvIy-4F zZ|-6~ABQ6c3s9Wj%r?oV=w3!QV z=x{N1Y&*gJitU;iF|nbz_4XU^jk~`|I`O~@FT78Ba(G=24j6F#b=TnTyT6VbZ@2{& zW!-rH{k@bYL!66#%wI4I_ucmpZoK|Rq@_&4)~&};U*Asf)WQ1Q@wKmi9kb`n!q@Kj zDt7KEz?qy<0#ZBM-9hk`jj!Hu2d=;V8Umvz?Ad!3HT5m(7&<8~il1MPlyNDz`PRE} z?06~i&sM=~kpvGeDu26-m87uMP{8NsHKVJ~2BXD_30aw(e;WZ$HokKEEgT;M_U_Js zWT298N0Bk11kFY&Qmc`iG==M+2sJg$Tz6hnqC%0Me+oe%zPRzm>rqltjl8^K0z5Zl zPt2r3RK>O&!L^%jv)VZFm5^v2S_P5? zaE62k_yrY)ey%eocu=tw$7ZoJ6sCNg2YRD6P6v+1V3*%Y}M{8>fjJ>UF zyTl~5qN%AFZEckZ4GF>e4ePLT$8PeP3KiVm-#3u`_9qWj>oKPaYPGpui9+ zGJ){qI+t;jBt214vC2eY-MWpKF>4M^oH&KF^bAa%It52h9)!1_4zp%u^PL4)G%pR7 zzG9T-egKb=GWfgKA<&~9F(KVZj~hT#P%r#+?7OcOVF3dO_O~D+%$?)q17`x@g2HOV z#b@$e*JIi86__|7gM5ELovOGD$?4V*2A!!9y4cxPZ>(LnOeq8Z6UXsa3__)dycAtu zK9XZ0F*25n2u@B!_AZVTb8_#M08mG92t<>ylgz}VewTlu!Ae#n$;=^MVJ>c-aHaq# zEGkB4XQz5n9R-SNrG&V=_iBoxUsqS;otJ*EV=S(&e3@s*DpK#&f>0@=0BN*+7q-*! z`&jM%GGqN^%B9=n7>`STe<2_o{at=IejoeUD=Uuq_-s3*?y)XMaoq2CUYwfbPx&eK z((<{SGB`k}<2wPaqan5&p7|0|&GBCOT)vRdK>|YM83Ca|!GUULPL72{$rQtQX@cxx zC=Y3g@8_mfyNxvxyRoVs;S_>eod)#{O$1BDtje1V%$@akqou7B5`Ltiu?~d=g*Zil zUQ$v+VP#?)jZURXo213+51bOi}i95@T}xx)tgu zTfn<`YnPQ*si6BNlQ>~Y4t44C=orc|yu%?$_F&*7fZZ{M@;w`P@QS8UtD!^9I=d*k zIDN7NCkd)foGL|QgPFoDp6~ZWPqzt;jV;JKTTWnn2K#mu!fy13RujOnbSA*EAt$E{ z<)v-dvpbJUN;5|?gzxrO&x#{gVNngXY&pVr)bag#0)Ah(aB@1k+F>GqId~|S;G+>e zUC!w17AHPeSo@8TWF}?h^#n|(*|&ZeOcK37hu{E*$8cwt5yy^|;QfCdW&ceCM}XeT zTY(+9&un(X?|%1BRFw8m!KqV9jF*QO$4!GtQ|4gbfwKhFr_e&c?dd7uk=#|>+i_`G z9Cr_F-;s-kdNbQ7X;uleNH*yy8CbJ+GiquHeBV8&cBC?W-IUZ@lr^ZseY+p`091yR@_C%)-|Rj;Bvs!1*cW z^QRzTX}dc5ke-%??|tvvDx*yU6~njQ`V^h5{mL;$V()(I-n+4U*-~70?G0#awqf`7 z1lT3myKgV&_lyGJvPvYmg(7a6`Y>tGhTPM~$$Rn(0_4Zr4(b`sx{ReiC zmxPdiWTT_2i6FWiM~@y<8*QR&i}(M~NH_ZWI!WVA%JFda+!d%OuTYpoJn=m}eGp5< zSCl|eT-R?{k7Y|%VEN)zD(uswiIb3(olON~F2-k1$HYm~F?sS#UehsU3NM1)Y13w7 zeC9-g=t=75xQq!{v2qQ0uQQ5^%aJxN14i=Dnz|bJ2lyZ5f;hhUUrc=4)|3?OEML1`TF4)qn8;lQAH;X13Mf7z-Q=3QJ`szN|W zdz4KYQMfn(I3Bv1a$cx^@iO*%RbQ^Me3@s*Dh^@!G*xDc7K_%{xap# zZTfs4K3^{E?`RqQ>~hauNfG*Wc*ILxQn!41W#i;{x1$Ym380j&iZdTSVJ+v5bOl|> z-{*Eh{hU)e4fIE0$7d*<#=9p zMLRmWQQO!-jlW*Skkfg%6KFP~q@a{b*_$AfHICTTE}PlXMWNtJp=m>3uZ{J&u@14- zqCig{r;f5JE6b>v7f|aThuqw=%64`0HP@n^%)h&*7tztNFc{409c85yL>&zX3k^nc zN~+pXeCy43C}?UGWa$DdTr>-D1P=*Gk(fLsi@;OQK6}8+CkS{NSD&FFtB*Q2}>Ld!dhQCng+Qs%( z=D|fd9rPIu>Vzng%ze$8B}hw+RVO<^fngj+InFDmu#-UTa%4FK+kly4P6jP#hGQ2H z4s(Ttj!dS&A$X&zfz>QPl)fIf2@$951kyuY`vA7+y? zftC@@ZWi+G7UhW4&{To0o;HFWA9is>eJ@THCFN%bN*XD+PZ2CbYM38&%Hqg0qsP$-ucG7?DU2 z1X7YGy}YOxxp_s{wdXjMDG3!dz_FBcx0IFx{p#7AljR%_aqjAcv#ST!oreN6Rb>?l zbnM!B44-^*00BNR91A@pb5L`O1WIqi$rFXxw&fVxY=pNyi0=jIsEFXQ8HbM?S58U2 zom|-i0;avxE_z{69^3ALJ-bff^_M zjqvf~htwvlSa4}2IWMWv}q+yu&|zCDp`?yR}bG|B`pys z*HltL^TPC*Q*b)xICk&djr!^ujup@)D|;tvP-1*yzq5fNSp@Ymy=x8LQuvGATqDzo(**9L-V zyW07@?z&AJ<3dPU(4xX(rPNABt<$H^kbgB`-`@SC&rXz8w{i_qp{#92Wwor?2J*93 z74ECKwUg}_MoViK`M?O*bQfNE?H}yVAm+|npv;aW9jRVVMJPUsN?jg&y`15#AqZs75uoz>N(KbmLty>uC=nmpo<@3*u{*+6;8Xd3E-$&ag zm)er@HN29a7n7yUy2lVg3KQPtD1>zxhux^0<&5G;$=ypAt?e zEHs2*lNvB31MgG-NkXToV|WTD0S|Hv)!k!2WmOA-NhM-pB=EPJim_K(Tn1M+9|E!g zu4~DPqNUJrgoKjQ4%uyzBj}(&J$~@Wy_h;}A{lQB7A;<^9A;{2Yq59lKIQDNdi6Ro z^0U~neJ8ekx=RUg=~HAx05ZlWk#RR;`?j4pc;GNT{NNMhoIXtV7p^)U7}!_&*3mH2Dyz!~s@hRopO2J`U_AY|pW*A@xSl|JJofG1Lr|@Q$<%_da92F}tMB9SUp$~v z?=>{k67-j=5Kv}oE3zg=>y z?%pOU0V9|-Kaqb-&d-(fqeXRTBj4wzym(!mS;ufM ze0|*2ZfIS77oYQDdv!{l*esm{?9J@I8_LV-c#n>B7f9hgNILAL($b4ED1<Ym` zrQel(cjJ6Ep}d@+r=kOmb!L*UKfjmQxo#Xs6OJ9*g;U2*!(tdvyLxNZELF~a^XAVc z0QEy#OB3na2h*m`!s3O?P+U-<^6E=82nkG2?m+q-4G|=AS`>{Du0IK(B(c9OR4OIm zgT(k|n`L1QNz7s~U6E9r63)yQk~iKyXeU^0;@aUFBxESaJHUDI!Ndt!3XJFH<)XEt zMFCu5cV*A3_t0U&0xsYE^xc z2p9M* z#xCf!uFC9#s{(F+r#>>3<2VbAnec z(PZSM;y@q~{zXd`gJMTxMup(N7pX}i{ELAwMJ@jtASks{E0!F>ax5Z3k@fH$qX1JT zPHd?xB;N80YVMugQk5cZ$GaSDx|$-7jrHi*^*Y{twdG3NJbK?3z5jAW0F4y6ee@Z} zTwl64K%3lqv3FeV*>k^KrhL)!XPxX-u6LEjg@{%6XCZF98g z{N?ye{b2d*yDxl>f2n@R_1VuqTmChLWc;5k7uNaN?_{luf+=x&-BdIRNyq7~P9emI zUVX=@mq*3nNKPRntBu5*llx^CrMj+JY4h<35!AHZAi3d7i%TiEebug@ywYwLFVAlB z5;8AJ7Q2m1jY4-i0on59^YPw$@1Urt2>0Cc4Q11nl{FqErDbHoCnzKmaO2IlVCvKv zm^ot>1)dujbpaMFnTtms{T>1X{PF3w9oWDBAetImuzcA{{PwrMR5n-51QDH`%}7d4 zz?``=p!X7xX;!wXT8$43eRjO_-c}WMrKYx(?epYldk{=}!(iwa8A)I|OhHZh86mK- z+6fj0VKkZf-2j2MfOajWOq~S3fDj6qF7hW2@-qrrf&;V3pvF_;61KNAz}QcqaI-Gif1-b^j3e+X#4V=3B0Xr%xbGQD|H2c7hx$lHz>v!i#?=$9})1d>vx#GH(ePeNwaID~}-6KD>p3{O$fQCPHa3BjZj_U$`LAXcUn zC{a?S2#*m(S~!h3=E-J&1fQ29d9igCo-FcPG8@TFv9YlT4+}?cPanrY@PvnQF2l6d zUjP9A^hrcPRFlw6V)HFF!7gq?m^gW&^0H4)O=aJE@bQ){Xzgl+KLPHYRK~vZ?c1?# z%`z;QzZmP+FGcRzQUdW_R96-vzwj`Da|R}6W+6E_iy+&Af4uoR+WGvS?%dv4MJ$UkWhvFoGm2Ca3 zm_27PY4%>snl&HmHf(~APXNwvElU1*SI$*XpfBguiqw=8&RH+w64F#6h>q5J(#r_x zBbY2#gJCx>1cWBRD=>ky8^Cc7fOkL?0-{pjvad_p@8r#HuQ|EJ1@?-C~LPy(dg zj?XR}`%Cr5anEJiJh~Hl1t3&@mvtt`@v@u1(Q$-CWBX+1=<^^{ij1ACJpoJN0xrk# zy?sV9+CDgd6LU^q>8hKYud( z{Cp^oqSSj&5mZG+MIo1rSK@X?ghyldo_z`w`4DJGjL7`_d`z2?h1oNvs;o&NAt7Y? z&B_~h!TkAHzG5DxPoJRd6w511F>z8R0mBUTZy1u5#m$Axm4cwUsu}-y{XK%B27=j0 z@*zD1irBR236uvQF-QIU{SXxyu3|7sPW|AZAcV4=85yY*e9Ljo#&y`dc?062V~}$? z2b~=q92-%TId7Z`t=5I$MvLe;aiG%h`!>Wz#ZWNLg~?z;agliDQh4|Wshv34F{*DU zA%C?ZEIfoD*Hz`EmbinmOI=c0gx@{&G|uLoMOZ`yvoAb_A3XY9l?qeRpKjmv zDQU$OiaV8+a;R1gMn z`lRgU_2RCtUq_&7!NZT;gKo--Oah6*;u190)nd+^Onl?+P1v#XZEWB10fqNm0yP`K zTP}eQpLzHz(Ce+(vh^+a`S>C^AxXsu?d)yD(q&Wdz{9uW(2?z&D_}y_M6|Uwp|w?Z zX?xk$`&5k4tvk2i`kOYXxUVIo>3#yfY15PN)bAcd8i8U`vOkhj;*nQSOkh$+P~M8a z{^jRbyLv7nVtui8{YvcGwTJ6WV$2S49+U9g^N(Zc;%Qj1VlmfGFY*iWp(VI)X|KRv z{_+GKd*n7OUNQ#@7S6=BPq&ct0POrM|>C$UWy zhd9{_a{v*CIh_<|XK{R#6HrG;I4(ZLhZP&*x{x@!l76?nt%LOMgvjUwBqb&BelewJ zCjhmuUMgc+SG@4j^9Uv={qVyN5FZzZy82oed&MusAG2rAU>i@MwY>+251&L_TncIb zG`4>HA%>|i_^3Fc)3_XmFk&C#`wR-yMMZ_Geo6frS1+7CRfPTf_F(d)@raBJQLv`H zxeIT;@h0yXQFG!n>_%E}#+z?{f={>Zg{9xFfW5@?4Gi*T`{P)bhcYcFE-og1aiLPv zjjdZhQYly~DhgSx9~D&cd5)Fr9z&vt$k>p#3ee2To=OltfOp@0S2ibw+d;^k_GEWB>6+Y~Njs(8x?IUA_rPDH)Lb`Nbv0XlZVNr>8f0k`Y4?C$oO? z;vg(pG9R8^T6n0FGnrR8N4tz{xXvJ?$YacU%`6`wOoN@BR1d!lLe{V3f5z#P9eUnKcMN1DTpe?W)M`hAV$I*4N&OBi_CKflc!El-o3MC&E~tk2=E38AY;h8JPE!*P*O*MoQJM%qw-$v?X$pa z5+Eo%#}Qy#>^eKTx=>HSSKm;L#-A4dwd`kUY>jGJAu;Kw;CP>{NpTqX^)% zIGuA^+4woa;klq7uN3Ji*;u@I5pKEZtC%=pI@(%#DEK^)lar4V$8s@o@?@l^jmM83 z`x)Ardm&k^oSZ$-(Aa^H;7AJJ1f(R5!}#$Nl})KuD|Uk(1S~p&QZ2Luj;mI$hhFE4 zPy+Mb9s}Cin%NHv>Z&Q2^j;K{=>)_sFk21iHFR_qDcN=67qk8{q?a_%b>5DW_qqY!UJXs`epLFK*=-`S0q zU;Q)o?b?SA-hYL%po@xtmQ>aUUw>x;f!8UBe}%W+c>!CuzfG_YxO5@IaMidH{EAnP~68kbeIK62sMXuien>6IGRJj zXxo*6?*v-69^#tpCfMw!GT_d&t*3$t z(yp62U6Zhtl7C)y1K)bXbz1ySv@H=Z z2;0SJ%WfwSH<8Y*>NHB@5rjs9zZR|o+3l8yK(Zzh6XTGSn2f^Qa`<>g@G~pQid%8( zZTDm9^fer-@t8I5dQ6zI5#cfO;1e19K9$4{^#sY=@%Ybvio3sh7ru7;*O8l3#95LU#};LpBR)JzhH!FaQ$ogGikQ_n zX8h{P6@$==700fUoV7{2B$vAo;MhexTcwEBq16O&0?r4^Rz*DHK2wi;A%T?H*&zx# z{*#H~jpwfaSFWZAiF#Z zHTwDJ^<~QWdL8eS+Qc@?iS;UGpmtI(y^f{r@{HqIvEi1}3vqG+wPIJe^I2D}VJ~+N zwZo=&bAzW=3m48&a9{)$FPM)THm}FifA|gd?%ayoZ@G@bEsjjw6Ne8U#D)#)aR2@H zE06d`AAJ;!jg1s6o(h!w;)y5l^PfFIKsgEizTzP(AjYvH+e@M0?&^+p>sJ$;&BvMC zQ+WF6-y^>u7g3R66#NOw@o8kp8Qxz03W%OPQ;om;`E@+|?8_8BBM1+Ug_|=0GWB4s z)|1Ni5J8y>!G-W28w`D|1d)v@oQu0=1Oa{;I1d}p*-`~VZzKA8>nR9pDfm2*o*s>u zC_lE_gP>1G(CdLP{?rnf78K;*x4->8?z!h)-0{^r9iGNQ469% zld)&lF$&)i0?9y*S2^a-TY0 zNQVN+{f2IiDU`inR#vJ4=FQDDF!r^>YU)8-QyqLH7<+U$CTC|MDqE1Si$xhGLsR)lumXX4_?5Z|MGLSGdeKRh4$`p#KimKwb%cSPe1(>58U?Cx%EsjPWZIn}}{rY;1&X2}plex%V+d1`J%F~O;g`I0rE;w(uWne_0&oH zWhdCF#LCN8EM17-KJ^6G@AJ5J^IB-!Mo>{zM?R5=rUqwx^xkQ%r;o9HdlB~RDaWo| zr8sb)9>-3$qqxk5%4#RnG-zNnhH@N}&}$7wht&`Mar2Nq^*Z>5&qP4@WGXz5VD*{} zNKS}@hEu1NG@pa6@O1Tt%aELp4NxJ`5O|BJ7Uy(`401%=Gac|z?OS|_a#c2=attmq z-ao)kg)$Ls{fi5Ix!;K()JV<4fB^|fBFFKZ5UE@VTN0o!Usu*|pw?AEW@IoJ75H`R zYKd{Pqm7rk9LJs)FVf_(nmu-(9PPi_a;4)ndfykl|KdgF&!M^gdy(koItE$O_19;;gnSGNA5#%(YQC^vr;U27AwGxj#{s0n^qEz1W{Ra-> z*zw~C4h_IV58a29)MO>WM2pZyuZHP>!Z0`SDiQaW8V$q_xDt_hWYu2)jb8+2GYjFElZp1a$Y*M>4^>r<9*p9lZ z&^*FREtUaw%qFHvvde6?7)hux|0Nw&NRj-AW)iA8)<&i2~u0 zKU|z$I$EnSclK2L;^)7i(h!appL;{)>mRVoaj%R?7@qp=Q&_!xEw+BJ4_mkFrPy&& zS$hoKop|&I4`JOk8!&t3eEj^0X9&cLA*YWfQx{e&Uw}uy|9#AxH;>AK3r?OWLS8{3 zB$a7gXfSTQ@mgGS{bnp#x*C7{(~AUh!{}`7!r*`zYt}5l+_`gb?KRgEP}y+kP%bQ_ zJ;|uGY3&N6CW-CrwOGD%6`ua%OX~R8-Q82o%leJW5E$fzuYBd}#3~wmB>DT@Bxia* zvL}p#pPydYAg*734d>`2YO2~fmOe;LNkvj}tO844yW^V}wCk{!-`fcGyuCeI4wtDp{=(vttoV93e?jrq_DqF`PLVU%a z1RQb=ONKDv8;Ym#pGtN?z$xoW*pOsElsR&B)yjDZ6^lWBFT099>NsCacOpplKK^>8 z2u`0qkvt*^0semQ_4g(H9wpH4@Q4w<%gl zO-n&nyAfTzR1QZ(kujpNu8r%~fPPCi9(wpY1h!MLlZxWugWJeIv$kkqyk1;axpc*e@PF>-ABF=g6h@}(;B9t}!Mi#VsAICbU(HV`aM zoivjGvkoV7a}`)GDlH)o4MJ2*7?mq`1y# zt;ffo9)YJAM}Q4IwWHJHx`#xbPi zzlt0I%J#Etm5bI%O^}RE93Mu+E@D7}L^~llB@OQS5Nh}p6j0mI)JpBran{FYT^t~E zjQ6QnqUVZQ4CgK>;k z0r&F@VwEmx$FQ!Z5g&iN z5Bv5X#k84O(0e(ftgKY+mbnc3QP^=kQ+Ndh>2cdv2{fjS$Ns(h@bO36DcCx(XyHQK z|G+m`r;j>%dg`g)Q3%Y$jW^wfn{T>R?OsSg@sg4%#Kb02VASC4H{Vg-#JAtJ2|xVN z_wd@QFQBk6ANPFon@FQzdFkaB)K1HFH{5^&`w!sLZ9DP9M}ES0_^YGC7hil8Z@l^; zI-1Q&@Q|6o#Z5xwh!?XHnY$Uz8dvfdayT+|V}B3(YvyQKRl2@=zxfSJo{)|$Ti#c; zQ9;4p1gOpw9Ce6`PsYtRew9M}JxE5G$Y=sF^2@I7W{&?bCQh76rtO7a{Ngz@Q;2tU zn$XtL3r~H3iZQ9eX${%nPQ?1>+#%r3G!H#E>su*~)hNqj|5@@s-w z7cILXAi5ocu3czqszp?IB7t5w1*aSQe95Pso6*r#&!41+A@Mf%VZZdyxa!Gs&9Dvi zpu4w%{q4ZGag)$kV}y@B9mYNrJiM$FI7W1Lb|`yUy)FpWei!m=)*}&|oQ&w`Dd!y4 zBQPKw9-0tzv^XQsKL}ktXGwuwq~&3P8ap)XKi~-olpsg6{q}CSdsxwDY^A{OMqpqH z2F#=#%OKy;N#I678axC~-$3;C%FFy=?PU%6Vd(Y!6xNc7#}50T7u&8yOS{-Q+7Tb6 zAyDgpe}E^&r4C0AmBZE9Pl2B9-b&a;8nAKGT8_6n_U+1J`+P|cHuUv3AcX)ZB`F%S z7SBdWSv?LNuB1}nOt8|6ep4Mmn=jU`SqhD_7lGhWlvQ`bIy}gJ_CxP%z@4{kMl1o) zsk4PBFY8lrRYwL!;Nvxf`SVk8&4yLzA&B3*FAs-~m7uYWU{MPsCk5b+TQ(_&v^W3p z9`esLprWdc&pK1d(_{I%EPVSrccG-X9Dn-lYbpzt$<$8})Qb(*ti<;ox}7u_i6@@; zEna!yBiJo&@b(IVZ=eV6zyB*(vvxj;ODpl%BhR3sq=PgqvfP5Z?!FdtW@RHbIu5VD z@lX8y@2{)i^A?){>ozRK^*67lVyNYNjCkqAw{Xwh58=eIBK+wOFLA91pWu{|Psj$R zI2=mKOgSnaCg_!8Yl$vfBY3fLj9FFil2WN6%X>1`+f{BA5TQb zcu`sI!;Lp?paN8gmbxBzdxYco@e@eTPQdh8nW%55f~%7s6_if$nX_2CVF~evtV3zP z2X^h=1`lrwmakaMbwfZm;Dx%T0lfU;HWg-TaM%bh-y!_!H&mXfVETAP;N7=(;-@5xADja&w!2o{wo2Ss+*@bDdrc+6ug((wK5bEcSviuXMEXhS{QzfdZ z%T!pbnX~62G&&JB7k~1SD7cZ%_wPS}Oak_8+u!F{9Ka7Bdjf|^ixS_ruXhBCmM-Hp z6Fz}<_RR&4|NLjDZLCImS|nb7{aJ*D=%J$wk??yiDm2{{$ft{xD+ZxLDY7FnD)dz} zeQMC5q0vf{k+2&QAI~A+oRG#}gJ~ABoSQK}jYOv40Y$hlIprxOww|SmbjF`|+nJ|_#_-ma*ss==8>D5%h@zf*XZYF9A|3=FFdh>#w^WzTTmD{<(i}ojYOO z#udoTJ&ieY=P2OU*wTdb^mGMC^YV(ZdGk$}J9nXS;CY+iuA;I*dDwsb>$l zpb(f%kR6D9dkAn9`qp)wQ;_^C?M^KO$;Zf^+H>-0hJXkq?Z7-D=q=`z5V!> zKvxQ3cXW0bU?pI48S$YK;*986cR0IB>{AWjC2=9;2vQ5;L@G6|oG%Tm1RBEx(Hb`$ z2J9M`jjjmvksUNW+;z_AHnu_U8G_DEI{~gM0g~9L4H6KOo}EoRCqZA#T^&FdEUWo+SR@eq*W5fzAl>n=y6$4y)ZdyNr zC@=K&nW3SgV6n6j{P%Kf``I^nS1=V6v7a2_TC)@6)^p7`z@dfh)M-PJ5SKz=U`0!7 z4FO*-5|g7L$p@+`+BjZ;1V#k&9LKiyCXCNYM?_>GcJA2Ac7+p+bgR>W=B{eCdl>WP z&P8=i6_vSaci78ZEasHFtSm6nB zEI&eC?C$AJex&92w{xtF(0MwtFv`YMS9d#kqM2AA0Rg!`iuaM-USiqU_=Ox-3eeY^*87l2!BY=wshOX=xeyItEZ#+C-)KEfv*b?YhP2 zGc_t(@rK4qL`6m-D{~5!1WBe5u58hhk`nReoA05dr~%QDNf?)!imKWwoXI-_L%$K@ z#wStf2*J3NNW?~X7tJ7NrSI^D?n(B4I?*51r9h{205{|V7yzC?V( z{3qf4{sSOXyk$k`2nZEsF18&a#^gg0lKt$wpT92`FG$#q6m@c3<)j*OWkpib33#om zEyEC1Vh0E!1wTy1}(Tw*%^RaD)|?)Hlp!o739T}`=kpQKHreI9N9<@)h|dyzGAwPmdNm+wZw zwv5sF@shP8fc@h3oMLw*N|zL6!^ycMoTYpia2$Q{m7=hT-J!*7KyYXvCQZzSr?-x4 z%ub;p<}xlyIrQ|D6ntXSt*6HBfpRjfH{aTZvu8@MV9|7H-mWMqDMN8_1-d&%D3Asf zP;t`?qR&{z7g;f7@)V>dPb33xA_JySc6TPz?j+cA#c~3?^t2?LEy%+=@4lz9hTMAV zR|q6J2wc1s*xkSXC}dM*{km1SX47h%IDQW|C@w%mL_qTFRB^%KI zfeFxWZijEcFs|9W3d@$Qpq%%|pMLv>3P)qL8{r*b#y#J@mWsO@y!F92b*vU!KiSW= zOL7n+;^N%#^{?H5jB(Qmd#56`gqHB{>#vP!U#qspxFjunH3=jf2T#z(*f#QM=wYs~q-? zAR{Y`{apvWhoo!m!j>%uC?9Of*+uU)g0&mxt8hkreSJ85qyY7`Jp{2nD%NLM_%LZL zfgnhSo*pxDPZtvONeoe06n2%cARHWhdAP4K-GN2hzHp^9MvkljgmKxMsXyHM$T8bRjI*4@QF( zo?fn`FF8>l)VEs*wn18OLMXwXxu1%Y#{jf?N%iW3zHTG?;>3PPC^1ojBpjlJpwY;m z&IHwx*3uipL$dB={pu+rtEF?KEr0e|fG(9q4_5+3ptG-uwA4;Tfq>Cf%QkqCzT60m zZ3J{}=xA?L$t3hzUj(x~l4VJDuSG3sYptb%HcZ*;PC80PN@6CS`pwgL{`uG7SGT z;YocejFgv$Kjpj|A%Pud^G@TR?|zE*7TI*rQW=oYRR+Lj#&^E^Z34Q@C@n8QNJJtu zS~qLRG-l-c?4YhjWoCq+JC-~$0?|>Pm`{Gw+EPy5R)l%8C!(RM z0%lVW0k{tm#!W?D-5@e1EhOe@!5@F~26B!xQu$7Vhfd6VG-z+NptGwO?xeq!D>h>M z_-quHo!}TbWB2a8=;&z0^y!)S1pB=S!YkrH-6 z0$C3aOZ-KNn*wy>=`R@@0#vTfoRwT=Gv5z(p=q?HCvTFaNt}kv9D&`~2T1qu}sT zWwg&1yT&T=z0^H=jh4}0FZH|tPRA7Re_XpxWF7LmvfWaDJHB&w*HHVnQ@B$AhlM~x zaHx)@xIP7h3b>ZIz~Vq7U|0Y~cXuC(imFt6%%~WGD5n8}h!Pw;c#Ht937ur*t!+&N zfiYOWX$3WJf6SUaho5!h)mQ$Z(%gA@d7-zv19|!RIDF_JweboH5-rZ0KBIQ{0t166 z1UnEN9nX7;)KOYjhXe#~BVQ=P+1x^ck0vzmee!&DWhDWP#3UWYym`|R8P&%Tf_>0NL2XtZ-{K)IJ2(w> z5>rxxn)*t-{q9b5bs4Z?`6~4G*!aF=?A);j>En{{=9{k)G@s??eOSNVk(1j@p|2r- zlQEM}NkKtD{H)(G=2{JbTrg^D>y_s^K;S_hsCD-tXp_?)0vRd? zy#*a@CNwp7lb!|$!b%7%hS^X>vs!F)HyP}=6(bnEd#U~W0X&E?8@V{sG z0d#issL(dWjey^e0aqA*kp_c~ud*d--g57@}k1aP(LXwrt(ab~h7{ zl%lfg6a}zeou~=e`o~*utFxEx^rgYDS8e=E!bZSeBba3#6mlP$aO;~zdlL46b-fAS$J zYR@7iEe*W{`Um#q;P219h1XvB0H19A6bBC-ARy$5qYN{eEO_%D@8a3NzJje=58~sG zcA}}J3SkieXlQC7ZIs~8PyZFW_8h_PT|3n7mxrf^+BKDoVefzVA+~Mbh2tkr&gB|yL`zE>!Xv^6 zm}21P>reWrCGAOOo_1JmR?-%z*v(L3(0u#?P*z^aIoyxKhmR5Hn&6>#=ln}HLmT_l zMV?|NO^tAl+DRLOTt7wvnnc|FjayMwozJ@SxSl!`Ag`#dM15l$0o#a5S!(WYBOq?Y zFgpHjgAV%hK<)Emx^vlNizX^JWS?(f=Wq)DluoPSyv#EQX^4Y--_S==>-*4 zqrAKVrBsNG{R32xSCY?!V(X^|@ge6>A~}SIM}Yb##1q^scwdCume5DM)+}_0|Nu8uy~M zXhQPe-*Dq5_~|7Z8kH}uD@VDw?73X|LLgM_wy3{Fcny-s+$oeCb{&r6c-f)3(uT-! z{163$;T#AZQgu6UuCofw;-S@%sZkKPc&Oc(f`TGyyP^fiZV*?62xR`doZ$XXmH*UR z|C9asGIgJaJpW!C^Y^ylY)zwnZUHEM++ zj!0@Rm46Ee6_6l#uG-0uJW}@u6voYsHjK+It$!I01!m)+PfX8>2X-NZ~|_-?RLzVz7Un=%?J*T zp-?-fKhR7s@sG5RRg5X;TjLkT9 zJO{aFOH>?I^SN+QLn9VMMEGL<{29o|%s^c&+gT*>la1;~yR)|z^A=1+R(2M21g*KJ zE78b4xVUN9mNw2oAZE;%f@xD`p{%4D`}XcdPp_n3_M*TXQIQ4G(o+x?5<&2E995N# z6!iSgWdy+?9+*635|WcBh^<4A^p0ZIA~vz!{#v#t2{Ca|6kNgVQw~m@EKs|bvU{Y} z5rBpVQs9TN4pR>dcCd5%^)neV;(30hk_NsswdkQxYrEJ#dB=|#$!3Z0|c|(xaHQ3c=DHzVEdkJSg??wHq?{KjUCTF`>wK; zJiPxDKHd7E0zZ={&4Fb2dF|CVvE`FpShac;+jEp-(8=}Z#riC;S$a92R1m3TZQr>Y zpKd#dox2Vb)V2_ybyF#hr?T3E&K@&@0;AB})PrM(@<}5d$~jS|*KzI7kAyuTg!xuqPJK(7B3@|!xo>kyURcJy<-ic;z9BpY%>K;)4U z0BG1s0O~4^*A^rt#bV*S`FzJIl$Vxs{DY_%v?}G^XzJwpZor&blQDhjY~q~&f^PPO z{fLi`$Jz~>5D^)Lx8L4M+Hj|0Js|cSDnI1_F_JS;ct}_n#${#^Xxj+(hgo+A8k_rY z=s-TIs=82GA-ljHXl$htZl?0m)QOnLMAB?Ms>-NH`uLL0T46TXRjgq%l>-wM%G+LUYaCt`7!|J%as4lTmSDYqYgBex)d2*qKw{iHRWF*>wj4ptG`#;pV9j+y#Lbm zQdv_>LUum6w$FVkUhx7tS&0Iv5^rx5gocKOaE;5nI>uPM;T=1n8i?}%RY8IXR|@ie zGO8l9wRI{jS>x`aLbntbmJ;ZRXSJ3fL`%Wqi>m4(96ERaM~@yyX-O5jyNuMXtCfZ= zTK(L)b1`?`Ld3>6O z)9YL)3@75wyKaGp&XoensGP6db$S>KRtmBsIB_Bu#=ZeEP(5@6gaSe(zk7FA7a47p z68e%}ud2G147!huy^)N)8C5kE=r>uA5SxIWjxLm!7Z4oURMs3P=<(ru+Xz~Xm^*tm zpYOv#_Eq|_aKRFST@7A-=^q4(K5Tm&-h1y8)YZ3h-1X?{vZ`SDvWwH)EIY!bY~yKk zb&6Lig&Y~ZR;%T`6hclG%$zla;7?D%R><}?I*v_UhN0DyuTm&SMMfhiD4HPiv^shd zx^Qu}ay*7GYtD3nNA0+)|eNz>@eKc6TdKvo_25)c9b9o~Lce%3rwOFiJw|)s$ty_+y ziH@2&o zt^=e)5yIk`yJXoSY`SI>0t14vW7`3aV?Aj=a@t!6$R}dzv@DhRN1_kx-FrxxdWkWL z?7q)mI3Lre&rr61JGSj6SnDA@d8?SPVh^|RnvJ9@FPzRPCOtQk-Y9tO1Mv3KVCL-c zm@{t68Vu?UT;EK>FKLiE)axE;uo;`;+zjdrj2XEgH%EKVer8CmfGI*~ua&rrnJ!@b9 zfv2;i(3PCxE*O`dfwq=*oXW{npi)v{isIOBHY+gi=HgB;Rm=7a6VUmo@v5t>TAsLzD(~v?Xv#YZW zH{EnC*OxP9&77)I)tZdG$exgn%Bo^4TRaaQo?7hPcR&H^u!wlhZ3miL%8@ZX4!7RA z83zv?Bxr2L!o_pY+1-ScbSkJVtw@Z|gfD@Rr>`@WPA>!o`C!V_X;{2$rHU}nZyrE+ zWGumO3T~ldC}u46RgG$wuOPRQAkPeMT`&RS5a*_y<2MYmZG<3fNS!#?ZO&BOx>=W# z0-El+Ag&j0w39Z>7UGT}cXV|2Q>ieM*GbG!F2*wi<5~;X_kT$9KJ9`tr zc5%HB^=mc6p<<%o#JXJ2*Vm2Yaj8@igVDk{(dm2$8Y6I$G~3fR!nu#ej9Dv@ls*L> zUcQ89#8<2)=TtEywy>B}78RYLq9EoI7LNTqELt>&e4Fd9&xDwmNM12GcH)>i(F!Gx zU$}5KLIQnAFODchLn?xb;J+^}$JK_&6&2Pkju9e^MCQrPhzJ@%`;M<2P9IX_IPda; zR9@|{Baq|3p+WJy7hvjmP6%JUOMopIujKHR$q?;j>)leD$GfaI3=Wu9Ggk7b5SZ|3Es*|%ajf0 zN1uFz0|yQeuev=tio1M&Wp~{%k-QJ;& zhvYb0a%GDE@be8+V9`LO_J-@Pp|Es^#okMS?@k~mp-VL6Ba;5NhQh6b;8dJbOcdM# zz%&#n9u7wmjR*XLf)N@P&UX$_;PkNnuFA8ww6qe1MI~zIZsVqPxbHg;V&#g}1mhkQ zhyesUsRSM?5f&CgK|}%I8Hm?k|0nNz2*3IDZ_(3jRAGsnTr_Ydum}woXQOefTT37p z#kM=4vulu`yn{SZgP7PPL`KIbU?ZnScCj_{@gxuw+rAEt&me`RiR~MrFzQuiOyZ2? zK|$0)Fx$npdsFa;U7+lma7G9yhE@7V7YZ?FGyBf&%_i{Wns?GhR zgYwEUCHUPm?gWyO2mnfGO8v4^*(xbd36O?4pS^wkaQE;*e4HGmyQ=U!&t8BM z&S@oqUVLIYT$~&ydTts|oXsmEcp&IWO6S}JsCCiXYaqA~rzbn}ga&0yy8!1o@oPL0OaTDxK!yB}-JM z!J67S0;(Yes>QS+EG(AauR?n21g?8=(lL={>;xn(3h*ykyb9B&&4dI}@9Z>iZX`*A zg&@w3aTys@wC1Yy-PS4*3_1w%ZHSJERlw`mi4$rUO+qModr5);37zH6dj?f91_84| z57J+q&R4bX{deETAOG|mKKS50f>1w#C~wlJ9cklYkehcDzxmyd@W@Z@gw@`Guqbcz z+uAT~W*YR~cFbOofjjQpi0f`zkGb;~V$NtMKz*`~*V-BLrq$ z=%KRP*3u1AuLVw2j0XrbC1t6}I7lF0ikhlsbab29ci|I3Xm04o$>U|D8y)$XAICxz zRUHbch?JGJac%0jUgU&;bj)`Q4vL+sU==Z6az;Q%IQqLg2|y?CyCH1*bUXQxr&=S2 z4jm={9#qPW>>dt~$H*FS<+@c_{kY~@sX!dyeX57aQhLw@zxf+|K6u~@7+)F zv!DI~`*v?ryjthsL?v)NZoXwB=dzz`$Q!HItR!#VgP%V3F#h?^xA42)JdWeXj;oU} zUw^UFb!;|{ZaiKs0F`p(JE7|T4k0G*5{HKF9%_qWaq2rUUY6Yn`BLn#96{;FY827) zh>iCR5^Z<$eR4c6Pq1@*RwhmY;0oiwh=vnjKygV4fA*8O-8lK9b_nwBtLyxiE&s8% zeg+YIv2xk5_!4!q@^ioZd%64^jQ#A@&Y^=o|M!(I)9%r+y71@a$IszbrrxS{LghCx zs}UgTQ2s=*)9E}^+dRDps)B>5<%^~(4{`OMYqOSMO^)GZjmu9X!NbubIp{N3)DDjD zBMG%sLMBKE3GpVC_1@LhhNP5OOrK7ToZ7cI!3JnNTwgzftKU( zU;=~@loZz}&?fwO#L0piZ`e%Gki~J)5~z2hy1J2VlX#;;aMw!kZE-Xk=6v)Jyj2j~ zNC0tHND9Yw>(-%)U_$KS#380AKc7HGJl;Lw<*QS>fLa1Wi5zj{$RRW}*1}aYLh#y7 zfLX%78#_DP41zB&|@6j0g7BW?7dx~firFA-jS1_P>V>TxDFAGI}2 zsI08#Jx0m|4F#kYAt63!Yj5Ki4RS2o6)+Sz)ZN=7(t_YP1#$673gDkQQNX#SjBxSf z*jN!A7sxs8RY#QaeQ9a6qE`V8KED2#GG&?q+bUa*Wso#mNt&n9({DpWL?C9*nT3Y> z2IQV8R`#*th$}nNHk*OU)G4%dw2@9amBUm+eGlslA`t6EbZh`ttX{}D0E&u>IrkFQ zih$8(LRfepR<2r%@Td^Z*ARhw3F_JZfPf%HgJq>>;TPbG!s1c{283bH&I6ol0r~v| zs$xQ5LJ(Lk)daIiP*1T~T#^4QTFSV_+kp++``X3m&_>#yJJuw6ErQOvf9S%Hs_ zAC;YUZ25Q_X}}C$?-0_H4o421LU*SLr%vXMz$xPbJxW&?j?|%4p(Q5%F-n9KWl1BF=29=;$jj*cJ|yER6<-yTYB=1 z$z10i1hdZ z9G`kBIpvD44s!i?Qn_$()lmsbBrW)p_6D(N$xOsVMRTs4QJ7bYy4rT^J9tp-m`jZ0 z!oq5tI$p(j^oG{U34JEnQ60j{wF_|b%^Q%C8i@&$QZaMZL@I^Rq}@>RLD|tl_^VT6cDiYJDOvQNe2yah6&es4HZg284UxM;>_Q#^yTwhm5o*P1$pe2BB zCh#3nN^n?cAeJv*Ol(HbEVxfbR(OJ^Y9jxf$HvZ4iqI_}eY=qLa+3P8v@6#K;^N6t`y z4XfCe;&dS)kxD6CU7RKGG#N7i+@=j1$RsBrGBOlXr_Ml9;y4vJTymp}pjo;h!=A}kPqLlWxJy>ed=_aJbnUy`twtmG$jKwXUY+`20M2g#NYq^Hu7?d zl!<|O(|_w*cj5a#cnH}OCh+qDWMpL_C?W#;4je^$yAcC6H~4sl5WLt4LOi%qsDu;b zX~jFYx03>)5l$RGXICe6A`~3x%W<5>aSNr;u%oCz;(A&LhKCUn>WBG@<`5Ls6J$qn z?6o*WupuB*?DQfdgD`i_Y-Eg^Kv3$=_T(whEpscj_Tns&n3#<51P5002o4`QsT?v) zCL@7B1lt+11Uzt!jt+&_UU;bSGeOfQ&4Hxn;{1QBg3$W*s7^JFePpw}~z4 z5a-YfdM{5ZUXi4!8rE+jEooVYm2(`&z6U{1(AU(`ijwkD0=|9%?{0*K2a^^u6~LC1 zj%Aci$!); z2In9X1^Gp!&2GwQP*LnbIO#QA9IXs}$U7@xdncDdI?g`=Lob1XahQADt`Z|@OQ zme-@TrHfX@!IR}@tFqI?yjyD z(uNUteC2K|UAzYS4;)Z=?iY}L#Az%#DxK?bNZBf$rQ#w^MI08SrH@zk)&~z9!r9Yj zP+42eaiOx+*-9m#5giCFe;-p(p8zOSzb5)z`6nWO~c_w)CravX?sWse`Kj@Ls& z!XODM(mC(`{vK%UsO7sn;UA!(qUA&$kj}L?gG$YK+;!Jx^cn|IQCUu2;*510mLnp- zk38STaS+)qvOzW;zj*m#-tp=)$L@)pDxm~Wm9HH~^3o95%^ckUmFv=FaEOiPb4FvY zVl+-8qdBN4?l`d$M@)80#6!zTw#~_WMf)-tO-fiw3Mmn#s!j4PM>D_BC2haj>tgj? z&86Bd|8ZPLudx8iWy|O4|IBrna$#1ii(Ox?TpEN*QFDKZet*6VqxX*9f8qE4jcc@A zs{NNLV%vPNdM^C^V&%gAfBu~pt52kCR>IHpbxYpw2>kk~C$L~nmI6ml|K-o9s;(jUy&h-Il;Xwb-@$=> z1!!qB699y=t#Js8^hbO`G?n2I0_ZSYbL~cq&(6fei4!q{z%n^G6u&N(@7;E1w0lOsXN%F^3wQOB3vy$1LP`cW7-c3`ao1ein+;)pR|u_8J$ z0@G$p=I3UPa|b~{0~Psx3MjkU1xZayRy#}LSkc~U#)+fH5g6i&j&`wWv=e}|Qkc{z z&+FE)x1iw|*;nc}91Qy-!)O)LThlhrdI$a4!ib-?Q z-hP-U=&iPXOq-fXVLlnLQ3<54e&ig_LsxsJ+Td`ZoS8g%G8S@9(o@DM$JgejHYzBt zN)9bsI)}nKR7E17PJn_u$!p)Gb}K#fz>1agv3%JQ`1^*S@N5;@TYA*yjMl>$b&ci7 zFF1>j-xXRHr#YL7_F^{5F0G4F(2gHJiDO5Oqn@-P&Q7x9M&iJNg>zJH_G>m>OL`bU zVL>T>67co(ASE>gt5z<<+BK_G2(^ZW24(7EwG6_OV>oBdbhXC-9n*(FWYY?@Fi{6_L6oBIqp^LiyfP;xgM{*`U!SzJ58lGkASlY zCkRSUoGd_bNx9ldKYjWv`Bn%vZeCBoJqIgSF2KhhzDcZM!!5UL#O7;OV&l3cm^XJa z=Fgvs)oT~4&|nf{wYsX3fZhTvl^5ZvWG%{H#hc2YUavtn!Lg5*grl_a8d6Gu#Gw`t zDm&hCQshacMEqAgJtfX0yE7gc!W^(%(7WTd{xdE<{l&l61BFB|!oYM#j^iiSle0)5hkrOdBTB87TY}s|O@&&!) z#W_Jfl+TA$09-MS7Om3p@&R5~7N$vMQ*d^r2Gge)x|&7R8D6YPgq@BHQ;x$%oZVsR z?^O)4pW2A*z=)R~r{5u9FA%u@r;5Dsf8wpG?egCReQ=EV|M~Kt9mlaj=vZa6UH`3d z8LNDmHp#OW_HDGT%gw`B@4VPpsrRV0B?^xE#4#JZRsNQ>F82r+ao1`n^zCG(=Nyw1 z2$gn9-Bcb2hoRHze&UlMW_}NgcJN zq{L#uq6J7yNK{9Ga{O6ZR!F8>gN)2^e7`$hfBkiA-@a4XUMi2})=m|(^VIRv*njXS zg+-m(rI1~;fk7LbTu0h=e8 zY$#jrMUot0yE@R-)r^+bCZvx`QBFHu-C~b9L}2O+KmPy}6y_;FI6Q3Um;|aghhCmu z1XK0!_R^xeuN8lP{$*_4x`V)AHW{-ofky-H(c!^|@5Q4(dI;~m{}xVCnA~#ntpqRx z90ZdmkLN&~m!vNqI$w^P2iww)f#Csl?A6iP3S)nt+94A&2?70ne zn=Ys%*f$t$6i%LKs?F!zc_A%*BIhXpXHJ)*u&|i*yHU_WnK(_EJOgv*EKmThyrPQp zB6hP5#X_8SdV5V2hILf>%at9P>lP;RM}Vd5#Y!Xpnzf%+fiLrjhxfD{O%-*3W_OM4IE?kXUK}S z4g#&FT7s72Dmj2SnTZ|r(2xcGoLfmSAkG*KjSU24jSx?G0k<}`<%S#AW6$nSap2G{ zOrAIu$BvyM2PYfaO7(h!)hXSZ_e5;cr2?Qy6`#S=k{{EM3Cqa##^e$_A2x+9# z%E~eV@=BFYU3O-r53-xNXyH7J8#Fqkf01 zwvjM292B9G?(QZkoerAq>+4~?5@wN%hU;hj`sFxr;tauT9qFPA1J+@*cbZ98UT_}v z<(#{5eR+`{B&d4>ib|@eH1r`dGDf9G{p904$jfVFyFHXoinq7FI%#Qd>s010on2j2 zk~|O@5kiHw4^>rpSh92mHmqBOaT(FDS-R2MTmd5iR~vuI+7}udpOJ!%8`rY!?ds@U z$9{;#pUy)AL$7$jcavTu*0Bv;JuReniH%Es$vKr6ye`Bea#ACq+&nx9Vux(h*X#sp zI@Z~#z_%RJ@7}pvja$y?LPS%6i-`@x>D+xND$Y?^pmK9dkUf4T^3Ifz*BzkZ>!ECX zWw(9X);(-Plmf<90?DwTAS_up7x{Uo$Ybre`G!r%N>AWeMItpZ4M73H1fM&poXPHg zKfd;rn+eQicQp~kAQjJO!DM(eEjkI2nh~n zzx#3OG(l*PH`cCQ4sRcKXo%q)n-rs)k6*leVGt^>;cx2r#=}F5c7-W9a>lAup8Q?z zxLkw822>V+m35I3m68}F>xPRul28H-MyRNx#4Sf+>LkN+k%}tC9u2~2JF<{-2y1=M<`r@xR_9cQ0PnU?AW+SNC5Q1 zhmNRml4DC>-v9-uWrtR5-6eyP#@!9c6x8J<6);gbPDqMT_VG8}cpL8c>MeNp-JN_! zyxxIvnTZriE@*10#kvh^6;NyMY{Og%k3oX0=7u)*$Es}2WOT)OOLo&F|GwDwxsVpj z7BfuU-Mqn#^CAgCBv-pTe0;q)roA|QJdXn1$~L<~qt~Ijt{%sZoWahmAECIQgn-E( z{nlQN*#LqAgAf%FOE4RRPJ)}7>N*8rWF9RRv6GW5HhR`)RP*Xdu&vj5@g7N8%0kI3 zHidFZCC8Eyx(;KsvZaeKd&Ud`=N!}#;0kUD4-4iP*ilz4fLIin4s{Hw(+XWVLOaRM zc^|>0m2$+_#|xf1caEoI=b`drY)4Hcfp$k1!AuAAq;EfOKiH|6$T4$$T@?lXQG&JO zY^&_P@}(p$XD6Z8Cfs`Kb(lV7A_4G0e%ruFehuwgz-{w8P)m8xylKuxiC(oXI&!Q0vBiOAJ$k+Fdnqd@QCOHeW*g>|~pd z6P$5e2$CcrMR!jpBpQa;4j1I-;@I({Do&~>Bg2%pNeS^PihwxIH8r*=P&dG_m6MUk zs7M9S-g!@U%!D?2VYSPq6Zr#Wwt!@#v5xOCD07^k5N`s|c47hx``*K~YGS`4v1-*a zy#LXgXlN?u*j|rYc%^4dU_E+{T`y_MjUd0B<2HbAe&d^1xnd>XV^X%NH{HArZ~yaM zG&Xl~z51~2{rud*b*Uk^93b%aSA8>?dI?ldA}8knGSXwPdDAi~35U?wP=f2OU4^NW zvyl|*PenL_ilW47?V>_>NQEBSe9Z79>9MW?lJPE!B>_)Zu_wL(oQ8}NF7S7MfoYP7nU%O@n*P3LLlQ^N0G1GBc zb~WV-flyhXBD6%46sGK<(@;Q+9>+UT6O`Ck(jX~gH%L;F$*!u&(#M4(AXGZxc$YjX z+Li2fN{A*WE|U8CYNGW@E+`wd4)Gupn@~qh|5@;K@#5(5|6n=Sb#?u>%7tyX$R!Kz z92s2Y<)EW4dX3KS=-;E|!r%X!<%_my^qz~+t$a5YJStY?&Nr0 zihM4PNpi1f_F5JD*M1QYD)*`%3UG*r@c@O8I0?$`lGry&-e(DyB4M2x2|}x@>M3Y- zY>1nRS*h3Sd2b`Z=^2!jRw@B0A)2&0R{}wAu4$mKun4D4on$-ou-YVxiWLC?A!N!U zuvz8!OKemL1j&fySX++bhn#GfF?%+$CrrUV-+3ROeDtZh&(AjybLT9?uAK)_TiXV2 z-*5^Eaqf|}69H_FS))oxp3Q;TZb?p=FSn;ILMl>B$51P*OzZm&UcVFA8%@7M9@qd%Y^OTbgV z{VnPm8?b84atiexY}v9EZH+AoeDs?-;mq-tT^5OfDJBJ?kH}G|-pk>sZZq4_(b|EA zh8i3^xDSU9pFn$u8In3uj-*GN2ib;h&YLIah=6vO!jYATJ*ecN?(efvAeZ1Efp$r8 z3Hj_GL8N%;iiafMN$@FiZnFVKg|G|3f)>G{lEtS2jNcNsU_DzoL`$*jch#Yf?>F7MAe_W3)Tr-lkx}&QZ^A}FR^jTR7fcN(HqPC`nYm##yKrT6! zKv5h|f{>n`L`AI_MaB7~9q~%{L`_XG6~G$gp2O{+yqOB3%cKz>0k z4jn$I`Xk}0nj0D+A+c&|8nA!w0USGef@9FDz^TD#QjRI}7tAGq8OL!8!jvhKQLT1j z%dlk0YOGql4z5}!WKYV#%2i8HR#8mAtS8NCRFL_p)3Z@iTa4u77)+U#jUz|)V9~8*^{6Tnh2t=M*fuY{ zD1|fMSkmWqBdy&Yp^I-t!fL*EN_ub3Df&4mV!E7Lz7T zLR~`#>Kj@(cN&F_0@sxtjg3D}FeC{!-L6b>qazGaNG?tX{K(AXH2fBz%U#gVex430>fb+@ZS9rl>1-vF zk@tx4v@<71JT=YKQhbn*l+5w-q_&!aox69d5E>_!h?{NovDr&9WyWOlhX=k1QHZV zXq|qORjtw5x)wb7#9uMu@N3{}b5q$rily;_IwWysbld1;J>L;O|7D z&So-p+0l_KQL@vhXW#4!TpRk#XsD@%iUY}3b68kRuf1ttWL92n_r40{1crRwooWM2- zpd6y0YgKllUY>psZ}cI8Ui*Mm?Pf{-YLOqk1m>Pz{%EKZ&+9;CCpu&`v;RO{eJzDL z2wuJT%!oR67cv(pr_*^u9GpZ!kU7-r-PsO1$E$}xC{`Vrj|{o;{t;#4>&Ny>6yPM#93s5Y4vULPECTZ+w5wiFzuu>v8RM8{w`Ka6b<3zqbc3 zKDUQ+s)vo^DjBFU(jxKTeYfJ{_n+lBcVf-T8KlD@Oq`gd)&a_(;o}eYl17^G$YXb5_WTUeOh4Q055E9$cCOB@^q z;U5sFv}f7Z$WWMO8hXdg^%s4PPXsMMFF@#e;d*&VBIKC7_3Z&xQX6 z(XNg%U0jBhm#N0ppUl)5YgWy{J@?*-+%u=KXwfo6MJ1q-Af&OSiy-fLl$KXvcu=DN zg5-=A&sfPvFE*@NPrx!jNiu7reGelQviFo5`Y0#n^8HH`1ty$U0!jtlHE!HT|>hI{M?g*RN_fS;fcq8fwRYQ zDR6&J0pCeM;Vs*KR)>IV>Hw^!Bg)AgV}<*8gUT$|JeHrI6trBTpWLv`Mb=#+Ld<2 z%w)-yEi=Z6AxRx*uqoW)FQt3S>AlHqnhe=1Bzx`sB|y%D#(bA9-Vh_0jHPWzLzP zOx4`c61J>*N?H&c9D&iHNrDRbNlubRhxj^bOYia(K7INe4!m^;k3RZoJoMm$2o9e@ zMO6Xol8DIg6yDzh-~8wAcx8o6X1uMHEx(=r;I@XilsW(YZhfirs?SD zv}Y(Gji)!~3ESl9CFMvwL>65FE-xQ^Lp{QG~!*|W!R%PniM zY4c({_2e^9D%>Z3LLilU8aLg%360I2tY0+iGmZG9Fw%Z3LD(TvYP3T7A<$Kiu7A&k6i_3G7VuBsz{;P_Md^zu=z{vh=9k(UK0puVviZyh{? z&wTdF_`^T=DtrS2uwG%72%r<MYo*G=p@e?0x{FA>Q;*u8rlg2P70kE+?N9E-qM*54a% zy>=4W%NF5J|Kbnv%9}4CXYqRc#h?C|z}XYtAzq}F0c2;!;wxYJ7+!t(2k=2J)~`;r zw(i}%Q(PWzP|5wp^RHW*CaHiw_V|7H>Ysle{hjUPDW0gWZ@??BJ&%(|ib$6p_~KU{ zMr0h=FQHhvWEB;ZE|gamQ8{=KzwxQxGZ6aC@B9FZ7boL;|Mq{7Vjy%1e%`W(iY_F} z7M5LCD)TPK&-Ed59v}f{Ul;-Ey+0*@1g8L@G9HPM>HW1JV#lgNVM4|~HZo#M9QK?! zKB0ajU;$mu0<<)?TJ{oY>5kymLWa&&y*_xuZ?x!%zmBJ>f31gS+t1^ALG_ImXOusz za{awEcYJ4o)PJQiw@%jrKxfOmfbjywCed~j4-XQg`UPQZc+7Z@HjbpEq+tueRA)y&8GId9uUU>Y zYu2(&A;>Szqaes&9haf5p$;_-m#}164sPDJm!PB(t<4SCx^)}2ZrjM;Yb>aHN^-in z9jI?xT3RqX>|}1Lt5rsuF@%Li6U>L3kD4C|aLChF{3^psWEMi*CvT3Q|rQ$Ekq%2Q<>|2GKlHb4l5(Sc!fW$p1 zUL`*_xAm8-vYiCBeLVvNZ?#a&Rr&d2dKBx|=3vLJ^=N1;Lw|o8L2(;~27CC7Q8YEx zBQN)Y0iLSrVhj$pvjU?ycm6n9Tk3eP3Oh&XS3BFAaPs&OOi?jvZLMMd)M9+B7rB?t z^1N~a%t{K=T2lg=n`O{wMssT|jvRTFfS?m=s7M_@dX%85m2{Pd18=`hU@9wfA9{OR z3523-Q%HMT1LEWPp5S$Ce84tB<>p=@Xjx&v@)yti9P8Gs!--=j2`0;to*qX4ozMOs zV2}9V!r5Ge5RebBoh2pbuxwc}&Ye3zU|mg6-h#G{atsbMTH4g9sXmIdG0u}|wxx^r zA4PXxt@%`@rbTkjO_S#QIqoi#jiG#%ue5v}!>9=P_;?sN-m_3e69k<^_aP+n%ta$k0NAamAKF{km;#=SP30j)^5bPh0%JM=gE9-Id-aGO4fBOx# z)e}!W^)&9d>ki%*?CT1={PF?YG?<)_gf{Yu_V#uv1KlVsDPp~*2tXge=8Y=}_9IYq z=``G&Q%kd#poiynv(3@r(VQ3LXH>+<1kKmVr&g}W#=6yM zwoLCqrB_CU>dFe#S9hVKWf03&EP^k2N@#E_l9JNNk48v0)hH`2$MRKM(b?z5`HT7N z(@@-X_kJp#f$%o~s#a?+(Dli!1${#8)#Q)f%W}hq@C#eqBVo#aOhJET+0f2TSt)e> z)rF{*B*+NHyG;w%L?boWFS=BZv`{bxLLVQyfOqwK9c0j1V zEFru`xw|#j6pK=6041O}i{ZsNDy!Dp2ai**D)wFo1yPX2$gHicCm@UF{b$fWJcLnq zuYpm;b5z>E_O4Fy5jO?SY73L3fZj@>SVzIt*4cs7luSJR%=5fY3q~n4)cupE^*zVJOTJhh1a{g?qYY(& z6odmDR|3#+0-T@_1S?Y#!KHhAh~RIWpeCF`T$_2Q4ERx)@jg@Jy8@q5?0q?w3fH4- zH*WTa0JoO3J>)Cw=j_f8@bzW8ND(9_+htCYSG-Xz;YvA?#aKXiVseCFdjqc@L?gjr zMrw-rTedVebNn;#@+-gOvqsr3*%lH<7IN)!SJ8&zd&;;Z zC8Vf07iATB1e1l9#VIT_0@YR3P=0K=D`>NhZBXiJKtod82cdwrR6nfC-BmIo#8lhwiCrh@^XBPWcUpO^v`7L=8gnWCZC<0(n87Md$Og!6|A#KrT+5a36C zMXWJS=VLvHK4F058wEwf5ybL2cCQ8HF!)0p_kx)%8Ouk zxDzq4q1e591IkJ-vOWD+yg0@7&S(zxQbFwNA7Y>MP{}GcSDst;?cyBqL1$M7db(sYDeO@F&xS-e)eTGeUgLeI5x1OS|mR&@T{W4;oaz5lRlSvS71bID3cD|#L; zB3rb3d>97>_?6l+d%VBQ_OTV!m-o2Rp?jJ%d0rGu@&i*^%SkfEnakj(i;V1zHxH1h3aAAj zEFv72^71KIo6*(XZXrw*PDy#O6;7qKy^8{w0MTC?8!0H`qxiiW7jiEd2&R6Crj~Ys z(`|V5^|#R0LCu{Cu9k$y$mo3t62mCi!(&{CPmG3(LQC3sL_{c((~~H?6KsQ2L{x-z zaz#}gpA`h940*JJO^8?ksvBKcJhN{de+EOMH_pc}vYKR%DwUV95Wckd*atS6|cL7-~_fAq(n z!gJ640Dtk9Um;-f#&3M`6Hv^@jEqGnDX!!_DhR3)2+WocDD>gj(X#}weHa>$3zX{P zW9|o*K9eAUoDq@XL71R0)zYrQ{)7a{zfxh26x5vKM4>4FH8n9#5IPNCA~fwZ9~&7n zUaej70^Qmmqn-Xr6{vK4UL5Objx8lW@UP5$KB-X520Z$@UZP*znJ%~2etyya^K0PVy1AK!B zBr1`bya<`8IhLEhlXRkaR9Rkzb?a8~Sc|Br7$`NQGIDvb7I)ooCk5m(3T|)qM=u)c zYOr+aQf%40mEdTQ%2Xs3noiQs2%dQ2aqQT!i*@v&P#&ccaE7!Oj7J~+7~23g^!ITxx3dZ)%Guzl+eL`B4K^7~-Y z?TZU%^GMSpRO$$rIc5rr*3UW9&`^iP*=e>y5fBj0wzvpFE3jnAQnQfCzj^nr9mvUE zO}dl}XTO#BY|qr==xk;x_bk51E1~A8rs(Y4ejXf--bvq@-I0s-ogr z@)&Q74ig~e3WO6h`zMg5128tMSjAdp@kCKU4NjfN!^9ZDacC5_Y}-MQn~Q087-Y9< zXlg+ofp2?zuUTxh5omn0A4``ca}Gx$IVp^a!0Q<7??Rxj2Z6lY5qQqT81FyHf8&^( z;XGlVdw2$8jC36m>W|@x0p72lW4ap8J^LyOi_5If5|X0LpSZfZjkHtB?_Ah_`)vfB z?O2|(#5VI4<(IL4e5}t#N4lu^p2VS}FPVa%tYF>UBjh)VgFZuAN}zJ(ftrd_hzOd& zI?}Bdd8CwrlF|}9_xvwxW$Ng`V;C9b9QFw0Tvc37@&k5n1Qmu=OLI`1cM)V=mast) zFG`Bpr(NWk@I`BDFM7KB*dppr6ew|sK@c+=g~hjh;2JJAvn|< zdBsQAw|Qvos-Z0Mq$1IdwHtP#gJXOC;(7D=SBR!)f>9~C>Psml*ITX%Urj!-#accW z09BE>dW;}cI}IKAL=Y;;A%W_MH+{K4QGTQ`PDB#Cz^>gyLQMkL0UQFT(po7UIA8+4 z)WF$J2T)1CJH>hahg0MdpruJYa~71VX$}C@@n5gVPj=pe|76XW@Axm;q$`&Hh!JpT zZT@5Sod4I#+`5aFb-dFKz9>+)=*63pYj%1G#MtZQ?+n<^qGtY|;j8Ad1iToMleSlf zXipa_?2Y`$6yio{KeeNhY|`Hc1qFF{>gi`}m+@0SdkR1M=}*Z_J8|UL5rWf6XxFm* z%>x6K*IEAJW9F;b*WXQWG-4K96EL3Bysiy(_0($85{?}^gtO;Pp|h)nU@DB-e=q^wD6jW~59>5B zK5W)33Bl2^VNA^oAv9F+1Qh@t1fwnZ$&a2k*MT?Rcpcpx9RwRu1dkN{> z2-4cBWocgLA%5z^L+=R`1C>tDpF)qkaD0sS>QIMUJWIJn3=))$jSj=#&l@R;$pk<# z@VDLG!{pgi@Mqk-5BuJOpmxg5x$ZU~D&D4PuMMKIZck5Y^C<>M=%CR0QO0na!=$IpKL3_)Eh4jnjxH(q_6ib)<` zd-YYk@x~h#X+W>%&!5NPLr3uJv(H;>)uV@w?x1r!zLQvrAdCr_QQLP22>0dEUVpE{23 zeCJ>A)?2T!K5z56XN_KZy1RH@1umRFXPfC1R9&lW=g*u#e%^WH<)7!cw4%MUo$oIZ z*bSqqx|G1K1a6)e;P1zIpuG?tW~J=tYBSKU{+0h`TU#p?u`Z*hriK=CS&#yvo$%As zlL#fymwSrlUsyyWK}Qhl)JGuZhm1vOxM}xxg3b&K4RIVvx5-Hf*s^5^aX#hqIZXmr2rzAqYHe#laY>OyG0={Axipkl zl%lk(oC;twm9Al%D}fYFIwEM1;K0MubSu_q^o*lzL(Z#T)B%HX1SWD{`r4t1iV zL;k*AoTr`yL-hy^^CN&9WuHtSDw6YwAbp^J&^GhQZ9(yS<>P9~5^FC^VH>P@=yj6c zO^GjQlG;J6LB(svLkgHyA=F}JPx3}>ZJlk%o8~{o;7v?PC7o4sE)G)J>cBU@`44#M zmrq-?Agv(D8Y(3|IXM-7{a1g5Z~WhHm}2Hho-;T!$$1;jG55DV^C5;0C-B{{W;r&k zUuzq>A|hR+jd84`;wGQ#jazmgDLI)+rU8}}Oe-gA z*KMP+`#C)R=o6Njb99h%e#*mKC(=?fkiIC(+Un!4tWbWeLm;|``q9wbisdWUA~H4# zVX+}tvvv)~XNBXM;Xy^815L4DET2+?J?P*t_Tmkdc`cz%5jb%yf$|^F!)HOG0t>ft zf~BWt+j&lWPzf(1$!jPYWN%K?UTQ=X4rGYVr3!*QLuNh$?RE_g)pDLEhNxL9jh}^R zA{v#DeD`?^Jad8iT(zc`m;9Y)z5iBMY3oA2U9H@}wYqY?L&QS3G4DU;jQPvL&0XL} zmW9CDwbRVy!qeZW^8)w1(L&O5xih)W67Y;4Mu*1CDklc6jTK?xVHDyn);R#m;-p;b+H|Akbw3JSx%0#)B$8)& zlL1FT!N~=@)c20AOP)mrJ~m1q#qS(YB|k_Xv$nnY<{Rkh>b7)}u8>d*E-ybQ{=gp!g{GX3?~wsjZ2^u<5I?wvdE?QcCtK-Egnrc5;B`0`gii=4$vaQEFGLBYi; z3ei5Z)D;&i{b&=`uGxt2FeeZExpQY7|5vtMOQLekndBJBvLYZO3#dlKlK?o=|5CLa16r_Lqw(Um8&pz|4fmm6wZ@cYQ zq!JVe+~ybLqp4AW#J!QTGzWnM=|BDH&&{eeK`@@VC<7~(t;2d?^GU@i{5eLa?7L0PlP z%1SMUqjp+rFGMcuTwmA7bE{C>P|5Fyk(*nH=B6GfJ!XAF6#?WW09e2;Lz2TNhba0r;MMslmKHGQOK8`gkRFN`7rKV@tJk83=filFEmnoev zm2A>rc|{R|Tz=+0;_c%?Lv1fg3R+oDrC^<4f6JENgVLhYn5M!gi{+`)xx`hys3Kpu z=iUdfhyAs7-9{?B0cfgM^a3i9>~gu@gt-E-dGmTyloj%`(sss@29IGQ&)>dn50X=} zEhO8;3x#Z3AXctefvhEIsHmu<5>>&z^G8W>JuaT7LNzkYHY~!DCF!WHF2ec^Yq4+d zoycCYnSIc~Hl(4mZxENLv?vAWU3cyy&kBZ*hx$%nlw)z7#o;zrD`Ygr@XT*S3`bT< z9}au~8Ay+P{=kJ=m3G`o>$I4K>{tnMIm3%c1a=)U=>)>(ulD=g!}(sv{N?@Eyyv)l z&V0puhy1l8S8@BqklES%F9D$M7AjYK-kf8ha;5X<9t#x%81o%ELD$cBT%}y8F4uZ2 zRIYUX+~d9F@^_by_n-S8eOQg=c|Tv#ue0Y}&#_Rs()sT>3~=&w_T0;#%@VG@wf>bt zsHIhB-o0b_*SY*kzwwX#F8z#CmUEauhs@ZU2Y=z0I)|4LplFpuexbSxZ$Ut%=kh(j zbB_&U3pM?(eeECdKmYPC@zIYxjEx)C8)Mh`**Qy*lCcW0@#*jjjD(kOh%KutG*M$+ zE175o@-7wP(xn1h8f|Oqgz{N8P+*@scL4|AI%pP9McWW)C?v>Gn#6XV*VjL6%d*2G z3S2(MI{P3tI-d8Q#?wFl1;$3EZ1cv?e)X;vIxuasY8Cia@Fw>Xl2oFDh6J8vH*-M%i_=1s619TRC*=Kum7DGLI2BXZYZ zoqYZM5D_UwVa8I6#+d>^y7E(8QpG$Kp?R4Sq+II3AujY15SCX~p{=va0G9A@Xc+s0 z3W+vQjSLUjh84N*`0@E>p=Ns&R9rru(nb_dR1qQi_?>0TqT(Q5RDnzFd$@41lxuSspeVQ9<%PvXw#!<(%?0)^Uc7+(qDyG&Xh&3JI5IOA+0y*EbEnvU zY-3+9X=M!IkzwfR?J=L(NrEYbtQuk;M8!l?X8T$_1wdV{a08$bR2(D2qd7*g*7vfm zO3sTGR4@ILl47fp^Av5WTep5SzWm#t#pl2H38ZJl;!D5vMXcYn3R`!q$LGKB1QpCQ zg2@5WVLyj(9D8rs%CT$0-+k@RNV8qI??Ht{@5s@Mr!h6(g>A`fLQWsZz@~;Mo%&xv*(OA&F&j=ioUtN za*dWynGN`#wN*uQc#~<&YS8}vAv{lh76OdUm9xc|+phpNX<5|TNqp+maWVrBGApNu z(dl)@tQx_tXx@90f};jCwY8=-OS`w_Wjo&Y!1onL^j*0KmMwI-LRs(>KHmvZr90`F zvz7w&$9!d>=Q>ZGzud^RR^fSybJvCLeFJ6TN`1KHLuwLP)8%)+T4w2PE)C3m?^qtM zuPpT3>n&oo0)9>%dFVgiJIa+q-&&T|GN9u7N!v|~k2l6GK`kLJo+E%D5MaygnhRv6 ziqCiG@Ch>HD1=bR1_uS3Us7vJ8=oa>g;p+<&XDt!U{zLEJy-Ws`d%$DZrZp8%a$+2 zxeMp;t$+Pjy!y)PICcC4L8X=<3E0d(QkDaOD^CMwlT={U2F(Zw6j@nSF99g|9%=)H zdvqM3;SuCBn|JR=SMxAVoH}K>-j5&6#lZvTaqe^#8NNE#AIS-61R)Uw$$5DGxtGvX-$f1? zN};(4tJh`XVr~I}&?KUx6DjnRch15U~WLQ3Ryg05&o<%Kn<+*mxW7Q4C8f z92(J~+B7yk#x{;3BqY@M<0yfh6nq;~rD7#G9Cwd90E73GG|gP8_BrpZ{+2wjSfje%lpABieLQCvU-_-y?W9ykwd9O6^m3rcH_p49GhtK;|(HT zj*W{WKwD(@5a1392{90*p2^P1L1tDK+v|oaB-{W-aIlwIf|SnEJuX^T%veu?uVB(` z7=gtILIT2#c0hp{NF(1Swrz{cOK1aRT!Fr2RqGagg&?n}9jvDDDJGdEqSCy<12lYR_$V z?8Ww-8>sO0vkrlH@WBTytW;!JgpH*vz)Gok%if!C}A!<&R&U()TM}w zh{UQDOOcm<8m=H;td=!6Hk|hvU|)`NT>Whmn+Qa#TObr3a%xo?RVmKAw}&vur1_`2 z-BhY3g3!^{OXX*h^TCa@j2MeRpftim!;=V&NI*hjswq*~*((qn7>&Bx4h#)Yf#fp; zZtH4`P~X^q6DQB3zOEaAzDg>=Iq0LM_z{9tZPpw&ca8wRU@A z80HwJAV0qtMfs&{&lG(8sDzQ;~4ow4#`_=!xI@t>3}ky|*JYBof6Xm26ih707Xd-zwXT^uPmm z*-m|bzi@o_+dpQ1Zb5TL2XgZ-kza-3&b#(efgu1_H@;&9eGg?^bGbGUN&zN8<}o5Il+2Siwfjk!h^Z=| zvKW6BM@MNH%uoUOdU$Q>aPIZB8`I-*&^^pfTmeEPK z0)RV9?HWb#Ci!D(sa)17@n``beJ_hpRCEOE69_l2m&MA@R~8grX(S|Nz@ZC$*8PpP z#F#}J{A|LSMOF_j$BIrw6MVFD7!PJ&j%!RN2y&E9Tt2*$c;bmiQCO7A{_@7wt?M~9 z+Kd)Ja2A2SfguB<0+Y(Eo|c}0#-=6$%n%B^RYr@dRC00(8tUtD^S+xAAD2Mz5@8!? z3xCtaZuyNByK0n09M-dv_6GKQ( zi^uv6>k%ClkIY5OY%XX6$}RhDq7o3xv7Nzf`}dK?+j!mq^SDV!{Gixz=NH-fcZ@_YbURgJ_Q7$PZna!EOzFTiIR{;U$=$Kfm`_g60a1-yV z?=*)LhgUn&*RNlO^o(S9`vwxEr?L&9yk9hS?%wEt^nfrb7~$yd9>o0*+{3;|pj;io z&h1;UY}sm?Gm922C$McJ;HyO_`_4^(EB6$EVv85+}Gq$$F)&08kJ=YoYNh)N$q2gf5ZS-R7?W6sDoSZ|~z%PQ@O z9pnjHHgBh*mB#z0AS67R;C37@z4{8r0;s8~LqT3Cd0`}*;26RpB15o&3SLcBF`ApI zI1aK_j$_He7s3f#4Gr#=4G@t^aVvcMr4@XOPK}izASA%vZ!puUs5vJkPcKT7Erl zGBBHv1iiBQTK%j~tYMc=zEYY0xw`qh&$V*>*DeHZRA$?JrQ=4*jb6V{x#GPSZsxD2 zkZ$Mp&-;(}m$`j^g`cmv2qrF6uJr7ym08QIEL_4EnwYAu=9*camwrKK95`P?J66nW1*x1zJB8?`kxh);|} zPk#eneenl>{8<9B$B?xo5uIJFhzJkI77CrR@>=sPtE+9IkZ#A3qbDd#2|>Lb7a&=5 zWn~%}Reo&Nmkky8)((Fu-~yf+11+yR?bZ@M%zsk?S4-j}VA2OR-%cx>ld* z&=nd^PmED;s-Kj!K+l(NoajW>P`O$d5b@^oY*~H^69oODR?&c#J!N@R=%?wKams~h z_R(?*^8ws<@0|ouF$6)Oq>oSnP>v^+g*)!Liy)K$g7+DrqR`OPOaQqB**VL2Zn&MJ z+A1v4?fdUQTwFY9)yb5kfa*y}DOkN`t;KYdWm7Rzwb5(qw(W3*Qf?4HDg~)RIC=U` z;pUt75=hH!LA2+Gn!0i6R5O@96gQx+8D%j*YFaOpgb9Xo2i`-)1W zNF~7`zU(WlLIb_M9XNmXg83DDdIe&bv|3bJWZ}>5yz^G_v0!T_Rc2C&`0%Vn^n;aa z2ch~zA{6tIE$$-0;T@`E}kJFql&x>I)4>_I>nZ86mZ#V3WNRqyt%9_TIM0M z<3y1Ul1%J@A)JKl!J4WnG_|yF5S(yP`Xff^2;}!ni}w`$taGk(Xnsjh&G%0X&$-9D z&(Jsa?fdTa{$pV<=$tcuS?JoUm8)I5&~vZ9EZm-j%iMmu((x;O$w%>*E1vuQW1*t^ z>dtfTKKB|a9`C=;mBw}MIkWGzimlhVXD>_>bIMh~??U&P|2Jn2Tj4pg0!8y%7DV0_ z^0V_L2qn5hShx$(k&zUlWHOw>`kj9{*A=TWi0#t+lLG38j*e~|K6275N7^i;)sdni zC*Zsork1;d0;NofQSmx5YsoR0_R|Mu;h@RhH80T~&oICt(mE?&GuU@^?=yir(K zK_I53cMk#@r+orsDzbhEAe$AGb5$Tz79H^xS+r!O)c{!J4mQBoTXBuG0wW(cUovf3 ze`V2~;HxM62yVySLs&`x@`+D8VoP0X*RQfPcyV!&*uG=4Eg!E~v5dgP4`n5%5R>SI zH5<|hAYZ}gSP$;H=MKDi;FlCyXAmCaiO+uS9>gX2;O&FY;O@KkVZ+)jCV;f@rnIyc z&pr1N>M6M8+p3)S{rw~8?diwB;4p#8sPR^3IdF=gi1n7Ra4W5&!nMfaqTTL}6e z#bEbM+gWD;K)FQ3+4Gy4TJXptpF$k#FYqfmQnn*4$13boLSnMfp%fm0hFkaFNzj#m z=qM-ksIHgw@s2z1Lu_=c(cb{Uv)s#8tXOM4p-~ZX8<`+Iv>-ex0=M73hrrNnh?82hVWR4ptf69mL=s`(o4N}rms3Z+w!-kdEvS}lqkxW1r!tbVV;NVHt z*VE!gDjloBtjT)b-#1`O@f};PJxgJe)p#kvt(6DeUtdySL)$XI?~UaSNa8jhdPYT)LD;Kzb3?m1XRQ zLiBdGA~`V%t5@f6?AZR{evVT=LV^Q0FZ@W;QljLtLq0%7$%7zta*7Hbd5z&5Px**C zyk>OBivW5Ai?g#480ZkoBb)QAWJguk04?r;-MgKwyB07 zGL^kHO2B&7`XewX9ExZlHeZviE+9HK4d*WwpqR>xAjrO( zZ$nE{8}cuea4vFQvi@TPq2b~FShrz0O3P0Zbe`k1oJNqp@Yf^(eUmNIkB-alS#6r3 z;^9voH%%pV8V!w=RIDzcjpvD%dyq#e;X_c6QWsC7tGgL_`MKtA-=nZnW8^_p^y(TL zEK11Tcil!18X^Wj04r;{XyeLQ?`q`(Swc;VFl&RO-HBPrZ%P`ImI`Kz1m)F>?&D3Z zxPyZ|NTIFRpcDp1AdWzZjEF`+5VaTfe06mtH6+CemB5tdFMx1$5bFGP<-?g$&fhDQ zh3;>FK(F&03jqb4v2Y(PbnSo5a&2RNeZ~5Ep2Im|fn$NL)KBk>)8%`;b59kHzl!F- zY?(W*?>U#{J@wL@nNw!3n^oxEf9-qALcd*KnWc7n$NA;hBb~PCP<3qcg&%<%wOXY- zjERmU^AgkJk7^SCDQ2awzv6`IvzG3>(Jr6R11As_oj}GEX2Hkv^Dm)OmQW9G&S@Wn zg+^VrP%20|sPX&Qa#CbOC_!d7L0$yzxP3oXu3Tkc<=D{^c!%7Ri&q= zT9y*C3Pf*bK{#VZwW z@9*oxzFT&2JeQ%VwT{4Soc!HQAsm7@g0s=lag>ymTQKd=&~Rif%Hp%UQC41QN=;L9 z8L=6G`AS=6bKX0$yl`5=&-z^n!>Wrc8`nBh`CO!?rkj7W z`nR;S%wl`0i?ji3XlN8o4b3=z{vwr!UeaU`6^Ie`4X8}zn$=c5(^7=wP9X4ER9wRG zn&fZ&(B?8(5(Qqh`9sU)#mZ2#Y?9ukNeo+90avkslubJH$1b;cAtS4a%HI>$&u zMcBH1D`_!?V5N=FK9G`I-4#hJ=L@ z7|Ehe(9bpu4-N48aVls-NJ);u`t{3M7tROv-!MUFFzX>#5i?v7hze^c$&QDo{BPMW zGncJ-Y%7~%OYDIGai}b7!T{&WxO)V?0U%iKA?+$TPYh03{YmETrB9x0+Xe2J{mWBaoUBMxN=9n{L`h1u~WGna22p zH|e+uh2;)f-%|?a41d!`LB(-ah^=wBr^p}1$4CR@3De{eq-*bh z5K9yi8R5b`cMF8N_(*O3(sI1yi74Z})Nw8418qzaCD|@XG9w8sEpI9Nh6Yrz==@mG zg@xY@FwP@P=PY zS*R`62bbSpsmui{zglMNJzrVq+W(s6+QbAOtx|9jd&0X!c7Rk@ZioV~^Y zpR?C5JpK!k&UKb|K`09!@GBsc@0}gMeg-Teqe9K4(Xyv3s^klk+BiVwNai;+BVaSe`$~Xn1C5xgR#T+JPEwF4k2BlD z-}Rf)4eEQfMV3Hi1d`92GW_ToKR>zLcoHl`5|G5;yWjm58Gi$A+OvaoN?;ub_6XeU zUhJ#F+(Ncz4EyickA%25eEEyNPsSa9pa1k#f-pDVPhEmUVKJiZNnCA=pg90cx z75sYA!Z<2)p2o&o7Hy7?g`3eXVJZvZ1ba#cshEehip4vbO9ao851T?kiC%SxJY@x) z1@`h4w5SH;%M#MMM(|(D&7vDwyT`{^Pu5w>b-g_u1b-cDI{`NDp=?zBgZ&0FmBB^e zO-h9TXh&Bs4jn#1VLwX6C!PS&#cK&J6`zsy)D)EPRfGdwXYo`?53*otgPBsl%1uKt zXhmlV*Ck7w?%mfTAR3R*@IdP$Ums-y3bK$`SxYjg5QI=*hY+wt@_w1@qbRt-6^5zT z=r$}=t{3Z}_?l9nwCu0@hq%I!nU%wS@i8|RrNWfeblLKiaD|4UwXKb9=to0iGnTJd zja94HAitolyO$50Yb1z}}^3?SF(uQz1G-kTyUX@E`yPM_pYf0jZYKDSyE+;Ju@wlGw(0&KEzt^vgHR!m1RW zB7QCThet&48kf;oa8M8dS0I99Df1(Jac+vvXE;{`rezq?>+Ejm_i!!}gXWX+bR94q6zQSA^1QvaKrjeGBi2b+SisL5^6J!_ zJp8dc@Hcbg>kXfQ>^cyZPyjzuTR%W8P;h$$5ci>7%jo)Di9hDRU255X?^7)Ri~2ks+= zX+TYNtAV<4DvgWMW3h5Y3R;_L%-UX%UryQ{!pb#UaqRR(0`(T-Q3?-MSJMd3X@?#y zlp1+pbaV*Tty_w+(sNYAirFl+X9}($AGTHdX0(b$rJe24{0-(@RKVw;Ao3AEjV*Z! z`MZ=e7nL&2b+>z%-zn>vR$jDX!a+5?tB`bHdbI!F@M!rLe5jZ?BU`XBZTXKA%q;ZFZg(HBP zm3GfpC=7@Bm^qsv)M0urW_i7hzgk%sWH>FI@0k5Ne|i5EbC3TnbIaAnVZpLMch3E3 z_8D`ZWkBn4nF~PQ4@R$8E?W&$X04wp&b71G&%S@}VavzYS)BR$E|{1-W|!Y>uJHY@ zfKYyvf26{h2y7{~U3@IHcb;d<<`P0YXOe%kdBlUtqJ*-nI4v!$IC|_P!CMl4)25|K zloS_IQ1;XPK%OTHM;F28@JKV(u3C$2+qYUkb8RmA_~V}> zC{4kkLq`d$C=jQmrOS0dKH8%cuA@{=2aOrC`ed%s_yy>uDR2~q#sLi)Pqp8GBim*m zlwBYYIve*=OY-_oR@QNXK84q*t*b(PLp{n0bKyyVo12%5gKxiWDe(sT2N55ggqn(G zJo)3Nv3AX7JoeaU*!~=R9V)+NoXR z%3Up234tOl^U8WEE2=^hsSQ%>m0-lIUTQOWtpu9BH%k`>+4!mu2VXVbB>83LB@3u>RQTh@@hR3j9 zr%_Z;f-|SjBQYu2Kz(FnocTt7`&-|JivTri@e;FmEn1X?6UR@Xva;F~E2W9m(z`My z6&*v2Oi3eyrLa{^D`0Uc1CrP{PAvd2cUdE=ghkr(t-Mpp3jEoPCv(osQJx7}8ZB5)+~@ zIy_)*3L!yC_@EUBfikv<^GspI#Q2oSO*_^_`dW@x|BQ~1PfUkmpnuX*(T1*`9x5>Y1oh#Zi*C*}`JK9{fV8r15!kj%nZ8z_vAG?;c>0%^ znG|n| z_1E7ZIHW@EF<~HZ&6=esFF%i(+ENo(%7^b_eF6jh`O$HIGX75_YAIOB3uGnr^dZpn znlu+AU*a}j)?02G9JQy za{c<$*pF)YtE^Vqxve1Y0+<8+6vjhCP_AdSUqS2TA8LNFyjHOz z6>`sLPau>0flv7}D!Ksi z0}dWKY)i3z{y~zx>?=R>2|ao03>Bz2DiQUpo7@<@@zP5#qNKFQmhlIA-E3YEPM$oE zmtTI7zmF3z3{vh0&^6=8;Zrz#gye1w|kc%Jz12R6-vEx+L_Y#BBmjXlihn78vyl?SE8Z;%_cVeXyEYS~-HFXxH*(BJ@EcEj0_`2` z2qz%_$U_ejY!TiG9{5gHa?8;PEO{ud}Kt;C9z>(N->j)vws+;#g-R90QW z|Ni>d@!Ye|VaLv`=DKt9zMZU#2U3!AEXlzgcizUnNFZH=csb(Z6WAJj(k++o|5oy-&drj(f_lw&F@vwPGZJ>9bK4x+Wa5o^~i zvnU5Owaw`09OigM;Z`a)Pkj1Oj@2sC{3zSpK^#K`5aXzn-BfZB!@jFJz0`L}<|(kGugbpe^Y$Hw(r zaQ6IJQy!xt!U#f_6NFwwEkUR!X~K^nG}NV}9g1?|0BU0%9CRs?rqp@}YYlN|CkR3b z%x8QtF-puu{-)>~+NU!upMA}FUNb$ZC?n+GRH_wMG%70GK&Y1Gy@}VH;?TzRln->J z1gDsgn9l?mm^5u|8d6c?K4{TI5R+90sk3Y{n7T~@;g61>*2V$HcfmRIyNWY${drB^D?;SIVJ)iGbQ%iNm`SZ}1B(&l1o%n_D<5N$*mYvcqaWk+=~L+H>M|c%E!`;`mH_AA zpmwki+tQo-uoPV&G?WaU{jXih+Lf>6LxKBH3M=`s%8I2O#PahTr|^?+ot7kLC_txd z2d&a}PFlWk?Ho;gq*lH|Wwu*f*gLUgR z;jza)g_~}=g}^n5^w!V*3?wMH1AA`16?fnB0KrO{#nN27Y%T7*_W^9!vJ=@W*Pw%- zbBxWo>;8}6j{6?Kwq1MRiikxML2%!|D3&Z+jhv+`4G?RyoyI02BHBVpjq^fTZneor z7J6+WQeO-XjIeKf%mS)Vf?6FAc>C#-Pg!5++VkfwTH=H=r_b4vt@5cKJ#riuFI+-p zd6gZC0HDxM|Ni|S6MWb5s76Dbp5cq|F>M1I^d{tamU^RsQn z<$V-YLi5`cWZp+|SpB6#*i41ez+T_QWYU1Ni7OyF7mO}cbpM5p535)``A=*?mMsG#awwWD>T@zI#e4;EYe^y&ax0J}gVrASot>TJx#GQQz1l$GAPWxv$+D^CJMAnN zIFz-nzh8mJ-RA47B}rLMHN;x}Q-F8%v-qzf4NOz0>#nmjJ6l9@;_u@ecWtiFu5o>H7?qC-q^B+BdB8va%Qx{a|Mag= z&UjxREuSXih38+w@BH@fp|P>qme}DPz&>%IsIV0O^nd>a6=hZYt<}ct)X6jW)35$H zjvhXaww4Y{AL}9*{?50*hkyN-Z{eW)Oh*OwIIaU@_`~1-6TJ57+o-K>Ku3EIY1aea z`sR1>SO4qpEqjbIY55cU?AoyxKmYkJke6G8^0I1N$}J$+y%k%w>_UEC0cmXp&CMMI zjEQ*oqaU@p2!K{r)bQMVeEhLbA~89YedcL9_%G!ZQt(gW{`(%X^A=^W{cgF9xbQg7 z6}VQ`tBgh2=<4jXO)-D{SAS2yk%ZN&Ho_GaL69|w-MjZ;-z~QxE+!6Hi*l&!4YF-B z1Z@-O?i%3S^u!|{eH1ZNmeNx)?LNZ;gQVj@Q;y`1Eg$2-L1mHZF~vnRrA<*+tU)jfhNo6h+fBc946U`01_}piI2jiojR3-)x z91u+~?1hN%M7;gxF|1j&on!TFY}vRMUw;JCOrD!nxbi}1m& zJ?pS(>vF7GorS@nb~LqCv5yDMr&ewem+}iZj)_Q3&LRK=e7zJlYJy|eXLC}%nC%4R z=gyp`lAVj5?g1*lL7cl22y{hJ2|rC3vQ3?O<4WKvO{F@ILonPWuS zl47iwr}Ckefl#2--#5UXrBuLDX0-gS3`ttmQnU-TRV!dVKK$NOZk0S&VAiahI>-yy zUp}M<(Sc-w4yl}Og@w}dFJrpvDIa)ak{Fh=Ilyg$lxu6jAgt0P4C4x?P?SvOYZ zGUETp@}KqG8!DoY52=_HkFQrc)Kv@imrk0e%>8Nh9&_&{CiMO?7X&W!Tseg6_t~?5 z_5Sl$O!U7{S?Ia*6=SKq&aPz}ob?R8<(#vnRer5ha_{(r#zjMMGA%_Tf7f*and1}F zoRa}$KI8)erDR~u&22b+`T|nZ(@pCZ7|Oepk7|Wx>1;z!PZxz`kNF2SHPw=_7ZRW} zsv+bd{@8odZfxDU1zWdm#pZ3BvFD~+aM#`Uv3@?NBN(xbAfch=N2->~A6b&3Vqg~i#KW<4z|DnM*pJp2NE5girDdwF7L zqz_?Xfd~ll;kb;!o4ii|e~NV!O^HWpyyQk80is;%8aF?GUjyFGMg)#7J4(y<0<}t) zsf`n|9Lb`ke$bp6AOPtb=rfKS#D1LiP@F^oTlNp{VU};wf&lKUADt%wu(NrCG$DcH zEi|l+9tzz>0p>S@p@D7+(H`sfhadR}!Ilp;Y*=nq*XpWry!P6w$jMoXJMX;50@O!G z#UMBLlI@ay^pVHV(VHsjVb}H)e2|hq2&13_ym;5K}yd!<@vzSFwb+`J46EtU8ameN-QBd&?*S0 zkI|0iq0Z5!KKU0{*VLoFp^eH%oaH{RscyjmDjr9UoMQW$aq{Fj@{@Qx^2n`t;kiR- zs8a}_A{6G=;Kx6H6)(Sh7}Jvh1b9i9m>x!LO*NH@KD>3{B);=+Kd^`jdv3ZJ-}~-U zXlr(}U)`wVJboed%Ztt$!Nc+tM`{PsyIKKm@s2sL)9#8PS2O67eP*z@z zHiGrsyh|7zA4Y&rfF-K9aQ+mO9Z5^%)m63pP4j-7bQX+F8&{#SG8fggCGaK?m4X@^ z;>UUJ?5$DSasNQ_O)|_Gwoz8_fFNIjbNL1%1X-6-q~Z%5df7BlSh>>kW{)Ae2nYE0{T5p=J z4t+n*A;vT7=QP`I@4VWdcgJ6o%nq9eI{3Z)KF`6EoICNfckZpH(9d?C&pnC7S;_eHXCA^|{q6sU|NV`>Mp&c^AN$xx&27Lh$RAsGY{LHAZy~t2 z3Afy`6Z;5cCntKbam#WFyEH6Yk#4Ck1wxAo3ONqG9Jm=M38}L^@9gS5#aA> zf~&Qq*~TX{#DyK(x0?l2abY_@kJl}$b-nr%0hj8 z0}dWOWVD)^l8RlscAJ|+Nogqx3k#5*#=cv&l>NH{MTLb_i1N(pzBGF|_T91{(UB2& z`_0!0j%sX&`07>bd8|W0UOpA7Mgu3e-g+yxZQjIj*=>MRmii?GqyiLruB^!79Reka zt*h)zvgkK7)?)u1w{n=K2t?yaM*(Ohcot|-KzjLL-gEE0rZ^~|xZ0!S00Pb%Hf+S% z3#XC2DhsX{0eU~&efL8gTQ7pT2CQAZ)>aEPZ`{JU8D&e-^$iW|cZJ@WK}Kcg)TG#;jU=bN5F%0q!orK zS^z?e6 zty7z-Mo?bf41d26@)4N@XHZsJgkUOl%Lqcl2;3&8M=c9lNRR@x`y0=dQma)EaV87G z&$dkwlPGPc0I3p2OtEfb1n#;vG&C5UT^$^YJFskdHtGo&SFhU4u~-9t-w5<}jbQ1L zRcy};6^k0qHR2SnF?{u_zfT(XHw*ceOHxF$s94{aF;r8;GLsUW|@VPI2k~l}1 z&!%mYV`XI?#zuQN7l1X(*Wu$IzaKZ6}$*exh02(9EHfSH;ak6k;qA+O*#fw2P0 z6NLKAaK8KV)q~0>$Htd{nEcT{DA2~ulXG*5b5Wqw*DsLso8J?+iA`$-%a>z6LnTw9 zRN!-h{9Rbfo67vq_zW>vx4CiLb?2>!kBBt>F5Y{+0957LuGDC;QYJ(>&=h|L1XUd2 zsY=WAaIM8TSH48Ds5(J$RmAytKRrx;?PZkTi9jXT`Gq=*RHG{0Xi?qOrumNlF8}Y8 zS)ljpDF0FSy0Pcz+FwsSZF=*M)knviIq1B~`o=k~e>$0my$YCk3owhZYu9A}zal`K zAe*DG#k8z6v&R4rE!~U~OewruD4B5-Kg&AlLqR!C08xsgM~>j9KYtc~{6~L+uYK+7 z7$P{4?~=531j8xD!?S=vZK9&pkbITn4zHZBd?hv z&}p|7l`)XxU85hqjbR7Van~ z5*m|c`4FIxMN_~~sfS0#DfBd6JgLe+$uNPeo9&N5R9r0jdpa;li6uBwWuiHLdYa0#^cn<6DTE^IPmtHX2q$hswC(Kf{(gf-#RnNv7$=m5HUx=~P6Xo35C`+6#Fczy38U=DtXXlWUDXc}p+brxcr`M!&gv=gAMI zv48(f2nmr3B6*s70HYk|>gpO>88~q84gAwL{|%)Td8{wz9~DtI6%ARdJ=9(j%ozJc zcuJU1^IfYa?nx&^n-p|qPm{v#7!j#Rj49-vTydyGP)m^#s@0S+(u~}89C6^t0<}rS z`A(}~R6b|O%e@pb?#8gvHNsa}bu@5#OU6ScZvm_=_bR`XRYl8oJjXc}D!P-jDP1c@ zW_Nz)H-}s5c(;gN*k-eOymRV*m;Wx8ivyk<(hyj>z9Rb8WSV=u-p_Yjy*Lxt-d(=; zmCM}vJ6FuUoBx=-w=;jPrM&-oeRsL&9{g;-aDHnJzQ;;yTwEtmSm-zX<4382a+{I= zwt%5L*uBUL$XDU#?MdOH0LT$!z>x?GOC~r8hc^Yu_;?3_TOXBAfzwGe*4Lx6rJD?m znmIzqOFYrr-GR>5b_x|28RZPdN3}slRzEV(4Am8_ zsI6+n*Z$$J@CX0ntN7io{270H6ZJJ6tedZ8M|%GGSMbe$`8NXANvv459xY8>IDanR zc53VW5WgSjA4gO~BKzFm{J^yQrLZ#EDJ(xWYnQKLReHdmZJ(qN=^{Y#p&$(YbSPW<#`!t$Vy8^IDy}z4?l#vZodr=+jzQF_az0TsIP8dpLQXHbnD46njD)#MM)*`k~ezV zdvX5s1v`d${b1h+hWm$k|6nA>B%!>h0#y~&Xlw35Vr(Lw`T5hNwR{v86%b(6lO{^B zcI^r@Hr1hsAX_`Jd;9v#3h2T6*H$;7xv8H(#Gl|SiQt_exweTQ%0+7XT zs$|mPG@@dB5D`6t`ySebKmE%uS^9$tR^1ggDMN(M3I(T!=(ZiGfmA|jIa zoERan_Cs=V0_VMtS$756d%8L~&j^RftF+Q;`%ZW`ypz0)&*tLDk)xdBe{Y+zv>DH(G^mP*L4_|OGz3kx z6{xK&ArHAgJ~oKZkYIDqcb*+}g#aAg2mu>@1Hv$GgR;u;c9P6!{qWuy6W!?@1&0DKa`?T0Kib zO9E+adZ28_WiYX~j zbM3-K=g;2l{rCOV@^1T_2lCK=&TCoCH21VLYs*voLH=^F(b0CEg;LXbWNNxg0GXh6 zX3lUfD%*;JhaWs}7>S7zQcftOl9Cc*j@mJ=_7x5 zuf1+N@CyrzEDO$tb=&!SD_(f+W%UR`L*sGgLDDCDKbf)+vDaUf{ttWKb~}BcPbE4Nh`j80T}^+3qO>g($lV z1<1%Se0i;Qd&_5VcxY65gz<9mbS=5cLMA^`-P8O<)%)ysg|c$~v5*yeu`j)Op5jWH z5WIYDTvW6zw`;LW7Br=BEG;e}Ao53AY6=@Mfzr}KE3$tX_dNYgVGVsse>Yc~lf444`$kxAB}hv^F;y2wJ>2!!qn?V_AK@e2^*8a+Kd*i2xudDABB-nE=Oiv1D4TCZU7Y(m8hy|;MfEaT+Xn6HsSU=_7fBxBj8UZD9gm5Bd193A<$+d0Wis2 zS-7={FDRHwBI(|jK*W#pLyDXH89hBEuP5N)E#Sr>;@Fw>Y*N0zoO{~*#`z;Fn<6KvdoagfBlhmyM&-vFu23JOr^aD&dIWv_-3E$-gPi4fVF&R`u^@+s^1W7d z#QVrY)J|nZQq+d3$~vB}`?-)px=>cBaq^nU316H!Q-Nd0&LOWLALZp`{7&3)3YnSd z`1}_i#r|9OAvrPDk`XAG#h%@}Etx}MaXuC;UWDKIolhepJ%S2Q0utl>;UeG4$y$Q7 z>#~rUm1%ym@`ViynMO<;!7V|(Ton%=IKkIZj&B?`Zd{E^myVIn%Q%Med-WhsQ-qJp zV4FNz3Z+)8oE0STN&-`kqd>O3CnJ=Ptb1I3qU?>!ePaDYI@haQET+AJiNX3T{FTyn z%C$!HLKR)MAq(Q$)zxG77Esj^l!_6Moa3YJoiTKeM9y7u*yR1y}`0zSI+hYX=%3Du=P% z)w)8x-g)7h+4pnmY*PIi$~#xQ@4iy2+Nu11XsMER0eQ zx;xs*bNbDSAj^Q3*V@}VEKc6;9k(L?LOns7zwO+9?wQw7UfhDX=%w)SjNrAyRIL38 z>_+g$8*k#p7oNr0Go=XfkHxL~?m%~MCtiK+4c0xB{BH)u#ihv0E3&$bjZP9&HL;EZ zXsT-?_-!Q!@Sq@!HvT6;#F68W${&lsPavCzpN}Wo*9-pu9|}+k90CbX^4jq+Sw8&` z781bs-Mj;p|G@zQyAUW?e3vX+1U!B|fyRGzU-4JvinmNuGn2-{Ex zhPo+a{W!(~JZ=KjVvFr4Yy0{Qt8xDPDH~VipeM4nHYF#;VR*Qo&!~bwK~PUm2Z3S) zBEwy1=XpmDA4F1ooMk_nnRcV9qKsp38ka7duz>TveV zN%KQ3%*$v0bfK-a70YsRNDFTK^vNgr{4w*{O=cTy|ANwfz1jk(8$uHPB*hlOP)lrt#ks&EG0aPkooUiifc4Il~_y>RZ zhlopxMpbn&R!pjE?o#2M69*I@tcyGbt{IPlgXTsWVP2OoHl?HfmON&=PRB<$XKJD=5nM1Eej zY$e+qjU`JIhqH}v&4n{>8l(F!U7J*ci}F(oc0Du!UUm(TFWKm7flQXxpk zx4!wW=Bq3}P-T5|@%eY(emjOn2Qe@*z=u!Z)RDI^HQs>I{DY_|DMn>UDe3lY)@zb9 z({6^h&0CkEl)R^-qlt>k1=4^I26}rC77>K4TQ`vZoTIW_1`oE$n=~Ejl1qYP$`F87 zQTQ@h4rJMu->t0YN^~KMw)n|}@f2RqelXd^Kk|8=#e81m4e)l6ZwZ7(83>Jz2!Sto zoOppFvvlDHFCPem>QIGDa8WY~36T|4-?5?mUduJkwtfk`cPk_rDWcc+VxlwJbw|xp z|1_Z{*clE8y^4j|)I4!t^n=SoHW=$!6=tl8p>|J-|BxqOguc;{Yxj3)cs@~#Vk zQ|D_1p(=ChxL|#?r1DPTc|6xZ1pjH?X-;eRsA;yGW3q(CL`B(kn&Y+%Bf2G{_9qBc z_9AtXKucp|lZDe+l(ER}Ee5DKpxSKW^wDg4#N?HaT>UO3bex~HE8pLkpTLeRGP0)0 zw@F}Vn&-*-!YfP==~X^tZh}@>n}UP=5E~aqFefX4z$-;61$C$rUD!@}H-V+gHm1m5 za%^0TSJpjmL`5r*evJ9VDfOOzpfCCf0yDFhPza5nhwmkjlvPGCI2BlZbhM95K8Q^C zBe-zk5{{pG%Pevk8R-Ps+9**+;Ow@39330L=wugimZlY1ocSCI7jMZKJqkfihAj^w_Pb&}f+raL?5)!!P&;lV!hFN}zYw9g8+R8m$=pw?_l zyRt^g=XS@AjYvt3L0m!vX(t7{c5cByUk|oy*@)hrZVNyzYwm5g-i$;7&YO1cM18$B zg{Cx^=5;Y;$t5;7{60h>ImKY{s2;?kC9gu>=Wc&z{DHb!*sGKl8^F z=x~KlK$CW32!OY4*~Bq)*>{5jeK>jIC;?d#mM&d_70Z_Lw-7WpHxa;%5WM(X3Pi00 zN_Li(C=x&xlq6zgWRyU?61@a51^IbclDP<-oh?|hGy^52g|;C{{?sX{SyYS$Y=cZo zYd7hyiZU}87tdWpZe9Ve>4KYpS2QIWpX9R?5=?>B6(bb3!Sxf^LF#YRq*qioNQ~0 z{7hvze)G-O2@XfGckfNO<>q}H_d9q^DbAm*z|g=1#@qwgykR}ZY%3mq=;Me_NW&p2 zFiV%MAgCWgSxGyU#zCxEvyRV}A`0GHS2xc{zmW>&1nGDcL8vk& zRTze%j$y75a+y>yyv6=eq7W(J1}ynm^HqoOboPN(S0pPPdCAZE<+ALQlHx58>#Zmh zeTXHU-*wlmhzJk)wFIlbDhPD|=w%SffBJ8x`Kd_`$n0_*wFe3a`4;FrXI!1ZRRbLW zYM*!rsQObYQ_9W>Tf&&U?925o2(>4XsNV&la`2ZnqK?rydYzTIj-b18Sx7L8c}lal zLAb(kBW0oI-st^rv~C|tnZLO=T(0%jvwiNoI`3yE(tJgy&OKk{TKo4}&wFpZ-dnC% z=WCqM@441_JAX02^4_BB%nEvWerq{iLPbxHj)_EUj4Yvo8xBzAWHDytZ|VO8TuH|i zMvaY)ID6(Sfk3t~FIg8ZUAklnrnQE1EQr_0FH>5&(!Oa&udHhVp4#kUX*Q<`Po_sW zzbPCD5<@Al6)aqqu>gXEiHTubO4M%E5DIyL24zm!ck4bf{8%(K*4YxQmZG&oTGqkQ zaVorQn}uYt+VPM{$oPn|CTVA{a?y`sHG#_V<=Mzslwm=;H*MHvKwT>}kz~BCP-U#i zw2dUomgNwHo`$E-5We{3PvcXcc??UkGYuRxHr8T%Vt{QJ#{RoE;EB&XjL-e%=imzW zL2+>bZrZyG!=r;Zb?PLAw&HYp*b=9@SU^A-l0;d?1<70G`xz7zX4VVE4rR5;yR=M3 z1%V2^HdSb|M&Cd?_U+q&J-aruA6ijgr;JQ)?BBnKKI(@Bgks5xUi>uP z!LrOnQZPn9VYHOiH6TEn$|fwocS2Gm$KIPl-PeShczs+n0sF`hvN#Ui1W^i$)!*02 z^A#)6O)!^({{AkGaSFo2g6&n-8D;C*uzn5eIgV8;m$RP0#`Wt6#9Fb3V04Cbv}4B> zgpzi0a+Z(|T}X_NBS=g{LShUBzw=%|H9W+Hb!%5s(7LcVD;?3%iWU(iBB?Qdr ze3t5yo}Og)+_Z5WBH3RNq(9|&Uy_-Lq=b0V`DO$J5{R%qQVf%lk`WdjiFNC@qpp_Y z+1O#0(4oOG z{QLKwL}Ps`9(n9z_}brp56?bzlr)vZJ`KQugGV^$>QGZ%Mj$OPK7*0LZYt4I1mq_@ ziQe8WQ&fTlLXB|QHXh=2vH)vUMf1*lAgL%%D@gm4VxRgDa||HApa6pkUqya(=~Axs z=lFydYU_K*E3)w5Lk|+*%4Nun&wcI_ICAt5=Uyp(`zybRr+)T*Jomy2Xltp(BOiH? zptX{K&J%H@15X0w#)`ARNIAm136wpln3FGr1ba}C?IRr|qqDsOdv0Ejh)^%oRTqgV zASpE)r_Y{ce@~IFw_Q%!QOdT+?a0Fv9T@_&c}RmQ@F`aVOU25$YpH>$94Pdd6iKH~ z#BrR%!g2AR=Ju?J^QB@lQViZmDQxbs#E5#_=D6+KwR?D`L0<^`eCWF%tHB198X zY>*QQ#oHL6zLz#5hgJiG)JV;oZ9;$k%7~%KcDA@r3?{<>PtWdW8xP0imc@J@^>+HC9o;6=t;OE)r|ECt# zZ&s-=8npVVUiRx1%iK0Q*YFOP54+a+>5Ap5{q<`obNlt(_j>O9hf^;pPR{wW*I!Hd zAm>`qqf~g=d!BXqRWHtWR|C$oH*$*I%f{~V{jOBz0in+EE(n!kCQF;rW5z^BaZYOa zTmp&b@EHP!ip!{_9NVGJYierhah6OmEhX7Pny8_bmF4zc_f|NeR04(gxHyD`xoqdO zc*xk8EHV_5Y;K^RHyQgV#t1YcBO;KT6mLRVd5)u^Ldp1Cw)Cp_lT*{f#()(@W`y50 zH#J&ZK?x&SL**}}jTEwi>KUV!lU@8}nqbz?tf+xOE-2<=Z(lb7m_qLO;=cQDw^V>T zcW&kLVvwAefS6cgNLVIsD(ier}PyY1ND6c+^%9_*Ivv(7gt;{rGCI7pG#3bz4xf^TNtii4OZsWaf zLrZHDcJ129K8i(0XB+Oh=N`UxVMNgeIKFC|r}vbBFE6iY3=DRW_l{sW@4N4o?Z{jd zNAR=+DQR&OPUqRCJFsD`d<-MW)W^`$R*QuA81{D{!9hFkL0~fN#l9Uya9}X|I@*Ns z@L<1uCu$9ZJgm4HDGACk7FT! z!!FX=Fx%FTF*n;cqFm+u{B77ajyP6o=KuwES63U`FDN)cph=qMxjw!G4&fn`uj8Cs z{%CJ+#kQ^6(9ZGMykQ;d+KlxZ)}Xni-ux03SUxi|i_acHY-}C9*&hieEfn4 zHiHmAz%@0gxl3grfHcqgYaF%OA%#b-H`>$&f=XF6HFjQ{r+jPI*eZ$mf^imwfReAI z>;{5#;i`O4z#jWf|_EYCD$58Xm12vT`sH$j2fA=UdGIH>d2kyX2 z&!0qXbsPG6$8hd+AxcZy*k_7*pQG!*O289^oA&I&%P$?q zq&t{&@3uI*jm-@_x5Hd9`uJK_oJY{vhTS)9;dye2nIeAZB~J080vuvT+Gs)PFSl2`+!RdPfaCy9xm^f)gQdf3ql0~ZP{I(>Uw3xHX_7sW^^99 zn{&Lk%oWlGG-pqH-?5<3zR~ilGXI@opy9)O_O%w)(Ll)Mk50WVf4EY)e4<_)@S;QS zFJJ5Ye8n>RjQ@x-+rK)TiTB|Y-TwoX*-qePR=3Mvyn7eDn>{{YnZ0bjj=n|^D!{4q zizz9IoPSX!#2uedUQZ^YFf{_9Lu8JMHz?s%Rb6A7H!?Fb$rl6=JqRi)(ckX?8Ks8| z3ndeq&{DXw6gW)Atqd(%UKUfFR*q+-wo#GgGtk>YhWPqZ&!(d7?K^|ct`>qn9}En1 z^0z_0cA=GEqN2RaLNARDcbgzrIG}<4dJ6bS6S&$K72*oJyg5S~c4Y1IhOz`HRFc4~ zfWgBL-)|dc`UFe~R$qDfW$d|WH_soYzzLziogpAiBnX^9NT@gJ>PyJ1`|;ZAPva*) ze3OD}5SzDbL|*I$=PhlhosoIJIyrH$k5X9|VJQicZk zP;$T#7$O$|FOvboLqineF2|ChDJ9yM0J<#HGWzUtdo|P~i}u(KU;+ zGO2(B5u6SanD%0bAT%jC8u77;m;eH*9x5J*1cG%IFSD$;9BHX(1c5EK+q$l<78z-2 zsH`Z*qKpjlpH%F}NzzmcL7KmxKl@O-kwZ~jT!d6AM1=);d}cW5qnt`bBu<|^X&YLK z3JM4&0&PRw$jBh&(4>J`B~HlCyTtn{oKz*-H)Y{-B*%-2E>Usv!KM83{C>hhX9<)l zHElaVYENIMS-G@vsIsbzedNa3b0*C^keqV3*>FVyVJ{TMv;I#xu1WHOPsT88YRIG+a z6lzF-L#vhAd!dj#QV5jYj53$9TSZH;Bb*1LBUIXW4_U>=+?<1~=h*m=`7oNB5a+yQ z6Y`LP%DLpHrCtJ3f)}~Aj1b(47N#eC5#Sq67NnS|k(PNZI5><-3F{RYO7ZcMyO?y>&S$ZnQ(heVaSV+T$nYEi=Ma|%LD7Wy6nA#@m^(~td=zfpw-J><<=4XP+Frs7*nK*-*wMlbgg z$Mt}!4#!^cKh;>hn(NGE1w;PDRLzZFOR12{kwV!CTTPHw^g22^X5U+`1K&{6`2gp6 zjIFN3MuxMmIA$}#YqEx3humVB7d46)#E4WRfV3lBG0aq9RZvdoX=zLN>uhMIYpsCu zNQFFhmUncWK&6*4JPUj(VaI>U^Z^exltf^=?@1)@3eH*UmEF!h&lbnR`QPQkDC*_e zzW%@#Y$2&`VQ z#Fi{KuU~~_S!u}3NJeO|KU!OAP*zrkn%YwI_jMsADhwZa=x!*BQFwR&L2@u$E?)|l zPy&{C0xc}adb7$g5c3RDRw3Xf?5?Vj#74D@y2)_ps1+iklE z=0ecl)51RPLULjx#>e_`*ByJ%)L4NF7f!%EK7gjCYHZ!S8hr#$2i|&x0H=}l@WAkB zCkJ^BhB#PL!LOO3C5A)A{U%o-?5rF?%! zM+bS{xLqdzE#G7Led?TX_bBPD8-b)jE&oTwgrRS+o3EkP9$Cb+b38OW7-12?6ibs( z$Q%zZS^Z%a(WI0(xF@NIq$R>H&Lppv$o$9LRlgeKUMQ{V6ey9rkKErs-b#|hY@NJw+M4MMl{iglqV(Zkikvq zO8J$!DrobgcDf6&_4f8#PXCIkYAP87{Zz6CI46|8^~{+wW>H?gVwq))J4;1eNg=jw z-G%3#|D^%d?|k=r`1#L%h$o+V8cM(W%a>nAOmv(nKK;~J>fDWt^s zA}Kx?L4E}3)BWTzz3A;}#Uk>!6w*sj0NY0e+Fy|kG)|YxFlk~?D-Ytu92fbB%HP<7 zoRX$xa2Pp>%T^OlKp~yjXUgB7Y=x*%EpgsH(hQpsF|kb>WV=+V3}1ezi*PmJji< zH&U!xs`os{yBlcUEwlYR>)<_K`PD10y9|Vym22lIs>AHh zj@4GzEzpdD+sxH)bM?#p%71DVZj#uq?;f| zJ5;5w29iO_0%zcX3^yV&)b8QUwrt+Ki9$b>0H_}!pW}Vaqdhh4j(#+l`Gfdp$8se z-$mf%7f#~Pfm}?E`=GtMhk)IK_1J=see5w@JX?Y9fA2YDW-X(T9>ep$cmZ#`et>|f zjX*jPA;DpI_L=9NRfG>rsNFiOC`IZ#Nx_` zSxbQ1+uLjD9_#Dt&Dz$`(17l4f~L+6G_*7l0C$^JQyGu6qhDiDTVHF|N!7K7zpG9H z%-U?!($Zo_1Mk-?VBOS=+L{_Ww7b5E=crz7?QLk6g|npC5-RAq`o5>P8|9@H2B=!w zn|V*U0<@xmZ4%&CVuM!Re}d!C+)4mW`s(TFM|Yt*LZs?CapgK$|MFx`bl@b z*tBUK9{=Qnh>YH5eK1$M#*z@xX(7as0#)-rooJ-+wy+E)bs_hH8%6?YG}cg)NKt zSXRnu;)Gc2+_e+8@4tn!dXm7~gUTNj+3-NpTt9)~2jnf%-(oEwx>s zl#L|)D|?t1=llS9$0Gdr$3H_sVTsXJMngV-Z0DB3uZKO~UI3^6|?z3sBQWWhT*|&rd^p*9cCWtHO!17m=QtjP2VtBd_3s zEyoA4ZN4M|g((w6lrO!fmgPBw3S4i#o+ck0OedLbR#5XLl|nvY?Nr)hVJwsDeAWC3 z4UdIiNG#`53u0p<*w=f>Z$ce~luDSnc3fwfUuU^mofd4;4P5)-mK%8Tjf~+nJodc+bnXQoRH>U= z=6Ue1%oEKw9t5F!6%Z9rv=s?5=7fZ}%OG^p1d?-w-Z&eR%qNt>NOQijvKj?>1<1-= zf)Q%s0x2b>#bzn>B7hlD{7EuE`9QX|wOb0r&wTn5$S*9yzkl!h7OLo(=U>Lluf2`q zhY#X~SKdZtX$e04#Ahh*TUn1VM1+N6ba)77&RjrQc@67Kp-PbS$xnU)fAWWah?cfS z)`Nhdt;t-4w5wSFDLOumjCwov?!B2nq7@Zo75qNH_>Oqm6os^ZfIpk%g`UnH3L*Ks z`Jkqvk^;Yz!o441q2VYkD)paWbhF+;1QO1&`nIiG@#Qalo`Aj|-}~ObnT1W8U1ays5_mPi zv@Dq?PoBiX_kV=#u0(ZJH33gO&rNZ{4N(Xy5cWqNyq_Sn2aW7ASvsUBXdGkW;|Ubf z2)6p5bf_d2_B-z{{>wfxpHLA8=Ya=EKLiXxJg65C;QNzyM&RY4%}oRBLvQ%_Y3a|6 z;6N{vAM#%_pGDG_$I)MenjhOah`4YH|63`2b>wc<3fBz8T;}gxF*A)_Gt|oeBcXuxpr6|&p zEYAw~uc!|K1p@HeC_;$9xgxicp57iRCLtCf!Ns}iJq=DEX~d&;PkXuma$RcRJ4XkyFH|9 z(w(L53@{#N08H&8f093_Ht!e>aa`5Tfj&j{@Wq>N9HOG_K_xNTEYdMC5f~Wi=X}j0 zFkFsLKK?n}vHw0i^3gk}Y;@qc7k)t+Nx)}6`)SgF3l}dI({Qu+4Cn*Pks`_xv?lc%@lF100={cgs8omx}2Yih0J*>KW_n5 zZ8kK2Pk+ZUE?%xak_A+&(&`(@hIZ25#!Wjo0bQu6t!E#E<4%hc8Ui0G^s_FO*ITYh z+DUw=K{Cs#aKzd~Cy^m{Sz6dh6qqubD@=*f{Pj{p z)Xp^R3Y@ims^}UMqGBZPE2_)2)#pE#Ye^`G{ANin*J))3Oo`?)fq!R6g)8~() zrJ;-05J2$!>V{f^ORezu;K-rlc<#BEtbNth^%x$VM4e zBaqcbbex@^LFadLcJg;$0<96Nw_ZiZqFtV5fY4d0 zl^>l#5fR2sc$%UxH0b6Sc(W~3vfPT*%JVfQ-a!O+>=)9|q+6~mN*bVLZ(jmU<;&NG zBToXmXgQmpfrjuDq$0x2eJas zO!2qTF$5FnM)7<3*+xZb7rqN5an2=$9~)yGCgANWUtle*YQu`Zfo=hCDPaQVinKJr zzH@VajuE73zLFAIcf}HQmZiNsl}1t4 zPg#EQ^o(>WNJ+T={*PhPrj2H)9%f%iVN}XiZRQIN)jR}pmMx=lF^$^#dVT_FamZ+; zpYzp^?UfQUJTzwWM|~(?bScrw*{|mszfvoy#5ggF$Bicq^!Hu3cD~vkdL6y?Ev21Neu(`#L`R>8~O$w}$i(kN^AiAK|b5*S86f@54WQ?OXWz zKm7>b_~*aD=y)Lh=&L`#i?1E!R0@FtQw~T8;6TU+)jdXDIWdOu$x(C<^dT-S71=8j zK=ME+`)6g(W;V0(*DehQ}ZKI94oQiHPtp)?f55zB`JMajiNl z2md(6+{1j9GGh&z|LoW(Uq?sGH+q5!x$dVqCOM!mVSc0=#h#VRfy;K?JCIT9&~s(T zjg)I!ju&x~*=qu8!Ye0oI46MZsN-ZMMe{HnT$fy>*l=^eCpbCf&oN?Jh&M0Qy+!;2 zptBp3yr}soOh;L1g)tYIhn;|`aw49+pYt*cIlGRZHDIrR+BRz29*fI3=Du&@GI=i|tGD;Qdg^s}{1pE2G!<(RWs0xpN@?PAucdKoun*ad+^hrcPR1=EJa>?LF zaQ9tz5D+%v#L4sIeFB#*);omtm?8)x=-@NG*snuF;|4-4JQKT8n^49nJc9%M`Mtu{ zRpa)3x8UZRc9A!GnmfZQufB}_?p_MaW$5qi$44IcD5@%I@Xdev7V6jsP3=8|5)@)G@Nz#W0wr^R7#n~C`|11hIU)vd+oESktJ8YI3Wp=VlDS#D+QkF;g>B^15{Q3A< z3XA$d%gB;1vK;F3=-3$P)d|`!5UTJ(vLeb7DT|~BWrti1lu$tyPQ|kn=nN!K6}Z%^ zTuWv+9R*qqyb_R%k@oxp2nO{WS%SR$FwHp|M1?`_Ckip8`^#^Vm)mm$8r^JzENBW@ zrj1%te3e^+?jt&r6;E(_4&vDOP58+$i`W_A+K8pM9yB}vy=ac@ESq~4?)YRb2nR5m( zLqlAo`Ne3p2nz?WBx@1pmBP76NtiZ&b?t1|j&A|-Su3Bgjc|zgpcE2?pc*0%^Ysm~ zRS0h?2LbFeWx`U}y0+E^@~UCZi!|~tAM&wF9E$+9!HrJNt+F%kX!%FdNex(LSN#VasG zrM$4D%>4N8y8Bi{gp!Avk|I8E{g%*c0HLykkl?8u%HK!+0vZIxF%wX9c14L$9e}uS zTt?@f;yxY-;AGV<*+DWPH>a+iZXuU2lLJB%(qlya5ZF7&h7z0f$#t@G@8 z*Lwbc90+xuE6XS+lUX)3-?YLSpAbvt6=B*lr@5UYYm9`TkAEPBWl5l*mBpvLwA|u? zrl+P5ENQpw3<`=1$uGv=sZUZ|B=+yW#ddwi$46nsiskm~LNe>IVOb14;78$2XkgbQ zCB_hRjp7b6R;4IZQ2FK-1%e;L(8z=V2l*9hlR!;fHHAAtgfb(MKL|i}6S&q?mlMc# zVcU*fNJ&aYQBf%_oH+$oSiJdeb$2uxFqm`;==nk!Q51i2=dSH|?D3Cb(}wjXpg#Sn z$FODFdIA(LJn^Z=$+QCqHk(jbn1}oCzYV|p2cN|f0H8p7SghDC}<9k2) z-}ubu9>v=ASy;6y$3ieET$OwgrPya=C}fi?t-%(9bdVr7G~7j@K;g-r7<0Q3<_a|c z5}>RvL4N#x+?Lt2@kcwSL&NS~N7a*ixK!4cl&Ff>3415&~kk z$t~1)v4E_A)bP+C=|{eE$@t7?K91enH*&1Qc@O#VDGN>~l?v@l54JJ39lWH0agK%J z7&@CqC~ruBN)2ij89hg>;2)8x{1wG@WRWq;Jg=L)ydtN%Xf;h2>3f|gnpHnL791@@ zEBn=i(Vl>Z0IhC3JO4Bm`d;6;`6?MBw*^O8(?&a4%e29Tpv*_seOM}$8`3)Krq7xys+*oQD?8=hFfu-5OQcdl*cqhBK}=E(cXoC1{%&;l zbYoP&lVDNVkmPzGrB@1==qMo}h5(0PB1Ew<11t-etyb~=L&M_)zI;35YZh%;{FHuI za#hwr8HF^r)Fwe$Nox6oYD|<+!6M{vFnAdOxQAJ4wR!K-#UflfuO0p^7#W;G{-rXM z7T4m%7vI47vjse746)HkxPAW?oIY8G+}t7@e)|kAoUg$vuN*;Z+kp8|%U^p6qXd}p zGcUoRgC}w1@CkyVRP5Tl6My@+|AOO3i}~Fd%f6LgP>PGWg*ba5&sGAIzg?~)qUFr2 z4C^ELw+FHxlr2p=$J0_%t*>QCR0ty}TZ+}IrSJ(Vg=9xm1Y>aSd?8B9YY`b0Z`NF4 zpV!}dok~?0@3EAaq!Tsu?dC$`?V~6hAq0Q}X4wx63gNhVp{BMGm-0$6&_9CsxHL32 zw_?Q2IUdEi>^F>|_9EayV5bsc;+iQ=X%TgpY@(Ybzh+9oa-$H%+;(b9BQtZtlDh{zn)vf zsAlUp``g?;dZ+$8W{ZBkmcy2SukgJN-cWz%E$Xki&z^f+tt>RgMmv`ehn)Cl>`C zsp2sHclz>uhv-}jSUUKTr;Fa$50c(|?U`y8b>us%6z3xkUkN47KR;h@18w2aE;7XloorQ)R0DWaG zo}zLSX;yw&W#wnBBnYWVNtQwAz}v@p&Y)#lYHV&HaMKEh>fplYFxxrfMr4EwgS~Ea zb_^mqDuK@k#+EJHapt7_M%}Dw0OzYGL3jjwLn29MQ|OhugP$zTGq%}p=dRtxBVyyD zZG)3G!AWtDWz(OEv@0T#bQ}ub02k*^FN(@)2_B<}GZd>c8sGevA0ah02ko7`yw_d} zmcM%KO5A$e?da+mCf}>!{2)COaEh;sCS@s?wO*ES`Q3VZQ3>FD*TybwuJiNt46;5c?$podDcGBfs5~GH3>5G?EzxUt=8Suk=QtqPc@;pZt8`?eD~ud?%+o!Ktit5>{FsRLB-@2+;Ce&1(v{{=o^fw00pszX~N~&1h)s zLEn&Kka|$*oIpcc7e)wlW=l`+2+As(aPn*+PMtZ2`nncWR(BA{x)BmW!RRCFoChKz zlsZscVUplRIkHE|SSes!5d>pvasT}vM_6dEEg!}w#34E+0?SvdC9}=6IFrdK$;ime zMo!KO+ufhNVg>IXL?J(h{KAVAT>Wr`1`!OmVPLS={N3^k3T!z`sU5W}F0i4^R>2fT zUIg$0Oj8hO@I*~*HL7YF;O7-?=L+rwun)D%wyUcH3OkgVk;=Yl!2kT8e~PZ|R`d=i z1!5S2L;MK{-AGAGb?#MN!Je5$u$IyYH2uYPTFNB8+4ha)Go5oGo|%@KR$ceAc9@1FnuLx0sTPDmkHz%@gsDTk*$*&9w= zEWY<-&v@E${siwkrG6ktoTLJA?C5Jaa`=}xfBp#Gdg}$0R$Rh_0M3j;^$_4v&O(aE zq|(63A5p8DBN&%!1Upm`c80%Ck&v}jc*^*J>cx6fDea*`7DELlng?4&1x^t(6nO&Z zAMPf90BNF^N(vAW9ZFC*z~_x)c(Rv@+%&rSn=w4vgDpE&WAC1gNJ@)FaF{QK-R+z^ zBZ!O(!2p%4tn5@|W+o!H=rlpy6k@0pYL%eh{7~hqE7!d#g1b@jpHTL%59!j)x$A@O z-U+<;@`kWOCW z5yrW+7lHnXmhiJk&^4DG_;{uOum+soQjCBNW{k{5l}Be zYFawtVhCmjC0@l%hi5gs4RG` zny^6m(4Kp>a+P{rOPOWlDs$^{BlWtGYTZC@ELhZ@xx(uG%EOJ+c{Zz;J%gX$-*&k}}w)pI0V^f*7C05VVlO#+(4qeBK0>g~-dxC74=7@Hk`^fRge;jJiiCtP+q;5T&I=ZT!$upo%@4 z$80yueilZ5=QkcI638+jhe!BYszrrXQr>gpJv>Q99K|^d3=A>L?EX9Mp`i7$O;5Xa z??Lvm&+R+}ugwOCCeu)YjZgAvQ!Uzl(ya%i;iP=X`x#6Mp>tCvoz` zY3$y$8yh!lvgPZv)D#0zp}}D|bl|YC7k=~epTolsKSV&d4=+=A6&2RlQm31M;DHD3 zu{fR|{n*`Dl9_|U2Tx*2_G+?hAG9=g;i;cJMFCfeRjW5)#fo)^2#+J^3u6BQd6!De zAJ!#b#9@wuhabX2Bglit2|9i7=%bIAJCkBvDvhZ^S8d$10e$^_cRVz-Teg3 zdFKAGeA!ZSqf+#dDWaC_B`Z)~UX8kjCJONoY}vdOy*-0ix@--~%4*ToImG9Wpdj}+ ze~)LsjM_4@mV_-vEcvu7;u2cJ?89+wa2V>P&}>I?LO8)f8=4!c@aCJZAR#Uu^$pEv zYHXsAcianXN&B*;&>3xw`kW$jsPpFX>#r7@I!42n>1NKnQTZ^H>-W#;Un!S=xB77o zi?7=JyUKN@Qn7z$lR2npGoamvhprb-kUVzevJ)yx${_I&9(v#bgoj6BQPyIDh#aJ* zFF||T0F@rf+6e&$rPr2AfaWyEkP3>%R3J&-YZ>saE=h-tk*1e>yEj#z(i6=hJ zXN1{zLxcV3?`fklm&kc32tAJet`=nYE<<=j{HJa6ur{^Bn`LH=BUHEY-6 zg?qEqcrv|;&(pscD(=nkKng{=k4h2=^(hQ!OC^>arp2)g3ly^@DPT^2&}bP znW$H5(RB)v4#h~Jk)};Il{DIB&D3VQLDFs?4aGuCn?471HO=JFQW{ZO*PehKJ8s4L zjazL*wy$s8`1kwY{{>oG2T9*v+;`8zlrf2@s-mo*;hdDLqh_=5%yS26H1@JBqiqCK zOG*Sl9WM!_Z_%P?m~AHt9c5d~posBCu}!8UKO+?_bydhuPewM|QlpK1Lva|0A@CeY zM@5SV1#@mdAaOd4Sz@4)I=bqb4|R)=w)@ZB2^Q-Dydvyq~b^`_`B zfKEKoI+si$ZZ*Evg}$+%!fIz;m$P$ALR3fh@v1X@5lum->HSz|7Z?dkKF}_f3WNs3 z457-30mDLO3ZA|e!(VTZK(RLA_lctAI?)ZqYlJsd=Bd(GQyHL`I68eCel{Yw_uovI zs#wbRa^t+w`0EKy8N#W${VFMaMP89{>L3uRr_^dwJ#G1hAGnlXxUHT3xcv5|GDci` z{UP!lDGH~KHqB2kAff4tm&+x`XPh=BX#jlItLK%Pcj9p=}s*) zJ-Ap>h8JFX0nhJx7W?+?rwkmz%4KVC`qWwc>Q~QMI$m!oe)#>z@Zzpx7#j23WGPl1XN+a=%G z-EV8Z`Uwyh5riftr()~29aOlKxv^R&H-Mk~NhpyyXUh?m`+eI?1RUYd3C0ORG-% zDI@(PA=abObh&pS4Tc9g92#|_g2N9|+*5^X@k3;)k@3xjsbr$`gWU~3;~J8Y*Cr2| zZV%b|QT3yE(wW|uJP_!N4%gWMqvBU>8djxrZvW_T$d-h(wRNJgMb6s;c;SV;G_?9z zu6RbR?-frgXuwD7N%_?Ps7CGFK_kk2m6&>7(n3q|bR^{Mx8H{Ph8i1@{H@>mAl7Xl zU(P77LnL$>*QwLTkdW-dZ~oT%$s%|UBun@-GID;06z1le}Z2<{WL!Q`yb)^gD9Ahg>;hxH_*7vBmf;G zPvjBY#Ud}afO01q9W9MmuwXvvd8N%lXv1P_TZ_rAsHk`vsmYiza}gFTTZhHV*CIJB zi}i}ei4!HLt8PVIeLKGPmH#A&^&mZ!;IFzF=g-zqc2wX5dGg}LDwGqH{q)gi(9+Ut zntrae>sKWkNUc`xGC+!H>3Sy|!Cr>b)GSt%WyjXI<{5h9ixM==uW$=y;>d=D_ zSXWY*r;&@hFz!=OPDDzh>+p)yIBOqlD9H&G%BQx(ezZZ5Bl z`u{BpESTs!{4b&n+|TO^8bMH6mr_%@S0(A@Yv059+W+ASNA^eL_v;CoWOIVjVWdJc zrDmTxJ%m6a&KU`HL8wMT%~^enAnTZog2~bk1d<4VMxBvR{w|^rEGjC(lEsTLGOXn~ zyhh=#DeY8R*HRek*RIBrC5y3yf^yZ0HJCYL4i(Wl0;CO?J$nIW&zyy|Yu4hX?YCgV zy3JTgP_%;2Enc`3Yu9bU;>Am;Toz;YtT~uBe*y2W#`2Xbux!~YuB!)yaB=GIqFyf=_IXZB^V-D)TRXaBGxHJnzr{6AdQa2 z5>zGenM6}y+JvRil-AZ-mSZ8-ui1hVhcBSNd&vBF?%utZ;I$L+o?Hs^QG^DgFn#)b z3iMw5?5B_7nWvsdXn@xW7U71ix8QtPITh@)l%pA-NTpKI(R=0Qn^fmjmz0!3r@f@6 z=dk?RKoSp~dZQyplM_E=j*cDz z#Ubia?En}3Xo&_@t=4Q(KFi?J8e5E$KB7huGd@UzWI92058JE-CypP*tXZ?s)Y6Kk z#ugeGnYP?Yu7;fSMDS8zSJAlff%yOWl$*kvlBL%O*Gl`+`cs84|LV70n}VMO^tA?8 zqoCqT#|V^8c6j*mx>C855(xD`?i2Zg*GBQ1AN&mi4>6>dLh_khUL87g8hw3y)|0?@ z`K(Q$hRdcYe)XqaBM@c!&OIkOd1?6z`h^oMA?fyf?_$ z>u7Do9k=hK(e^5mw2RskOQ2PaO$4md92^K zl*V5(jvhJA`yt%8bsGjky)@pop}S)M|L5<%X6r+D?%aWmo3>)k+yz)mFeab8XHOl% zsx|9vbo1o#W9aVdv%@EB>YVM+P~T;I+T0Sv#S7IaE3LA1ofpp6;?-9V;jzb_B|RtG z+Hsu{p5V_W@EfNQ+sNjPL0M&uxtQvvp*UioGS<8XnD1EDQNOi3VT65UrWKpgS#wMo zLph^GiITa6h10NP!6NjucVi7@SzE^l>f45qoU;gZU4CTG*@B{rec1QPSsXc9g)=4f zD7#RPGp8=F{WO&yM1D>VHdFT1RFz`-v>f(DK86Q-(NE(bBPSCJmMlSnH=cFrMq7I; zWlKFVR2O=?JJG?|#pkq6b#N$X%P~@DpsFwB_g0(KwA4X9k&m4?hQyQ%w6ukA;&d_6 z(~}88Z=-D2#=;Q6w~zE8dcHnBz4l0`MnUyQrqS@f3a67Ogz8gL(n+9NKt0S)N9kT- zx+#M?WWYvBbj({6E2|R?)J04Ha_lP*s_A&GCzB&(fl%#?RcC7yz!?qI<5TDN`pPqL zm`d>*TQcp*;TIVBDzjdX%s;Z8ZzAa_-*wZUEIK2E69?VD-e7$c zQLxK>=Ft0_=|h(x-L-1Ych%$aZ#OvkIBjp=uSzzu9IvNb6NiX4)cg9!Pr2Dq`%1z2 zypAJh1EG1jNJ*2ALrur)Sxpg+*)+FYG|AnIm!LI@fb+zOlQ@0)l&v3JdTci_FE?z7p2s_7Eg7X(j zsnpI97**ihxwEwHE15@^ZMZ2bt3b(x^A;QGThQ4RqO2Iet9y=M|GvFQPRoIF+@zmE zxW}Bz+i1{;)@6~l;4!0GBRo-2Lj-RgbayvX(dtwn`4-d;_Bh+ctaWWVpL%Ghi}jp^ zTX)=sXPJ#mN=h-{(MN+^yRWONE6vr4+|#`L z@=G@ABcI9w3JVs_w<%MdufOHS8`zd*l&w*0qdpWDU%*pO??P_g3~VLvuPCo3kR2qA z#^UiOo*|g6rZSDiaEL}pbUXqH={8`XQFFOca>1ykAT^~P=aF3ImEnGV4iosUMnPVR zttTxiI)>FWFmwu3Ny&KxG!iP1Bmhf#Q&JAE>(hkIC5w?!#`E9d0FN&ou7 zRPS2;rl*`|?2~120pyhB;-ebPwvA3?RA=Nfe9My2?te$Vh;QX3K7o6&B zZy~^0V0^Lf-~lw$)#22MA_5?$MEXiePD5sTwz*E4H+Mb)r0Jjk^yjuQY5TSvc=oxc z(cRgJcfa#J*h+vobH+ma@P|*~$f2{gInw8g!MgS9v1<8ReB$GON)Q#o0Rq&*=`&GX z*@m=K9TzU|I#G!C2Z%?ANqPk~OG#rbm^pJcjlnpArxOHOawnM%xm!AM@*KfuFJm7{ z&Xwc*#VX+$vAuMZ zrDki@AL3cH=`ca4)4z=DFvrE6My+*CgJ`if`=i4oC3a!@ECg=UjpiN`iu!J!h zg)C=oK|YqQ-%60a5;+CgSi4~(7B5|l#Y>iA!=_ExvVA)?(@0&tegkIAk--vA{vLsc zpK4p3T(dL$-}IZL*@=mzR_^)kx(ihje^MXRYPli zg{BF#6H*RQqvSg-R!G{_g(?(O2j`9<4he4>UUUwu^JSG=SX&Drh8VPk-jbF5BNsHHqLh{R~vzeoC z+VP6j zwN(V0r6?;eGhkX#Rc8J@tEx-++qrhJ^dgGS6cNZ)QV9-GA&l|;7J}On?B9C;hYy{` zxie+x=RNI^?d%E?P*oD}mZIp?ISNg=Qb|W>V90jyOX$YN$ao&5f|0+!R)WUaSiNcm zvN8phd|0=3HSfhCCp!~`Gp124rDM^;g?Q=ZXEAGb7C!g6PvJf9c^8%}T}q&L4qcty zR8k)F54GTfA9xU-`t*l!`|aBaOrz1*Tx$xprnVkc1m*B3GCjzpTKeyh557a&_nOW@#ClP-S7MW)iq6MX>3QlSM~Q>)TpIK z#6_Cs5{Lye1BMqgQWs@(MQ}PI7evF@v~~%>hS<_b)L0{-GS0ND z!RShVqAjB_H#&J4pNL_m2+p%o?he3nKQ&9{DE`TVrGK4a%6C-`l_4Be3a3nDCjFj* zm&I=~jN~+5k7@8n?yJ}kVX)(@rBxUq@N_^ZbujxtXN9j{x0d}HqydylK$1X1!H08a zE6hL}9n-FD(UsG#$}8GV&=I`!Fbzgq92aJKm0Y8wT6@WI>uAr;wk893r)YRyxLATR z8jWX8mEg$XQ)qAL#-?>Q5UAwhBE@;@|%(u|X_$+;l6x`OTjYl=^7E zouwgKO};;YgEHnw=h>M#SiWop0a`o`A3TDNj!v5%m#^3{f^H4gH@9}1qo8^|X3_h4i&8bKPKBcnmU8)ON3kecDc#v4}Q=!sX+N#j|EbCgzIFoVCeyd2ea z^^~F2C^|{QzoH5u(okDhFLeBQ@4z6s`UX(n(vGUS2GrEl+evMWEp3z;!)WX7M@^$P zih1$k%X?|aWbnOV96xay85t?K`>vgK@PL>1wP{g$!J(Ho9-_z$6LN#5;UrYFF=32A zQKH#4L&z{`!e5Aw&P@hc}-R9i3E1!<5Sh?T4Aa;uho{$PSc6QwSd`F_w8Qzw)>Q> zxy6Zm*Zm%OZOU?My)>Fx_pgPPDf17mq(m{_f-Rno$`daGQpkZ{9|QK;cf{rHwYvJ^vz_TjYmQBP=>n zPVF#+*r)`ylNJz!s1|(`xC2b1m(4_l$|quC$FODd4s*^P=kp>y;K$LUr|{x)FA^;A zy>Ty<0xkMbH{ugAFxb}vUs5_1G;7X&@g?LS)TdpvlrzaGR4`pO(&_W-{Nz4-;u9am znssXs7vn(8+1d?K~ci(B;|GDc#yI^ z3tb((l)ZkIJB~m%+8lh3%0meOiS5P~&9F>Sl*LlO8hMJ9;vMOxF*AtY`|#T^cXldy zw-f*NZ(qi{-}ip(Bk(wU_z0#?pT+B1H%E0&5EaEb+C~`a00Arqva!mVCT4J^iLa#X z$nRJ4;pN|a#`)*`3coYeyKf}u-AidI3X}_sGiZcZ!A;+N&V5HbH(5|q$bi#;k257N zBhgt4>TE_*T1wZE8S+1>HGm@;t)n6J_J{5_cTAr6M1B|Y_h{RYoS&bGZ+!d9_~=JJLp;#I_8}i9YEOPI`UYEUW@gQr z8!&(FGRmMf8l#8J^_$Nhi<;^R#QEi1KbiH7L0`83dK&r&#zu#_%tcXBa;j}iRR3t1 zj$C8uECf%iyg9@}zR|}<`Vkx+Ao$ZXbS(P%)lks{Xnva>7yi*P#oF}KOPLW!(5!{} zJeGVdx|S=nF~~pe$Z(Lq*_Ld_P^g_eB+2Z-Ao*b|CV<#P8tNhTHSv#*#!T`hBARVK zI@-;wyO~Ze=FXjt&;0QpV&5M5V%>|hWR@eOjovZ@nKYG+Tzbh+)CMwn6B*L+>il$0 z1#?cp8`AU)OXGlbUL!&H0?Fv_)0$-Pvmft%*N0GB---YH&+lT!j4XWbdtbwXnK^t* zfLpXIR3e&xg*fecebM!Br)Q~=2-pn$5ZEiqZpPR@v8 z9?Z~~OoB~|dIfN`*nj|Q1J1%vSzc*FkHyy5SnaJ=a$~D!iym$3&ho0Q%+;tU*1@|j&JI_uM zY)Z=sZold!>tCiP#o}JKr6rb~3dCs7UX}0b43oXXT%At}9-{!2fqZ8pqog-k?g4@y z@w^&r?UL7;aBTvruCBu3MN7!L@+};VGw04x z7_vN;t9X0dJZcE|Rae(Q$8*-ylsig|!q)*B5@ITyhi^FT6{8J11f~d&ROq`l!7N?6 z%3P5&G_}A_f!W&HgNm|7Q?N0yRAyR78I#015oC@iO)u+_NFl6IMJjWqr*@8xVR^@y zW`K%fxS#Dag8S~j3n?jyXl|;f;`QKs$vNog&!}h#?lA+aQXqqa9h6hR*Z%#hc;;8H zVqmZxZ+rVgcSUZoP=V{mU=onWtaHyoH&VH+weX{fXw!aMj8+HeIf@ zvMX1uKnD%{=`&_f$WKQ}$pxH0bB5(%tyzYlVNI1w9t(y$GEhw<=j{RlGR!rDw0OxP zyz`Mqu>atG+bE{#&)S*>Dnu_%o-D?(QzZr}-}bhLZT)OfQ5iZr`%pr_+t}Q~^t?90 ztfN6k*iJUM6CKC8D_>`1N93x!`OU~x^2(v9VSW!0kdCr$3y_)aXZwxg#HnMLzhD8% zD=X2`(gq#ds*N1ld@3K6mX7|Im__>&Ejyb#G%(?YiRk;%dlN+Il&gdBBJW-LejUN( zT?MDCY6#|OSJY;&&DRZX*(M7D2@cp)bY>}>T=cGJz_POZH4U#(P#YQLMV+Fg^_n`O zRBbFjyjqr0QPD_{HNaFfYbkv#8WR088UT_kaPqXxipI0{h^4EUQH}KJC`cXPpf#R) zOJ|hJW5z&lH~ga05&7~SvjHXSrwuo3UXM+i*5L8S9;2~ViFxy8K}T=4 zwdxq~7=k?cN2Pp;8zL?DAeV+~c6L6hNH^08X(-)sGk*ER^E8}-h>K&Ly)jHU#t`UxKIzV~h#tZQ)ZefMD9+6_2#=nyLvqdkc>y{&NXJ@;V4 z<_)NCti_EtZee|C`VvGVN^Y&#*wNY*@4;Fboe9yDH!WDOa2cN)L05MNWdcENqRw3( zWNJ*qLI@`ce@apMq$AD!fVAi1HG=M#=S)j&t>} zr^JVpfuw^GmS=EmfQF!CViXoGU4~^V)?n7``It3#5mv0)h((LnVd;v^lm#0wcfoqB zSh)oY7jD43`D?Lc8SgLINMm{xX3t&CI&8q4IcqRu_6nx43Nz=dq|vejGiR^H?AdFO zl#-9lTkpiyt(&m><%2kX{v7+vhlk#FuWd|{K_a;}L4Fb>RJfuKnC_(chJ$U$GCtH2bUPnB6;$+rTaih4&e zV6z%>M(?E{$|u0`6I2dS;A`eVJLr`T;iAV&;Sbx5u6iCibQBjZT*RFDb0GId@;i90 z_=aQhapKU~z zpi9$bm6c^UclI25dWWDRJlk4(DfFp)ViGW}^VV559lbb0z^onnAgI!Jof985uF*s< zm2ilLuw29NTC_&@hV2N;;l*7?2uPi2Zk-2y=N&s)=Nu}z+j0BOyKw6GMYb#DCV{s6b-wiS zZnou^9RTvvpFV2&tz5kx)m6@VHQ5LPfI7NTMt{7|&-Rz2Zo+ZOPql?cvxE$#)GBDK zr=-Y*$~`!FoP7||i0^<+&*=!zg-cdp)tZe2rmeQtEs09+;`s^;1O+;r-O*}qO_j0*1t_M@|>ksv&lJe5eJGyt!M z#uM8?8?^?4y)-NbuxQbIEAK#GH(Ht-ZN0fXVVGQ!TPsf#mMx!8KsFPJG}bn6S&y2! zN|cqJXI?rbZV-Jvtw_&F#m=2KV#cgO^SycV&9|FDoR^cqwirc2bs5`3hU^&oh9H;k zYUDK|Jq^9&Z^>F6Iv{_on)y}tQZf;;#xi;^Ox_!zY#JHYdR@srhqm-7pUi6S5xzw+ zMtPOQb{=6}%5mi2DU?+<5v;f3)ai1ZDXOIWZ9rLB3;Dhk7tS}ZeVb8M-hy&oE4$c= zy4pU!-9(euNd}`^Jd0z1c%=R**~?CYKYx zwqWJIsvc7bD7!Po{c8oKt+ywNZ)saj8C)eXS)4pf)m94EY|ANvL-$Uwbewmo@N;B`o>kOHjU!86zU0VJDmfaXd4$3 z5>lvSmJ>9^+i0vt@kR(hGJ+J_^Di?Cq9GHls;3l1MD!M}a& z=M>&i$Vi)m>Y8&jussB)@4(6xYw*P5FJa&AQ@Clz-Kegs!;gOa6LWvk(9}c$e+H*c z6{8@3ni=`WPn<$+U87BdYu3r+o{dtGZU`W>aZ1Wo$yHcIeLC9WXQt7%2OBXBFyl4!7zNf#*U zH~;iqvRE6jq}WGC2H}s7!L2uM#Pn&IG#rLeeC8C}XFHmjn=ESNPHT#lk4Er}7c5QD zS2!>Gbkf)P@+RqOy_KWbAqQ z4*NG+x|Hvc?zKll{i!^){7%;${qK}R1{*f4Ky_^?Qd0f6Ve>ldesvdl;sKipIehp4LGl{pM{;pG0Ox z0u91eyt?-#^M9&t)X}G!LFy%l4fx|tjxAfV94$@lH2O-hW5*Wu!x;SjSli4g!@ISq z-r6rnyrfN2+SHd22vF`&4k=N#uc%!hREv@1H+W2jxC}0eO?!l_9bCe+pN`o&txq85VG22_^Sqr9}1 z&$rXiZ6b)RpiFBa@Dy0B#zo$%EF(}qSH*jktY1AYlvJVUbP2k9o7wk6?5lL#amP)_ zOHVaAA12S6(K-dqPZh2`5=w>Pu#7Ba9h284$8% zTaKd11?&@NdQyT`Bc3`MP|j2(;A-m{pq-U+g6)7$szP#tc=>uO{<^}{vf|egto-^H zQIBg0skf?FZ)saj8K$n$HA^+c>u;v5+ zR5YP`Q{7j%oT>uFADnpaLIBMqG3Xl~+1y ztLxF*9YoQo61@5n-%TvUvK8xa=;#p~JbZ{{i9q_=ojFoe4Z4{*f zC4Fdq%gb{4ykl6gd=8aU7us6uaO~J2JGrIgd@1YNM3AKENtTys7`>3Dw3FO23_vOc7FRWpL_y)U)@JOOU8}c?C(Au(;))i8U$@=jZS>)Ac!ro(O%V| zt+kB+auCT$X~qY&wE|@qar(p=967X`Wj=unw!xa!%Luw}ArJMMvHI?JJ&bq0^BuVJ zjythx<#GbURvM?>h@}Co87HlUc9+(Sv5y_!t>g*HSh5g530B!R(V_#xOin-R`O%RW z3=eAAln)8yXFp?tmPe9a=GaItKul-;?Up#c@sA3ITY%o5dhXV2@gGVFZo!T;WRU)5#P52glcp`l@>!dji5Z_ zaz!9i(?))OGOr7%OKH5`0!YxXA;$(F-&B3QJ!}juPIs(6DGN=4Vv<=6I%~SF zt`@@vRz>`p8j=K-K(R#Mn($iL@@o&)arzfgk*NTMo-zS2NqjR!*8BfG;ToluHq|2& zM77lfmoGemiiUe`#AKxhI%sC@ZqnpabO zPD|?SVIM7V2ZU<0WzXJyD6cA`Vwh*UKD9&s+_{qo4fXO3P00^aI1fM$khR`Qn}LoT zIe^B-T9!fOqVSVqyc7gHB@_iqwIQaPpHyO_8rh+x-*S1nxW>uxiJ zkdYNY@tI>NueiW_@$kg>v1R)RIK3ND{X_vn9{ zs+U$|xPrd1B!sQdhML*#dRUwK_`3^vJwfJ2(#J&!jACr=lV?nlwo(t*Ly7>bH6ntLK`HXGIky>TsT)0#@{ z!q*yL2ZY+rZyN~}5OLa%IaxlM<#2#7LD29Jf&=~VCnRA0y!lwYauGIdTy2|{FP<+) zPIe)3^9t=`v4Y$J?0ID`LW9G2@c!HI^PfLWFcgnlcHD+|()oMe_q#ZMu@SGntXY9N z;`%&C`&;3}jav7d^_GxV0wh`5}jpUhh1Divm1LjGiV45}yYBOCAc`u7b z&oT0K65jd9gZQIQeH2?Zug1K&1z59Y8CI=WfVFFu5(MWWJ1d38vqp$Zkew62gAd(> zx$|crD=QtVR;|RkbsKF1WnDun2Kt7KFU2Rr{A|zx5`%+CPff+VIWz5u+R>4I#vodn z>T%EAcaUG>kVybOclJD+@u;h9pm8cNC*R94qy=r|BLJn*ttBuz;Yb7$YXFp{qHs}^ zu#sdm`#^L+kUBmZMWC5v09BiidbOcyJVf~vkAeO!^GXplK7g+7CgQ6m42PO+M0jkx zm-*B99_gWs>md-8Q+oFQh-6+j<#{ywMWf<<1h$|akiik;b6RsgNIut^c=-+$2))ae zE~plQVp_X;yadLYuv5!0iYR+}dZ^HBj%jVjsb5S5F2H}biw=|aEV zYwqV{WfBP06M9bST;N=Fl5!F6>2)37ru*LbIGc_a2p!T+ODaYAjuQY?(C$f1-zFFc z9mDS3ucE%b21{2gqhU#59U4N3otPv5YPnK)#bFKsP-)8qRDT{RNQ9%sbHT^H&+ z?*J18TOS$~B7o9nmI20I#Kt9Ip)VR%0kK{AdXJ#H?KY{3)(o8(kWXAQ=N z)Q4I;uhAW*&AMuxn2iAQPLMLFr&lMpwV5o^Xn}yI3~Q|)?dq=JJ1Vbst`DPspa)A9 zEy4Ubv+>OHKgZB;8$R^Ghw+I|{5G<)Q_<4afX0>@17CfEC)ft9c=vnm#?qx!#QSz3 z);EfGyyFoZK6V_ZPV7N<_aOT_hV2+dB|nU;j6z#eI~W|{HSJ1IFhJ~p)EKrGl@;Z^ z-0DR3zs;UfQ3*)M5D@6si7Jmg@`(9KJaq7&c|E9Ys6kQj8OqaE^mg^Ju6`;JKg-c? zBh(~Awt6#}_*9Br&EdFPIY-X)ljpY}=FA8f`%tv2OGpZ`j zgGP-RyH4jf7l$xdC{QR{BZ5DEh>;TWp^>nX=M~^R+UG-qUk%t1lINWvnok*pj zmzkZ5-27=sP0zy%FYH5Ibu+xa6h0@zLL;j*$e5O<;vEp`tcg~;Yvj|}gyw7<)9+YM zoXICXKtoh(QMJo{lzm!@zV2?)^C|3paSu)&Jxd_gg=2?Lu^c%#dZd`wiZN^E0s_)` zc#&l(FKxh0+qUDkfAjs=yQdWY{_UTmqO=LKr_V>}g(C980RH|T{*-jI9sl%?UqefC z3pQ-rfbV?khse)agfD;P8#I3R(5PuZ$@vndS7B>QPZ4~dJzdP_>uHd6V%5rpc=p*} zA~z?QZ8w0{mRehvdivBcw6xZdWBS=f$po@llt&kA^t8Xfk2Tb&ViYQA*!Fb|BR(#L zSK<*DlSo>pu^1d=`;DTvw*&3%t>mLUPuw=<1 z6y&5~DA+-Mu19iWG#+^1X54xAjo7ex0p`xlf+v0m$teV^p(dmxjWH5mc?W5H``9OG zEPK#mVxnfdx>%Mj=Aom3gXCq^z28Pb<%vXVxOM8?JKpgC@5%6Sc*xlqe|=#J5ULFY zVloK{jZ`=wvAesALXs9hdYXYyJtJT#L9cO(se(pVH3cv{qFr;E`q7C={k-8cwj;DEtOn@jf851Nvx;E+kEA%4R3Y&3?@kQ?~*`awo_G1&q^Sx<0pty zzRNJtJ8t~%49b3@GAX{fj-LEoOWUYv;t&Z!-Bcpm*Li=kFx9=w>9}c#_B9HsPp$X6 zx*wXXF!v2FRllwiJn@pf()#_cbsrJ?E|i zRarC=8m@d9ls3JV?_@=~)?g;Gui*-~;!uZXqmQyb^!-$xl)s z$Dp7v2b(u1ZN3G940eSAMb@J_sgATzHZ%ckQrcz)#QE9mZR;WNqj-Vgp2+izKe zZ8xpMwrv}1x_#-gWwur?jev97wCMx}UToN~kwA4RfpjJE3kumj9`yHivuq9k9O%_1 zix7N?0V;zSmUV=`Szm$_o!>7vMIpzwTAQfs64`eec6H^IDA3_GXXe5Q z?ln(rm>xtDd|XfKJw<0gVv3PaMg{u}^NHx*`4+x@-GQl4U%ini{U&PEoZsc>tP0d} z21QMm+U7fr4zoR^RkdzeqmZhrc-AoxjFb7BTADILBXe5s=<~?g__(!ba1EQ`~Q`Z0~T(SXo2d^FS3k`=8pj;8U$)@9LS%t+ybe4Ytd zKWQY6MkfJTWqBnoUMNRPODBSZqbNF4LjG>W%P;IfLv0H|3@~TrBCJ@k9xpumGA^7i zMRCzZJn_UUc=?sXXlm|ed6H=i23dkWba%Dl$zSfq^Uv(`Xqk# z=<}pAFY^iUy%yBg)#Chx3KXBZh@z9{tbLMbKyTc*0@G(^VdjiH)^h}{&05x1MevnP za5mF686Mcb2NhKpX>2l``f7r*nOL`WE#}Ue%k~^b@#zv&*VM7yDFcVb?f6=ej7BKq z;>Mw4gX`n>f)n+pC?$EGiugLqOeeBl` z%6iF(5eyFXQUtU713CyJ2Y24SgMd5E+((I~-x?4~O0{WtDIa45W<=sN=kjEZc%NLM z@IhKnHkHGB4nt4G)J|g#hWaR6od%Be$p2Tb2|as*gd+yiQ1j5pn2ofiX6BhSR$r$@ zwza0*#CY0`CjqAEQpg>Lsq1F3PZF=)o|YP)BXjdv(UiHuVU$Wx z>8ykj0*ua@WGA}U+!|PM!_PaZP9B+nMf1g{a`KWulGZ-D;O*+NyLD2q`cDwGnS^SY zCAcy=f%&i-EFTIE)lbvvBeJ-8H;LdtVAG!%kE|T6s_?-+nh0#VEFJ zT?1`=ICc6E)~sEGmbNO~e%CfCuOxUWziMl$2-IWEPwMAC_XPumnogH9Y$>bt8&@Mc z$A^!9>^Jf6|Nd=)!+fM9Wn$WlLUSG(l-C}IqyaqSiumRI%<`K{k z><|F?69Q~|mW3VGMQ}VA8nks}T5~2Jp`x%jVHEaHa&jE&n#Fb>L{m#W4jkH#dGi;s zT}sg0)WSZ=WS?rZpERWb2)?TkHj%b?`Eu0Aj|?C!8_^~@(k(v~+>@I0oIr=}i)T$1 zFf9dpmcK6r(y)Cn>Z+oFSTg{f>1jPLK2n-W>x!UZDggs2T}E+`GlEb37#_XUb&V=| z5ksRtrdwVZ> zx`)u+(MKAchwV4ripPKU0y^8`kdrafma52yXq+d&visS-iL4vbq0y$zMk`m(#qpE- zXy|s+NZrRaDL{K?CvLygHFCDg|C#chvblOv97IJ7T*VfdavAza% zwUzME4vLAELDq`|8G!`*W1}IYr=;MXyY3;VK4*PYQBj5q=Pu&roA1Q(Woy|M9+t<4 z6Q|B%c!(HiXcRGI#=((3;+t%?oz9xq8SEam(E!0|Kbvcq^vGAo1W>)C3DFMei+!VM zcV>*lfQRXI5+}uC`mAK!|KN54>pZqs6LRx2@Y5gt7$s**_`8>VB99^3$fhMcLkJFa z!$Y|z5HDx;Itn<37%oOwbaf#kHJP$1KqI3UGiGG7?K05ZI$-YQWQ1#jStgBa zXT2(mM6Bp6k$mI9)lRPoWG`}*G=XCs*)->KX&4quPnd3kI?+NNowO zI**DxO*!jFIA{i3YbK=?1$jp`B6k&krln_N-n@A@e*BnCnZ5ezUJA%|<9`Q)%A(af z!x)xQ4wseEg5O6FB4j@AWih6(!RYjcE(KQ&EL-(zTOuEUd0J&wkvI@YZp1qInC zWYorq@$q4Ts|MI_N}~;UR+4fj+j;7?M+xkdl&sb*na^y{!>H`oVYc%g29CrCNufP!Q8tmwB`E z32Z{>>usPyYGh=c#@g_)PS2(M9P& zf;69(fF}`I87aujNVau$X=#b1pH#$q3GUf8f%sVX8DryAM$#>1gRN7aG>FbeQCU@q zQ$;6m^3+MZ`pO>c-+zDrqLFt6mRVQw(>M)0d8i>3vEQhNN%I1yaj_o6Mrr4~#^z$l zna&uU!=d~fCx;UNYd}g--K7n2p&ak zI^IK`>cUO8tis1W`2iX}3&;y0o4rWQ@}qB{6`eh;xNYYStX;E$V7d?izx?3#Bb{xP zm=uo|)@NE_E^gUzD*e~S|*_M^R{mi^jC04Lw5A-+#q zht|Tzz~diBoPPvs*DlALIn!~n=s40-Q?PK+JR7C_i@*Fc{PVy31JP=ni^|twqb+@d=!m=WcGh%P8tp77z{`8IvZUEwWi|Lw~_%GdGy64(8wJp z01x5hY3=qOBDftuYezl$LtQjxyC`Go3Ah^wY}xTyA%v3>77cip&~MyY6*WT%97AX&73)l*g{&vrp(2G`sXmNh+9o&7sElIQ%B$lYHMmo zY_D}6irNi!X=4)e(k^(N0HFo;THG%}si|q8btp!WAaek)WQPfh%h~+T2rBYaLQaiy zo#9Qq`WA;bSh9%6-L`U-h5ZU&)4eHL^3pr6J48G#_%&I$y8qs2K6*YfjjPkMdWEk^ z`RI9lD!A8Qn*Esf{-p2~7z2k)NN7q(ncJ2Em$T z%l!Gjrj%qg%f(J=dX}vLeRcP%=xT2#$ec|;5l=wXhjS%GR0;yLQeQfEei-=$(`ZrW zprQxH4x=Y!RwP{8`IRh6QW}Rv_bp%jmEAWilOt&L#V1K!-2i~@zj%# z>$)zLwK`57QeXf|fxopb+fuu7V@(KKAk7!@9Lw@bBOJ zG0vW?V;Qp1)Z9P;z7r3vDVWcMc`Cc=A z=eORC-~8?O;E_ij#Ij`z@%|4yLIs|RlCx(CYND})VD|$bd>8I};11lpa~t0M-iHZ% zJt!_NA_$&F<=eu(?Z?4`2T)pe5&eBqP;7rHacxYoV;)J5BO?UC!vvx<5Qc|>7z%1? zKMr$d7f?}lP+`@Yv;S4AR-?S40?kxl@|2+W)E5G9MvjqzfGaYH-rYxB+IK${oOP+9 z?911U#*MBoKWE>=*WBn%T1l9R5b7Nx?F?lWGr=!%Bg`Q^RA&afxJFIo|c=mK)^@d3L+yt5la@&#Kw(Fao@c= zaQM)RNK6K9zGV#_`{nnrW!nP0|ATj9<(iqe`L-RXtgb_ST_fc}1G2JX@Yyf?KHm1w z?KFsPw;5EgZxl1S&=FW`Ri1eqmjxvyF-1vs^!4Ex5 zc?GN{?fJaPZ0~s1DP*%Ag@tKIOiVy|c?~+dG`q|8rE%2T*JrXo%TO8`nyeiQ3Jclw z+7HtQkCz4o6YXHWJp)aYEg@Vue+GktJ+>*RqUr)^8U($E*mh&M`<}ZoefkU>ICKE# z&mTi~ANxQ9&Cx^TZGre0_x1w~@0sH`>%WrWX|Z!=5Vsr2<$ z{J%3;xx)f%qUeBx>kHTa=35=!V96pM*Y~SlSFfwBT!k@NbpLwh$h)F|aA5HfC zdV|#~A}CEaP8J;6;TLdMG8hFM<@U#M@pRWc z_h8Y&B@}XFxOkz4&uHY1GDau4MEUr9JU{i0lV@C9B4tr5qBK<`{wJ7>_a&+%6tF(Z z42{naj3w%bNKM^J&Jbi$aqFCT$sCQ+da0Q-g(+nnOBtfIq2n~5rPy^Ml&+5qccFhE z2yKMaj#H(5^vG#~%JX>qmycurKDjhHL?!6Q#?@PJaPKj^yn7F7s66ZI+VRi-^zV4( z<&y+q*`^e=Q@y695_9LxHCIi4`4|6yuC^d{-f^Fu$NatT|A=LZL3?XEPMkbr(_n`W z9HPQHj;hK!f{_?>cMTA9kFku})huu#1?!gp@d)KpJkto3bF8nNuZ^Z=jfq(W=8(bvJ@ex#-*612=>Kl-TT zl5yzJ5u7`D1c9VX<`WBB?h)&(OO&G4NT@i_mPqk)Xm|iKXXN0nyKkbR&!Q}+L2~g7 z7A{(9F1cD-TBz8yImV&K%e1ZUZgfDW8(q1ma5ZlzxK|?Yx$C*Fe%?(hGP>asfAKT& z`lTQ+5DvO+Kp~ulcu1f^fK+QTheHFFo|T_}y6%8>@*1y?5HOlqXL*V@M#&2yTkbX@ zULnAf7XkSK4e`1LV1xi|nUaA* z9eeHdGjFXSC0~=~Z9Oql(VvnYSDFNzYCdzA&b&0xB;9OvP@T-6CC^eWSR3$NxogxR z3fkP)-Q7&XXAVB|+21EEW#Q}J_$TW5b_0c(nJGAW;uXxAlZjm~K8`>A>>n`=FE(tx z4X00+kUkpm$xreaG;D54;Dy01d2kFJ6B2C4#mjY`$SFDyq-n;Gsik zYwIO&OrZSIhCFM;QSOQ@282e^8g!Z;}I|)jDYe&WiT*q~MXg_J0;LtNhc|>Djbim$i zqyhT-pZFNI+;9W_`mg^A#b-`p#p0dXwhseS~3HxR8>i7h8 zrZcM~xu(rX>JLd@5V(%8{Re`h1kyf!52B>x1X|nck(rf-wvJW|5>pjS%VT~gSZ*4Q z(eg~vL%FG8YPsP{tNQ zO6w@+2T)j$i+k?91DTW+q6OC&GeW$MAXGSEVA`ZHCt(Q%Wg@|+UKTNScD7$01+}NH zRRHI{4KEvo>zCfub^GB2=5=MUWRV$n7zlRraRt}^hW`!!o#B$=Vu<|yMuT`l*0?(| z>0Wa{qG;W@Hc=jz6()IvO2gK#gU^g>!$!yerZ(YdbRs5Nqqi~W?GYFop|B-5qtZ~lY(1LE z3)MwaMg&kAo(i`YTZ*76$~IPLN-mmZv1vWNpOHO-%4m*_{0@hx*s1sgbh~>7DAWn| zdUQ(DC|X;B_~ti%h)@3Er}6A_FHjMuV|XwDG2>~NJ990@h7$0@|9k>}_cvchOMMVa z7v8{oiRkaAB23OkW=6hEZ}oQdAS-JoQZr_vp{5!wO&#d()0#ReSJq#ySv2~p_8!sH zyHGB{wKk%Jh6yg>#;N?GkdP?ApsCFsoH=t0Wu--kjTy%58M#=vpb*<{S%;7R!H00i z?OO;?(~zB`87HmJZ=<5^WnLaMx7AWf2XMOh1gfgb5gYKcUDcG19uSGxI!yv6QH2Hu z1nhlYuWg2s3%{zW8dQ{*p|!1*b-wH5gMvRt&1eR$$zTWLW?KGZvvpAQNC)UX)=(c+jQS~j{HV& zuCR>ZN0`Q_Xoz*> zvo<53KVGslcwK8ihY3)%hEO}h#Y23O^^jX8jgE@1)K`pQBi3YzKAA)xjZZB*NXtya z85*IFKKet{)RtoV_Vt)PBO9yMEa82EsQz9I4UP~rCZRBI2IkCNNURZqxEMeD-Xzk0 zlQuwy^vOn(2t-N?;LrLl7>a&xt|aufrD{REP|b`Jgrf8ztp zGY?CbEhMn&MO$kVE|e7Gr5B#T&wlnJeCI!Yiszo&V;d!>O`FcPR~-P6(T{&XBlQIYZNCo75G&(k)Ry^v%TQ%fm@=RL0l{h0$>aZqD}%eH@rociF+d@D5DiTn-%M~7 z+hj4aude=ntr+>7lt<(}SDESiM8SP7GF&dxm1$iaCk(u-du|)s8tpJpuvme+NPFJ++}ySgX$LfW{bDR->}^Twqj5TAv_Kq{Y)gU(XFRAm)k z>wfIFYQ!(GgaO*n!TbaOG`(#n`S5pZYdZ#lK`VDhSG!(Da6rokVp)$YOQ)-+1;L?C zESx_NTW;8fjcc|u9ZjEsa&Z(zB_~lQG)gHAd(1DV`4{b4eAiV>+CtxuzAZmBqw>15b$Eb z!nw%ENTWgo7R+CWWlNV>oAJhb@dY%BAh6DI z=z-BOY?O+_I}Sa%-$l2P@iNWYtdW6Fz3-;MT-^I%+K;^c8hH^8k?^g48qO3pjRpg(dWR1?x7eNpn*yH7Uh93e)I#r>Bl!`X z*X}5K)lR(Wl+!7z{7 z)!>ju-2_ndUA(5~_MPb3WRfI+>S}%BWU9LL_4gnlH4$+Hp}pN5xM{~0Y}&jYUEN(+ zzH$X=*N1pUZ(K5Zx?>3lJ8|RYx8vL2cnUkVz8&Y!)uXFJMwOQaYB`@v!)HJHMf~)q zzeGlQHj0Z%%j~Pk8C& z=h!zRRyLjfmYbb{)U-H)-)Sf>FU7%whY4OoCU&&OSL-E}hL60}*FS&_8`t5BU;G<< z;q!lHCq2FW9rxnXfAk0V>%aOdeDV)I#?LR{4?g+3w(DMgcZ2=?@R66EeDX1T_xt~W zJMY?w#Y+~k9|!U1&z{8(e(*iK_`)8W_3+Vf3bK@H!zN_zFP9X2k-sR`*6dyEw*GMH6@cqC}k6Ld}%7v%RwNJY3`+B+3xX-!61zw zCf3s2#y;^NB{`Y()Dj!Hh|}o(2$EA$D3jvZmI9;9cO=%<-P+7F>6g^zl#X;DnJIbT zl=u3AsBMx!A`@{kit$a+$U4(+-Q}mwagL?1cY~VD4P-4o>lE02U%nL%PN5wJa2QEJ ztY%gk8A8RA0JNQeylre~oUZqr=l{nB6@Rk$zhS~~SxJZt9QygcAw<&R>!nNgIelIo z-O&~Iw}PuMO{q;0^tdz9snMCs(MCSSyy5gBgPVslI(l{6ir@6xEsG<7+~1N5+J$US zP;kqisIt*IA#EhkBKgtLAc4`aoj$Z=ncSw#p|BmGz^LD^tQTa-|ZB z`|r9BU!|gZ>=!@7*T3=ic;Nn$_q3r!ieUu(eLd*v>R_H@w%$(b0psG6*}xiw zpwjK{Mm)j%#?7no(A)39{SV!V2N|<7bhdOWTQOuyB@P|lM?g}A-7h_l@BGKVVgLSD zP+ePrBS#P6;)M&Q__Uei#L?qOO-w;sb1SMVYtYuxfw)*7YpS(kqD}S-{|R8p(Y*N# zB~3bjUwsyZw)S>ZR92#~zQOugqg3)KsnI^`3!_Pm>}gG?fSUT~+QERX@quV9Opli5 z<$EqoI%T;sxODBLL0Srby1~-qXXLfXg9C`2e4NotcWtPadg$m?0Y9x%mPhQJ(tTp6aB#jkb$7Dnf8q8J7*yT0S#HLR znYL^sHI-l_G0Es(hb7p$Xc|3F&}a=^GOR?h#Aer(F3)3 z{>igAeyA1y`1e1?FCW`OT8}}%n}hRb>+t-u2aJD@96E(hf9kJs?o1^Os4UWA5}KPk z(NN!p-mV}5TACy81LRwuPosQeG(bnlGi`jXo`C#3fp90=G=P*e`R5!Yt%i`w-+%R& zpTb}N&0nFgu)zA9B+ULAXB@JA(6W(~lmOPOSp#@+YbiMJDo{^@5vjc{)F*UG(tDwLmzq<-%F(2$Y)uTFs-ls9ZM{a1m-)GG%(J#4#Pf1$wbX8ke=8dQMRlxWS&Nnle3VW zJ&o^qDcj=srVMmH`&drw$I0JXwnLfHJ3zTNW`}UZk$ziqUN^%OHR3Q7l8O zH^ID$^!AThdu#Ms#_%8kdx%D~m5ubEYi`-DCrr5})QFt|ga2742_?6+wTVlSOzR^d zkn1!A^Vd28EuI(nRDslNDxkY<-vqzFES$!Z#W4``TnNDW&ZxJ4R4~@Qx(~1o5|x_RozIT&uqdWvXWEe%v+)s z_xnWQa+3Py3SlR{p%9Um+T%4LGPz5%b~#QJUT;|3ofP#>V(9U+ucqSWRp+0jQLy>dl0P z$F-|9mcWi+%8np)Mwrw9QL$qb{7lOii%_rusc9+r@JD_JTW{Qg?5s>GpjB8ne=agI zQ>e&%1eteIU?(!YVN_HU;g+3i(b8Uz=U;dZbLMBGqq`S}4?o9t>B71V%kZxE+=kO< z4x)FU8H*QBr|=)Zf+Y*kLj|yX$6aib61^d=qjS8jYYL77b>VUceCnCYfYpg^xOAQ0_54I5 zrjhTs-z_qm%fB6-P`MSHWdiyYWgC;^r9f*rm4__@;Z4!4W3cg$`Kmt!-bA-Hi$I#x zNVi5AM`#oXtcs3x_=DC1i+8NJOv^2|fdKy2k_hdeNFdKHTf7)`^-b(^@q}D#`EjnK zk~FEZ=s*GjT_^ErDA2>7MIVz4WX7X?m| zlYQ{|f!^LW+^~5qHf&gf3#7TCQ|IuuhwehCe-KaqYA+gV+i<4%JRX1U8JsPyV4{BJ z=QlsYS{~BaRE?*ed=bC+`IFTBO~^0I!NZT-i-v|))Yo+(CpVYISd?wHdf~-a(bpYf z+r={ttxN8~`i+a&1{aL}<@I8az)~|A8t0YI-+tl_8G_mXc<|sc(zZ4~Izi8;(-_p~ z^!f8uG*0_$eXjPUR8-VhJ0vCsY~=Ik@zdz;>atz&n&qgjDYF?G`P0^fiM0r^? z4jwp$n(BHiU%DK=c!KML2XO325f1DxBKTI@`waWYyM(AHRtI{p|8!`^7)6zrU{Sm! zzKJ2o)J#)L_ltP`nPVV$+DFQy?BA=fsYWK8N zjHNeTH08+rOySBXl=aHz#BdB(gHU}>N=mR@-#P|P{l+9LNjo-|VtiyQhI~70Yb52T z@1>VsqQDLjaAs40GiTnfs%|shj+aAtmPz1s)~wkSig{Q@K@2L!it;)FDanL5Duxu6 ziu@d{6Gf7!NGL=-2^5shIpdNqQc^Zbtj!%Xb~W|yiA{i)%Ev~VC|4-b_&kL;m9pxj zXGg~+%c5z+kKs@Ua`N-A^Y)!oB7I1u3{pE)RhDAo#&wuG zZ#ot(nM1ilQ+uorO$}v8NsGZ(zV>f;>WODDV|Eq>2pEnWK8_IEWAm1k=nvN8pTGEZ zyt4Nd+(y8v^;BsT`2K`6%$_}ufH8-{UQ^yNHg(z5)Pg(iyc5TcA4BkU9?z&eWkWT#tcM2uyT zaWYPMZL&L7AV_N&2QYVbK6dQb!hRgL-SNd|PGRQE*(fSz-U9=s{FIu=Rp3n{ghpVO zLYUyfL14_*Q);M+!N40kSG1}i0HwAuI_7T!nvD9?b(fa}0Hr$wT6JAZNZjYmccyrS zf6i~#C!GG}aQU|*&(sGFKz2a2Mg(KXKS=~VT01P)I5d9b&ox%Nh#fvt+088&-_v0b z@&hWsqvs9i@frQrRHsfU8VrSKeCSMX@v<{IW*#N@oOoH+HH|;cbmR+iIgOaswodqb zi7bzwz%UbKWp!w2m48Sd%c_le<1B;REvgNi_R_j(8JK1qu+5dO`bgkb{Gz&E3hFXN z6@u?;IgB>42{#N3blW<}b?a6#opH($KQ5M(;P#!j5^#m^%U?W=wzd|mS-l*a)~_eu z0^J0kY<1ERc``0Yc`<;^G*>m!+W&1j`wYKBT*)q(TJJWok3T&5`H6hqf zo;097&ivc4ZTm{Jwp5_x+!-_6G?#7lWQB%@Z{K0_SLz0KAJWp~mB3?0 z>+IRnSf>#KpgKsRm2D{6k*gvdLEGC$fJ#u=+T4t`_D;5g)<=8MLtvPgkZz})ZQisU zWu;Z9uB=0Dc0N|GTFy4{5#ZL~;Nc=RqnG)mVQ`3Tz$TU~#d|o3MJ_dMsbL4$GIXBOqNx<8&cbui1*tn{Q^C!#G`Z5#0mYd?lkv zzL=A6|NVEdziBv-mPsbzaOuk%3X{8N5>RAgC^`)0SYPe!?KY*5LE#lefh2-;gEQ(m zSwTb~9wSx}ftW|<#_Rle2{93ejfAoh<*Z&OBqStdAd2Og}xeOToL|)-~X{)lT=-+!YavW?t) zBlC~Ec76FufjYeL8qiNBlNeUGbdTvefX?~tjD(I|8VMB$b(|18`43WQIf_cBIswTk z8R+ir!;??^iXe#~G(X!wiY)Cjw9IR3$|*0J_zVq5D&5A$R+OAQg;OVsC^*leqqUZT zRse92iXupm(MiSFNoA~cQB)KJa=`)p9<}@0X>G=_l~;gM3T2Gt3WWivQxA>iO34Vg zNmi)&bh?j@36?hwXY_|p(K{R5m;C>h4o0E~=rr)A~0r9=QJ=%$!j` zp?y2ntlEI1hf1(y*?P*jC@R-_{OVU!$W$clon1J6>J$NL1{M(D{^h{H%iByn7p)rD!P6EzsG&Oc$&npKBpvDMTyI7Y)C@CpJb#=W>%h|>#wWrB) zjn+v1I-pIUU!%<9V}qn09~Lj2&H9g_hkdVu3s$aPhl>|W(c9Z=AT&~MIAHQJA2{>9 zmxF$Z0>u}~OLtx~ z)@|x&>{#-Wrsy>&Gb|8lZLfMcAX*tIFKYv~r>!3)&#YU!hG4COZRBCU<{&F~22P*8 zh_((LN6E7Ax<*cQ_=BzKH9x1Zw9}m3*i7EqS769INFZ9@*^2gCazN4CIMG1S zF`&H!LZ0|2Y`bwid8Hf2jvc_tm5Xus;6B`a&#eT8op}1$M=^7DCO-YAAI5_Z--?Y} z*3wWZK_`u{m>7cZxE_4?_uhd|{o%)P+Z~%&?nZQW)#HJ;--4drF30J9)DX^JI7v`D zg8JGn^!HLW5nOBSXa8U`HmqMvgRTM_nA0Z^u$o7zyjvhT>-VsinDxv{hi-N+LG-kSy6M%VwRG_SYo*Lj&{;rtTBwwm&zw21&EmJvT(UN zh)LzAE7penb=mN;t76V*|xO!~(>-@29(jZ9vr*MOqP@ZZ#ZY7;k@P!E^GzU%Yq`{8iue#Et@ z!qv~~Q*AXR4TM8v9{TRaiG$;(Q1y_)aDy`%Dw>lb)VqxQu5?VG5XbML84NT9-MjwIAGtWG0(=_=7`BV-bf}KH}I)0Y-sPv+fm~INc*Q2Fb zuGUIXUDZrE(odkNTs4!Th41MIBNw1GWRlfb0mvFFVQZzjk8>=;;QhZdJ zI_sLxYJH}pg20fL1dS7W)`wi^YPLP64o_XwPHOM%wI)NdJ#YR;iDK1 zB@+zzZO48r<<-tRZbfcRA-?(bAET+ZkAU?7bM5q_pZtWN^cX?(2o=UD96x>v%a^Z4 zM`s6t+j(1CInX;mks1pfnW?2qVw1wVsh}Mr9?#L*R_Coist|YjRklH1bF=#PSVLvGpJ&$!kX@>PWyKfk;u&Nvv77 z4(HEbwCQ*OEf+W%4H`{~$iiU)5Ne+;5%V3rr{69p)ipP`e5Fr;Q2VWScumi%?8ZZk z0(N$fQD9P|rFzcpyU$;W`mH=2eu@OB4v=&5RnV-e{JCnxQqRflp!!cEoEl+uHZH~R zx(qPUHPd6>{iHv=H_XP?dOZOkEq&2%={^-p07Y=n1@cb0ba=rKeDSe%^kj2O2m3UK z??xNoI!j}srL~uRDd21x-D$V*&U+j6HBd<~YKiK9E#c91er2=`QffQXy8?Uypo$*S z`?$?Wj1vU*(eTL5PBHKa{yux=Bn_?#JowOqOlANtz48P$Zd!u6hO>C)`A5wscvk*& zl%7A2y1I*a*L!v%D<>X5ee?&!2wm8^Wj*%pdjW5MT$af>hzeBm-m~ zO|5C9;kXD>M4ar})gkiw)!!$Mx+^|% z`gxL6uX=~fHHkoWf*4;PQkohyl2o7~)^CCjjU;JzoujbCbc_WXjGt3qXF{WscF|C;VizZ(JKN(8%+{u@DdQ|^qqJr z>3E}QSE1{BEJ1|;DX&ry=-4}LiqYt--q%#Drj%J;${Rawm|2fed20zka!L-gbG@Uz z2T7^Zk(@joCFja0z>g3}okM$DC#ouH;PWORBdq`qfk5)$Pu#u;tA zGB^g1(w!rQD5ESUr~AGs~ZBx-kv-|1=jICr)Javk)-u9rziH2O$)e!mAVzVsaap{uK#M&1I$Bn=IXc=@H5QB-`++)!oEc+wh7 z9VHq|-qz9`$qo%(jS@RZY)~}VyS4#Kn{N07)gft?QDPw?c)d~NrwsDMbe3rjW)jfP zo;91mUT&P6We|NdvO_c+6_i_AQW6SsbCF6Ok|&P<+cMw}upe|r{TyUv%g630!D$_` zGBfeugAd{D55EmdS1dt8OAT9AOEG$A5G&n2w(JPYJj}9;u&uh0;Aek~cJo>fl9LAT z(EZEsAK&>DzWSAq;e)@i4WItwhw-<6`%xOVGA=vF)AFd1LZcv^JfDHS&SVVr<)Eoi z2Px!W{-R|B_r!0*v6w!6DGiokoITfo+WLOV<}4(p%}1;^i-x&&+vi}6vU-s6LzLl? zp+X$#%Nbm{ny=qjnDlKKqq2DIe-fjBp+3bRvYO<1UxO|pG>uAViYPWF!0!_L0-_?^ z$l(0esDp-;HJmNyx|$Z!!fj1ah^gg5LEjx>7Q^x%HHFrtvILfn8bWM9QDJHRZ-@vI z6q7`Kyj8(5CSFTUu0VHOdQ2RzpzQy`U}e)NOqh&piqH9asoaWgi2N>Im@2x#{T`W~ z8+A{glihd2)!(O%mlc?RqN_L*!k5E=&+32u$48uZu6Q6Ec+DAxWO*<1zU08j$jGHS z2)3qbpd4%Ek(uD=9{O zOC<(Fn$3x(GKxcUTRWPY+p&A!E4+n^vB z`ou4v!l8r5ajy8HeZKJG%lOGpeu^VU597#@L-_HJe~c%de4JqWoK5j>-*zK@`!_#` z4}S1N1lI4x^l1f5N3OD%zl|J=zSx*o1+}$}2C_UlaV9A_2|AfY;7XLH15RvBvVk^d zI@zH)heodz73_IN_uAz&c-g&w)u+3O$<~O5-@7b(A_1l|E$*%vbv8pu`A0Em8t9RGBMtUwuLkR9eJp>bPF>w{I5M7nY<$aTySFv-q77zoq|t6Zuk-6u&`uhR zCSUE?z703tco+FP9>02WKVrrM=<0|xL4QGDkW%jj3M)`O|2n6JzAQ>4M$^4}wECVPk%(JLvCb3LcCxTh` zFleegOV6hzAv-ezGYSh(P>@3~IY{|9WE-k-^Rn5`arnUxzDqfA1`ogUZFtxF-i?z* zC-CUceoEdLLV#(@M{h!s2Lqul(g0ji` zXnrzgPmja2X&&5g!+iYnzkCi~{Nm>b%zfkWGMS}`(2{=WL&Yl8rglg1Sam!Il?0m#>;pd~W8K3Ur0weUs`0yhb9FL~2L z3sm%E(~C4D<%&m}4F>vjwz3qKz@=O-g+ZZhU{uhjB!7?`xHXq6O)e<5{Jjlou7}kiYHq7WAlc(mf>l$s) z$Q8@u^(HfK3jbcMv5H4#Mj-`qCK~HH`Cf>>3y_kO&3B}*$I#Uov_<(qAEp#X;7g3}}L1$vN~Glnny!{_j^KX?~9gC&TL>qLxa*w$C|^>(p6 z<#x$&h_8{~&;aW)tf|8R+uWcHT7!dHyGsZyXZ{{P68x!12&A#?gBWBQF#INyZbE7*!ET<;v=&GS z;?|pQ#CzWLPQ2~y4`TJ2m23-*)Tvh`vq?*&1yPIs7fC9rZEf=#wYq3UyZhT)TM39e z2(Afs_}dN`us(3)ltz{G`&#ncS=Spj+U&Oj7?rWs_gZ;W2nJgNs?YFm;{iAF9q0RH z9pa{G!7U4;=tLKk&P0(p*t72Fr_ynFK__*2(A2C^pYdKbYB;Z zhSrug@=QBAI=j)@+J=s{He1$UyW(wRU-c&MY0BKq(^7DPm794xWma9JUt`Sq`uutG zFk{AStXZ=G>(^{VPIiHeAAavC)K&Mw=gH&s3s^9F zJwEbVpTW)@@4%ed%P4yW$s^8;sg~NvsP%hw4u6h~`bv&i9r;~Gkw&1^yQ*H8TrLIG zTYV`ooRghro+S1kIEsDykD;?mOC_|S+A)9?G_rfHyb6a;6yfOU(`CHh&{Wco@GDM=0keJJM zjJ4l#=QKL1Wml5H0mQ}y%x|a>Sw!&BXmFNo>iU)U-bk2yO(=!024KfW7%6--!6gQ3 zC8MZAbMxjpj4I2BgeohA-;%O-}pOn;eJ5TwECw^roisTm-kT>J( z9Q5-g7pRo=qGm+`EPxEt0p_c9e+RVmt`RMB*@if4;$t3#Du2}HF~Gh zmRP=M0Vn1@)Pp&5=iuRYKZN(a|2>#Fb2=6;T56k)v=evU!UeeZ{`)X{&J31%2L2TZ(l7KS`4?J|gdGa`MYA z`>}G>8n&gEN+=UI-*PjubF;Bx^(vM#7IJ;%i`SXb!w3%av#nDNH1zceD6>JLMyRxU zS?&=mUa}Zlwrs}C8PiZ#Q;+%c=VN3@8!&>n{mwh^@{7Bu^g5U>44{UF2dJE=SUgcS z5+`>qa|l{0E6efBbI)VtiglFBTAvs~S$QSSP}ynegDs6<8OGTAqNCVoXRtxMtz{5u z%iy4+>~6k!GcvN0sI&)|M!9W{xNxD=d?ETtL+V$_DhI?Vx&V>UbjfA;pnAI_@0J&h zAYIppwrEG+62g4W!6>CIwP_gjia8V!R7e#rT)|AI;NowD|%;$<&bfq z5xihX>vCx{X-Ns`+!)dY()_Iti7G99&}epkZVt|#J5S!E?j%5J@94#;GZzSgy7{Wl zwD~Xrq{<}TA7Ni;c4M6KLi$|wa(GhdD?8O!`LO=Hz;FCcz9hf07x>H&!EF?2RU4m1 z;7|0UoyN|~FTH{T1aCSCZJ=iqvu4l6?RU+_)4wdjh4U3Sd*&jJA1lIRk3Wyr_5sAl zrLi0_7zlQtxcDT_7M0Wy@EizM&Hp6^*2; zK>|>fj>cWE8XGsSq~X(r(z3I}Frpi_rRu;ZG&3?XL=JYk`ih{l)3roGeqPm|l~wf= zk|Vh5_S>*!^9C$lumBr3tjF3_%dus{YRsCEjl~P+Au++r_H8q_YUYJQUI7vkv3A{h z8W~;a=<30uMT_vKpZR0-^!KoDqj1-~58~AEVpNjH1_wv6eECuo%*dj#rkRi~mei7{wkpZ0V%p`!E{8fr=qGZw^1un*^oi&?Kh?6~Ph*82kG z&?)!>DYgMAGdmNVoy{bdek@snLY#F}fvIO|W$Be0m!s`pJ#(GVNCUM8m!inK$EIUj7#m403 zfQlt0UTeD;Y$QY3Ys6#Hq%H?jXeu_ObP9L#EMjck*!U%!$Jp9v!WY~AZ5al&`pc#XbxgvI1B+<+5CB|TMS;U%chs5eE2=`o`M6=lnVnD?;yGtj!d+jj94+#;TqY&nSWYQ_Q1i$0TZHypN^$YPi?SSuRS$ioc zHR9p!$P^v%d806uRSvb8nv&8zeJ~w?Z-G6{z))V>hXIY`#s!x^WFH$ zzy1^3E*c5(NtV|QH*CO@zkCe0?z|a0ciwC3S_`KYu)T+{a`iNoAwT$4I?u>lkKYk3y;yWj1o@_jT|aN=UB>!80JMcB8ur!X$v6e z+QC8Z;0222-ru= zAmMu=C8fs?MftE6I2~m@#M1us4@!og@;(SO?OhvX_ zaZn*{X7A~R@(!+Kkt^1OgZ!$@rhCnpi zU!6{xjf!JGP_Ai%kDf?tQMD$@WK-JjRw6vNf7fZVMg()0H*{#EpJ&tgI%>0HYz}PRO59O zK+i}@Nw^4n@QSh_xYDSNS(_U2mz8C7A%!hv;s_aw|33(kfb=!-^)&PUqv2|h_*Msp z9-R#c?$of2j7Ydee4i*@D@1})H|Trh?>7@BYb*Eq<@@1J=4&%+&aX*>o*5<`Hn+A= zut_;naQAdmRFHpT<)(#owqMn6C@%~|+dW0*$$rv%8lQ3M#=fJ_mHaSchB8H0wJTgeRG>oMHlkui2ynH2i#L&o zq?Ami8;jyoXL01vNu0k}j+B%%f}eN-vk|%w1NZ!S&)%*o&`2vLlbo)V@8>bihzV4AwPA{YN9!Qt z2=GZ4A<~L=6pzUB0cpiHo7pCr@MfJUg7S0nWWO;wza1SResS+l97RtN!Cq3D_Je$_ zO*KwA+}-Fl-7fK)`FI{Hs};88Ev9i zr7du38~I4HIx$J3!qR;L)pA+bJJ4$&R*vgMrwUFv+@0Ahxb!lwIox`=ei~684vnF# zyaGi<#W;Ps2rut`0s9Z^LsySRwS0!3hiIuOYF)GQn;=o^teKYMSYPr>c{w~~BcX%} z1AV=`JZy&%c*r;7@t6U8=y%?UuYL22SiW)rc`VUJ)}mvzfu|bFRxHB%e&d~3vvw(gP6!vuOOTN4 zLvDT+>1-6IPo2P*zxt1O{K+R->L|V&Am|++y;sxF=*KLAD>;$R&85*tV|OUnhvbA< z@~DicSY)Oo<2Qcew{h^mt9a+b_Y;WHa$%6vilsqeqo!=*>?}W4tXRxzQTV5S{6F~Q zpL_o1Vx-ib?y_8jTwRQN#FCN3+{O#Z2^MCevlwP>Vaz!IG z#fNpP79l=5gxD3&Pni$oIQ#!xiBrMxN%k4#fQ8W(8w$8YL z_=kU^GKwx?GSQ=MzVRSxnf zHU>aM-$v?JXi0HD}6)Wu^1cD8qXwDmj?0pk5A+4|MWDz_?JIG<#{Tiq-EIk ztK)e2`9l<89<(;Lqq(saM-QK}QQucy*=2tD)~(r!nrbSCQOy(u@Qa`Q68GQ#AfDUx zG+un+RRXXm?0w}B7S3Hyg=Y>k9eI8Y%L-@eE{s1!yS0f{J9(>8G z2t21TtvJ@j&prxJX*rt&3g@gqM{@^S2x0??1-$1$*~N>t=Ci%M4ITm=xnr7DIG=U* zqN%nFc25go0an4YKQ2TQ1|gveuY*PZub`SO+M z?(8L~m}Z8Cvl&I74qd1>wbOfSB-%y^rNrbl!T5$eB4w^O{49^HN7TAJ-XGBjJwd&k z*9){w6-1w!j<=~}zNaYqb@}EpO}{p}!Qoq#IWlNDKzKxwU{qjONk+bJGB*PF+NXdh zuc=J7%*Fl9^69?lEfDWRGJ%msIbDz|-Y_7o;Yx-$Z=AKgc6Q5kl3V~qYn`Q@QT=3y zS-F{Hn2!YrjbEIqhl5j3l_N3W!^ZXN>~Mvdv!-Fwrj54lHz^?z{r&QB>oEgCMwQMC z*Kw+%0e!~C$?y}{72_~Qu|N4cnlXmpFf}cJTW;BA=cvE;{qMw`ci)N6e&MtD6^ ztu;ta9>X`j`RBOt#^vblt;N7#18%!>BR>CyPhi!mIrx{ad;#xxWGAK-2H3ux=;*5A z`$Ndi(^|zr@^CL@fi~?86Bv&nH-~h}Hma*{AlM9GI2b}l_b58rX^4{F)t|Z_@Asm- zq6|O(#p5Wap{4fKh9xy?Q)2_cY#YkU%b`Ose)j0k@uMI7h~?KPzGDcbq-J3A`ql7i zn>|BKRT=i~IY6ULCn}AbhY8KFc)Whwl-S(dhJy!>(BO!}ubzG$-~P@IFmw7`l$BMX zgFsa6pP7}3`2?{$wr#`e)vNH}0}tBn{KnQc8aO)ftc&lDBi=V^JLUrvS$JUmoL*#{o$X{_{^i>JRJ)b%r`#N1}^cZGs7m1 zb?PPYs9;wd5)23GLdpQm0=(HUxwHCFS}UxCF(A20I#)Zs+B#ZkktD&Fn83FUFVlLW zg*B{mPxYpz;8e13=`A=zwpy=2(Zf`=Fh7X?V6W}eV%dSrrfx$R&+H<`D}F2SQu<>@HFsT0=oQ-!J8W2&T`_nb0K7)*#TP~kcC za6;sF1-&k%B}HodN?@Q78Z~uVaxy_j4gyqEn#L68DrgkZLxp8i-YjHtaynXCI`RAq z&m%f^3^}>kCV1snuco?!GDQ5UjYyISDwhLX%pkSkZeG$-0JXKs;-})1RFy*HJx#gl z{U|NlAxPjgTlS#}@HtHnMGK@^y+b-mY=9)DKYB^&l-}E=r0juy^l46rVngv*(I%;^ZMaYkAT9WqA6jUD&;Q z4@yc(P*z%vFMQ#PC_mpyVV*{inQXh)&zGKMIw?4Q>@@!RFTaHJ^g=3`hw#mRdmK+b z^$HcsAUZooaPfRK!DA5JT_aR}4LEy-3UEMc1*2?zr`FYJ6jWYF;^O0N6P2!e2q-i? z>r5%?sK{=lr6=R&o42!nhfq{pgsO^4b6(!srW2XkZ4*ptaw?Tp(AIm_)z>30Zw5{l zo#Xuu%$~i7rUj=@o<%>)(Z+YRL_@mZ5`FShxr%;lgp>e7>rgW@ldyW#65b3E zq&HI`pC<^JgJZ`}hS!9uF4_GJ{3Pn>^mUTdB%BG{OKr5@tQ786vZcw-VgxP zJMK({v&TVv;qsEwb@Fk5hRaJX2vr)2dS0MKyU7)dhsbYASAbUjc0Ka)64vD-q*nn{ zt?$)Tu#~ArPBjv&_XLgvhP81mi?7Iv> z?ZVcSe$kn;qzNA?tLstU*oN~Ls@aZy_PKnPI%N^C(Gmr7uc(vDSXMQK_&^i?M0otI zr7!$NKI|bd+qPpH<}H|o4ANM3b{d|3`bm=!cinTh`O@v+GX;gYtV=Y?DoUxx6G7HP zeqI)Jc%zLfzOwr{bAj}&Z+#U%dGyDuXFBT~O}ei{YjYWHx_Lcz?|B-3_kaEhFYI~= zci(*ny81e>ZsSVxy0Cch8XL{uymc)Krp;u!gIKh1fgRMac+ngzT{@2dEgJa+xj0*V zia@Ll35gygC#5j21p8Efo;!DjJoo}CDjTg`!{o*Oi^IYN^XycyWy_Ya?L&5~r`Esg z)G5sp=;X5g;2^5&nz3lnT!Kh1YU>+$T|SgOEK@fM^Jichfo6M04=T!Qm`@!J>_19C z+>YX+(*&g_QBl!sax5;+kM17w-n?miCz~MCN5d_i#_MxvZmGmOAGx3W*N?{fO48dP zl2YZitp&dLQ3A|(8sc$iYVN0~^x3HF5Dm{=FCRgDot93d+WO?N(I5>(ZMe!H9Sl=W z5u}eq*>R()TXZx*DCtnZQ-gq`q|HmbL4yR$KRSBYJO|u+?@soGT;yqmvE;ZK&!NjV z8m4$li+m}p`Gm2a%EIr~Syo7g@U_O%7*tF!N-K3-){c^u($h=&)F^`rN1 z8zKQ+Bv^BlhI3}JXj9W|`h7`By~*I#;n!IgH(UuoFQ@O0=0;|zksWGD=|kh#D?)h0 zOF{p~lK!+=LMwzM6a-4t7HUFmn2~;$A*nTMm%*l#H2GiaLanVMGM6LyFi4Qh5zvuq z5!-!hBSw0j+T1jR$I7TtItivI$_1@gbJm&b26-f!irm(-d2OWD%(SY-~JQ$t3UrLKJzDkPf!_$>4i(t*G;89;d+Jflp=z{!$KKJA<{NfkCLTf{djgAct^dpL3SFB)stZp6b6zn9P6 zi#c-^Q<>@9?hqOqw4vlx{OCtNC3vl3J>t>R)dxFFM1`=CP)4JRa8HsBJOs!(7(o56 z4L0Hxjf~0@fkysxB9Nk76^Z`DQ^BC7pta6->XFc2SGZDkhG~Fh5l=+&#ieUTtIlsl z=etvH`KEPum^&k=ysv-!)Tn20pwFh(JG$G^-qnhMp?(a~C=f+!E$=Wh>So=wVMS{| zhe(TZSgzA-umHYU%?4WuMtdL?*<3W)lrrTW`FLbZ$B7P-&qvVL*KMGzt-Axw zq(i@swvCRpo&H)w==TLkLvq;OL<6ghledpcmHV^B&5VL2@!{LLc2u6=%%g26+KmXH@ zQ>J_yzj*9tXlSTIW@?tTn|!ej(pab{FF{XxGv&hoc_&0586?m3A)aDFn*-$rPDhDm zrX{j2q}}m;8m(=%MmswrgU|V~ci(>UUO)14a_!_apHIGM7r6k@W!^G$qISRz6L_QpzX0uPFLj^#< z$u~vTRx#bB`r;o6-hPFHl_(4{*&wnwoy`hTWKIKJ4o(^WH~e~n=ubpAS^Vz`qJ@b- zm6eM$IaQo0n6hEKnu6T=x-M5-&>0zZf1>MdbklI-)#2)USO16gD;o!@K-vqcE=W^=MQw+S*tEMN^AXY;kb}l9n3zHO%EE2gV7Y z#s?T>r1HBtsi);G_ikg|m#&Rbm=2j^^d5`ubK~PWvsuS>y3YpL&Ycv%Jr>8p&+7X? zu#-xy3!x#c&6KPP@jb~R`4`o>@d7=g6x=~7r9R5EK0Y(Ra(7V)H=t**7*!3gU~sgY zPgU~SI`ju?5gcqMsAwk5cv#m&NkAke#9{r~?bxvPR%GU-!xQg8Rv?d{H3l`!)l|w! zm^pI>3TI@ayStalrX3j>QRwPyVarfq3^X7ZYNYJ+QaKQSXkd6egt(+Q1d_d=ScNCR zj)|e78E!^@UkCGzK}z}z0@pTlv^J4`HM=y3yYIUhkG%Un+_G~Ek`jG}6MYGO^z_K5 z=n%mx+eko%DYUk=W3YdSN>!uAQK+qLKwEnkwCPALo!D2(k`CL(I>4SEHahEk_`F zs-R~D^yE%Rp8|-ydWp}b3JyP9mK_fLJJx}W_o8(>8#|n*vnyV|H6Xxe zSboO{(0~mM9h;7K_&+fzfE0o#trPafX}Vv0K?*d`plNQMmNaUk<-vhr8X&{y?;Rvv z^cyfzwX}xMPFV^sFHwQ5z7z2&gUX;$x{GBcsH&|b{SV;e$z#~F_f__7E9rO8PVDLL z6Fm%=5il?ibc_K46ahgq(D+aC!O4d0Y)<730~bpTpyiKZThy=8!i= z@YSz=8*!c_b8ohHk8|=)MR_C2OY3QPEx=2=4ze9m2+$H(r&yGiHR98s`aJ&SpTCMF zi{?A?RTo(^lb9)hcR^A^HOP?$!8F`u-nGx%*SGXHvY3K{!KlLr|DW%Fj`6U;^< z-ow5p5E~ZItE|Sp14nS^&Lp>{R3JnIf}Z5W`aS@xuq#Oy12#ggqg#gv#5E;Pl|*n(+VW@d8MY^l)xQ3qc{%XQH!sWM z<;(H$G8lW=r<8+~n>ux=opjLI(SgdcGF&)MI;pB6eaVA}3`4nFVgph#iI((j^1x@P z8#GAyX2ax3Sn9HPP3o}eqm3DcwZJww#>)FiobKylRu2oUN-H=H?CpKaB8HZq8jsAR zX*M>JMP4^QX#D0dwnj283j{HpnBHUv1!c6}A#*5POZfax4w^QaEdD=S?bj79^}9aa z;B zf~rrYuaPs&qA(@XDoh#HP&)anmjHF?Ws!ixy^L`_|P+%N#;#S{&xjo5{KY-JNYrsR!?P_+k9} zzkd_YKKl$F|M|~RFg*iZ1GT8{I*p`2EI#^?58XZRC z%^Y&wr0G8yD-OV;;i6>(2H3RBg7qMs%Tc=A^x1Uw6v2R>>4eBlg6ut$hc5j%(GBiz zmj^V0sdOTP!*4P&osl_BPdnF~seXBlF!xNBHzVISJ;ib;Eq8sOm4ly_m!4tMXi8iL znKwM@s1tOYHFtbQ>9fsre6?I(X+xiupbhF^1OiW`E6~x`FQ6z-1CDDdqh;eqH@ZQU zRhfalo-U-NrXV*r(||~RejXMqScr`DbR+}<28Oi^!ink=elmLFv^0hMXh4l^OzX#E zqp{NKu>?2-%>>6qr_bSwU;Jmh_|kp?(sTHSFMS2y|K6iGeyjvv{qpzlvEThOR9tLD zU3E7~&o|=4u~K~clYdQ+*@x({MAAl_eeQbxpq()G#A65X2Os+f?A?8u_fio(o`Ran zZv6B|ze00eAD;NdEBK4geF@&^H2A%l_}+IO!wb(JFc2H>&0zTxQFNxr)^}>@O?FNW zj-Nb=@h4N0z36rj2%0iloXGg zoOIi;mz=DDHnu+dRD*K$P3?R}?uw#qgm-9&0MhG>f(Cpk><8yWw@-ZHQ`oulF6<>Z zRbT$%=TEThzJ#y;+gI?f|N3PVpFTq@ticY=2(%C^4k14$6SHRIVQjdcU|mz>qm(u6 zXm9Jl0P`FhWf=+P$43%qM6!RzQjidz!Fna2pGKulzS2&3JDgx_09omAwo5)SKqDfW zhG=smcE9){9)8=~kdmB$V@D4WD9gJ6jqn&DF%9-fo;rYAgAk-{cj6-=kRFN2Ce#^k zFig58bYxi5a}Hz44TPAmzqikvx2C0MA}4>Aj0qDA3St~v(`n2|!NB)M$BEuY`dO8r zF_7&{)yNXx(32Stl9mRaKhfL+oWF1$on75*3P<2MLP`0G zG4&zlx1X``no!{pO5JYaHo+cCn-3!|FAIaiLGul|amyyGShb9w>yVV5je=>@kXM+C=2~rVpt0|d$5@aGPySC? zW(oe0ko+-@A}uQ&q2XQv*mQ#7yWsVWV&;q-G`G~S?T1iVS%%fCR^arhla$$MNKQ&d zR#rBZu-86k&6>$_gwWgDZ_}tXbqzRwvD&5wPo6k|qM}l?w#uPC<+6Bz?Pqjj^yGj- zyJGa@j4tae`@Gy#tXjQ<0AZZ(H=?ZUA{H!KYP+>H8Y)nxcO>r>uN7h~Uy=Zc*ri`Z zhfh=vmsgzo?r%+DUkN^)ckEj@4gRwrz2(e$=mOIr&1fT*=`%(r4L)!8rSG&!N*iuj z^ATqR)ck)E&?O}$u-;8fW&}EwNN;G$TfSGdG(pp<@@s4L7oaAsJJaose$yskxx7+2 zH29+QWhmP8ytRF}K2}NlV)r%5oRHwN4N28CIu0@hJp@!O?Y-Fjihz*HNqQQS5hG6$ zs+;y;XqgfFkJqA&U!6fBfo(GkSqAn#X(W+A%qhF3Z)3SUeja7eInPiC{N{ zbUDKQ_py%Rck&i>{mK<97-!>&U%rS@>isiCXYkzfyD$`D8)!y#EWoO;1o0!Nsw%_N z&pnNU`%W;AC~UcLE2htyj&FbK2LxNOlrPOVeE0y49hVdNP8w3}xNzYt4K9sd?!z5- z-Oe_rp&C7gEnBymH;B2j<}&}~wlqOU)o$9j#hm#Iu;u4v&~VE`VL=X!%^c(w}ry(^p8%vfh#f%vIzqDhZ5h+}L`sLqbx zX+WJELhPnN0ukbCkm~CSlY-Ep5Q&lmD%VVw5eusIJ92xFp2?0%O*4jd{0RzFYVkaY zm<1Oziuv8C2iDCj5D8U1C!i^-TvHKR0~)P-SP2O=)p+t<}}hiPG|NTR5wC zw2M*JsT7Iot?7C(RFx@a!z06{s;@zpkmEh^>`1;d%9f4K2 zobKf^Uj3=yC>uTN{ML8(GxFUx8k`Zp$a-Cwjs(7aMx?Lr?(fKQC`8`7T;_1086wk( zd^hqLeV1~IywCsbyFz3hR|e-fhxeSeaul!wJf(YeT}suSrlOPLl;F{IjZ&E(K;F}N z(>kuvL!Q@W2bD*Pc!W_WtBj0lRz$lr6Hr^*NJT;rn&LAzKneb2Du+|%R!9QODHjC* zGz}}os_*)g0@rueh01yya%1C+NZNOO60pfJJ>joCtMzI6uBAO%Q?5EhQ#i`al5ky}XlB9RF*^Olrjm8d0S)p?sgc(hPY{EH9hf_R4h8;t6rDbWX@xUc zrYM{#K8Krbx(SOHFG6Q$oB083B?t|MI?>r(gMa<k^m?PwKhVi`%f#~K3;3=F&CPYFEHAUQe5VOILSY}8 z=9`ysVp_g3=m94tnlt5Ugubx)%6~ zz@SD-bzSdhJ*0R>X~^HKM%NUSrAA3r9<967lx}8by6GzQwMKuX!$zbJRTN%ha;6j2 z7HUcXKMkm;sCK5jK%iAkC@jSD&pvG%>(;JWf#u7Vp}Do2 zw5ocMzE}C%_VT0OWMuH(v=Gd zQs-dqoF!PeU?uruEkW!;8l%fuhjsS3a>XiaB#2$UVhw3~G1jl&MA^_|vLZ7p7w>(~ z`|*p%A45w^2kyG-UYtBm18hLcQ9?8T^Q_ORs;W_2)u6_v?CB(UY-5>#C5z@@H39pr zH}AmWx$_Y0??PW6foe2?XJa$PS^z`+LzFcQe7}lVDV=~j6&;MblsV4E zq$J#X&+T@MspiPvG7vhh^&!kyyHmx-GH80byGY#aB!Cz;Rw9u<8-vejNLh=PRS}&~ zBB7)a6fH_OUJ;YALNO$0S$$eOEv2TZeKC(cL?Tt?jp^AEYFL5Lo~~|OEGwg6>@@)> zi@_LDf+8%8Bmk~2T=$FrWx*A%kwHW=S%|zh(YsTJH~z-2BV5uU7G7Hh2|`EFIQK3q zovYt{W5G%Ca+;CpDu~{u3T|6p{hosEU0KeF6La&8yzdBp_nphY(G5y_(&!2TDzhuY zmA?hx9HUU6&N*}1+{o~;^z<|;fgHq<@x{lw#}b;7)o7!Z;fzoZ2Lj1xY;47gFTRM3 zoKz~9JPIryjvOgQTT3;|ul8{TlM6Z>S#V|0no+G6m8T4?+oZs=sPBpbr1}&Xk}z~+ zll&BGA-<+7?bE(r8MW(ogup>ji}>|h06}s}QL`>u*grU^^`qk`%v(U2lz?CS{8=12 zTuk9TgNo+{8pC~5hAjkEUMlxQlu^h({nYbVw{8<2eDHoeaQ}T+v~U%b^hzg?zwKa8k^k=`IvIyW}c@3WU`OgXbgin%i z=1dh8s_0%02i#1R{QxS3W8` zv1RjC8y#wHZp6vcr%`n36#DynQCn9{g#zZ+Pol}+BM*!nLo`qXcSUqhzv?qd?-HC zJ+};2Cf(zI;_gVt`y5Q%|!EMBq@P0dSR33s98w%*{FO*st(b7o&aQsG@0O!C3tdnc1K5tkdv2= zS@Q@0lj4w)>O)s|6SizwZRe{0@`;~d)5cYH1m(`1+mV@@%krH?Z+{mS^r>Q0)l?xZIi2P1gg1`uPFm8*Od9A*N%0c&rsLKfo3LW(9OP!FVSH!=-JKl- zi^N7zLu{WG#E{fuDWBqE;%HCPS{NN9s77;C< z_>GJ8A}=?Cpge%AjC95{%8w!Tjn4UxBEJT#Er+%K)MTRuABor~DD<4x;YY^|Q${4? zo_lY*G!p6|4TyFx>7F+jCIz8UazszTA2qIXnl(x>%tq)$V?(WtLdvgHfW$2e$b^!1 zXi?}3U2FQzMlR&SLd+?YEwY!?+Pm6qBR;1&15F{XhPzlpclwBYQ z?d>y^u8|m}E&*n*@t0`u`oeX;_+J)O*Q)4nIshPn9miRQal{93g)hFh)MF>l3y0wbH!$oh#D3>ib0ZE-RYXKCh%rd4%)1 zI$nPK@_SCWtf-ymToCH=UJQJ35+($pX#|w{1fjMDafE_Md^>JaY|_CxKUuzflPFM| zn>(=kmEFjnmTRZ*#K$M0xacC98at@4H65>`IrS;yQA%4Qa{BE?U6UoPsWW~b*C-96 zO~Lbb6hFt^XJ`rAbw~Nx^u4Vs6$qLv>b~+0$1C1*gIl%$6*W*%+K!8*rD&+@MoaS$ z>Z;rE9F^6pufB}><{B#4Y$W*7@#7!;3IqLPxNYZM6wK4`!m~&5_!G}jiNzt=I}P=9 zE!ePr1Ga73Lg1BxpZw@4%E!Q$5 z-Ad5OJ{pqYp1|u#1l1lJoyJ(N4GL&v*b}eygh2w(OvW_4vU@kq6c^jcE~TXxsTPJ& zU8Buaqd0Q-Fb*C(M6eP*|?q9Nzwp_ppo$uyomK6rC<+ z*E@72ey~wOf)N9Pqyy2C=wnpQ&RL!zD*xFt@~~>vV#?|`9>z5vtaG`?0u@ybtt?2G+ zN5JnzM|ThU*>3UPH1f+CoIX=V9-$H1+=ZIjdh$sv>Ka;b@q7^t$tD_HH(1|Zyikga z%q)VsUgpt^<;zzimmu_&S9jBBEi-Tz@F$p|7Dc0boW_erzvs=Hg$M7w6Khv5;(Hf} zcTQrUw*!NHgKTBV<7D=W4CPMJk48a9(cRvTJOb4X>z87|yh4P?(eex#-)A~`8wOGmtM9&{75s-0wH#dzh{R<7S1 znTG2%Yq;v5{VOWIr<%6ZKHw^w9DNlIhwh2q|zz zdnqJqX_$SAkoJR!V?!FGsIYzQ)G6v5~i5w=b!p)eZbr*#B* zK)BTyo)m9?qJB1j*3h^c9mL$`#9og{Ky` zC?Py~VwV+FINyj6`8)DCH$>jQoSzdX3%WJ&?aAMHBjIuxq}T-pbj|s6g7d|xk9d(h z$M2?agXCQT2wD3w2z5)!$x+DUZGu`yu?b*O3L3c6r@*KHsQW!39JMx-zhhGQnZm>v zW90UQzhlyz>(PmfN&LQCZ%OUAqpTrmhVaN^7Y!_w$)<_*UrbIv(wS2?W`N(ccWXRyIIVz7CCw!zu2{bFnbHYR5Q5<)p^6*g(}YIEMnIdo6w z>6!1Gs=hnDtC>X-7~}8nnytOJ@2#p^;R)xdi2Lt*5}wj3RF_v`*Unv3fcshJUTl8; zd9*aOu>4hMKG}r*dk#?HkS1NKCm9AV)7zx^ux>vUQfUC$w6>NBQh>YBex{4YdWw0j zr5p`l_s&CX50}}jUTq>U7A+5(9^Bk;hM@2i(-<{#;1(~QOQlkd8MCG`Jz)2q?W~g^ z!P5X53AXDSs?ELGFH-HS#i=w#L@OE&SC60oqM;N1FLXudY`&}BQ!Qvx;PPm>new4t zNdZs|Q!Bpc>K8fDp=eccFYNV{6MdTbmGmmBeJ0Q(BV^2t(f9fH);albUdYf=&%fpl z+pUwy*hgD{1p{H~Kh0sb;9aLG8DytV z8PETu1kZh&w{t!Ib`TLY%$}^9Sz3q69yWfnp>sDjx)XBKzrW>(v z@gjoALF5PutJSL?h#*p4MZlRd3j($I{FKR4%{lICSFb`%c{QeK%7WKtR*kDo1@uIp zCFH%bvH*OPMSgD$LgcTC$|(p(rlKNRhpHNFgH?_GfdrN;UV-2LgHPes+wU-2N{LTS zo;ZdBhxVCi0NO1ZN1xf3_~k7- z(bv^M-;UPPXNc31$Rr1V;Xw?idT9{$qPoh9MGIITb0;I{6Mx6~K1K6AN4%y5O5|0w z`8gfw&>gRahAqvi<=&{X96OFHE!AZBEL{FPEmxvlpN7H)$=nGxSeD4Um)1iE8!g4q zI_!TCd4koF5lxy;Fjpyt*H$Y@{-z)_!)OGZwAx2Uw9=9VB+;pWLfK=5p!MbCii9M> z&70vk`(C0>_r=2Kf8B4s8v{P$_(GV8oDxes%Hwn^@{T_2tWD^0)@xseF zaV~s+;cq8gar(v2oaYz5=l|!@dgI;-72P}KH|eS;M$hz5SLf5b>f5GgNiQj=HBU$e zp;n}((^;fb8g8VJr=XMoCKofJ0|Im}FshytF}HkiPbDqsk%HH~dOk<^T#J}S`CI#B zYOf;G3o6iBxHp^3d#OOB+{gDCMY5i!(8;0Mkt7lcZEuu<&mEycspWerX684Z%;0QGEA}2bfac~_e#nm;zvXw^#TqT` zJF#`=vs4(n`5l6qvLNCyO$A_3ewY6DW{YW<`6i%{lby@P`vu zK-dCehu*9cyS$oz?A7sOZY{%PaCU2jzosN;HwYPGcB>|BH)W=?@J~8x zcvwA0;t?%`^O_zo&12Mh2j$x)ukY~6y0X9RbFr9F@J!3{k;-21=C^(JYG=c1yQRTc z+??C5Vd7&)j~Rd^(5c0G+Q(9WR7;+x(S=+H6z?7oMv`K9f6@rA9Xw_nqB%1X3AFu-~WP)_7=^vFrlXFopw z7k`JZ{QH-1)zz1wrMZjXk47Uw-=PD?vGImC;ZHvMxA@AJzmC{|_QTY|!90OwE#->~ zt!-TdQKJO?F$VEW*PKZ4tD zza6t?%tFu~LNpr1q)C%7XZ9>J#UhnVBAFuS6OS?PUaw9-^Ha`gk(isj0}Kpm+5WPL!=wjKMPPZ_PBWP=CLU;QqG@U(6qqPMk`5}zv z;%v$kX3uQIqWRNNT@f^++VO#I$`2htMEWPSiQL$>J-^6ZBphEkibwyymK3c8H@WuQDGd(NC&H_y3MOVj5St@C5 zr{nhsC>Dm}CpSR*8|H_#7?4Va@zvpFP8!mN@ZKO5YXoP`Hsh(MpGL#vS~O0oV>*89 z-**h1?LACi08>NV1#oFv%*>&oQ$CfhoO4g@roBMSoHSjXdjV4cQl%vgs9qfX=6#8q zMb@feP1E^Bp5cfp%~kW5@@~p3&2eL@Zsv_(Z?r6dXq5{tUj}Y3!BuG*mDK_G0+c-j z8Fh8_Sg~pq6>AwDeBdXTF|!(f{||qP4}9PqICJ_qPPA?_Q<8?MaOxWa_@^&?9=G4I z(aekMXm7%T#dA&khadhiy1LI4%B^}DMlREWKt(;T%*#leet^|QP3R(^ab-{%5)dkZ zM_`CRLL0>EY_mlo++y|P*yqx%ba#`Mthnd#X#U)D2+*Z9Q55$LqQQzudhH0!xQv*H+_ zOT{a`(Y!f5muyoU4P$FFbe%-i&AL~Qujc$|fsuwc)mCb6wVUeQ4F8qtYO-?9X$J&D z`{o5}nB^8qgIPxzz4n*46T5%T3RpHf(R4Jd*)}c>1Yr)Y;nJD$IJ5 z4%MoB)g|kYaalFyUTKn%EjW3+ zi6Ey7M~j)lyd?#LfeizoPU5oN)1v*;WvG$Tn znDJ3;dwCl=n$F#rq{BoEfrn4Z{^Cy!#myg9@#{g^d#8a7d8ojKhKKLMt8@hPwJ zVa~kiG}Ouvizg8Z)sQFZacKV;ba!iXH_XarI}($KeqG)&Vv<3E&@zOgRg{H3=27cs z%5dWN32fQ&61Hu9iN@zCbar;|`^VL2X0O&u)-A=x>n=rSTN|E#?s)>fUMyWS8%q|? zKy9_3#YiD3Of^K~G?`<&rCH@8$fWww(lUf0R@3b_OvU<3W@E~fVN_M8K-|mr2ikgo zAPv`PGaD$gMhTV~m-G{KRUtv(+}hP3oATp!;BK^r| z7Uq&6l^@NbgmOp=L3Lu%ZDwJTmo<`yyHwLV6ic%C^}7i{Xlh_5+MBlE%n3GX^8pNW zH`5C5!3cq-i$toe0VEU#`OM6xNc55UbPVSZEnZD9?&I@5T4kDFL92`nrg@+e5<0F- z7IcQ7RC9#vu!dzO)BVr;N(xa8dkBP{IH~y?35H{(P+2MsD@d&Hkbh(D4M+U7In~95 zPW3dAD}Fa#+>5){ALF$;3G&zGesMU3c&+KZ_V148L}NA$)$4_6U9267!#elQRq-4} zDp#D2eJ3G*{xd~&o>^e6w8ry=bYEqm+TV6Ap6;d8wLhX&BwG2b4d=xY)fMU)pb+zF zei#KS1+A2&lx~`WRx`Z4-T(!4Ia*u0@Zt+EVe*tZG}Kiyd?|MBIEbF^4t__9TX|NV z^i9p3)5r;>rCA{_FU4%ZgaxR&moK_!9%!DAUDdm$`Q~QMdEt7_GfeS&0hM#l3eN>7 zU?kIyORiXs-~OEs;>xR56HLv<9e3W0hK5Qrck8lC*PG4f)zfhD z-!}`X8Y&KO!39 zvuq}dV@HnQ^y!m0e(X49Z2}wCUt-#J-uyYpjS!p!{Ag?MBse&Uj_z&(h*3l<%CTzg zDom%6j?u{1yf!Id&0Cx@Wjextm;`xXH+(hzA$y^tdW%UU!x zJebC)hS@qPKFEDQc_@(F^N1&UEUvuZQO_DtUs>JlLX{10spn*WhoQk6n1D8%DU^+@m`5N=~nE{;S z8FR0E353%9A`qIUF0HPrq@l5ZI`a(MZJ2sEjn?))g0ojpUa4VX7wgDPKxyNYk?!SX z+^BPBl!k-0;xagx^`S+^`jEtlWQW}&m`0!hs5W0JzqWJiCVd5b5tbR~A4sCEelpsc zJF$PyK{TIf#&y?iB+#0MAAav=<`k}NTXx`uP1|Xlv=B#>GTm~5xhR2CC(bsV#HMFn z!k(S4n9bg2&YXjJ^B3S--~1^~9qT8i7&Z&(o_gvT?B25%2VOa7j)j%1>FpiB6<1zO z18fSWPMyZ`=FRHx>dI;Y;vsB#aSM5p_0rnU@ARRG^x03W;tvN&{|Vd6ne{NQmk=yB zp|!1#vM^+N_On@y`f7&<0#Y9VYa+pNA7s6kWBT;jG~7J|o~KO@q;@!1x^xL;!bzMV z7>yGv&6_h5Z@%MZoIJ7{n_qYa;a~_?UVbSi)m4&iw3m9!82`D<2>QEXW=A4Gy{N=k z{R6cBM)A9!*ns!F?*^=2zko7oKCZlaCIR^r%$-+>t1eqbpgY8JwW6{%44;q2Lq^je zBj}H3(8cnl2 zds%rIBVcq~nHgRpCB_Lrhxl6)rnO2?K9w1!b(l8HsGbt_su-m!LZ;88spQBYwRN== zoMBV(A~vlo)ZT=4WoCi+c`tS~KMmKsPX9l^IReIReWlVe>xJ@9I$O52UOVPiczo93^yq82K^4HvTu9JdNi}+Dy-StJHL_s|A_%y-il{ zojGmAO454U<0G#&5Zx=B^3O+wFz0%FM;Jhls3fGcO&!ylp)_9Y_ceT}G%WvEz&eVM z#(xOvCQWX{?AbG!zMc;gZ~{s4ayk=Z9Qz$Vm1;CvgHxy4@!Y1DjBpKybTnfa+qdsF z3kYoCG!Il671$)8D%9=yUhf^+8!PMBRq=FRd?lDPUia!Db<)LjKS0pvbhwecD(SUigse*{aG&ZknK@?qJBhhvDAyRm-V671i<8yO1e zo`Ey?(trFv{KtQM4T~19KxbDLr%rbmC3VxSm*cD7_-Fjf7r%gKpLrHnU2!GqYAO)Y z-hTur+6rp<%0*bdY5{8MLb&rSw;)ngh9v~P*Is=Yzp)>&?!)j!rjr)^7)`OB)TSk@ zOSZ4e=OL)j_DH2Duc$D*s4*tZO}zAq%W>@FNeobly|i^ZUO9LOuN*#sqi0&t($RxK zD$mxQPMmH!jRD?!{Xy*6e-MFC1@kh6GJ6C&Ufzjq+qW>?9OZZn9)E=F-*8(-eR_%+P-}Ufl=0gRuQl0*vt^nlaLsc=R{7@l)_P^}l8DZF-fvGJ@IAL*)m2{77cN@En-!bS#~*P~%< z(U!7qdx4dvz_B_}JOrUSmNXdhQ?Yxfs3W8SHzMIMp9hi85gb$hl^F16Dc*S2pV-WL zd+*}6bTlr1s^q-#A^r8s26?v>VJbjUH8Ql-`9`&#wnOGZ4Roc zC(!^nj#x~i9zllJh==8U^?FKnm}6`C4Xu7x`xbss=TJwNP)E~Plg!G|7}2gb9wE;> z?}te{vg0T>G}m+}k%2!Hq0P#6Vk+rm4n6|cB=!B8HLEdo%49t7vj&HITr2W*>ewK|XE8XKH2a1Q z3?#^-Yzub?XHU0c$%2*Gz2g8L{rQtPcK8edUp4CLW+D=;!<;#*;14$9#OYofV^|Nt z?`7++!>l>Wv1q|Ml$TFNtT$)oRtCJTA790Crm%U-<5;s|CEj-Tt$6l{`>}WDCK~&GtiNO>fnSh@ zV~lu5b&|$lUluI{$EhLpa(Y-lr-++k1n8sq_-|c~Yp$NcHtN7|x|=e&hwYOlZRSu} z z60)`ykn%G_XxfX4#7co`6@%?<5f9YV)S9mE-ku&DJARanPOFs9&FXl=B+R2x*#F;i zh2p<%N3q5KMKBf^$;&xcC*=#@Tftr&?$_*`2AAWl@}no_TKsNYH*ubwGF~hRr_9A= zcj8^lJKweW8~d%R6UHjWVrQQ_fKu--ETjEB_S{LsdCsQe4=E6|lwOxHzz5BMu^^vGE}@x-&3GO30_ z)Md6K*}3x|`L>_ws~1WNPnjzAN<>~?bME!rsVC=NS2?Alu=0B5Toq5{QXLe(rz|ng z1U}WM-Y#rjLH#w+`q(bm?Fbb1iiQ)zZ}p25r8cVWhi8Cbe_ zu^AzXgsU)|_aGE0r))b$1)^g!&$9kYsT`-{$l(JN?qvkD{buh!Z3sR*q)p?4a8vN- zsU!qMM`_%9f&t_*akJ<^y;SPG@cF&ixN#$uEP*T24p&rS=A60c=^Mhy@dSn0=qOZhzU(WPtj?0Jvd04_Bb?V$Lp_vqSA_ zSCPEs0ejMs(lY54j7HJ21(>=@*C@P=!~acK^^Vzi+O|l&tYc~Dx3(q|?aNqET(bos z>&m`k8vM2f@EC(>+O%{Wtl8Rz;A~)^-)xbUAi!5z8GUteLn@Y3H ze6OvAG_O$2>mwVkUcD5xHPv|Kz#g-5{*OQX2YBy$-@&|gkVg6lZbxZMk3GX$i=IbxAAFIt=1 z@X`xgaq!>~vwcyD^`A+Nk_QIy-Lex+XLRsG4w^>jc8^j9tYkR}<9(%O8>*h3cD&Fw@;)OKa!$D*S?7_B5rDMnpCkcKt zc(iqz&MMD+1`G!jfef&`A<;9WzjgfftV>x zBb4-062U7+PopoRQD!Z4WLwhb(r)-QUzt{f-&?}pG{lMb+%zO5^VROdBnovL%Gd(I zw?<_e8*1>jx8B7(&}b7SNuG+gjPiN?ZbA?`JoqBoTQ{?TH3TEFC$W_gXof0LMvKDj zpADCPCgpe~GbgLB5^fTQ$IW|sopz$*_B^hD>B=^n%X<85zycT*Lm8*}MD{8M$kPHB zFs-hthM5!E(`PnOR)uP)Pu8j!P)@7mB|`td=H6(D)rz*~PeNb z?{juX1m*Mf)WF1fzOYOertADJ4p)4=m{-)|^v27x4JR;Yewp8LR+&mUSm(sGVXb$R zrt{l6+jC(msQ^09y(*#_DQ`OzZxybpNP9gBTxmXILt{M!O#|zDn3i^mN?pC-S@JLy zx{lqY=<)la6#SJqaiST|KC=l84caidls=3-dyY~#YxSo^^In^s#9M8Gcf9mEHhzANs(DaQs*o9(&|v zq!OBPG>Tk)2yedg7W~%7K8m;AeGhgKjB1YU;zet*<7I*O9r)gN@8h?bPXfGbwiE|m zIf0vQxRXYHC7yih8FV+FAvg`e8=_1lNX@7xCO}~CDuwoC_7Z3X2sYDH{2s3WVIGP2 zAZ6?*lF2xdLpqkU4E=or*t6pV+M3fy4wfJqtVLbbRJM5~mA4CLPIRNYErraG7p0?7 ztXXk2CO6JyJ`bVkR2RQdg*5Z0#a^mgsywEvEu*yPL<@38?3w=~DXdw&7&qN?6)K`W z^mezHxp^yBU4mV^c2m(3ID70u9xY-L5S4Rie>^AMCK`8m%X<6H>FsyoTYgY_<|nVV z$I{^ydvC#{jcZ9k&!uR^6V~e_7=D<1Bvw>hJ0iqz!IutqhtM=4!sk^qn#*h*Kv5z&d~Yvi0i-y3(kw zZN!|piwT%2@buH08J0S^G{~zufW~@z4S$T<9$h}*H*C4&Z0|E$o6nO3e45Yd^?3+* zRIeI>g#l6{qbYp!x88^AufGB_XV;^fK{+<{wfyAG#MA0Rlc!Sorm_|cEQ zjyvAG5epYhXWGNK^zzHG?-kM+X+4qX#k_^p_}Fi~4NDfy$MqYRVD7xxID6&@)~s8M z`+t5vjlXWvkIMkA;k*_%v`cxf?rn?jm315KF{K3vM%XeZx)H zvdkj{#O1j1nrjL0<0vn$!PQq^i)*ggNE#Ty;lqb13yu=IbP-@CC=cTJ!$15a?)&MF zaP;T_3=^17nOu$8vt|&Cd--0YR4&95Jv0DMqOGYL9kB%IDv!DdFlRv?*Ic z5*cDN$`Erpp3a^R!bOWgTZ;K~LYB*if!;wR(`1rP}skgo2S)7R-ca zyRC>Ou}c67be3sF9+9=?6d6J<>Y1_oirU}9v?7JntE+1$tbArz@A!%1rYCfi%%C%f zEpIA~H&*EX(atouZTRv0Mcr!%Tl`+$3PS59iu235;%|)W#60%jd0~HHJmV(Lb8&f! z({dD+1aNU3IN^)07v@2~tuH*FD-I*Yr#vaHqYxdZWbN~@X#jH0y_2uvcM9+1Q}K-} z^n@0t?SNW6Q~FlvT7|1B(vYJ|maVG{4Ry7sudl}_6{?P5)F$L+4j4UEH}72thN}q1 zwEti`HgDOEsZ;9_q|o>IBc>-o^Rh(LSguf<VU2P=8Ca=Q-l2opfux!a3D)s>!I=By~ z&YYmK_hS2wodgR$(-W$pV{Mls3N^#?7jf!kvov1Z!)c%CUh(yN3~*ZdcKAdzuHSMt zzT(>Wc3O%BT9%(#L>7~e20Y6Q=06G%@kE3a<`LqY1{Byu!NwMa<| zp=QpUj?aAhk5N+_!7GPe#;loBSbjgMs-n31+Dq}|6A$A}x88vE&NGxRBYZyz$BymC z;w5wOrGNV;+Rz0DcGFEa;w^7^i#d^O&z?PI9f{^Gx3;xn_uf6^ zscm?IhTW;NO=N#R!jTFC>N+~wFm1*(3?&9l&-J=XExdH@>noFCd zfnI08?7BTT}n!>JRe@bb1D<|HI7)NZJ$MQpGKAOHAAaO&g{JhS;p z_(^v&Sx2*HP9tqlUb2k_V<~iYYR+dn_OqSN_6?zm@@#4}if}NG+wWY9Wh-YHuqor$ z=c{G80-(*u`>5f=(R``dmMau4H*@vVnNd{NPi9-xqPe9LWo)YwK8u@up&d7h#IVk- zk5OHWB2p1HqhV==9VRhorx5W?A~wXj93b9PPk#oD^|g50TkeF9@>3lY;y3Ze8+8+c z&}`x*^mH9X%b6i;-=b|5q^v673(Z8Jd?tl<12VL%5)_gnS~VpQI;<^I#IPiCR*Hz3 zpDPhPa_ymOob3YDxL z>r?i<6GrWGejbXQO}7|yo_{Z8DZ|g?p^)a-_ietU*euAkb42CUtKrdt1EwJmT31_( zy81fu+Xyn*G?ghikHt|hkA$+$Z4Za42s*21AU0D`Y%zj08r2Ye5IZy+-`mG;stySD z%(b{3bgyTQFMcPd-%h^iMu^n3Ktf~V+Pa9=xLs_-E6bs|pQSFATL770phV!3fXG